Merge
authorduke
Wed, 05 Jul 2017 22:13:53 +0200
changeset 41019 e77d2b4288c7
parent 41018 b772c7126f36 (current diff)
parent 41017 c6d60c5aed01 (diff)
child 41024 bf109947796c
Merge
hotspot/src/share/vm/gc/g1/g1Predictions.cpp
hotspot/src/share/vm/gc/shared/memset_with_concurrent_readers.cpp
hotspot/src/share/vm/gc/shared/referencePendingListLocker.cpp
hotspot/src/share/vm/gc/shared/referencePendingListLocker.hpp
hotspot/test/compiler/jvmci/compilerToVM/InitializeConfigurationTest.java
hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java
jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.dll
jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.lib
jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.dll
jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.lib
jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.dll
jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.lib
jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll
jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.lib
jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll
jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.lib
jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll
jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.lib
jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz
jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256
--- a/.hgtags-top-repo	Thu Sep 15 17:15:55 2016 +0000
+++ b/.hgtags-top-repo	Wed Jul 05 22:13:53 2017 +0200
@@ -378,3 +378,4 @@
 be1218f792a450dfb5d4b1f82616b9d95a6a732e jdk-9+133
 065724348690eda41fc69112278d8da6dcde548c jdk-9+134
 82b94cb5f342319d2cda77f9fa59703ad7fde576 jdk-9+135
+3ec350f5f32af249b59620d7e37b54bdcd77b233 jdk-9+136
--- a/corba/.hgtags	Thu Sep 15 17:15:55 2016 +0000
+++ b/corba/.hgtags	Wed Jul 05 22:13:53 2017 +0200
@@ -378,3 +378,4 @@
 2021bfedf1c478a4808a7711a6090682a12f4c0e jdk-9+133
 1a497f5ca0cfd88115cc7daa8af8a62b8741caf2 jdk-9+134
 094d0db606db976045f594dba47d4593b715cc81 jdk-9+135
+aa053a3faf266c12b4fd5272da431a3e08e4a3e3 jdk-9+136
--- a/hotspot/.hgtags	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/.hgtags	Wed Jul 05 22:13:53 2017 +0200
@@ -538,3 +538,4 @@
 a25e0fb6033245ab075136e744d362ce765464cd jdk-9+133
 b8b694c6b4d2ab0939aed7adaf0eec1ac321a085 jdk-9+134
 3b1c4562953db47e36b237a500f368d5c9746d47 jdk-9+135
+a20da289f646ee44440695b81abc0548330e4ca7 jdk-9+136
--- a/hotspot/make/symbols/symbols-unix	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/make/symbols/symbols-unix	Wed Jul 05 22:13:53 2017 +0200
@@ -67,6 +67,7 @@
 JVM_FreeMemory
 JVM_GC
 JVM_GetAllThreads
+JVM_GetAndClearReferencePendingList
 JVM_GetArrayElement
 JVM_GetArrayLength
 JVM_GetCallerClass
@@ -130,6 +131,7 @@
 JVM_GetTemporaryDirectory
 JVM_GetVmArguments
 JVM_Halt
+JVM_HasReferencePendingList
 JVM_HoldsLock
 JVM_IHashCode
 JVM_InitProperties
@@ -179,6 +181,7 @@
 JVM_ToStackTraceElement
 JVM_TotalMemory
 JVM_UnloadLibrary
+JVM_WaitForReferencePendingList
 JVM_Yield
 
 # Module related API's
--- a/hotspot/src/cpu/x86/vm/globals_x86.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -65,10 +65,10 @@
 #ifdef AMD64
 // Very large C++ stack frames using solaris-amd64 optimized builds
 // due to lack of optimization caused by C++ compiler bugs
-#define DEFAULT_STACK_SHADOW_PAGES (NOT_WIN64(20) WIN64_ONLY(6) DEBUG_ONLY(+2))
+#define DEFAULT_STACK_SHADOW_PAGES (NOT_WIN64(20) WIN64_ONLY(7) DEBUG_ONLY(+2))
 // For those clients that do not use write socket, we allow
 // the min range value to be below that of the default
-#define MIN_STACK_SHADOW_PAGES (NOT_WIN64(10) WIN64_ONLY(6) DEBUG_ONLY(+2))
+#define MIN_STACK_SHADOW_PAGES (NOT_WIN64(10) WIN64_ONLY(7) DEBUG_ONLY(+2))
 #else
 #define DEFAULT_STACK_SHADOW_PAGES (4 DEBUG_ONLY(+5))
 #define MIN_STACK_SHADOW_PAGES DEFAULT_STACK_SHADOW_PAGES
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java	Wed Jul 05 22:13:53 2017 +0200
@@ -24,6 +24,7 @@
 
 package sun.jvm.hotspot.gc.g1;
 
+import java.io.PrintStream;
 import java.util.Iterator;
 import java.util.Observable;
 import java.util.Observer;
@@ -125,6 +126,15 @@
         return CollectedHeapName.G1_COLLECTED_HEAP;
     }
 
+    @Override
+    public void printOn(PrintStream tty) {
+        MemRegion mr = reservedRegion();
+
+        tty.print("garbage-first heap");
+        tty.print(" [" + mr.start() + ", " + mr.end() + "]");
+        tty.println(" region size " + (HeapRegion.grainBytes() / 1024) + "K");
+    }
+
     public G1CollectedHeap(Address addr) {
         super(addr);
     }
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodData.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodData.java	Wed Jul 05 22:13:53 2017 +0200
@@ -36,6 +36,7 @@
 public class MethodData extends Metadata implements MethodDataInterface<Klass,Method> {
   static int TypeProfileWidth = 2;
   static int BciProfileWidth = 2;
+  static int MethodProfileWidth = 0;
   static int CompileThreshold;
 
   static int Reason_many;                 // indicates presence of several reasons
@@ -142,6 +143,8 @@
         TypeProfileWidth = (int)flag.getIntx();
       } else if (flag.getName().equals("BciProfileWidth")) {
         BciProfileWidth = (int)flag.getIntx();
+      } else if (flag.getName().equals("MethodProfileWidth")) {
+        MethodProfileWidth = (int)flag.getIntx();
       } else if (flag.getName().equals("CompileThreshold")) {
         CompileThreshold = (int)flag.getIntx();
       }
@@ -154,7 +157,7 @@
 
     parametersTypeDataDi = new CIntField(type.getCIntegerField("_parameters_type_data_di"), 0);
 
-    sizeofMethodDataOopDesc = (int)type.getSize();;
+    sizeofMethodDataOopDesc = (int)type.getSize();
 
     Reason_many            = db.lookupIntConstant("Deoptimization::Reason_many").intValue();
     Reason_none            = db.lookupIntConstant("Deoptimization::Reason_none").intValue();
@@ -257,7 +260,7 @@
 
   ParametersTypeData<Klass,Method> parametersTypeData() {
     int di = (int)parametersTypeDataDi.getValue(getAddress());
-    if (di == -1) {
+    if (di == -1 || di == -2) {
       return null;
     }
     DataLayout dataLayout = new DataLayout(this, di + (int)data.getOffset());
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ReceiverTypeData.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ReceiverTypeData.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,9 +38,21 @@
 // that the check is reached, and a series of (Klass, count) pairs
 // which are used to store a type profile for the receiver of the check.
 public class ReceiverTypeData<K,M> extends CounterData {
-  static final int   receiver0Offset = counterCellCount;
-  static final int     count0Offset = receiver0Offset + 1;
-  static final int     receiverTypeRowCellCount = (count0Offset + 1) - receiver0Offset;
+  static final int INCLUDE_JVMCI;
+  static final int nonProfiledCountOffset = counterCellCount;
+  static final int receiver0Offset;
+  static final int count0Offset;
+  static final int receiverTypeRowCellCount;
+  static {
+    INCLUDE_JVMCI = VM.getVM().getTypeDataBase().lookupIntConstant("INCLUDE_JVMCI");
+    if (INCLUDE_JVMCI == 1) {
+        receiver0Offset = nonProfiledCountOffset + 1;
+    } else {
+        receiver0Offset = counterCellCount;
+    }
+    count0Offset = receiver0Offset + 1;
+    receiverTypeRowCellCount = (count0Offset + 1) - receiver0Offset;
+  }
   final MethodDataInterface<K,M> methodData;
 
   public ReceiverTypeData(MethodDataInterface<K,M> methodData, DataLayout layout) {
@@ -53,7 +65,11 @@
   boolean isReceivertypedata() { return true; }
 
   static int staticCellCount() {
-    return counterCellCount + MethodData.TypeProfileWidth * receiverTypeRowCellCount;
+    int cellCount = counterCellCount + MethodData.TypeProfileWidth * receiverTypeRowCellCount;
+    if (INCLUDE_JVMCI == 1) {
+      cellCount += 1;
+    }
+    return cellCount;
   }
 
   public int cellCount() {
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/VirtualCallData.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/VirtualCallData.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,11 @@
   static int staticCellCount() {
     // At this point we could add more profile state, e.g., for arguments.
     // But for now it's the same size as the base record type.
-    return ReceiverTypeData.staticCellCount();
+    int cellCount = ReceiverTypeData.staticCellCount();
+    if (INCLUDE_JVMCI == 1) {
+      cellCount += MethodData.MethodProfileWidth * receiverTypeRowCellCount;
+    }
+    return cellCount;
   }
 
   public int cellCount() {
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java	Wed Jul 05 22:13:53 2017 +0200
@@ -129,8 +129,6 @@
             virtualConstructor.addMapping("CompilerThread", CompilerThread.class);
             virtualConstructor.addMapping("CodeCacheSweeperThread", CodeCacheSweeperThread.class);
         }
-        // for now, use JavaThread itself. fix it later with appropriate class if needed
-        virtualConstructor.addMapping("ReferencePendingListLockerThread", JavaThread.class);
         virtualConstructor.addMapping("JvmtiAgentThread", JvmtiAgentThread.class);
         virtualConstructor.addMapping("ServiceThread", ServiceThread.class);
     }
@@ -172,7 +170,7 @@
             return thread;
         } catch (Exception e) {
             throw new RuntimeException("Unable to deduce type of thread from address " + threadAddr +
-            " (expected type JavaThread, CompilerThread, ServiceThread, JvmtiAgentThread, ReferencePendingListLockerThread, or CodeCacheSweeperThread)", e);
+            " (expected type JavaThread, CompilerThread, ServiceThread, JvmtiAgentThread or CodeCacheSweeperThread)", e);
         }
     }
 
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/soql/sa.js	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/soql/sa.js	Wed Jul 05 22:13:53 2017 +0200
@@ -837,7 +837,6 @@
 vmType2Class["JavaThread"] = sapkg.runtime.JavaThread;
 vmType2Class["CompilerThread"] = sapkg.runtime.CompilerThread;
 vmType2Class["CodeCacheSweeperThread"] = sapkg.runtime.CodeCacheSweeperThread;
-vmType2Class["ReferencePendingListLockerThread"] = sapkg.runtime.JavaThread;
 vmType2Class["DebuggerThread"] = sapkg.runtime.DebuggerThread;
 
 // gc
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java	Wed Jul 05 22:13:53 2017 +0200
@@ -244,17 +244,21 @@
     native void resolveInvokeDynamicInPool(HotSpotConstantPool constantPool, int cpi);
 
     /**
-     * Ensures that the type referenced by the entry for a
+     * If {@code cpi} denotes an entry representing a
      * <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.9">signature
-     * polymorphic</a> method at index {@code cpi} in {@code constantPool} is loaded and
-     * initialized.
-     *
-     * The behavior of this method is undefined if {@code cpi} does not denote an entry representing
-     * a signature polymorphic method.
+     * polymorphic</a> method, this method ensures that the type referenced by the entry is loaded
+     * and initialized. It {@code cpi} does not denote a signature polymorphic method, this method
+     * does nothing.
      */
     native void resolveInvokeHandleInPool(HotSpotConstantPool constantPool, int cpi);
 
     /**
+     * Gets the list of type names (in the format of {@link JavaType#getName()}) denoting the
+     * classes that define signature polymorphic methods.
+     */
+    native String[] getSignaturePolymorphicHolders();
+
+    /**
      * Gets the resolved type denoted by the entry at index {@code cpi} in {@code constantPool}.
      *
      * The behavior of this method is undefined if {@code cpi} does not denote an entry representing
@@ -348,6 +352,7 @@
      *         [String name, Long value, ...] vmConstants,
      *         [String name, Long value, ...] vmAddresses,
      *         VMFlag[] vmFlags
+     *         VMIntrinsicMethod[] vmIntrinsics
      *     ]
      * </pre>
      *
@@ -610,4 +615,5 @@
      * @return the number of bytes required for deoptimization of this frame state
      */
     native int interpreterFrameSize(BytecodeFrame frame);
+
 }
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantPool.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantPool.java	Wed Jul 05 22:13:53 2017 +0200
@@ -282,7 +282,7 @@
      * @return constant pool tag
      */
     private JVM_CONSTANT getTagAt(int index) {
-        assertBounds(index);
+        assert checkBounds(index);
         HotSpotVMConfig config = config();
         final long metaspaceConstantPoolTags = UNSAFE.getAddress(getMetaspaceConstantPool() + config.constantPoolTagsOffset);
         final int tag = UNSAFE.getByteVolatile(null, metaspaceConstantPoolTags + config.arrayU1DataOffset + index);
@@ -299,7 +299,7 @@
      * @return constant pool entry
      */
     private long getEntryAt(int index) {
-        assertBounds(index);
+        assert checkBounds(index);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         return UNSAFE.getAddress(getMetaspaceConstantPool() + config().constantPoolSize + offset);
     }
@@ -311,7 +311,7 @@
      * @return integer constant pool entry at index
      */
     private int getIntAt(int index) {
-        assertTag(index, JVM_CONSTANT.Integer);
+        assert checkTag(index, JVM_CONSTANT.Integer);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         return UNSAFE.getInt(getMetaspaceConstantPool() + config().constantPoolSize + offset);
     }
@@ -323,7 +323,7 @@
      * @return long constant pool entry
      */
     private long getLongAt(int index) {
-        assertTag(index, JVM_CONSTANT.Long);
+        assert checkTag(index, JVM_CONSTANT.Long);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         return UNSAFE.getLong(getMetaspaceConstantPool() + config().constantPoolSize + offset);
     }
@@ -335,7 +335,7 @@
      * @return float constant pool entry
      */
     private float getFloatAt(int index) {
-        assertTag(index, JVM_CONSTANT.Float);
+        assert checkTag(index, JVM_CONSTANT.Float);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         return UNSAFE.getFloat(getMetaspaceConstantPool() + config().constantPoolSize + offset);
     }
@@ -347,7 +347,7 @@
      * @return float constant pool entry
      */
     private double getDoubleAt(int index) {
-        assertTag(index, JVM_CONSTANT.Double);
+        assert checkTag(index, JVM_CONSTANT.Double);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         return UNSAFE.getDouble(getMetaspaceConstantPool() + config().constantPoolSize + offset);
     }
@@ -359,7 +359,7 @@
      * @return {@code JVM_CONSTANT_NameAndType} constant pool entry
      */
     private int getNameAndTypeAt(int index) {
-        assertTag(index, JVM_CONSTANT.NameAndType);
+        assert checkTag(index, JVM_CONSTANT.NameAndType);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         return UNSAFE.getInt(getMetaspaceConstantPool() + config().constantPoolSize + offset);
     }
@@ -441,7 +441,7 @@
      * @return klass reference index
      */
     private int getUncachedKlassRefIndexAt(int index) {
-        assertTagIsFieldOrMethod(index);
+        assert checkTagIsFieldOrMethod(index);
         int offset = index * runtime().getHostJVMCIBackend().getTarget().wordSize;
         final int refIndex = UNSAFE.getInt(getMetaspaceConstantPool() + config().constantPoolSize + offset);
         // klass ref index is in the low 16-bits.
@@ -449,23 +449,27 @@
     }
 
     /**
-     * Asserts that the constant pool index {@code index} is in the bounds of the constant pool.
+     * Checks that the constant pool index {@code index} is in the bounds of the constant pool.
      *
      * @param index constant pool index
+     * @throws AssertionError if the check fails
      */
-    private void assertBounds(int index) {
+    private boolean checkBounds(int index) {
         assert 0 <= index && index < length() : "index " + index + " not between 0 and " + length();
+        return true;
     }
 
     /**
-     * Asserts that the constant pool tag at index {@code index} is equal to {@code tag}.
+     * Checks that the constant pool tag at index {@code index} is equal to {@code tag}.
      *
      * @param index constant pool index
      * @param tag expected tag
+     * @throws AssertionError if the check fails
      */
-    private void assertTag(int index, JVM_CONSTANT tag) {
+    private boolean checkTag(int index, JVM_CONSTANT tag) {
         final JVM_CONSTANT tagAt = getTagAt(index);
         assert tagAt == tag : "constant pool tag at index " + index + " is " + tagAt + " but expected " + tag;
+        return true;
     }
 
     /**
@@ -473,10 +477,12 @@
      * or a {@link JVM_CONSTANT#MethodRef}, or a {@link JVM_CONSTANT#InterfaceMethodref}.
      *
      * @param index constant pool index
+     * @throws AssertionError if the check fails
      */
-    private void assertTagIsFieldOrMethod(int index) {
+    private boolean checkTagIsFieldOrMethod(int index) {
         final JVM_CONSTANT tagAt = getTagAt(index);
         assert tagAt == JVM_CONSTANT.Fieldref || tagAt == JVM_CONSTANT.MethodRef || tagAt == JVM_CONSTANT.InterfaceMethodref : tagAt;
+        return true;
     }
 
     @Override
@@ -523,7 +529,7 @@
 
     @Override
     public String lookupUtf8(int cpi) {
-        assertTag(cpi, JVM_CONSTANT.Utf8);
+        assert checkTag(cpi, JVM_CONSTANT.Utf8);
         return compilerToVM().getSymbol(getEntryAt(cpi));
     }
 
@@ -690,11 +696,10 @@
                     UNSAFE.ensureClassInitialized(klass);
                 }
                 if (tag == JVM_CONSTANT.MethodRef) {
-                    if (Bytecodes.isInvokeHandleAlias(opcode)) {
+                    if (Bytecodes.isInvokeHandleAlias(opcode) && isSignaturePolymorphicHolder(type)) {
                         final int methodRefCacheIndex = rawIndexToConstantPoolIndex(cpi, opcode);
-                        if (isInvokeHandle(methodRefCacheIndex, type)) {
-                            compilerToVM().resolveInvokeHandleInPool(this, methodRefCacheIndex);
-                        }
+                        assert checkTag(compilerToVM().constantPoolRemapInstructionOperandFromCache(this, methodRefCacheIndex), JVM_CONSTANT.MethodRef);
+                        compilerToVM().resolveInvokeHandleInPool(this, methodRefCacheIndex);
                     }
                 }
 
@@ -708,11 +713,26 @@
                 // nothing
                 break;
         }
+
     }
 
-    private boolean isInvokeHandle(int methodRefCacheIndex, HotSpotResolvedObjectTypeImpl klass) {
-        assertTag(compilerToVM().constantPoolRemapInstructionOperandFromCache(this, methodRefCacheIndex), JVM_CONSTANT.MethodRef);
-        return ResolvedJavaMethod.isSignaturePolymorphic(klass, getNameOf(methodRefCacheIndex), runtime().getHostJVMCIBackend().getMetaAccess());
+    // Lazily initialized.
+    private static String[] signaturePolymorphicHolders;
+
+    /**
+     * Determines if {@code type} contains signature polymorphic methods.
+     */
+    private static boolean isSignaturePolymorphicHolder(final HotSpotResolvedObjectTypeImpl type) {
+        String name = type.getName();
+        if (signaturePolymorphicHolders == null) {
+            signaturePolymorphicHolders = compilerToVM().getSignaturePolymorphicHolders();
+        }
+        for (String holder : signaturePolymorphicHolders) {
+            if (name.equals(holder)) {
+                return true;
+            }
+        }
+        return false;
     }
 
     @Override
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java	Wed Jul 05 22:13:53 2017 +0200
@@ -497,6 +497,9 @@
         for (Map.Entry<String, Long> e : typeSizes.entrySet()) {
             printConfigLine(vm, "[vmconfig:type size] %s = %d%n", e.getKey(), e.getValue());
         }
+        for (VMIntrinsicMethod e : store.getIntrinsics()) {
+            printConfigLine(vm, "[vmconfig:intrinsic] %d = %s.%s %s%n", e.id, e.declaringClass, e.name, e.descriptor);
+        }
     }
 
     public OutputStream getLogStream() {
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethod.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethod.java	Wed Jul 05 22:13:53 2017 +0200
@@ -112,6 +112,15 @@
     int intrinsicId();
 
     /**
+     * Determines if this method denotes itself as a candidate for intrinsification. As of JDK 9,
+     * this is denoted by the {@code HotSpotIntrinsicCandidate} annotation. In earlier JDK versions,
+     * this method returns true.
+     *
+     * @see <a href="https://bugs.openjdk.java.net/browse/JDK-8076112">JDK-8076112</a>
+     */
+    boolean isIntrinsicCandidate();
+
+    /**
      * Allocates a compile id for this method by asking the VM for one.
      *
      * @param entryBCI entry bci
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java	Wed Jul 05 22:13:53 2017 +0200
@@ -693,6 +693,10 @@
         return UNSAFE.getChar(metaspaceMethod + config.methodIntrinsicIdOffset);
     }
 
+    public boolean isIntrinsicCandidate() {
+        return (getFlags() & config().methodFlagsIntrinsicCandidate) != 0;
+    }
+
     @Override
     public JavaConstant invoke(JavaConstant receiver, JavaConstant[] arguments) {
         assert !isConstructor();
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java	Wed Jul 05 22:13:53 2017 +0200
@@ -144,6 +144,7 @@
 
     final int methodFlagsCallerSensitive = getConstant("Method::_caller_sensitive", Integer.class);
     final int methodFlagsForceInline = getConstant("Method::_force_inline", Integer.class);
+    final int methodFlagsIntrinsicCandidate = getConstant("Method::_intrinsic_candidate", Integer.class);
     final int methodFlagsDontInline = getConstant("Method::_dont_inline", Integer.class);
     final int methodFlagsReservedStackAccess = getConstant("Method::_reserved_stack_access", Integer.class);
     final int nonvirtualVtableIndex = getConstant("Method::nonvirtual_vtable_index", Integer.class);
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfigAccess.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfigAccess.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,6 +30,13 @@
 public class HotSpotVMConfigAccess {
 
     /**
+     * Gets the available configuration data.
+     */
+    public HotSpotVMConfigStore getStore() {
+        return store;
+    }
+
+    /**
      * Gets the address of a C++ symbol.
      *
      * @param name name of C++ symbol
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java	Wed Jul 05 22:13:53 2017 +0200
@@ -24,8 +24,10 @@
 
 import static jdk.vm.ci.common.InitTimer.timer;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import jdk.vm.ci.common.InitTimer;
@@ -80,11 +82,19 @@
         return Collections.unmodifiableMap(vmFields);
     }
 
+    /**
+     * Gets the VM intrinsic descriptions exposed by this object.
+     */
+    public List<VMIntrinsicMethod> getIntrinsics() {
+        return Collections.unmodifiableList(vmIntrinsics);
+    }
+
     final HashMap<String, VMField> vmFields;
     final HashMap<String, Long> vmTypeSizes;
     final HashMap<String, Long> vmConstants;
     final HashMap<String, Long> vmAddresses;
     final HashMap<String, VMFlag> vmFlags;
+    final List<VMIntrinsicMethod> vmIntrinsics;
 
     /**
      * Reads the database of VM info. The return value encodes the info in a nested object array
@@ -97,6 +107,7 @@
      *         [String name, Long value, ...] vmConstants,
      *         [String name, Long value, ...] vmAddresses,
      *         VMFlag[] vmFlags
+     *         VMIntrinsicMethod[] vmIntrinsics
      *     ]
      * </pre>
      */
@@ -106,7 +117,7 @@
         try (InitTimer t = timer("CompilerToVm readConfiguration")) {
             data = compilerToVm.readConfiguration();
         }
-        assert data.length == 5 : data.length;
+        assert data.length == 6 : data.length;
 
         // @formatter:off
         VMField[] vmFieldsInfo    = (VMField[]) data[0];
@@ -115,11 +126,12 @@
         Object[] vmAddressesInfo  = (Object[])  data[3];
         VMFlag[] vmFlagsInfo      = (VMFlag[])  data[4];
 
-        vmFields    = new HashMap<>(vmFieldsInfo.length);
-        vmTypeSizes = new HashMap<>(vmTypesSizesInfo.length);
-        vmConstants = new HashMap<>(vmConstantsInfo.length);
-        vmAddresses = new HashMap<>(vmAddressesInfo.length);
-        vmFlags     = new HashMap<>(vmFlagsInfo.length);
+        vmFields     = new HashMap<>(vmFieldsInfo.length);
+        vmTypeSizes  = new HashMap<>(vmTypesSizesInfo.length);
+        vmConstants  = new HashMap<>(vmConstantsInfo.length);
+        vmAddresses  = new HashMap<>(vmAddressesInfo.length);
+        vmFlags      = new HashMap<>(vmFlagsInfo.length);
+        vmIntrinsics = Arrays.asList((VMIntrinsicMethod[]) data[5]);
         // @formatter:on
 
         try (InitTimer t = timer("HotSpotVMConfigStore<init> fill maps")) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/VMIntrinsicMethod.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.vm.ci.hotspot;
+
+import jdk.vm.ci.meta.Signature;
+
+/**
+ * Describes a method for which the VM has an intrinsic implementation.
+ */
+public final class VMIntrinsicMethod {
+
+    /**
+     * The name of the class declaring the intrinsified method. The name is in
+     * <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.2.1">class
+     * file format</a> (e.g., {@code "java/lang/Thread"} instead of {@code "java.lang.Thread"}).
+     */
+    public final String declaringClass;
+
+    /**
+     * The name of the intrinsified method. This is not guaranteed to be a legal method name (e.g.,
+     * there is a HotSpot intrinsic with the name {@code "<compiledLambdaForm>"}).
+     */
+    public final String name;
+
+    /**
+     * The {@link Signature#toMethodDescriptor() descriptor} of the intrinsified method. This is not
+     * guaranteed to be a legal method descriptor (e.g., intrinsics for signature polymorphic
+     * methods have a descriptor of {@code "*"}).
+     */
+    public final String descriptor;
+
+    /**
+     * The unique VM identifier for the intrinsic.
+     */
+    public final int id;
+
+    VMIntrinsicMethod(String declaringClass, String name, String descriptor, int id) {
+        this.declaringClass = declaringClass;
+        this.name = name;
+        this.descriptor = descriptor;
+        this.id = id;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof VMIntrinsicMethod) {
+            VMIntrinsicMethod that = (VMIntrinsicMethod) obj;
+            if (that.id == this.id) {
+                assert that.name.equals(this.name) &&
+                                that.declaringClass.equals(this.declaringClass) &&
+                                that.descriptor.equals(this.descriptor);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("IntrinsicMethod[declaringClass=%s, name=%s, descriptor=%s, id=%d]", declaringClass, name, descriptor, id);
+    }
+}
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaMethod.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaMethod.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,7 +23,6 @@
 package jdk.vm.ci.meta;
 
 import java.lang.annotation.Annotation;
-import java.lang.invoke.MethodHandle;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Array;
 import java.lang.reflect.Method;
@@ -330,22 +329,4 @@
     }
 
     SpeculationLog getSpeculationLog();
-
-    /**
-     * Determines if the method identified by its holder and name is a
-     * <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.9">signature
-     * polymorphic</a> method.
-     */
-    static boolean isSignaturePolymorphic(JavaType holder, String name, MetaAccessProvider metaAccess) {
-        if (!holder.getName().equals("Ljava/lang/invoke/MethodHandle;")) {
-            return false;
-        }
-        ResolvedJavaType methodHandleType = metaAccess.lookupJavaType(MethodHandle.class);
-        Signature signature = metaAccess.parseMethodDescriptor("([Ljava/lang/Object;)Ljava/lang/Object;");
-        ResolvedJavaMethod method = methodHandleType.findMethod(name, signature);
-        if (method == null) {
-            return false;
-        }
-        return method.isNative() && method.isVarArgs();
-    }
 }
--- a/hotspot/src/os/linux/vm/os_linux.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/os/linux/vm/os_linux.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -2875,7 +2875,7 @@
                               // in the library.
   const size_t BitsPerCLong = sizeof(long) * CHAR_BIT;
 
-  size_t cpu_num = os::active_processor_count();
+  size_t cpu_num = processor_count();
   size_t cpu_map_size = NCPUS / BitsPerCLong;
   size_t cpu_map_valid_size =
     MIN2((cpu_num + BitsPerCLong - 1) / BitsPerCLong, cpu_map_size);
--- a/hotspot/src/os/windows/vm/os_windows.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/os/windows/vm/os_windows.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -2504,13 +2504,15 @@
   // It write enables the page immediately after protecting it
   // so just return.
   if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
-    JavaThread* thread = (JavaThread*) t;
-    PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
-    address addr = (address) exceptionRecord->ExceptionInformation[1];
-    if (os::is_memory_serialize_page(thread, addr)) {
-      // Block current thread until the memory serialize page permission restored.
-      os::block_on_serialize_page_trap();
-      return EXCEPTION_CONTINUE_EXECUTION;
+    if (t != NULL && t->is_Java_thread()) {
+      JavaThread* thread = (JavaThread*) t;
+      PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
+      address addr = (address) exceptionRecord->ExceptionInformation[1];
+      if (os::is_memory_serialize_page(thread, addr)) {
+        // Block current thread until the memory serialize page permission restored.
+        os::block_on_serialize_page_trap();
+        return EXCEPTION_CONTINUE_EXECUTION;
+      }
     }
   }
 
@@ -2564,7 +2566,7 @@
       }
 #endif
       if (thread->stack_guards_enabled()) {
-        if (_thread_in_Java) {
+        if (in_java) {
           frame fr;
           PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
           address addr = (address) exceptionRecord->ExceptionInformation[1];
@@ -2576,6 +2578,7 @@
         // Yellow zone violation.  The o/s has unprotected the first yellow
         // zone page for us.  Note:  must call disable_stack_yellow_zone to
         // update the enabled status, even if the zone contains only one page.
+        assert(thread->thread_state() != _thread_in_vm, "Undersized StackShadowPages");
         thread->disable_stack_yellow_reserved_zone();
         // If not in java code, return and hope for the best.
         return in_java
@@ -3793,6 +3796,11 @@
   GlobalMemoryStatusEx(&ms);
   _physical_memory = ms.ullTotalPhys;
 
+  if (FLAG_IS_DEFAULT(MaxRAM)) {
+    // Adjust MaxRAM according to the maximum virtual address space available.
+    FLAG_SET_DEFAULT(MaxRAM, MIN2(MaxRAM, (uint64_t) ms.ullTotalVirtual));
+  }
+
   OSVERSIONINFOEX oi;
   oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
   GetVersionEx((OSVERSIONINFO*)&oi);
--- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -444,7 +444,7 @@
 
 
     if (thread->thread_state() == _thread_in_vm) {
-      if (sig == SIGBUS && info->si_code == BUS_OBJERR && thread->doing_unsafe_access()) {
+      if (sig == SIGBUS && thread->doing_unsafe_access()) {
         stub = SharedRuntime::handle_unsafe_access(thread, npc);
       }
     }
--- a/hotspot/src/share/vm/c1/c1_Compiler.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_Compiler.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -221,6 +221,9 @@
   case vmIntrinsics::_putCharStringU:
 #ifdef TRACE_HAVE_INTRINSICS
   case vmIntrinsics::_counterTime:
+#if defined(_LP64) || !defined(TRACE_ID_CLASS_SHIFT)
+  case vmIntrinsics::_getClassId:
+#endif
 #endif
     break;
   default:
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -683,6 +683,7 @@
   , _cleanup_block(NULL)
   , _cleanup_return_prev(NULL)
   , _cleanup_state(NULL)
+  , _ignore_return(false)
 {
   if (parent != NULL) {
     _max_inline_size = (intx) ((float) NestedInliningSizeRatio * (float) parent->max_inline_size() / 100.0f);
@@ -1445,7 +1446,7 @@
 }
 
 
-void GraphBuilder::method_return(Value x) {
+void GraphBuilder::method_return(Value x, bool ignore_return) {
   if (RegisterFinalizersAtInit &&
       method()->intrinsic_id() == vmIntrinsics::_Object_init) {
     call_register_finalizer();
@@ -1518,7 +1519,9 @@
     int invoke_bci = state()->caller_state()->bci();
     set_state(state()->caller_state()->copy_for_parsing());
     if (x != NULL) {
-      state()->push(x->type(), x);
+      if (!ignore_return) {
+        state()->push(x->type(), x);
+      }
       if (profile_return() && x->type()->is_object_kind()) {
         ciMethod* caller = state()->scope()->method();
         ciMethodData* md = caller->method_data_or_null();
@@ -1563,6 +1566,7 @@
       append(new MemBar(lir_membar_storestore));
   }
 
+  assert(!ignore_return, "Ignoring return value works only for inlining");
   append(new Return(x));
 }
 
@@ -1981,7 +1985,7 @@
         code == Bytecodes::_invokedynamic) {
       ciMethod* inline_target = (cha_monomorphic_target != NULL) ? cha_monomorphic_target : target;
       // static binding => check if callee is ok
-      bool success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), code, better_receiver);
+      bool success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), false, code, better_receiver);
 
       CHECK_BAILOUT();
       clear_inline_bailout();
@@ -2611,6 +2615,8 @@
     push_exception = true;
   }
 
+  bool ignore_return = scope_data()->ignore_return();
+
   while (!bailed_out() && last()->as_BlockEnd() == NULL &&
          (code = stream()->next()) != ciBytecodeStream::EOBC() &&
          (block_at(s.cur_bci()) == NULL || block_at(s.cur_bci()) == block())) {
@@ -2806,12 +2812,12 @@
       case Bytecodes::_ret            : ret(s.get_index()); break;
       case Bytecodes::_tableswitch    : table_switch(); break;
       case Bytecodes::_lookupswitch   : lookup_switch(); break;
-      case Bytecodes::_ireturn        : method_return(ipop()); break;
-      case Bytecodes::_lreturn        : method_return(lpop()); break;
-      case Bytecodes::_freturn        : method_return(fpop()); break;
-      case Bytecodes::_dreturn        : method_return(dpop()); break;
-      case Bytecodes::_areturn        : method_return(apop()); break;
-      case Bytecodes::_return         : method_return(NULL  ); break;
+      case Bytecodes::_ireturn        : method_return(ipop(), ignore_return); break;
+      case Bytecodes::_lreturn        : method_return(lpop(), ignore_return); break;
+      case Bytecodes::_freturn        : method_return(fpop(), ignore_return); break;
+      case Bytecodes::_dreturn        : method_return(dpop(), ignore_return); break;
+      case Bytecodes::_areturn        : method_return(apop(), ignore_return); break;
+      case Bytecodes::_return         : method_return(NULL  , ignore_return); break;
       case Bytecodes::_getstatic      : // fall through
       case Bytecodes::_putstatic      : // fall through
       case Bytecodes::_getfield       : // fall through
@@ -3336,7 +3342,7 @@
 }
 
 
-bool GraphBuilder::try_inline(ciMethod* callee, bool holder_known, Bytecodes::Code bc, Value receiver) {
+bool GraphBuilder::try_inline(ciMethod* callee, bool holder_known, bool ignore_return, Bytecodes::Code bc, Value receiver) {
   const char* msg = NULL;
 
   // clear out any existing inline bailout condition
@@ -3351,7 +3357,7 @@
 
   // method handle invokes
   if (callee->is_method_handle_intrinsic()) {
-    if (try_method_handle_inline(callee)) {
+    if (try_method_handle_inline(callee, ignore_return)) {
       if (callee->has_reserved_stack_access()) {
         compilation()->set_has_reserved_stack_access(true);
       }
@@ -3363,7 +3369,7 @@
   // handle intrinsics
   if (callee->intrinsic_id() != vmIntrinsics::_none &&
       (CheckIntrinsics ? callee->intrinsic_candidate() : true)) {
-    if (try_inline_intrinsics(callee)) {
+    if (try_inline_intrinsics(callee, ignore_return)) {
       print_inlining(callee, "intrinsic");
       if (callee->has_reserved_stack_access()) {
         compilation()->set_has_reserved_stack_access(true);
@@ -3384,7 +3390,7 @@
   if (bc == Bytecodes::_illegal) {
     bc = code();
   }
-  if (try_inline_full(callee, holder_known, bc, receiver)) {
+  if (try_inline_full(callee, holder_known, ignore_return, bc, receiver)) {
     if (callee->has_reserved_stack_access()) {
       compilation()->set_has_reserved_stack_access(true);
     }
@@ -3415,7 +3421,7 @@
   return NULL;
 }
 
-void GraphBuilder::build_graph_for_intrinsic(ciMethod* callee) {
+void GraphBuilder::build_graph_for_intrinsic(ciMethod* callee, bool ignore_return) {
   vmIntrinsics::ID id = callee->intrinsic_id();
   assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
 
@@ -3509,14 +3515,16 @@
                                     vmIntrinsics::can_trap(id));
   // append instruction & push result
   Value value = append_split(result);
-  if (result_type != voidType) push(result_type, value);
+  if (result_type != voidType && !ignore_return) {
+    push(result_type, value);
+  }
 
   if (callee != method() && profile_return() && result_type->is_object_kind()) {
     profile_return_type(result, callee);
   }
 }
 
-bool GraphBuilder::try_inline_intrinsics(ciMethod* callee) {
+bool GraphBuilder::try_inline_intrinsics(ciMethod* callee, bool ignore_return) {
   // For calling is_intrinsic_available we need to transition to
   // the '_thread_in_vm' state because is_intrinsic_available()
   // accesses critical VM-internal data.
@@ -3536,7 +3544,7 @@
       return false;
     }
   }
-  build_graph_for_intrinsic(callee);
+  build_graph_for_intrinsic(callee, ignore_return);
   return true;
 }
 
@@ -3691,7 +3699,7 @@
 }
 
 
-bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known, Bytecodes::Code bc, Value receiver) {
+bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known, bool ignore_return, Bytecodes::Code bc, Value receiver) {
   assert(!callee->is_native(), "callee must not be native");
   if (CompilationPolicy::policy()->should_not_inline(compilation()->env(), callee)) {
     INLINE_BAILOUT("inlining prohibited by policy");
@@ -3889,6 +3897,7 @@
 
   // Clear out bytecode stream
   scope_data()->set_stream(NULL);
+  scope_data()->set_ignore_return(ignore_return);
 
   CompileLog* log = compilation()->log();
   if (log != NULL) log->head("parse method='%d'", log->identify(callee));
@@ -3958,7 +3967,7 @@
 }
 
 
-bool GraphBuilder::try_method_handle_inline(ciMethod* callee) {
+bool GraphBuilder::try_method_handle_inline(ciMethod* callee, bool ignore_return) {
   ValueStack* state_before = copy_state_before();
   vmIntrinsics::ID iid = callee->intrinsic_id();
   switch (iid) {
@@ -3972,7 +3981,8 @@
         // We don't do CHA here so only inline static and statically bindable methods.
         if (target->is_static() || target->can_be_statically_bound()) {
           Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual;
-          if (try_inline(target, /*holder_known*/ true, bc)) {
+          ignore_return = ignore_return || (callee->return_type()->is_void() && !target->return_type()->is_void());
+          if (try_inline(target, /*holder_known*/ true, ignore_return, bc)) {
             return true;
           }
         } else {
@@ -3994,10 +4004,11 @@
       ValueType* type = apop()->type();
       if (type->is_constant()) {
         ciMethod* target = type->as_ObjectType()->constant_value()->as_member_name()->get_vmtarget();
+        ignore_return = ignore_return || (callee->return_type()->is_void() && !target->return_type()->is_void());
         // If the target is another method handle invoke, try to recursively get
         // a better target.
         if (target->is_method_handle_intrinsic()) {
-          if (try_method_handle_inline(target)) {
+          if (try_method_handle_inline(target, ignore_return)) {
             return true;
           }
         } else {
@@ -4032,7 +4043,7 @@
           // We don't do CHA here so only inline static and statically bindable methods.
           if (target->is_static() || target->can_be_statically_bound()) {
             Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual;
-            if (try_inline(target, /*holder_known*/ true, bc)) {
+            if (try_inline(target, /*holder_known*/ true, ignore_return, bc)) {
               return true;
             }
           } else {
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -100,6 +100,9 @@
     Instruction* _cleanup_return_prev; // Instruction before return instruction
     ValueStack*  _cleanup_state;       // State of that block (not yet pinned)
 
+    // When inlining do not push the result on the stack
+    bool         _ignore_return;
+
    public:
     ScopeData(ScopeData* parent);
 
@@ -163,6 +166,9 @@
     BlockBegin*  inline_cleanup_block() const      { return _cleanup_block; }
     Instruction* inline_cleanup_return_prev() const{ return _cleanup_return_prev; }
     ValueStack*  inline_cleanup_state() const      { return _cleanup_state; }
+
+    bool ignore_return() const                     { return _ignore_return;          }
+    void set_ignore_return(bool ignore_return)     { _ignore_return = ignore_return; }
   };
 
   // for all GraphBuilders
@@ -246,7 +252,7 @@
   void ret(int local_index);
   void table_switch();
   void lookup_switch();
-  void method_return(Value x);
+  void method_return(Value x, bool ignore_return = false);
   void call_register_finalizer();
   void access_field(Bytecodes::Code code);
   void invoke(Bytecodes::Code code);
@@ -340,19 +346,19 @@
   void inline_sync_entry(Value lock, BlockBegin* sync_handler);
   void fill_sync_handler(Value lock, BlockBegin* sync_handler, bool default_handler = false);
 
-  void build_graph_for_intrinsic(ciMethod* callee);
+  void build_graph_for_intrinsic(ciMethod* callee, bool ignore_return);
 
   // inliners
-  bool try_inline(           ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL);
-  bool try_inline_intrinsics(ciMethod* callee);
-  bool try_inline_full(      ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL);
+  bool try_inline(           ciMethod* callee, bool holder_known, bool ignore_return, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL);
+  bool try_inline_intrinsics(ciMethod* callee, bool ignore_return = false);
+  bool try_inline_full(      ciMethod* callee, bool holder_known, bool ignore_return, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL);
   bool try_inline_jsr(int jsr_dest_bci);
 
   const char* check_can_parse(ciMethod* callee) const;
   const char* should_not_inline(ciMethod* callee) const;
 
   // JSR 292 support
-  bool try_method_handle_inline(ciMethod* callee);
+  bool try_method_handle_inline(ciMethod* callee, bool ignore_return);
 
   // helpers
   void inline_bailout(const char* msg);
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -3083,6 +3083,37 @@
   __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type()));
 }
 
+#ifdef TRACE_HAVE_INTRINSICS
+void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) {
+  CodeEmitInfo* info = state_for(x);
+  CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check
+
+  assert(info != NULL, "must have info");
+  LIRItem arg(x->argument_at(0), this);
+
+  arg.load_item();
+  LIR_Opr klass = new_register(T_METADATA);
+  __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_ADDRESS), klass, info);
+  LIR_Opr id = new_register(T_LONG);
+  ByteSize offset = TRACE_KLASS_TRACE_ID_OFFSET;
+  LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
+
+  __ move(trace_id_addr, id);
+  __ logical_or(id, LIR_OprFact::longConst(0x01l), id);
+  __ store(id, trace_id_addr);
+
+#ifdef TRACE_ID_META_BITS
+  __ logical_and(id, LIR_OprFact::longConst(~TRACE_ID_META_BITS), id);
+#endif
+#ifdef TRACE_ID_CLASS_SHIFT
+  __ unsigned_shift_right(id, TRACE_ID_CLASS_SHIFT, id);
+#endif
+
+  __ move(id, rlock_result(x));
+}
+#endif
+
+
 void LIRGenerator::do_RuntimeCall(address routine, Intrinsic* x) {
   assert(x->number_of_arguments() == 0, "wrong type");
   // Enforce computation of _reserved_argument_area_size which is required on some platforms.
@@ -3108,6 +3139,9 @@
   }
 
 #ifdef TRACE_HAVE_INTRINSICS
+  case vmIntrinsics::_getClassId:
+    do_ClassIDIntrinsic(x);
+    break;
   case vmIntrinsics::_counterTime:
     do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x);
     break;
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -438,6 +438,10 @@
   SwitchRangeArray* create_lookup_ranges(LookupSwitch* x);
   void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
 
+#ifdef TRACE_HAVE_INTRINSICS
+  void do_ClassIDIntrinsic(Intrinsic* x);
+#endif
+
   void do_RuntimeCall(address routine, Intrinsic* x);
 
   ciKlass* profile_type(ciMethodData* md, int md_first_offset, int md_offset, intptr_t profiled_k,
--- a/hotspot/src/share/vm/ci/ciReplay.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/ci/ciReplay.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -29,7 +29,6 @@
 #include "ci/ciKlass.hpp"
 #include "ci/ciUtilities.hpp"
 #include "compiler/compileBroker.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/oopFactory.hpp"
 #include "memory/resourceArea.hpp"
@@ -577,9 +576,7 @@
     Method* method = parse_method(CHECK);
     if (had_error()) return;
     /* just copied from Method, to build interpret data*/
-    if (ReferencePendingListLocker::is_locked_by_self()) {
-      return;
-    }
+
     // To be properly initialized, some profiling in the MDO needs the
     // method to be rewritten (number of arguments at a call for
     // instance)
--- a/hotspot/src/share/vm/classfile/altHashing.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/altHashing.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -205,103 +205,3 @@
 juint AltHashing::murmur3_32(const int* data, int len) {
   return murmur3_32(0, data, len);
 }
-
-#ifndef PRODUCT
-// Overloaded versions for internal test.
-juint AltHashing::murmur3_32(const jbyte* data, int len) {
-  return murmur3_32(0, data, len);
-}
-
-juint AltHashing::murmur3_32(const jchar* data, int len) {
-  return murmur3_32(0, data, len);
-}
-
-// Internal test for alternate hashing.  Translated from JDK version
-// test/sun/misc/Hashing.java
-static const jbyte ONE_BYTE[] = { (jbyte) 0x80};
-static const jbyte TWO_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81};
-static const jchar ONE_CHAR[] = { (jchar) 0x8180};
-static const jbyte THREE_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82};
-static const jbyte FOUR_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83};
-static const jchar TWO_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382};
-static const jint ONE_INT[] = { (jint)0x83828180};
-static const jbyte SIX_BYTE[] = { (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85};
-static const jchar THREE_CHAR[] = { (jchar) 0x8180, (jchar) 0x8382, (jchar) 0x8584};
-static const jbyte EIGHT_BYTE[] = {
-  (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82,
-  (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85,
-  (jbyte) 0x86, (jbyte) 0x87};
-static const jchar FOUR_CHAR[] = {
-  (jchar) 0x8180, (jchar) 0x8382,
-  (jchar) 0x8584, (jchar) 0x8786};
-
-static const jint TWO_INT[] = { (jint)0x83828180, (jint)0x87868584};
-
-static const juint MURMUR3_32_X86_CHECK_VALUE = 0xB0F57EE3;
-
-void AltHashing::testMurmur3_32_ByteArray() {
-  // printf("testMurmur3_32_ByteArray\n");
-
-  jbyte vector[256];
-  jbyte hashes[4 * 256];
-
-  for (int i = 0; i < 256; i++) {
-    vector[i] = (jbyte) i;
-  }
-
-  // Hash subranges {}, {0}, {0,1}, {0,1,2}, ..., {0,...,255}
-  for (int i = 0; i < 256; i++) {
-    juint hash = murmur3_32(256 - i, vector, i);
-    hashes[i * 4] = (jbyte) hash;
-    hashes[i * 4 + 1] = (jbyte)(hash >> 8);
-    hashes[i * 4 + 2] = (jbyte)(hash >> 16);
-    hashes[i * 4 + 3] = (jbyte)(hash >> 24);
-  }
-
-  // hash to get const result.
-  juint final_hash = murmur3_32(hashes, 4*256);
-
-  assert (MURMUR3_32_X86_CHECK_VALUE == final_hash,
-          "Calculated hash result not as expected. Expected %08X got %08X\n",
-          MURMUR3_32_X86_CHECK_VALUE,
-          final_hash);
-}
-
-void AltHashing::testEquivalentHashes() {
-  juint jbytes, jchars, ints;
-
-  // printf("testEquivalentHashes\n");
-
-  jbytes = murmur3_32(TWO_BYTE, 2);
-  jchars = murmur3_32(ONE_CHAR, 1);
-  assert (jbytes == jchars,
-          "Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars);
-
-  jbytes = murmur3_32(FOUR_BYTE, 4);
-  jchars = murmur3_32(TWO_CHAR, 2);
-  ints = murmur3_32(ONE_INT, 1);
-  assert ((jbytes == jchars) && (jbytes == ints),
-          "Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints);
-
-  jbytes = murmur3_32(SIX_BYTE, 6);
-  jchars = murmur3_32(THREE_CHAR, 3);
-  assert (jbytes == jchars,
-         "Hashes did not match. b:%08x != c:%08x\n", jbytes, jchars);
-
-  jbytes = murmur3_32(EIGHT_BYTE, 8);
-  jchars = murmur3_32(FOUR_CHAR, 4);
-  ints = murmur3_32(TWO_INT, 2);
-  assert ((jbytes == jchars) && (jbytes == ints),
-          "Hashes did not match. b:%08x != c:%08x != i:%08x\n", jbytes, jchars, ints);
-}
-
-// Returns true if the alternate hashcode is correct
-void AltHashing::test_alt_hash() {
-  testMurmur3_32_ByteArray();
-  testEquivalentHashes();
-}
-
-void AltHashing_test() {
-  AltHashing::test_alt_hash();
-}
-#endif // PRODUCT
--- a/hotspot/src/share/vm/classfile/altHashing.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/altHashing.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,26 +37,18 @@
  */
 
 class AltHashing : AllStatic {
+  friend class AltHashingTest;
 
   // utility function copied from java/lang/Integer
   static juint Integer_rotateLeft(juint i, int distance) {
-    return (i << distance) | (i >> (32-distance));
+    return (i << distance) | (i >> (32 - distance));
   }
   static juint murmur3_32(const int* data, int len);
   static juint murmur3_32(juint seed, const int* data, int len);
 
-#ifndef PRODUCT
-  // Hashing functions used for internal testing
-  static juint murmur3_32(const jbyte* data, int len);
-  static juint murmur3_32(const jchar* data, int len);
-  static void testMurmur3_32_ByteArray();
-  static void testEquivalentHashes();
-#endif // PRODUCT
-
  public:
   static juint compute_seed();
   static juint murmur3_32(juint seed, const jbyte* data, int len);
   static juint murmur3_32(juint seed, const jchar* data, int len);
-  NOT_PRODUCT(static void test_alt_hash();)
 };
 #endif // SHARE_VM_CLASSFILE_ALTHASHING_HPP
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -95,7 +95,6 @@
 #define JAVA_6_VERSION                    50
 
 // Used for backward compatibility reasons:
-// - to check NameAndType_info signatures more aggressively
 // - to disallow argument and require ACC_STATIC for <clinit> methods
 #define JAVA_7_VERSION                    51
 
@@ -564,7 +563,7 @@
         break;
       }
       case JVM_CONSTANT_NameAndType: {
-        if (_need_verify && _major_version >= JAVA_7_VERSION) {
+        if (_need_verify) {
           const int sig_index = cp->signature_ref_index_at(index);
           const int name_index = cp->name_ref_index_at(index);
           const Symbol* const name = cp->symbol_at(name_index);
@@ -572,9 +571,17 @@
           guarantee_property(sig->utf8_length() != 0,
             "Illegal zero length constant pool entry at %d in class %s",
             sig_index, CHECK);
+          guarantee_property(name->utf8_length() != 0,
+            "Illegal zero length constant pool entry at %d in class %s",
+            name_index, CHECK);
+
           if (sig->byte_at(0) == JVM_SIGNATURE_FUNC) {
+            // Format check method name and signature
+            verify_legal_method_name(name, CHECK);
             verify_legal_method_signature(name, sig, CHECK);
           } else {
+            // Format check field name and signature
+            verify_legal_field_name(name, CHECK);
             verify_legal_field_signature(name, sig, CHECK);
           }
         }
@@ -595,42 +602,32 @@
         const Symbol* const name = cp->symbol_at(name_ref_index);
         const Symbol* const signature = cp->symbol_at(signature_ref_index);
         if (tag == JVM_CONSTANT_Fieldref) {
-          verify_legal_field_name(name, CHECK);
-          if (_need_verify && _major_version >= JAVA_7_VERSION) {
-            // Signature is verified above, when iterating NameAndType_info.
-            // Need only to be sure it's non-zero length and the right type.
+          if (_need_verify) {
+            // Field name and signature are verified above, when iterating NameAndType_info.
+            // Need only to be sure signature is non-zero length and the right type.
             if (signature->utf8_length() == 0 ||
                 signature->byte_at(0) == JVM_SIGNATURE_FUNC) {
-              throwIllegalSignature(
-                "Field", name, signature, CHECK);
+              throwIllegalSignature("Field", name, signature, CHECK);
             }
-          } else {
-            verify_legal_field_signature(name, signature, CHECK);
           }
         } else {
-          verify_legal_method_name(name, CHECK);
-          if (_need_verify && _major_version >= JAVA_7_VERSION) {
-            // Signature is verified above, when iterating NameAndType_info.
-            // Need only to be sure it's non-zero length and the right type.
+          if (_need_verify) {
+            // Method name and signature are verified above, when iterating NameAndType_info.
+            // Need only to be sure signature is non-zero length and the right type.
             if (signature->utf8_length() == 0 ||
                 signature->byte_at(0) != JVM_SIGNATURE_FUNC) {
-              throwIllegalSignature(
-                "Method", name, signature, CHECK);
+              throwIllegalSignature("Method", name, signature, CHECK);
             }
-          } else {
-            verify_legal_method_signature(name, signature, CHECK);
           }
-          if (tag == JVM_CONSTANT_Methodref) {
-            // 4509014: If a class method name begins with '<', it must be "<init>".
-            assert(name != NULL, "method name in constant pool is null");
-            const unsigned int name_len = name->utf8_length();
-            if (name_len != 0 && name->byte_at(0) == '<') {
-              if (name != vmSymbols::object_initializer_name()) {
-                classfile_parse_error(
-                  "Bad method name at constant pool index %u in class file %s",
-                  name_ref_index, CHECK);
-              }
-            }
+          // 4509014: If a class method name begins with '<', it must be "<init>"
+          const unsigned int name_len = name->utf8_length();
+          if (tag == JVM_CONSTANT_Methodref &&
+              name_len != 0 &&
+              name->byte_at(0) == '<' &&
+              name != vmSymbols::object_initializer_name()) {
+            classfile_parse_error(
+              "Bad method name at constant pool index %u in class file %s",
+              name_ref_index, CHECK);
           }
         }
         break;
@@ -4843,19 +4840,28 @@
         }
       }
       else {
-        // 4900761: For class version > 48, any unicode is allowed in class name.
+        // Skip leading 'L' and ignore first appearance of ';'
         length--;
         signature++;
-        while (length > 0 && signature[0] != ';') {
-          if (signature[0] == '.') {
-            classfile_parse_error("Class name contains illegal character '.' in descriptor in class file %s", CHECK_0);
+        char* c = strchr((char*) signature, ';');
+        // Format check signature
+        if (c != NULL) {
+          ResourceMark rm(THREAD);
+          int newlen = c - (char*) signature;
+          char* sig = NEW_RESOURCE_ARRAY(char, newlen + 1);
+          strncpy(sig, signature, newlen);
+          sig[newlen] = '\0';
+
+          bool legal = verify_unqualified_name(sig, newlen, LegalClass);
+          if (!legal) {
+            classfile_parse_error("Class name contains illegal character "
+                                  "in descriptor in class file %s",
+                                  CHECK_0);
+            return NULL;
           }
-          length--;
-          signature++;
+          return signature + newlen + 1;
         }
-        if (signature[0] == ';') { return signature + 1; }
       }
-
       return NULL;
     }
     case JVM_SIGNATURE_ARRAY:
@@ -4869,7 +4875,6 @@
       length--;
       void_ok = false;
       break;
-
     default:
       return NULL;
     }
@@ -5402,11 +5407,75 @@
   debug_only(ik->verify();)
 }
 
+// For an anonymous class that is in the unnamed package, move it to its host class's
+// package by prepending its host class's package name to its class name and setting
+// its _class_name field.
+void ClassFileParser::prepend_host_package_name(const InstanceKlass* host_klass, TRAPS) {
+  ResourceMark rm(THREAD);
+  assert(strrchr(_class_name->as_C_string(), '/') == NULL,
+         "Anonymous class should not be in a package");
+  const char* host_pkg_name =
+    ClassLoader::package_from_name(host_klass->name()->as_C_string(), NULL);
+
+  if (host_pkg_name != NULL) {
+    size_t host_pkg_len = strlen(host_pkg_name);
+    int class_name_len = _class_name->utf8_length();
+    char* new_anon_name =
+      NEW_RESOURCE_ARRAY(char, host_pkg_len + 1 + class_name_len);
+    // Copy host package name and trailing /.
+    strncpy(new_anon_name, host_pkg_name, host_pkg_len);
+    new_anon_name[host_pkg_len] = '/';
+    // Append anonymous class name. The anonymous class name can contain odd
+    // characters.  So, do a strncpy instead of using sprintf("%s...").
+    strncpy(new_anon_name + host_pkg_len + 1, (char *)_class_name->base(), class_name_len);
+
+    // Create a symbol and update the anonymous class name.
+    _class_name = SymbolTable::new_symbol(new_anon_name,
+                                          (int)host_pkg_len + 1 + class_name_len,
+                                          CHECK);
+  }
+}
+
+// If the host class and the anonymous class are in the same package then do
+// nothing.  If the anonymous class is in the unnamed package then move it to its
+// host's package.  If the classes are in different packages then throw an IAE
+// exception.
+void ClassFileParser::fix_anonymous_class_name(TRAPS) {
+  assert(_host_klass != NULL, "Expected an anonymous class");
+
+  const jbyte* anon_last_slash = UTF8::strrchr(_class_name->base(),
+                                               _class_name->utf8_length(), '/');
+  if (anon_last_slash == NULL) {  // Unnamed package
+    prepend_host_package_name(_host_klass, CHECK);
+  } else {
+    if (!InstanceKlass::is_same_class_package(_host_klass->class_loader(),
+                                              _host_klass->name(),
+                                              _host_klass->class_loader(),
+                                              _class_name)) {
+      ResourceMark rm(THREAD);
+      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
+        err_msg("Host class %s and anonymous class %s are in different packages",
+        _host_klass->name()->as_C_string(), _class_name->as_C_string()));
+    }
+  }
+}
+
+static bool relax_format_check_for(ClassLoaderData* loader_data) {
+  bool trusted = (loader_data->is_the_null_class_loader_data() ||
+                  SystemDictionary::is_platform_class_loader(loader_data->class_loader()));
+  bool need_verify =
+    // verifyAll
+    (BytecodeVerificationLocal && BytecodeVerificationRemote) ||
+    // verifyRemote
+    (!BytecodeVerificationLocal && BytecodeVerificationRemote && !trusted);
+  return !need_verify;
+}
+
 ClassFileParser::ClassFileParser(ClassFileStream* stream,
                                  Symbol* name,
                                  ClassLoaderData* loader_data,
                                  Handle protection_domain,
-                                 const Klass* host_klass,
+                                 const InstanceKlass* host_klass,
                                  GrowableArray<Handle>* cp_patches,
                                  Publicity pub_level,
                                  TRAPS) :
@@ -5490,7 +5559,7 @@
 
   // Check if verification needs to be relaxed for this class file
   // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376)
-  _relax_verify = Verifier::relax_verify_for(_loader_data->class_loader());
+  _relax_verify = relax_format_check_for(_loader_data);
 
   parse_stream(stream, CHECK);
 
@@ -5681,6 +5750,13 @@
     return;
   }
 
+  // if this is an anonymous class fix up its name if it's in the unnamed
+  // package.  Otherwise, throw IAE if it is in a different package than
+  // its host class.
+  if (_host_klass != NULL) {
+    fix_anonymous_class_name(CHECK);
+  }
+
   // Verification prevents us from creating names with dots in them, this
   // asserts that that's the case.
   assert(is_internal_format(_class_name), "external class name format used internally");
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classFileParser.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -79,7 +79,7 @@
   const Symbol* _requested_name;
   Symbol* _class_name;
   mutable ClassLoaderData* _loader_data;
-  const Klass* _host_klass;
+  const InstanceKlass* _host_klass;
   GrowableArray<Handle>* _cp_patches; // overrides for CP entries
 
   // Metadata created before the instance klass is created.  Must be deallocated
@@ -155,6 +155,9 @@
                                   ConstantPool* cp,
                                   TRAPS);
 
+  void prepend_host_package_name(const InstanceKlass* host_klass, TRAPS);
+  void fix_anonymous_class_name(TRAPS);
+
   void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH, TRAPS);
   void set_klass(InstanceKlass* instance);
 
@@ -474,7 +477,7 @@
                   Symbol* name,
                   ClassLoaderData* loader_data,
                   Handle protection_domain,
-                  const Klass* host_klass,
+                  const InstanceKlass* host_klass,
                   GrowableArray<Handle>* cp_patches,
                   Publicity pub_level,
                   TRAPS);
@@ -500,7 +503,7 @@
   bool is_anonymous() const { return _host_klass != NULL; }
   bool is_interface() const { return _access_flags.is_interface(); }
 
-  const Klass* host_klass() const { return _host_klass; }
+  const InstanceKlass* host_klass() const { return _host_klass; }
   const GrowableArray<Handle>* cp_patches() const { return _cp_patches; }
   ClassLoaderData* loader_data() const { return _loader_data; }
   const Symbol* class_name() const { return _class_name; }
--- a/hotspot/src/share/vm/classfile/classLoader.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -50,12 +50,14 @@
 
 class ClassPathEntry : public CHeapObj<mtClass> {
 private:
-  ClassPathEntry* _next;
+  ClassPathEntry* volatile _next;
 public:
   // Next entry in class path
-  ClassPathEntry* next() const { return _next; }
+  ClassPathEntry* next() const {
+    return (ClassPathEntry*) OrderAccess::load_ptr_acquire(&_next);
+  }
   void set_next(ClassPathEntry* next) {
-    // may have unlocked readers, so write atomically.
+    // may have unlocked readers, so ensure visibility.
     OrderAccess::release_store_ptr(&_next, next);
   }
   virtual bool is_jrt() = 0;
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -966,7 +966,7 @@
   // Klasses to delete.
   bool walk_all_metadata = clean_previous_versions &&
                            JvmtiExport::has_redefined_a_class() &&
-                           InstanceKlass::has_previous_versions();
+                           InstanceKlass::has_previous_versions_and_reset();
   MetadataOnStackMark md_on_stack(walk_all_metadata);
 
   // Save previous _unloading pointer for CMS which may add to unloading list before
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -3015,41 +3015,6 @@
   }
 }
 
-
-// Support for java_lang_ref_Reference
-HeapWord *java_lang_ref_Reference::pending_list_lock_addr() {
-  InstanceKlass* ik = SystemDictionary::Reference_klass();
-  address addr = ik->static_field_addr(static_lock_offset);
-  return (HeapWord*) addr;
-}
-
-oop java_lang_ref_Reference::pending_list_lock() {
-  InstanceKlass* ik = SystemDictionary::Reference_klass();
-  address addr = ik->static_field_addr(static_lock_offset);
-  if (UseCompressedOops) {
-    return oopDesc::load_decode_heap_oop((narrowOop *)addr);
-  } else {
-    return oopDesc::load_decode_heap_oop((oop*)addr);
-  }
-}
-
-HeapWord *java_lang_ref_Reference::pending_list_addr() {
-  InstanceKlass* ik = SystemDictionary::Reference_klass();
-  address addr = ik->static_field_addr(static_pending_offset);
-  // XXX This might not be HeapWord aligned, almost rather be char *.
-  return (HeapWord*)addr;
-}
-
-oop java_lang_ref_Reference::pending_list() {
-  char *addr = (char *)pending_list_addr();
-  if (UseCompressedOops) {
-    return oopDesc::load_decode_heap_oop((narrowOop *)addr);
-  } else {
-    return oopDesc::load_decode_heap_oop((oop*)addr);
-  }
-}
-
-
 // Support for java_lang_ref_SoftReference
 
 jlong java_lang_ref_SoftReference::timestamp(oop ref) {
@@ -3616,8 +3581,6 @@
 int java_lang_ref_Reference::queue_offset;
 int java_lang_ref_Reference::next_offset;
 int java_lang_ref_Reference::discovered_offset;
-int java_lang_ref_Reference::static_lock_offset;
-int java_lang_ref_Reference::static_pending_offset;
 int java_lang_ref_Reference::number_of_fake_oop_fields;
 int java_lang_ref_SoftReference::timestamp_offset;
 int java_lang_ref_SoftReference::static_clock_offset;
@@ -3772,8 +3735,6 @@
   java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header;
   java_lang_ref_Reference::next_offset  = java_lang_ref_Reference::hc_next_offset * x + header;
   java_lang_ref_Reference::discovered_offset  = java_lang_ref_Reference::hc_discovered_offset * x + header;
-  java_lang_ref_Reference::static_lock_offset = java_lang_ref_Reference::hc_static_lock_offset *  x;
-  java_lang_ref_Reference::static_pending_offset = java_lang_ref_Reference::hc_static_pending_offset * x;
   // Artificial fields for java_lang_ref_Reference
   // The first field is for the discovered field added in 1.4
   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
@@ -4006,8 +3967,6 @@
   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;");
   // Fake field
   //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;");
-  CHECK_STATIC_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, lock, "Ljava/lang/ref/Reference$Lock;");
-  CHECK_STATIC_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, pending, "Ljava/lang/ref/Reference;");
 
   // java.lang.ref.SoftReference
 
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -886,17 +886,11 @@
    hc_next_offset       = 2,
    hc_discovered_offset = 3  // Is not last, see SoftRefs.
   };
-  enum {
-   hc_static_lock_offset    = 0,
-   hc_static_pending_offset = 1
-  };
 
   static int referent_offset;
   static int queue_offset;
   static int next_offset;
   static int discovered_offset;
-  static int static_lock_offset;
-  static int static_pending_offset;
   static int number_of_fake_oop_fields;
 
   // Accessors
@@ -912,13 +906,6 @@
   static inline void set_discovered(oop ref, oop value);
   static inline void set_discovered_raw(oop ref, oop value);
   static inline HeapWord* discovered_addr(oop ref);
-
-  // Accessors for statics
-  static oop  pending_list_lock();
-  static oop  pending_list();
-
-  static HeapWord*  pending_list_lock_addr();
-  static HeapWord*  pending_list_addr();
 };
 
 
--- a/hotspot/src/share/vm/classfile/klassFactory.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/klassFactory.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -94,7 +94,7 @@
                                                      Symbol* name,
                                                      ClassLoaderData* loader_data,
                                                      Handle protection_domain,
-                                                     const Klass* host_klass,
+                                                     const InstanceKlass* host_klass,
                                                      GrowableArray<Handle>* cp_patches,
                                                      TRAPS) {
 
--- a/hotspot/src/share/vm/classfile/klassFactory.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/klassFactory.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -72,7 +72,7 @@
                                                 Symbol* name,
                                                 ClassLoaderData* loader_data,
                                                 Handle protection_domain,
-                                                const Klass* host_klass,
+                                                const InstanceKlass* host_klass,
                                                 GrowableArray<Handle>* cp_patches,
                                                 TRAPS);
 };
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1027,7 +1027,7 @@
                                       Handle class_loader,
                                       Handle protection_domain,
                                       ClassFileStream* st,
-                                      const Klass* host_klass,
+                                      const InstanceKlass* host_klass,
                                       GrowableArray<Handle>* cp_patches,
                                       TRAPS) {
 
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -299,7 +299,7 @@
                              Handle class_loader,
                              Handle protection_domain,
                              ClassFileStream* st,
-                             const Klass* host_klass,
+                             const InstanceKlass* host_klass,
                              GrowableArray<Handle>* cp_patches,
                              TRAPS);
 
--- a/hotspot/src/share/vm/classfile/verifier.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/verifier.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -67,12 +67,12 @@
 static volatile jint _is_new_verify_byte_codes_fn = (jint) true;
 
 static void* verify_byte_codes_fn() {
-  if (_verify_byte_codes_fn == NULL) {
+  if (OrderAccess::load_ptr_acquire(&_verify_byte_codes_fn) == NULL) {
     void *lib_handle = os::native_java_library();
     void *func = os::dll_lookup(lib_handle, "VerifyClassCodesForMajorVersion");
     OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
     if (func == NULL) {
-      OrderAccess::release_store(&_is_new_verify_byte_codes_fn, false);
+      _is_new_verify_byte_codes_fn = false;
       func = os::dll_lookup(lib_handle, "VerifyClassCodes");
       OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
     }
@@ -88,7 +88,7 @@
     BytecodeVerificationLocal : BytecodeVerificationRemote;
 }
 
-bool Verifier::relax_verify_for(oop loader) {
+bool Verifier::relax_access_for(oop loader) {
   bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
   bool need_verify =
     // verifyAll
@@ -2786,7 +2786,7 @@
       // direct interface relative to the host class
       have_imr_indirect = (have_imr_indirect &&
                            !is_same_or_direct_interface(
-                             InstanceKlass::cast(current_class()->host_klass()),
+                             current_class()->host_klass(),
                              host_klass_type, ref_class_type));
     }
     if (!subtype) {
--- a/hotspot/src/share/vm/classfile/verifier.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/verifier.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -58,8 +58,8 @@
   // -Xverify:all/none override this value
   static bool should_verify_for(oop class_loader, bool should_verify_class);
 
-  // Relax certain verifier checks to enable some broken 1.1 apps to run on 1.2.
-  static bool relax_verify_for(oop class_loader);
+  // Relax certain access checks to enable some broken 1.1 apps to run on 1.2.
+  static bool relax_access_for(oop class_loader);
 
   // Print output for class+resolve
   static void trace_class_resolution(Klass* resolve_class, InstanceKlass* verify_class);
--- a/hotspot/src/share/vm/classfile/vmSymbols.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/classfile/vmSymbols.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -366,6 +366,7 @@
   switch(id) {
 #ifdef TRACE_HAVE_INTRINSICS
   case vmIntrinsics::_counterTime:
+  case vmIntrinsics::_getClassId:
 #endif
   case vmIntrinsics::_currentTimeMillis:
   case vmIntrinsics::_nanoTime:
--- a/hotspot/src/share/vm/code/codeCache.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/code/codeCache.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -437,7 +437,7 @@
  * run the constructor for the CodeBlob subclass he is busy
  * instantiating.
  */
-CodeBlob* CodeCache::allocate(int size, int code_blob_type, bool strict) {
+CodeBlob* CodeCache::allocate(int size, int code_blob_type, int orig_code_blob_type) {
   // Possibly wakes up the sweeper thread.
   NMethodSweeper::notify(code_blob_type);
   assert_locked_or_safepoint(CodeCache_lock);
@@ -455,32 +455,41 @@
     cb = (CodeBlob*)heap->allocate(size);
     if (cb != NULL) break;
     if (!heap->expand_by(CodeCacheExpansionSize)) {
+      // Save original type for error reporting
+      if (orig_code_blob_type == CodeBlobType::All) {
+        orig_code_blob_type = code_blob_type;
+      }
       // Expansion failed
-      if (SegmentedCodeCache && !strict) {
+      if (SegmentedCodeCache) {
         // Fallback solution: Try to store code in another code heap.
+        // NonNMethod -> MethodNonProfiled -> MethodProfiled (-> MethodNonProfiled)
         // Note that in the sweeper, we check the reverse_free_ratio of the code heap
         // and force stack scanning if less than 10% of the code heap are free.
         int type = code_blob_type;
         switch (type) {
         case CodeBlobType::NonNMethod:
           type = CodeBlobType::MethodNonProfiled;
-          strict = false;   // Allow recursive search for other heaps
-          break;
-        case CodeBlobType::MethodProfiled:
-          type = CodeBlobType::MethodNonProfiled;
-          strict = true;
           break;
         case CodeBlobType::MethodNonProfiled:
           type = CodeBlobType::MethodProfiled;
-          strict = true;
+          break;
+        case CodeBlobType::MethodProfiled:
+          // Avoid loop if we already tried that code heap
+          if (type == orig_code_blob_type) {
+            type = CodeBlobType::MethodNonProfiled;
+          }
           break;
         }
-        if (heap_available(type)) {
-          return allocate(size, type, strict);
+        if (type != code_blob_type && type != orig_code_blob_type && heap_available(type)) {
+          if (PrintCodeCacheExtension) {
+            tty->print_cr("Extension of %s failed. Trying to allocate in %s.",
+                          heap->name(), get_code_heap(type)->name());
+          }
+          return allocate(size, type, orig_code_blob_type);
         }
       }
       MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
-      CompileBroker::handle_full_code_cache(code_blob_type);
+      CompileBroker::handle_full_code_cache(orig_code_blob_type);
       return NULL;
     }
     if (PrintCodeCacheExtension) {
--- a/hotspot/src/share/vm/code/codeCache.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/code/codeCache.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -126,7 +126,7 @@
   static void initialize();
 
   // Allocation/administration
-  static CodeBlob* allocate(int size, int code_blob_type, bool strict = false); // allocates a new CodeBlob
+  static CodeBlob* allocate(int size, int code_blob_type, int orig_code_blob_type = CodeBlobType::All); // allocates a new CodeBlob
   static void commit(CodeBlob* cb);                        // called when the allocated CodeBlob has been filled
   static int  alignment_unit();                            // guaranteed alignment of all CodeBlobs
   static int  alignment_offset();                          // guaranteed offset of first CodeBlob byte within alignment unit (i.e., allocation header)
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -32,7 +32,6 @@
 #include "compiler/compileLog.hpp"
 #include "compiler/compilerOracle.hpp"
 #include "compiler/directivesParser.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "interpreter/linkResolver.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/resourceArea.hpp"
@@ -893,15 +892,6 @@
     return;
   }
 
-  // If the requesting thread is holding the pending list lock
-  // then we just return. We can't risk blocking while holding
-  // the pending list lock or a 3-way deadlock may occur
-  // between the reference handler thread, a GC (instigated
-  // by a compiler thread), and compiled method registration.
-  if (ReferencePendingListLocker::is_locked_by_self()) {
-    return;
-  }
-
   if (TieredCompilation) {
     // Tiered policy requires MethodCounters to exist before adding a method to
     // the queue. Create if we don't have them yet.
--- a/hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -3511,6 +3511,7 @@
                                                                   conc_workers()->active_workers(),
                                                                   Threads::number_of_non_daemon_threads());
   num_workers = conc_workers()->update_active_workers(num_workers);
+  log_info(gc,task)("Using %u workers of %u for marking", num_workers, conc_workers()->total_workers());
 
   CompactibleFreeListSpace* cms_space  = _cmsGen->cmsSpace();
 
--- a/hotspot/src/share/vm/gc/cms/concurrentMarkSweepThread.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/cms/concurrentMarkSweepThread.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -28,7 +28,6 @@
 #include "gc/cms/concurrentMarkSweepThread.hpp"
 #include "gc/shared/gcId.hpp"
 #include "gc/shared/genCollectedHeap.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/init.hpp"
 #include "runtime/interfaceSupport.hpp"
@@ -77,23 +76,6 @@
     log_warning(gc)("Couldn't bind CMS thread to processor " UINTX_FORMAT, CPUForCMSThread);
   }
 
-  {
-    MutexLockerEx x(CGC_lock, true);
-    set_CMS_flag(CMS_cms_wants_token);
-    assert(is_init_completed() && Universe::is_fully_initialized(), "ConcurrentGCThread::run() should have waited for this.");
-
-    // Wait until the surrogate locker thread that will do
-    // pending list locking on our behalf has been created.
-    // We cannot start the SLT thread ourselves since we need
-    // to be a JavaThread to do so.
-    CMSLoopCountWarn loopY("CMS::run", "waiting for SLT installation", 2);
-    while (!ReferencePendingListLocker::is_initialized() && !should_terminate()) {
-      CGC_lock->wait(true, 200);
-      loopY.tick();
-    }
-    clear_CMS_flag(CMS_cms_wants_token);
-  }
-
   while (!should_terminate()) {
     sleepBeforeNextCycle();
     if (should_terminate()) break;
--- a/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -899,6 +899,8 @@
                                                workers->active_workers(),
                                                Threads::number_of_non_daemon_threads());
   active_workers = workers->update_active_workers(active_workers);
+  log_info(gc,task)("Using %u workers of %u for evacuation", active_workers, workers->total_workers());
+
   _old_gen = gch->old_gen();
 
   // If the next generation is too full to accommodate worst-case promotion
--- a/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -37,14 +37,6 @@
 //////////////////////////////////////////////////////////
 // Methods in abstract class VM_CMS_Operation
 //////////////////////////////////////////////////////////
-void VM_CMS_Operation::acquire_pending_list_lock() {
-  _pending_list_locker.lock();
-}
-
-void VM_CMS_Operation::release_and_notify_pending_list_lock() {
-  _pending_list_locker.unlock();
-}
-
 void VM_CMS_Operation::verify_before_gc() {
   if (VerifyBeforeGC &&
       GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
@@ -85,17 +77,10 @@
   assert(!ConcurrentMarkSweepThread::cms_thread_has_cms_token(),
          "Possible deadlock");
 
-  if (needs_pending_list_lock()) {
-    acquire_pending_list_lock();
-  }
-  // Get the Heap_lock after the pending_list_lock.
   Heap_lock->lock();
   if (lost_race()) {
     assert(_prologue_succeeded == false, "Initialized in c'tor");
     Heap_lock->unlock();
-    if (needs_pending_list_lock()) {
-      release_and_notify_pending_list_lock();
-    }
   } else {
     _prologue_succeeded = true;
   }
@@ -108,11 +93,10 @@
   assert(!ConcurrentMarkSweepThread::cms_thread_has_cms_token(),
          "Possible deadlock");
 
-  // Release the Heap_lock first.
+  if (Universe::has_reference_pending_list()) {
+    Heap_lock->notify_all();
+  }
   Heap_lock->unlock();
-  if (needs_pending_list_lock()) {
-    release_and_notify_pending_list_lock();
-  }
 }
 
 //////////////////////////////////////////////////////////
@@ -230,9 +214,11 @@
   Thread* thr = Thread::current();
   assert(thr->is_Java_thread(), "just checking");
   JavaThread* jt = (JavaThread*)thr;
-  // Release the Heap_lock first.
+
+  if (Universe::has_reference_pending_list()) {
+    Heap_lock->notify_all();
+  }
   Heap_lock->unlock();
-  release_and_notify_pending_list_lock();
 
   // It is fine to test whether completed collections has
   // exceeded our request count without locking because
--- a/hotspot/src/share/vm/gc/cms/vmCMSOperations.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/cms/vmCMSOperations.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -28,7 +28,6 @@
 #include "gc/cms/concurrentMarkSweepGeneration.hpp"
 #include "gc/shared/gcCause.hpp"
 #include "gc/shared/gcId.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "gc/shared/vmGCOperations.hpp"
 #include "runtime/vm_operations.hpp"
 
@@ -52,9 +51,6 @@
 class CMSCollector;
 
 class VM_CMS_Operation: public VM_Operation {
- private:
-  ReferencePendingListLocker _pending_list_locker;
-
  protected:
   CMSCollector*  _collector;                 // associated collector
   bool           _prologue_succeeded;     // whether doit_prologue succeeded
@@ -62,10 +58,6 @@
 
   bool lost_race() const;
 
-  // java.lang.ref.Reference support
-  void acquire_pending_list_lock();
-  void release_and_notify_pending_list_lock();
-
  public:
   VM_CMS_Operation(CMSCollector* collector):
     _collector(collector),
--- a/hotspot/src/share/vm/gc/g1/concurrentMarkThread.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/concurrentMarkThread.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -175,7 +175,7 @@
                                 TimeHelper::counter_to_millis(mark_end - mark_start));
 
           CMCheckpointRootsFinalClosure final_cl(_cm);
-          VM_CGC_Operation op(&final_cl, "Pause Remark", true /* needs_pll */);
+          VM_CGC_Operation op(&final_cl, "Pause Remark");
           VMThread::execute(&op);
         }
         if (cm()->restart_for_overflow()) {
@@ -199,7 +199,7 @@
         delay_to_keep_mmu(g1_policy, false /* cleanup */);
 
         CMCleanUp cl_cl(_cm);
-        VM_CGC_Operation op(&cl_cl, "Pause Cleanup", false /* needs_pll */);
+        VM_CGC_Operation op(&cl_cl, "Pause Cleanup");
         VMThread::execute(&op);
       } else {
         // We don't want to update the marking status if a GC pause
--- a/hotspot/src/share/vm/gc/g1/g1CodeCacheRemSet.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1CodeCacheRemSet.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -25,6 +25,7 @@
 #include "precompiled.hpp"
 #include "code/codeCache.hpp"
 #include "code/nmethod.hpp"
+#include "gc/g1/g1CodeRootSetTable.hpp"
 #include "gc/g1/g1CodeCacheRemSet.hpp"
 #include "gc/g1/heapRegion.hpp"
 #include "memory/heap.hpp"
@@ -33,58 +34,13 @@
 #include "utilities/hashtable.inline.hpp"
 #include "utilities/stack.inline.hpp"
 
-class CodeRootSetTable : public Hashtable<nmethod*, mtGC> {
-  friend class G1CodeRootSetTest;
-  typedef HashtableEntry<nmethod*, mtGC> Entry;
-
-  static CodeRootSetTable* volatile _purge_list;
-
-  CodeRootSetTable* _purge_next;
-
-  unsigned int compute_hash(nmethod* nm) {
-    uintptr_t hash = (uintptr_t)nm;
-    return hash ^ (hash >> 7); // code heap blocks are 128byte aligned
-  }
-
-  void remove_entry(Entry* e, Entry* previous);
-  Entry* new_entry(nmethod* nm);
-
- public:
-  CodeRootSetTable(int size) : Hashtable<nmethod*, mtGC>(size, sizeof(Entry)), _purge_next(NULL) {}
-  ~CodeRootSetTable();
-
-  // Needs to be protected locks
-  bool add(nmethod* nm);
-  bool remove(nmethod* nm);
+G1CodeRootSetTable* volatile G1CodeRootSetTable::_purge_list = NULL;
 
-  // Can be called without locking
-  bool contains(nmethod* nm);
-
-  int entry_size() const { return BasicHashtable<mtGC>::entry_size(); }
-
-  void copy_to(CodeRootSetTable* new_table);
-  void nmethods_do(CodeBlobClosure* blk);
-
-  template<typename CB>
-  int remove_if(CB& should_remove);
-
-  static void purge_list_append(CodeRootSetTable* tbl);
-  static void purge();
-
-  static size_t static_mem_size() {
-    return sizeof(_purge_list);
-  }
-
-  size_t mem_size();
-};
-
-CodeRootSetTable* volatile CodeRootSetTable::_purge_list = NULL;
-
-size_t CodeRootSetTable::mem_size() {
-  return sizeof(CodeRootSetTable) + (entry_size() * number_of_entries()) + (sizeof(HashtableBucket<mtGC>) * table_size());
+size_t G1CodeRootSetTable::mem_size() {
+  return sizeof(G1CodeRootSetTable) + (entry_size() * number_of_entries()) + (sizeof(HashtableBucket<mtGC>) * table_size());
 }
 
-CodeRootSetTable::Entry* CodeRootSetTable::new_entry(nmethod* nm) {
+G1CodeRootSetTable::Entry* G1CodeRootSetTable::new_entry(nmethod* nm) {
   unsigned int hash = compute_hash(nm);
   Entry* entry = (Entry*) new_entry_free_list();
   if (entry == NULL) {
@@ -96,7 +52,7 @@
   return entry;
 }
 
-void CodeRootSetTable::remove_entry(Entry* e, Entry* previous) {
+void G1CodeRootSetTable::remove_entry(Entry* e, Entry* previous) {
   int index = hash_to_index(e->hash());
   assert((e == bucket(index)) == (previous == NULL), "if e is the first entry then previous should be null");
 
@@ -108,7 +64,7 @@
   free_entry(e);
 }
 
-CodeRootSetTable::~CodeRootSetTable() {
+G1CodeRootSetTable::~G1CodeRootSetTable() {
   for (int index = 0; index < table_size(); ++index) {
     for (Entry* e = bucket(index); e != NULL; ) {
       Entry* to_remove = e;
@@ -125,7 +81,7 @@
   }
 }
 
-bool CodeRootSetTable::add(nmethod* nm) {
+bool G1CodeRootSetTable::add(nmethod* nm) {
   if (!contains(nm)) {
     Entry* e = new_entry(nm);
     int index = hash_to_index(e->hash());
@@ -135,7 +91,7 @@
   return false;
 }
 
-bool CodeRootSetTable::contains(nmethod* nm) {
+bool G1CodeRootSetTable::contains(nmethod* nm) {
   int index = hash_to_index(compute_hash(nm));
   for (Entry* e = bucket(index); e != NULL; e = e->next()) {
     if (e->literal() == nm) {
@@ -145,7 +101,7 @@
   return false;
 }
 
-bool CodeRootSetTable::remove(nmethod* nm) {
+bool G1CodeRootSetTable::remove(nmethod* nm) {
   int index = hash_to_index(compute_hash(nm));
   Entry* previous = NULL;
   for (Entry* e = bucket(index); e != NULL; previous = e, e = e->next()) {
@@ -157,7 +113,7 @@
   return false;
 }
 
-void CodeRootSetTable::copy_to(CodeRootSetTable* new_table) {
+void G1CodeRootSetTable::copy_to(G1CodeRootSetTable* new_table) {
   for (int index = 0; index < table_size(); ++index) {
     for (Entry* e = bucket(index); e != NULL; e = e->next()) {
       new_table->add(e->literal());
@@ -166,7 +122,7 @@
   new_table->copy_freelist(this);
 }
 
-void CodeRootSetTable::nmethods_do(CodeBlobClosure* blk) {
+void G1CodeRootSetTable::nmethods_do(CodeBlobClosure* blk) {
   for (int index = 0; index < table_size(); ++index) {
     for (Entry* e = bucket(index); e != NULL; e = e->next()) {
       blk->do_code_blob(e->literal());
@@ -175,7 +131,7 @@
 }
 
 template<typename CB>
-int CodeRootSetTable::remove_if(CB& should_remove) {
+int G1CodeRootSetTable::remove_if(CB& should_remove) {
   int num_removed = 0;
   for (int index = 0; index < table_size(); ++index) {
     Entry* previous = NULL;
@@ -198,52 +154,52 @@
   delete _table;
 }
 
-CodeRootSetTable* G1CodeRootSet::load_acquire_table() {
-  return (CodeRootSetTable*) OrderAccess::load_ptr_acquire(&_table);
+G1CodeRootSetTable* G1CodeRootSet::load_acquire_table() {
+  return (G1CodeRootSetTable*) OrderAccess::load_ptr_acquire(&_table);
 }
 
 void G1CodeRootSet::allocate_small_table() {
-  CodeRootSetTable* temp = new CodeRootSetTable(SmallSize);
+  G1CodeRootSetTable* temp = new G1CodeRootSetTable(SmallSize);
 
   OrderAccess::release_store_ptr(&_table, temp);
 }
 
-void CodeRootSetTable::purge_list_append(CodeRootSetTable* table) {
+void G1CodeRootSetTable::purge_list_append(G1CodeRootSetTable* table) {
   for (;;) {
     table->_purge_next = _purge_list;
-    CodeRootSetTable* old = (CodeRootSetTable*) Atomic::cmpxchg_ptr(table, &_purge_list, table->_purge_next);
+    G1CodeRootSetTable* old = (G1CodeRootSetTable*) Atomic::cmpxchg_ptr(table, &_purge_list, table->_purge_next);
     if (old == table->_purge_next) {
       break;
     }
   }
 }
 
-void CodeRootSetTable::purge() {
-  CodeRootSetTable* table = _purge_list;
+void G1CodeRootSetTable::purge() {
+  G1CodeRootSetTable* table = _purge_list;
   _purge_list = NULL;
   while (table != NULL) {
-    CodeRootSetTable* to_purge = table;
+    G1CodeRootSetTable* to_purge = table;
     table = table->_purge_next;
     delete to_purge;
   }
 }
 
 void G1CodeRootSet::move_to_large() {
-  CodeRootSetTable* temp = new CodeRootSetTable(LargeSize);
+  G1CodeRootSetTable* temp = new G1CodeRootSetTable(LargeSize);
 
   _table->copy_to(temp);
 
-  CodeRootSetTable::purge_list_append(_table);
+  G1CodeRootSetTable::purge_list_append(_table);
 
   OrderAccess::release_store_ptr(&_table, temp);
 }
 
 void G1CodeRootSet::purge() {
-  CodeRootSetTable::purge();
+  G1CodeRootSetTable::purge();
 }
 
 size_t G1CodeRootSet::static_mem_size() {
-  return CodeRootSetTable::static_mem_size();
+  return G1CodeRootSetTable::static_mem_size();
 }
 
 void G1CodeRootSet::add(nmethod* method) {
@@ -278,7 +234,7 @@
 }
 
 bool G1CodeRootSet::contains(nmethod* method) {
-  CodeRootSetTable* table = load_acquire_table(); // contains() may be called outside of lock, so ensure mem sync.
+  G1CodeRootSetTable* table = load_acquire_table(); // contains() may be called outside of lock, so ensure mem sync.
   if (table != NULL) {
     return table->contains(method);
   }
@@ -348,67 +304,3 @@
     clear();
   }
 }
-
-#ifndef PRODUCT
-
-class G1CodeRootSetTest {
- public:
-  static void test() {
-    {
-      G1CodeRootSet set1;
-      assert(set1.is_empty(), "Code root set must be initially empty but is not.");
-
-      assert(G1CodeRootSet::static_mem_size() == sizeof(void*),
-             "The code root set's static memory usage is incorrect, " SIZE_FORMAT " bytes", G1CodeRootSet::static_mem_size());
-
-      set1.add((nmethod*)1);
-      assert(set1.length() == 1, "Added exactly one element, but set contains "
-             SIZE_FORMAT " elements", set1.length());
-
-      const size_t num_to_add = (size_t)G1CodeRootSet::Threshold + 1;
-
-      for (size_t i = 1; i <= num_to_add; i++) {
-        set1.add((nmethod*)1);
-      }
-      assert(set1.length() == 1,
-             "Duplicate detection should not have increased the set size but "
-             "is " SIZE_FORMAT, set1.length());
-
-      for (size_t i = 2; i <= num_to_add; i++) {
-        set1.add((nmethod*)(uintptr_t)(i));
-      }
-      assert(set1.length() == num_to_add,
-             "After adding in total " SIZE_FORMAT " distinct code roots, they "
-             "need to be in the set, but there are only " SIZE_FORMAT,
-             num_to_add, set1.length());
-
-      assert(CodeRootSetTable::_purge_list != NULL, "should have grown to large hashtable");
-
-      size_t num_popped = 0;
-      for (size_t i = 1; i <= num_to_add; i++) {
-        bool removed = set1.remove((nmethod*)i);
-        if (removed) {
-          num_popped += 1;
-        } else {
-          break;
-        }
-      }
-      assert(num_popped == num_to_add,
-             "Managed to pop " SIZE_FORMAT " code roots, but only " SIZE_FORMAT " "
-             "were added", num_popped, num_to_add);
-      assert(CodeRootSetTable::_purge_list != NULL, "should have grown to large hashtable");
-
-      G1CodeRootSet::purge();
-
-      assert(CodeRootSetTable::_purge_list == NULL, "should have purged old small tables");
-
-    }
-
-  }
-};
-
-void TestCodeCacheRemSet_test() {
-  G1CodeRootSetTest::test();
-}
-
-#endif
--- a/hotspot/src/share/vm/gc/g1/g1CodeCacheRemSet.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1CodeCacheRemSet.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,7 @@
 #include "memory/allocation.hpp"
 
 class CodeBlobClosure;
-class CodeRootSetTable;
+class G1CodeRootSetTable;
 class HeapRegion;
 class nmethod;
 
@@ -42,8 +42,8 @@
   const static size_t Threshold = 24;
   const static size_t LargeSize = 512;
 
-  CodeRootSetTable* _table;
-  CodeRootSetTable* load_acquire_table();
+  G1CodeRootSetTable* _table;
+  G1CodeRootSetTable* load_acquire_table();
 
   size_t _length;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1CodeRootSetTable.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef SHARE_VM_GC_G1_G1CODEROOTSETTABLE_HPP
+#define SHARE_VM_GC_G1_G1CODEROOTSETTABLE_HPP
+
+#include "utilities/hashtable.hpp"
+
+class nmethod;
+
+class G1CodeRootSetTable : public Hashtable<nmethod*, mtGC> {
+  friend class G1CodeRootSetTest;
+  typedef HashtableEntry<nmethod*, mtGC> Entry;
+
+  static G1CodeRootSetTable* volatile _purge_list;
+
+  G1CodeRootSetTable* _purge_next;
+
+  unsigned int compute_hash(nmethod* nm) {
+    uintptr_t hash = (uintptr_t)nm;
+    return hash ^ (hash >> 7); // code heap blocks are 128byte aligned
+  }
+
+  void remove_entry(Entry* e, Entry* previous);
+  Entry* new_entry(nmethod* nm);
+
+ public:
+  G1CodeRootSetTable(int size) : Hashtable<nmethod*, mtGC>(size, sizeof(Entry)), _purge_next(NULL) {}
+  ~G1CodeRootSetTable();
+
+  // Needs to be protected by locks
+  bool add(nmethod* nm);
+  bool remove(nmethod* nm);
+
+  // Can be called without locking
+  bool contains(nmethod* nm);
+
+  int entry_size() const { return BasicHashtable<mtGC>::entry_size(); }
+
+  void copy_to(G1CodeRootSetTable* new_table);
+  void nmethods_do(CodeBlobClosure* blk);
+
+  template<typename CB>
+  int remove_if(CB& should_remove);
+
+  static void purge_list_append(G1CodeRootSetTable* tbl);
+  static void purge();
+
+  static size_t static_mem_size() {
+    return sizeof(_purge_list);
+  }
+
+  size_t mem_size();
+};
+
+#endif /* SHARE_VM_GC_G1_G1CODEROOTSETTABLE_HPP */
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1332,6 +1332,7 @@
                                                 workers()->active_workers(),
                                                 Threads::number_of_non_daemon_threads());
       workers()->update_active_workers(n_workers);
+      log_info(gc,task)("Using %u workers of %u to rebuild remembered set", n_workers, workers()->total_workers());
 
       ParRebuildRSTask rebuild_rs_task(this);
       workers()->run_task(&rebuild_rs_task);
@@ -3068,6 +3069,7 @@
                                                                   workers()->active_workers(),
                                                                   Threads::number_of_non_daemon_threads());
     workers()->update_active_workers(active_workers);
+    log_info(gc,task)("Using %u workers of %u for evacuation", active_workers, workers()->total_workers());
 
     TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
     TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
@@ -4513,6 +4515,7 @@
 #if defined(COMPILER2) || INCLUDE_JVMCI
   DerivedPointerTable::update_pointers();
 #endif
+  g1_policy()->print_age_table();
 }
 
 void G1CollectedHeap::record_obj_copy_mem_stats() {
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1273,12 +1273,6 @@
     return true;
   }
 
-  // The reference pending list lock is acquired from from the
-  // ConcurrentMarkThread.
-  virtual bool needs_reference_pending_list_locker_thread() const {
-    return true;
-  }
-
   inline bool is_in_young(const oop obj);
 
   virtual bool is_scavengable(const void* addr);
--- a/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1035,6 +1035,8 @@
   // worker threads may currently exist and more may not be
   // available.
   active_workers = _parallel_workers->update_active_workers(active_workers);
+  log_info(gc, task)("Using %u workers of %u for marking", active_workers, _parallel_workers->total_workers());
+
   // Parallel task terminator is set in "set_concurrency_and_phase()"
   set_concurrency_and_phase(active_workers, true /* concurrent */);
 
--- a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -885,6 +885,15 @@
   return _young_gen_sizer.adaptive_young_list_length();
 }
 
+size_t G1DefaultPolicy::desired_survivor_size() const {
+  size_t const survivor_capacity = HeapRegion::GrainWords * _max_survivor_regions;
+  return (size_t)((((double)survivor_capacity) * TargetSurvivorRatio) / 100);
+}
+
+void G1DefaultPolicy::print_age_table() {
+  _survivors_age_table.print_age_table(_tenuring_threshold);
+}
+
 void G1DefaultPolicy::update_max_gc_locker_expansion() {
   uint expansion_region_num = 0;
   if (GCLockerEdenExpansionPercent > 0) {
@@ -908,8 +917,11 @@
   // smaller than 1.0) we'll get 1.
   _max_survivor_regions = (uint) ceil(max_survivor_regions_d);
 
-  _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
-      HeapRegion::GrainWords * _max_survivor_regions, _policy_counters);
+  _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(desired_survivor_size());
+  if (UsePerfData) {
+    _policy_counters->tenuring_threshold()->set_value(_tenuring_threshold);
+    _policy_counters->desired_survivor_size()->set_value(desired_survivor_size() * oopSize);
+  }
 }
 
 bool G1DefaultPolicy::force_initial_mark_if_outside_cycle(GCCause::Cause gc_cause) {
--- a/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1DefaultPolicy.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -360,6 +360,8 @@
 
   AgeTable _survivors_age_table;
 
+protected:
+  size_t desired_survivor_size() const;
 public:
   uint tenuring_threshold() const { return _tenuring_threshold; }
 
@@ -379,6 +381,8 @@
     _survivors_age_table.merge(age_table);
   }
 
+  void print_age_table();
+
   void update_max_gc_locker_expansion();
 
   void update_survivors_policy();
--- a/hotspot/src/share/vm/gc/g1/g1Policy.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1Policy.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -181,6 +181,9 @@
   virtual void note_stop_adding_survivor_regions() = 0;
 
   virtual void record_age_table(AgeTable* age_table) = 0;
+  virtual void print_age_table() = 0;
+protected:
+  virtual size_t desired_survivor_size() const = 0;
 };
 
 #endif // SHARE_VM_GC_G1_G1POLICY_HPP
--- a/hotspot/src/share/vm/gc/g1/g1Predictions.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "precompiled.hpp"
-#include "gc/g1/g1Predictions.hpp"
-
-#ifndef PRODUCT
-
-void G1Predictions::test() {
-  double const epsilon = 1e-6;
-  {
-    // Some basic formula tests with confidence = 0.0
-    G1Predictions predictor(0.0);
-    TruncatedSeq s;
-
-    double p0 = predictor.get_new_prediction(&s);
-    assert(p0 < epsilon, "Initial prediction of empty sequence must be 0.0 but is %f", p0);
-
-    s.add(5.0);
-    double p1 = predictor.get_new_prediction(&s);
-    assert(fabs(p1 - 5.0) < epsilon, "Prediction should be 5.0 but is %f", p1);
-    for (int i = 0; i < 40; i++) {
-      s.add(5.0);
-    }
-    double p2 = predictor.get_new_prediction(&s);
-    assert(fabs(p2 - 5.0) < epsilon, "Prediction should be 5.0 but is %f", p1);
-  }
-
-  {
-    // The following tests checks that the initial predictions are based on the
-    // average of the sequence and not on the stddev (which is 0).
-    G1Predictions predictor(0.5);
-    TruncatedSeq s;
-
-    s.add(1.0);
-    double p1 = predictor.get_new_prediction(&s);
-    assert(p1 > 1.0, "First prediction must be larger than average, but avg is %f and prediction %f", s.davg(), p1);
-    s.add(1.0);
-    double p2 = predictor.get_new_prediction(&s);
-    assert(p2 < p1, "First prediction must be larger than second, but they are %f %f", p1, p2);
-    s.add(1.0);
-    double p3 = predictor.get_new_prediction(&s);
-    assert(p3 < p2, "Second prediction must be larger than third, but they are %f %f", p2, p3);
-    s.add(1.0);
-    s.add(1.0); // Five elements are now in the sequence.
-    double p5 = predictor.get_new_prediction(&s);
-    assert(p5 < p3, "Fifth prediction must be smaller than third, but they are %f %f", p3, p5);
-    assert(fabs(p5 - 1.0) < epsilon, "Prediction must be 1.0+epsilon, but is %f", p5);
-  }
-
-  {
-    // The following tests checks that initially prediction based on the average is
-    // used, that gets overridden by the stddev prediction at the end.
-    G1Predictions predictor(0.5);
-    TruncatedSeq s;
-
-    s.add(0.5);
-    double p1 = predictor.get_new_prediction(&s);
-    assert(p1 > 0.5, "First prediction must be larger than average, but avg is %f and prediction %f", s.davg(), p1);
-    s.add(0.2);
-    double p2 = predictor.get_new_prediction(&s);
-    assert(p2 < p1, "First prediction must be larger than second, but they are %f %f", p1, p2);
-    s.add(0.5);
-    double p3 = predictor.get_new_prediction(&s);
-    assert(p3 < p2, "Second prediction must be larger than third, but they are %f %f", p2, p3);
-    s.add(0.2);
-    s.add(2.0);
-    double p5 = predictor.get_new_prediction(&s);
-    assert(p5 > p3, "Fifth prediction must be bigger than third, but they are %f %f", p3, p5);
-  }
-}
-
-void TestPredictions_test() {
-  G1Predictions::test();
-}
-
-#endif
--- a/hotspot/src/share/vm/gc/g1/g1Predictions.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/g1Predictions.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -57,10 +57,6 @@
   double get_new_prediction(TruncatedSeq const* seq) const {
     return seq->davg() + _sigma * stddev_estimate(seq);
   }
-
-#ifndef PRODUCT
-  static void test();
-#endif
 };
 
 #endif // SHARE_VM_GC_G1_G1PREDICTIONS_HPP
--- a/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -204,14 +204,6 @@
   }
 }
 
-void VM_CGC_Operation::acquire_pending_list_lock() {
-  _pending_list_locker.lock();
-}
-
-void VM_CGC_Operation::release_and_notify_pending_list_lock() {
-  _pending_list_locker.unlock();
-}
-
 void VM_CGC_Operation::doit() {
   GCIdMark gc_id_mark(_gc_id);
   GCTraceCPUTime tcpu;
@@ -222,20 +214,13 @@
 }
 
 bool VM_CGC_Operation::doit_prologue() {
-  // Note the relative order of the locks must match that in
-  // VM_GC_Operation::doit_prologue() or deadlocks can occur
-  if (_needs_pending_list_lock) {
-    acquire_pending_list_lock();
-  }
   Heap_lock->lock();
   return true;
 }
 
 void VM_CGC_Operation::doit_epilogue() {
-  // Note the relative order of the unlocks must match that in
-  // VM_GC_Operation::doit_epilogue()
+  if (Universe::has_reference_pending_list()) {
+    Heap_lock->notify_all();
+  }
   Heap_lock->unlock();
-  if (_needs_pending_list_lock) {
-    release_and_notify_pending_list_lock();
-  }
 }
--- a/hotspot/src/share/vm/gc/g1/vm_operations_g1.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/g1/vm_operations_g1.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
 
 #include "gc/g1/g1AllocationContext.hpp"
 #include "gc/shared/gcId.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "gc/shared/vmGCOperations.hpp"
 
 // VM_operations for the G1 collector.
@@ -103,20 +102,13 @@
 // Concurrent GC stop-the-world operations such as remark and cleanup;
 // consider sharing these with CMS's counterparts.
 class VM_CGC_Operation: public VM_Operation {
-  VoidClosure*               _cl;
-  const char*                _printGCMessage;
-  bool                       _needs_pending_list_lock;
-  ReferencePendingListLocker _pending_list_locker;
-  uint                       _gc_id;
-
-protected:
-  // java.lang.ref.Reference support
-  void acquire_pending_list_lock();
-  void release_and_notify_pending_list_lock();
+  VoidClosure* _cl;
+  const char*  _printGCMessage;
+  uint         _gc_id;
 
 public:
-  VM_CGC_Operation(VoidClosure* cl, const char *printGCMsg, bool needs_pending_list_lock)
-    : _cl(cl), _printGCMessage(printGCMsg), _needs_pending_list_lock(needs_pending_list_lock), _gc_id(GCId::current()) {}
+  VM_CGC_Operation(VoidClosure* cl, const char *printGCMsg)
+    : _cl(cl), _printGCMessage(printGCMsg), _gc_id(GCId::current()) {}
   virtual VMOp_Type type() const { return VMOp_CGC_Operation; }
   virtual void doit();
   virtual bool doit_prologue();
--- a/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1133,18 +1133,3 @@
 
   return false;
 }
-
-#ifndef PRODUCT
-
-void TestOldFreeSpaceCalculation_test() {
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 20) == 25, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 50) == 100, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 60) == 150, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 75) == 300, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 20) == 100, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 50) == 400, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 60) == 600, "Calculation of free memory failed");
-  assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 75) == 1200, "Calculation of free memory failed");
-}
-
-#endif /* !PRODUCT */
--- a/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -564,9 +564,18 @@
 
 void DefNewGeneration::adjust_desired_tenuring_threshold() {
   // Set the desired survivor size to half the real survivor space
-  GCPolicyCounters* gc_counters = GenCollectedHeap::heap()->gen_policy()->counters();
-  _tenuring_threshold =
-    age_table()->compute_tenuring_threshold(to()->capacity()/HeapWordSize, gc_counters);
+  size_t const survivor_capacity = to()->capacity() / HeapWordSize;
+  size_t const desired_survivor_size = (size_t)((((double)survivor_capacity) * TargetSurvivorRatio) / 100);
+
+  _tenuring_threshold = age_table()->compute_tenuring_threshold(desired_survivor_size);
+
+  if (UsePerfData) {
+    GCPolicyCounters* gc_counters = GenCollectedHeap::heap()->gen_policy()->counters();
+    gc_counters->tenuring_threshold()->set_value(_tenuring_threshold);
+    gc_counters->desired_survivor_size()->set_value(desired_survivor_size * oopSize);
+  }
+
+  age_table()->print_age_table(_tenuring_threshold);
 }
 
 void DefNewGeneration::collect(bool   full,
--- a/hotspot/src/share/vm/gc/shared/ageTable.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/ageTable.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
 #include "gc/shared/ageTableTracer.hpp"
 #include "gc/shared/collectedHeap.hpp"
 #include "gc/shared/collectorPolicy.hpp"
-#include "gc/shared/gcPolicyCounters.hpp"
 #include "memory/resourceArea.hpp"
 #include "logging/log.hpp"
 #include "oops/oop.inline.hpp"
@@ -75,8 +74,7 @@
   }
 }
 
-uint AgeTable::compute_tenuring_threshold(size_t survivor_capacity, GCPolicyCounters* gc_counters) {
-  size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
+uint AgeTable::compute_tenuring_threshold(size_t desired_survivor_size) {
   uint result;
 
   if (AlwaysTenure || NeverTenure) {
@@ -99,9 +97,16 @@
 
 
   log_debug(gc, age)("Desired survivor size " SIZE_FORMAT " bytes, new threshold " UINTX_FORMAT " (max threshold " UINTX_FORMAT ")",
-                     desired_survivor_size*oopSize, (uintx) result, MaxTenuringThreshold);
+                     desired_survivor_size * oopSize, (uintx) result, MaxTenuringThreshold);
+
+  return result;
+}
 
+void AgeTable::print_age_table(uint tenuring_threshold) {
   if (log_is_enabled(Trace, gc, age) || UsePerfData || AgeTableTracer::is_tenuring_distribution_event_enabled()) {
+    log_trace(gc, age)("Age table with threshold %u (max threshold " UINTX_FORMAT ")",
+                       tenuring_threshold, MaxTenuringThreshold);
+
     size_t total = 0;
     uint age = 1;
     while (age < table_size) {
@@ -109,20 +114,14 @@
       total += wordSize;
       if (wordSize > 0) {
         log_trace(gc, age)("- age %3u: " SIZE_FORMAT_W(10) " bytes, " SIZE_FORMAT_W(10) " total",
-                            age, wordSize*oopSize, total*oopSize);
+                            age, wordSize * oopSize, total * oopSize);
       }
-      AgeTableTracer::send_tenuring_distribution_event(age, wordSize*oopSize);
+      AgeTableTracer::send_tenuring_distribution_event(age, wordSize * oopSize);
       if (UsePerfData) {
-        _perf_sizes[age]->set_value(wordSize*oopSize);
+        _perf_sizes[age]->set_value(wordSize * oopSize);
       }
       age++;
     }
-    if (UsePerfData) {
-      gc_counters->tenuring_threshold()->set_value(result);
-      gc_counters->desired_survivor_size()->set_value(
-        desired_survivor_size*oopSize);
-    }
   }
+}
 
-  return result;
-}
--- a/hotspot/src/share/vm/gc/shared/ageTable.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/ageTable.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -29,8 +29,6 @@
 #include "oops/oop.hpp"
 #include "runtime/perfData.hpp"
 
-class GCPolicyCounters;
-
 /* Copyright (c) 1992, 2016, Oracle and/or its affiliates, and Stanford University.
    See the LICENSE file for license information. */
 
@@ -67,10 +65,12 @@
   // for parallel young generation gc.
   void merge(AgeTable* subTable);
 
-  // calculate new tenuring threshold based on age information
-  uint compute_tenuring_threshold(size_t survivor_capacity, GCPolicyCounters* gc_counters);
+  // Calculate new tenuring threshold based on age information.
+  uint compute_tenuring_threshold(size_t desired_survivor_size);
+  void print_age_table(uint tenuring_threshold);
 
  private:
+
   PerfVariable* _perf_sizes[table_size];
 };
 
--- a/hotspot/src/share/vm/gc/shared/collectedHeap.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/collectedHeap.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -441,12 +441,6 @@
   // remembered set.
   virtual void flush_deferred_store_barrier(JavaThread* thread);
 
-  // Should return true if the reference pending list lock is
-  // acquired from non-Java threads, such as a concurrent GC thread.
-  virtual bool needs_reference_pending_list_locker_thread() const {
-    return false;
-  }
-
   // Perform a collection of the heap; intended for use in implementing
   // "System.gc".  This probably implies as full a collection as the
   // "CollectedHeap" supports.
--- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -281,10 +281,6 @@
     return UseConcMarkSweepGC;
   }
 
-  virtual bool needs_reference_pending_list_locker_thread() const {
-    return UseConcMarkSweepGC;
-  }
-
   // We don't need barriers for stores to objects in the
   // young gen and, a fortiori, for initializing stores to
   // objects therein. This applies to DefNew+Tenured and ParNew+CMS
--- a/hotspot/src/share/vm/gc/shared/memset_with_concurrent_readers.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "precompiled.hpp"
-
-#include <string.h>
-#include "gc/shared/memset_with_concurrent_readers.hpp"
-#include "utilities/debug.hpp"
-#include "utilities/globalDefinitions.hpp"
-#include "utilities/macros.hpp"
-#include "utilities/ostream.hpp"
-
-#if INCLUDE_ALL_GCS
-
-// Unit test
-#ifndef PRODUCT
-
-static unsigned line_byte(const char* line, size_t i) {
-  return unsigned(line[i]) & 0xFF;
-}
-
-// Verify memset_with_concurrent_readers mimics memset.
-// We don't attempt to verify the concurrent reader case.
-void test_memset_with_concurrent_readers() {
-  const size_t chunk_size = 8 * BytesPerWord;
-  const unsigned chunk_count = 4;
-  const size_t block_size = (chunk_count + 4) * chunk_size;
-  char block[block_size];
-  char clear_block[block_size];
-  char set_block[block_size];
-
-  // block format:
-  // 0: unused leading chunk
-  // 1: chunk written from start index to end of chunk
-  // ... nchunks fully written chunks
-  // N: chunk written from start of chunk to end index
-  // N+1: unused trailing chunk
-
-  const int clear_value = 0;
-  const int set_value = 0xAC;
-
-  memset(clear_block, clear_value, block_size);
-  memset(set_block, set_value, block_size);
-
-  for (unsigned nchunks = 0; nchunks <= chunk_count; ++nchunks) {
-    for (size_t start = 1; start <= chunk_size; ++start) {
-      for (size_t end = 0; end <= chunk_size; ++end) {
-        size_t set_start = chunk_size + start;
-        size_t set_end = (2 + nchunks) * chunk_size + end;
-        size_t set_size = set_end - set_start;
-
-        memset(block, clear_value, block_size);
-        memset_with_concurrent_readers(&block[set_start], set_value, set_size);
-        bool head_clear = !memcmp(clear_block, block, set_start);
-        bool middle_set = !memcmp(set_block, block + set_start, set_size);
-        bool tail_clear = !memcmp(clear_block, block + set_end, block_size - set_end);
-        if (!(head_clear && middle_set && tail_clear)) {
-          tty->print_cr("*** memset_with_concurrent_readers failed: "
-                        "set start " SIZE_FORMAT ", set end " SIZE_FORMAT,
-                        set_start, set_end);
-          for (unsigned chunk = 0; chunk < (block_size / chunk_size); ++chunk) {
-            for (unsigned line = 0; line < (chunk_size / BytesPerWord); ++line) {
-              const char* lp = &block[chunk * chunk_size + line * BytesPerWord];
-              tty->print_cr("%d,%d: %2x %2x  %2x %2x  %2x %2x  %2x %2x",
-                            chunk, line,
-                            line_byte(lp, 0), line_byte(lp, 1),
-                            line_byte(lp, 2), line_byte(lp, 3),
-                            line_byte(lp, 4), line_byte(lp, 5),
-                            line_byte(lp, 6), line_byte(lp, 7));
-            }
-          }
-          assert(head_clear, "leading byte not clear");
-          assert(middle_set, "memset byte not set");
-          assert(tail_clear, "trailing bye not clear");
-        }
-      }
-    }
-  }
-}
-
-#endif // end unit test
-
-#endif // INCLUDE_ALL_GCS
--- a/hotspot/src/share/vm/gc/shared/referencePendingListLocker.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "precompiled.hpp"
-#include "classfile/javaClasses.hpp"
-#include "classfile/systemDictionary.hpp"
-#include "gc/shared/collectedHeap.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
-#include "memory/universe.hpp"
-#include "runtime/javaCalls.hpp"
-#include "utilities/preserveException.hpp"
-
-ReferencePendingListLockerThread::ReferencePendingListLockerThread() :
-  JavaThread(&start),
-  _monitor(Monitor::nonleaf, "ReferencePendingListLocker", false, Monitor::_safepoint_check_sometimes),
-  _message(NONE) {}
-
-ReferencePendingListLockerThread* ReferencePendingListLockerThread::create(TRAPS) {
-  // Create Java thread objects
-  instanceKlassHandle thread_klass = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL);
-  instanceHandle thread_object = thread_klass->allocate_instance_handle(CHECK_NULL);
-  Handle thread_name = java_lang_String::create_from_str("Reference Pending List Locker", CHECK_NULL);
-  Handle thread_group = Universe::system_thread_group();
-  JavaValue result(T_VOID);
-  JavaCalls::call_special(&result,
-                          thread_object,
-                          thread_klass,
-                          vmSymbols::object_initializer_name(),
-                          vmSymbols::threadgroup_string_void_signature(),
-                          thread_group,
-                          thread_name,
-                          CHECK_NULL);
-
-  {
-    MutexLocker ml(Threads_lock);
-
-    // Allocate thread
-    ReferencePendingListLockerThread* thread = new ReferencePendingListLockerThread();
-    if (thread == NULL || thread->osthread() == NULL) {
-      vm_exit_during_initialization("java.lang.OutOfMemoryError",
-                                    os::native_thread_creation_failed_msg());
-    }
-
-    // Initialize thread
-    java_lang_Thread::set_thread(thread_object(), thread);
-    java_lang_Thread::set_priority(thread_object(), NearMaxPriority);
-    java_lang_Thread::set_daemon(thread_object());
-    thread->set_threadObj(thread_object());
-
-    // Start thread
-    Threads::add(thread);
-    Thread::start(thread);
-
-    return thread;
-  }
-}
-
-void ReferencePendingListLockerThread::start(JavaThread* thread, TRAPS) {
-  ReferencePendingListLockerThread* locker_thread = static_cast<ReferencePendingListLockerThread*>(thread);
-  locker_thread->receive_and_handle_messages();
-}
-
-bool ReferencePendingListLockerThread::is_hidden_from_external_view() const {
-  return true;
-}
-
-void ReferencePendingListLockerThread::send_message(Message message) {
-  assert(message != NONE, "Should not be none");
-  MonitorLockerEx ml(&_monitor, Monitor::_no_safepoint_check_flag);
-
-  // Wait for completion of current message
-  while (_message != NONE) {
-    ml.wait(Monitor::_no_safepoint_check_flag);
-  }
-
-  // Send new message
-  _message = message;
-  ml.notify_all();
-
-  // Wait for completion of new message
-  while (_message != NONE) {
-    ml.wait(Monitor::_no_safepoint_check_flag);
-  }
-}
-
-void ReferencePendingListLockerThread::receive_and_handle_messages() {
-  ReferencePendingListLocker pending_list_locker;
-  MonitorLockerEx ml(&_monitor);
-
-  // Main loop, never terminates
-  for (;;) {
-    // Wait for message
-    while (_message == NONE) {
-      ml.wait();
-    }
-
-    // Handle message
-    if (_message == LOCK) {
-      pending_list_locker.lock();
-    } else if (_message == UNLOCK) {
-      pending_list_locker.unlock();
-    } else {
-      ShouldNotReachHere();
-    }
-
-    // Clear message
-    _message = NONE;
-    ml.notify_all();
-  }
-}
-
-void ReferencePendingListLockerThread::lock() {
-  send_message(LOCK);
-}
-
-void ReferencePendingListLockerThread::unlock() {
-  send_message(UNLOCK);
-}
-
-bool ReferencePendingListLocker::_is_initialized = false;
-ReferencePendingListLockerThread* ReferencePendingListLocker::_locker_thread = NULL;
-
-void ReferencePendingListLocker::initialize(bool needs_locker_thread, TRAPS) {
-  if (needs_locker_thread) {
-    _locker_thread = ReferencePendingListLockerThread::create(CHECK);
-  }
-
-  _is_initialized = true;
-}
-
-bool ReferencePendingListLocker::is_initialized() {
-  return _is_initialized;
-}
-
-bool ReferencePendingListLocker::is_locked_by_self() {
-  oop pending_list_lock = java_lang_ref_Reference::pending_list_lock();
-  if (pending_list_lock == NULL) {
-    return false;
-  }
-
-  JavaThread* thread = JavaThread::current();
-  Handle handle(thread, pending_list_lock);
-  return ObjectSynchronizer::current_thread_holds_lock(thread, handle);
-}
-
-void ReferencePendingListLocker::lock() {
-  assert(!Heap_lock->owned_by_self(), "Heap_lock must not be owned by requesting thread");
-
-  if (Thread::current()->is_Java_thread()) {
-    assert(java_lang_ref_Reference::pending_list_lock() != NULL, "Not initialized");
-
-    // We may enter this with a pending exception
-    PRESERVE_EXCEPTION_MARK;
-
-    HandleMark hm;
-    Handle handle(THREAD, java_lang_ref_Reference::pending_list_lock());
-
-    // Lock
-    ObjectSynchronizer::fast_enter(handle, &_basic_lock, false, THREAD);
-
-    assert(is_locked_by_self(), "Locking failed");
-
-    if (HAS_PENDING_EXCEPTION) {
-      CLEAR_PENDING_EXCEPTION;
-    }
-  } else {
-    // Delegate operation to locker thread
-    assert(_locker_thread != NULL, "Locker thread not created");
-    _locker_thread->lock();
-  }
-}
-
-void ReferencePendingListLocker::unlock() {
-  if (Thread::current()->is_Java_thread()) {
-    assert(java_lang_ref_Reference::pending_list_lock() != NULL, "Not initialized");
-
-    // We may enter this with a pending exception
-    PRESERVE_EXCEPTION_MARK;
-
-    HandleMark hm;
-    Handle handle(THREAD, java_lang_ref_Reference::pending_list_lock());
-
-    assert(is_locked_by_self(), "Should be locked by self");
-
-    // Notify waiters if the pending list is non-empty
-    if (java_lang_ref_Reference::pending_list() != NULL) {
-      ObjectSynchronizer::notifyall(handle, THREAD);
-    }
-
-    // Unlock
-    ObjectSynchronizer::fast_exit(handle(), &_basic_lock, THREAD);
-
-    if (HAS_PENDING_EXCEPTION) {
-      CLEAR_PENDING_EXCEPTION;
-    }
-  } else {
-    // Delegate operation to locker thread
-    assert(_locker_thread != NULL, "Locker thread not created");
-    _locker_thread->unlock();
-  }
-}
--- a/hotspot/src/share/vm/gc/shared/referencePendingListLocker.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef SHARE_VM_GC_SHARED_REFERENCEPENDINGLISTLOCKER_HPP
-#define SHARE_VM_GC_SHARED_REFERENCEPENDINGLISTLOCKER_HPP
-
-#include "memory/allocation.hpp"
-#include "runtime/basicLock.hpp"
-#include "runtime/mutex.hpp"
-#include "runtime/thread.hpp"
-#include "utilities/exceptions.hpp"
-
-//
-// The ReferencePendingListLockerThread locks and unlocks the reference
-// pending list lock on behalf a non-Java thread, typically a concurrent
-// GC thread. This interface should not be directly accessed. All uses
-// should instead go through the ReferencePendingListLocker, which calls
-// this thread if needed.
-//
-class ReferencePendingListLockerThread : public JavaThread {
-private:
-  enum Message {
-    NONE,
-    LOCK,
-    UNLOCK
-  };
-
-  Monitor _monitor;
-  Message _message;
-
-  ReferencePendingListLockerThread();
-
-  static void start(JavaThread* thread, TRAPS);
-
-  void send_message(Message message);
-  void receive_and_handle_messages();
-
-public:
-  static ReferencePendingListLockerThread* create(TRAPS);
-
-  virtual bool is_hidden_from_external_view() const;
-
-  void lock();
-  void unlock();
-};
-
-//
-// The ReferencePendingListLocker is the main interface for locking and
-// unlocking the reference pending list lock, which needs to be held by
-// the GC when adding references to the pending list. Since this is a
-// Java-level monitor it can only be locked/unlocked by a Java thread.
-// For this reason there is an option to spawn a helper thread, the
-// ReferencePendingListLockerThread, during initialization. If a helper
-// thread is spawned all lock operations from non-Java threads will be
-// delegated to the helper thread. The helper thread is typically needed
-// by concurrent GCs.
-//
-class ReferencePendingListLocker VALUE_OBJ_CLASS_SPEC {
-private:
-  static bool                              _is_initialized;
-  static ReferencePendingListLockerThread* _locker_thread;
-  BasicLock                                _basic_lock;
-
-public:
-  static void initialize(bool needs_locker_thread, TRAPS);
-  static bool is_initialized();
-
-  static bool is_locked_by_self();
-
-  void lock();
-  void unlock();
-};
-
-#endif // SHARE_VM_GC_SHARED_REFERENCEPENDINGLISTLOCKER_HPP
--- a/hotspot/src/share/vm/gc/shared/referenceProcessor.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/referenceProcessor.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -289,39 +289,16 @@
   complete_gc->do_void();
 }
 
-
-template <class T>
-bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
-                                   AbstractRefProcTaskExecutor* task_executor) {
-
-  // Remember old value of pending references list
-  T* pending_list_addr = (T*)java_lang_ref_Reference::pending_list_addr();
-  T old_pending_list_value = *pending_list_addr;
-
+void ReferenceProcessor::enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor) {
   // Enqueue references that are not made active again, and
   // clear the decks for the next collection (cycle).
-  ref->enqueue_discovered_reflists((HeapWord*)pending_list_addr, task_executor);
-  // Do the post-barrier on pending_list_addr missed in
-  // enqueue_discovered_reflist.
-  oopDesc::bs()->write_ref_field(pending_list_addr, oopDesc::load_decode_heap_oop(pending_list_addr));
+  enqueue_discovered_reflists(task_executor);
 
   // Stop treating discovered references specially.
-  ref->disable_discovery();
-
-  // Return true if new pending references were added
-  return old_pending_list_value != *pending_list_addr;
+  disable_discovery();
 }
 
-bool ReferenceProcessor::enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor) {
-  if (UseCompressedOops) {
-    return enqueue_discovered_ref_helper<narrowOop>(this, task_executor);
-  } else {
-    return enqueue_discovered_ref_helper<oop>(this, task_executor);
-  }
-}
-
-void ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList& refs_list,
-                                                    HeapWord* pending_list_addr) {
+void ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList& refs_list) {
   // Given a list of refs linked through the "discovered" field
   // (java.lang.ref.Reference.discovered), self-loop their "next" field
   // thus distinguishing them from active References, then
@@ -354,10 +331,9 @@
       oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), next_d);
     } else {
       // This is the last object.
-      // Swap refs_list into pending_list_addr and
-      // set obj's discovered to what we read from pending_list_addr.
-      oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr);
-      // Need post-barrier on pending_list_addr. See enqueue_discovered_ref_helper() above.
+      // Swap refs_list into pending list and set obj's
+      // discovered to what we read from the pending list.
+      oop old = Universe::swap_reference_pending_list(refs_list.head());
       java_lang_ref_Reference::set_discovered_raw(obj, old); // old may be NULL
       oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), old);
     }
@@ -369,10 +345,8 @@
 public:
   RefProcEnqueueTask(ReferenceProcessor& ref_processor,
                      DiscoveredList      discovered_refs[],
-                     HeapWord*           pending_list_addr,
                      int                 n_queues)
-    : EnqueueTask(ref_processor, discovered_refs,
-                  pending_list_addr, n_queues)
+    : EnqueueTask(ref_processor, discovered_refs, n_queues)
   { }
 
   virtual void work(unsigned int work_id) {
@@ -387,8 +361,7 @@
     for (int j = 0;
          j < ReferenceProcessor::number_of_subclasses_of_ref();
          j++, index += _n_queues) {
-      _ref_processor.enqueue_discovered_reflist(
-        _refs_lists[index], _pending_list_addr);
+      _ref_processor.enqueue_discovered_reflist(_refs_lists[index]);
       _refs_lists[index].set_head(NULL);
       _refs_lists[index].set_length(0);
     }
@@ -396,17 +369,15 @@
 };
 
 // Enqueue references that are not made active again
-void ReferenceProcessor::enqueue_discovered_reflists(HeapWord* pending_list_addr,
-  AbstractRefProcTaskExecutor* task_executor) {
+void ReferenceProcessor::enqueue_discovered_reflists(AbstractRefProcTaskExecutor* task_executor) {
   if (_processing_is_mt && task_executor != NULL) {
     // Parallel code
-    RefProcEnqueueTask tsk(*this, _discovered_refs,
-                           pending_list_addr, _max_num_q);
+    RefProcEnqueueTask tsk(*this, _discovered_refs, _max_num_q);
     task_executor->execute(tsk);
   } else {
     // Serial code: call the parent class's implementation
     for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
-      enqueue_discovered_reflist(_discovered_refs[i], pending_list_addr);
+      enqueue_discovered_reflist(_discovered_refs[i]);
       _discovered_refs[i].set_head(NULL);
       _discovered_refs[i].set_length(0);
     }
--- a/hotspot/src/share/vm/gc/shared/referenceProcessor.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/referenceProcessor.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -290,7 +290,7 @@
                       VoidClosure*       complete_gc);
 
   // Enqueue references with a certain reachability level
-  void enqueue_discovered_reflist(DiscoveredList& refs_list, HeapWord* pending_list_addr);
+  void enqueue_discovered_reflist(DiscoveredList& refs_list);
 
   // "Preclean" all the discovered reference lists
   // by removing references with strongly reachable referents.
@@ -311,7 +311,7 @@
   // occupying the i / _num_q slot.
   const char* list_name(uint i);
 
-  void enqueue_discovered_reflists(HeapWord* pending_list_addr, AbstractRefProcTaskExecutor* task_executor);
+  void enqueue_discovered_reflists(AbstractRefProcTaskExecutor* task_executor);
 
  protected:
   // "Preclean" the given discovered reference list
@@ -424,7 +424,7 @@
                                 GCTimer *gc_timer);
 
   // Enqueue references at end of GC (called by the garbage collector)
-  bool enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor = NULL);
+  void enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor = NULL);
 
   // If a discovery is in process that is being superceded, abandon it: all
   // the discovered lists will be empty, and all the objects on them will
@@ -613,11 +613,9 @@
 protected:
   EnqueueTask(ReferenceProcessor& ref_processor,
               DiscoveredList      refs_lists[],
-              HeapWord*           pending_list_addr,
               int                 n_queues)
     : _ref_processor(ref_processor),
       _refs_lists(refs_lists),
-      _pending_list_addr(pending_list_addr),
       _n_queues(n_queues)
   { }
 
@@ -627,7 +625,6 @@
 protected:
   ReferenceProcessor& _ref_processor;
   DiscoveredList*     _refs_lists;
-  HeapWord*           _pending_list_addr;
   int                 _n_queues;
 };
 
--- a/hotspot/src/share/vm/gc/shared/space.inline.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/space.inline.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -293,10 +293,11 @@
 
   verify_up_to_first_dead(space);
 
+  HeapWord* const bottom = space->bottom();
   HeapWord* const end_of_live = space->_end_of_live;
 
   assert(space->_first_dead <= end_of_live, "Invariant. _first_dead: " PTR_FORMAT " <= end_of_live: " PTR_FORMAT, p2i(space->_first_dead), p2i(end_of_live));
-  if (space->_first_dead == end_of_live && !oop(space->bottom())->is_gc_marked()) {
+  if (space->_first_dead == end_of_live && (bottom == end_of_live || !oop(bottom)->is_gc_marked())) {
     // Nothing to compact. The space is either empty or all live object should be left in place.
     clear_empty_region(space);
     return;
@@ -305,8 +306,8 @@
   const intx scan_interval = PrefetchScanIntervalInBytes;
   const intx copy_interval = PrefetchCopyIntervalInBytes;
 
-  assert(space->bottom() < end_of_live, "bottom: " PTR_FORMAT " should be < end_of_live: " PTR_FORMAT, p2i(space->bottom()), p2i(end_of_live));
-  HeapWord* cur_obj = space->bottom();
+  assert(bottom < end_of_live, "bottom: " PTR_FORMAT " should be < end_of_live: " PTR_FORMAT, p2i(bottom), p2i(end_of_live));
+  HeapWord* cur_obj = bottom;
   if (space->_first_dead > cur_obj && !oop(cur_obj)->is_gc_marked()) {
     // All object before _first_dead can be skipped. They should not be moved.
     // A pointer to the first live object is stored at the memory location for _first_dead.
--- a/hotspot/src/share/vm/gc/shared/vmGCOperations.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/vmGCOperations.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -62,14 +62,6 @@
   HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
 }
 
-void VM_GC_Operation::acquire_pending_list_lock() {
-  _pending_list_locker.lock();
-}
-
-void VM_GC_Operation::release_and_notify_pending_list_lock() {
-  _pending_list_locker.unlock();
-}
-
 // Allocations may fail in several threads at about the same time,
 // resulting in multiple gc requests.  We only want to do one of them.
 // In case a GC locker is active and the need for a GC is already signaled,
@@ -102,16 +94,13 @@
               proper_unit_for_byte_size(NewSize)));
   }
 
-  acquire_pending_list_lock();
   // If the GC count has changed someone beat us to the collection
-  // Get the Heap_lock after the pending_list_lock.
   Heap_lock->lock();
 
   // Check invocations
   if (skip_operation()) {
     // skip collection
     Heap_lock->unlock();
-    release_and_notify_pending_list_lock();
     _prologue_succeeded = false;
   } else {
     _prologue_succeeded = true;
@@ -122,9 +111,10 @@
 
 void VM_GC_Operation::doit_epilogue() {
   assert(Thread::current()->is_Java_thread(), "just checking");
-  // Release the Heap_lock first.
+  if (Universe::has_reference_pending_list()) {
+    Heap_lock->notify_all();
+  }
   Heap_lock->unlock();
-  release_and_notify_pending_list_lock();
 }
 
 bool VM_GC_HeapInspection::skip_operation() const {
--- a/hotspot/src/share/vm/gc/shared/vmGCOperations.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/vmGCOperations.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
 
 #include "gc/shared/collectedHeap.hpp"
 #include "gc/shared/genCollectedHeap.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "memory/heapInspection.hpp"
 #include "prims/jvmtiExport.hpp"
 #include "runtime/handles.hpp"
@@ -70,9 +69,6 @@
 //
 
 class VM_GC_Operation: public VM_Operation {
- private:
-  ReferencePendingListLocker _pending_list_locker;
-
  protected:
   uint           _gc_count_before;         // gc count before acquiring PLL
   uint           _full_gc_count_before;    // full gc count before acquiring PLL
@@ -83,10 +79,6 @@
 
   virtual bool skip_operation() const;
 
-  // java.lang.ref.Reference support
-  void acquire_pending_list_lock();
-  void release_and_notify_pending_list_lock();
-
  public:
   VM_GC_Operation(uint gc_count_before,
                   GCCause::Cause _cause,
--- a/hotspot/src/share/vm/gc/shared/workgroup.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -162,7 +162,7 @@
     _active_workers = MIN2(v, _total_workers);
     add_workers(false /* exit_on_failure */);
     assert(v != 0, "Trying to set active workers to 0");
-    log_info(gc, task)("GC Workers: using %d out of %d", _active_workers, _total_workers);
+    log_trace(gc, task)("%s: using %d out of %d workers", name(), _active_workers, _total_workers);
     return _active_workers;
   }
 
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -203,6 +203,40 @@
 #undef SET_TRIGFUNC
 }
 
+objArrayHandle CompilerToVM::initialize_intrinsics(TRAPS) {
+  objArrayHandle vmIntrinsics = oopFactory::new_objArray(VMIntrinsicMethod::klass(), (vmIntrinsics::ID_LIMIT - 1), CHECK_(objArrayHandle()));
+  int index = 0;
+  // The intrinsics for a class are usually adjacent to each other.
+  // When they are, the string for the class name can be reused.
+  vmSymbols::SID kls_sid = vmSymbols::NO_SID;
+  Handle kls_str;
+#define SID_ENUM(n) vmSymbols::VM_SYMBOL_ENUM_NAME(n)
+#define VM_SYMBOL_TO_STRING(s) \
+  java_lang_String::create_from_symbol(vmSymbols::symbol_at(SID_ENUM(s)), CHECK_(objArrayHandle()))
+#define VM_INTRINSIC_INFO(id, kls, name, sig, ignore_fcode) {             \
+    instanceHandle vmIntrinsicMethod = InstanceKlass::cast(VMIntrinsicMethod::klass())->allocate_instance_handle(CHECK_(objArrayHandle())); \
+    if (kls_sid != SID_ENUM(kls)) {                                       \
+      kls_str = VM_SYMBOL_TO_STRING(kls);                                 \
+      kls_sid = SID_ENUM(kls);                                            \
+    }                                                                     \
+    Handle name_str = VM_SYMBOL_TO_STRING(name);                          \
+    Handle sig_str = VM_SYMBOL_TO_STRING(sig);                            \
+    VMIntrinsicMethod::set_declaringClass(vmIntrinsicMethod, kls_str());  \
+    VMIntrinsicMethod::set_name(vmIntrinsicMethod, name_str());           \
+    VMIntrinsicMethod::set_descriptor(vmIntrinsicMethod, sig_str());      \
+    VMIntrinsicMethod::set_id(vmIntrinsicMethod, vmIntrinsics::id);       \
+      vmIntrinsics->obj_at_put(index++, vmIntrinsicMethod());             \
+  }
+
+  VM_INTRINSICS_DO(VM_INTRINSIC_INFO, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE)
+#undef SID_ENUM
+#undef VM_SYMBOL_TO_STRING
+#undef VM_INTRINSIC_INFO
+  assert(index == vmIntrinsics::ID_LIMIT - 1, "must be");
+
+  return vmIntrinsics;
+}
+
 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv *env))
 #define BOXED_LONG(name, value) oop name; do { jvalue p; p.j = (jlong) (value); name = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL);} while(0)
 #define BOXED_DOUBLE(name, value) oop name; do { jvalue p; p.d = (jdouble) (value); name = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL);} while(0)
@@ -211,8 +245,9 @@
 
   CompilerToVM::Data::initialize();
 
-  VMField::klass()->initialize(thread);
-  VMFlag::klass()->initialize(thread);
+  VMField::klass()->initialize(CHECK_NULL);
+  VMFlag::klass()->initialize(CHECK_NULL);
+  VMIntrinsicMethod::klass()->initialize(CHECK_NULL);
 
   int len = JVMCIVMStructs::localHotSpotVMStructs_count();
   objArrayHandle vmFields = oopFactory::new_objArray(VMField::klass(), len, CHECK_NULL);
@@ -220,7 +255,7 @@
     VMStructEntry vmField = JVMCIVMStructs::localHotSpotVMStructs[i];
     instanceHandle vmFieldObj = InstanceKlass::cast(VMField::klass())->allocate_instance_handle(CHECK_NULL);
     size_t name_buf_len = strlen(vmField.typeName) + strlen(vmField.fieldName) + 2 /* "::" */;
-    char* name_buf = NEW_RESOURCE_ARRAY(char, name_buf_len + 1);
+    char* name_buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, name_buf_len + 1);
     sprintf(name_buf, "%s::%s", vmField.typeName, vmField.fieldName);
     Handle name = java_lang_String::create_from_str(name_buf, CHECK_NULL);
     Handle type = java_lang_String::create_from_str(vmField.typeString, CHECK_NULL);
@@ -338,12 +373,15 @@
     vmFlags->obj_at_put(i, vmFlagObj());
   }
 
-  objArrayOop data = oopFactory::new_objArray(SystemDictionary::Object_klass(), 5, CHECK_NULL);
+  objArrayHandle vmIntrinsics = CompilerToVM::initialize_intrinsics(CHECK_NULL);
+
+  objArrayOop data = oopFactory::new_objArray(SystemDictionary::Object_klass(), 6, CHECK_NULL);
   data->obj_at_put(0, vmFields());
   data->obj_at_put(1, vmTypes());
   data->obj_at_put(2, vmConstants());
   data->obj_at_put(3, vmAddresses());
   data->obj_at_put(4, vmFlags());
+  data->obj_at_put(5, vmIntrinsics());
 
   return (jobjectArray) JNIHandles::make_local(THREAD, data);
 #undef BOXED_LONG
@@ -1266,10 +1304,23 @@
 
 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
-  CallInfo callInfo;
-  LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
-  ConstantPoolCacheEntry* cp_cache_entry = cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
-  cp_cache_entry->set_method_handle(cp, callInfo);
+  KlassHandle holder = cp->klass_ref_at(index, CHECK);
+  Symbol* name = cp->name_ref_at(index);
+  if (MethodHandles::is_signature_polymorphic_name(holder(), name)) {
+    CallInfo callInfo;
+    LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
+    ConstantPoolCacheEntry* cp_cache_entry = cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
+    cp_cache_entry->set_method_handle(cp, callInfo);
+  }
+C2V_END
+
+C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv*, jobject))
+  objArrayHandle holders = oopFactory::new_objArray(SystemDictionary::String_klass(), 2, CHECK_NULL);
+  Handle mh = java_lang_String::create_from_str("Ljava/lang/invoke/MethodHandle;", CHECK_NULL);
+  Handle vh = java_lang_String::create_from_str("Ljava/lang/invoke/VarHandle;", CHECK_NULL);
+  holders->obj_at_put(0, mh());
+  holders->obj_at_put(1, vh());
+  return JNIHandles::make_local(THREAD, holders());
 C2V_END
 
 C2V_VMENTRY(jboolean, shouldDebugNonSafepoints, (JNIEnv*, jobject))
@@ -1511,6 +1562,7 @@
   {CC "resolveInvokeDynamicInPool",                   CC "(" HS_CONSTANT_POOL "I)V",                                                        FN_PTR(resolveInvokeDynamicInPool)},
   {CC "resolveInvokeHandleInPool",                    CC "(" HS_CONSTANT_POOL "I)V",                                                        FN_PTR(resolveInvokeHandleInPool)},
   {CC "resolveMethod",                                CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD HS_RESOLVED_KLASS ")" HS_RESOLVED_METHOD, FN_PTR(resolveMethod)},
+  {CC "getSignaturePolymorphicHolders",               CC "()[" STRING,                                                                      FN_PTR(getSignaturePolymorphicHolders)},
   {CC "getVtableIndexForInterfaceMethod",             CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD ")I",                                     FN_PTR(getVtableIndexForInterfaceMethod)},
   {CC "getClassInitializer",                          CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_METHOD,                                      FN_PTR(getClassInitializer)},
   {CC "hasFinalizableSubclass",                       CC "(" HS_RESOLVED_KLASS ")Z",                                                        FN_PTR(hasFinalizableSubclass)},
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -83,8 +83,10 @@
     }
   };
 
+  static JNINativeMethod methods[];
+
+  static objArrayHandle initialize_intrinsics(TRAPS);
  public:
-  static JNINativeMethod methods[];
   static int methods_count();
 
   static inline Method* asMethod(jobject jvmci_method) {
--- a/hotspot/src/share/vm/jvmci/jvmciJavaClasses.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciJavaClasses.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -124,6 +124,12 @@
     oop_field(VMFlag, type, "Ljava/lang/String;")                                                                                                              \
     oop_field(VMFlag, value, "Ljava/lang/Object;")                                                                                                             \
   end_class                                                                                                                                                    \
+  start_class(VMIntrinsicMethod)                                                                                                                               \
+    oop_field(VMIntrinsicMethod, declaringClass, "Ljava/lang/String;")                                                                                         \
+    oop_field(VMIntrinsicMethod, name, "Ljava/lang/String;")                                                                                                   \
+    oop_field(VMIntrinsicMethod, descriptor, "Ljava/lang/String;")                                                                                             \
+    int_field(VMIntrinsicMethod, id)                                                                                                                           \
+  end_class                                                                                                                                                    \
   start_class(Assumptions_NoFinalizableSubclass)                                                                                                               \
     oop_field(Assumptions_NoFinalizableSubclass, receiverType, "Ljdk/vm/ci/meta/ResolvedJavaType;")                                                            \
   end_class                                                                                                                                                    \
--- a/hotspot/src/share/vm/jvmci/jvmci_globals.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmci_globals.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -84,6 +84,7 @@
   CHECK_NOT_SET(JVMCICountersExcludeCompiler, EnableJVMCI)
   CHECK_NOT_SET(JVMCIUseFastLocking,          EnableJVMCI)
   CHECK_NOT_SET(JVMCINMethodSizeLimit,        EnableJVMCI)
+  CHECK_NOT_SET(MethodProfileWidth,           EnableJVMCI)
   CHECK_NOT_SET(TraceUncollectedSpeculations, EnableJVMCI)
 
 #ifndef PRODUCT
--- a/hotspot/src/share/vm/jvmci/jvmci_globals.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmci_globals.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -88,6 +88,9 @@
   experimental(intx, JVMCINMethodSizeLimit, (80*K)*wordSize,                \
           "Maximum size of a compiled method.")                             \
                                                                             \
+  experimental(intx, MethodProfileWidth, 0,                                 \
+          "Number of methods to record in call profile")                    \
+                                                                            \
   develop(bool, TraceUncollectedSpeculations, false,                        \
           "Print message when a failed speculation was not collected")
 
--- a/hotspot/src/share/vm/jvmci/systemDictionary_jvmci.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/systemDictionary_jvmci.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -51,6 +51,7 @@
   do_klass(HotSpotCompilationRequestResult_klass,        jdk_vm_ci_hotspot_HotSpotCompilationRequestResult,     Jvmci) \
   do_klass(VMField_klass,                                jdk_vm_ci_hotspot_VMField,                             Jvmci) \
   do_klass(VMFlag_klass,                                 jdk_vm_ci_hotspot_VMFlag,                              Jvmci) \
+  do_klass(VMIntrinsicMethod_klass,                      jdk_vm_ci_hotspot_VMIntrinsicMethod,                   Jvmci) \
   do_klass(Assumptions_ConcreteMethod_klass,             jdk_vm_ci_meta_Assumptions_ConcreteMethod,             Jvmci) \
   do_klass(Assumptions_NoFinalizableSubclass_klass,      jdk_vm_ci_meta_Assumptions_NoFinalizableSubclass,      Jvmci) \
   do_klass(Assumptions_ConcreteSubtype_klass,            jdk_vm_ci_meta_Assumptions_ConcreteSubtype,            Jvmci) \
--- a/hotspot/src/share/vm/jvmci/vmStructs_jvmci.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/vmStructs_jvmci.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -493,6 +493,7 @@
   declare_constant(Method::_force_inline)                                 \
   declare_constant(Method::_dont_inline)                                  \
   declare_constant(Method::_hidden)                                       \
+  declare_constant(Method::_intrinsic_candidate)                          \
   declare_constant(Method::_reserved_stack_access)                        \
                                                                           \
   declare_constant(Method::nonvirtual_vtable_index)                       \
--- a/hotspot/src/share/vm/jvmci/vmSymbols_jvmci.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/vmSymbols_jvmci.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -52,6 +52,7 @@
   template(jdk_vm_ci_hotspot_HotSpotCompilationRequestResult,     "jdk/vm/ci/hotspot/HotSpotCompilationRequestResult")     \
   template(jdk_vm_ci_hotspot_VMField,                             "jdk/vm/ci/hotspot/VMField")                             \
   template(jdk_vm_ci_hotspot_VMFlag,                              "jdk/vm/ci/hotspot/VMFlag")                              \
+  template(jdk_vm_ci_hotspot_VMIntrinsicMethod,                   "jdk/vm/ci/hotspot/VMIntrinsicMethod")                   \
   template(jdk_vm_ci_meta_JavaConstant,                           "jdk/vm/ci/meta/JavaConstant")                           \
   template(jdk_vm_ci_meta_PrimitiveConstant,                      "jdk/vm/ci/meta/PrimitiveConstant")                      \
   template(jdk_vm_ci_meta_RawConstant,                            "jdk/vm/ci/meta/RawConstant")                            \
--- a/hotspot/src/share/vm/logging/log.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/log.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1161,7 +1161,7 @@
 
   // Attempt to log to a directory (existing log not a regular file)
   create_directory(target_name);
-  LogFileOutput bad_file("tmplogdir");
+  LogFileOutput bad_file("file=tmplogdir");
   assert(bad_file.initialize("", &ss) == false, "file was initialized "
          "when there was an existing directory with the same name");
   assert(strstr(ss.as_string(), "tmplogdir is not a regular file") != NULL,
--- a/hotspot/src/share/vm/logging/logConfiguration.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logConfiguration.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -44,6 +44,9 @@
 LogConfiguration::UpdateListenerFunction* LogConfiguration::_listener_callbacks = NULL;
 size_t      LogConfiguration::_n_listener_callbacks = 0;
 
+// LogFileOutput is the default type of output, its type prefix should be used if no type was specified
+static const char* implicit_output_prefix = LogFileOutput::Prefix;
+
 // Stack object to take the lock for configuring the logging.
 // Should only be held during the critical parts of the configuration
 // (when calling configure_output or reading/modifying the outputs array).
@@ -107,6 +110,55 @@
   FREE_C_HEAP_ARRAY(LogOutput*, _outputs);
 }
 
+// Normalizes the given LogOutput name to type=name form.
+// For example, foo, "foo", file="foo", will all be normalized to file=foo (no quotes, prefixed).
+static bool normalize_output_name(const char* full_name, char* buffer, size_t len, outputStream* errstream) {
+  const char* start_quote = strchr(full_name, '"');
+  const char* equals = strchr(full_name, '=');
+  const bool quoted = start_quote != NULL;
+  const bool is_stdout_or_stderr = (strcmp(full_name, "stdout") == 0 || strcmp(full_name, "stderr") == 0);
+
+  // ignore equals sign within quotes
+  if (quoted && equals > start_quote) {
+    equals = NULL;
+  }
+
+  const char* prefix = "";
+  size_t prefix_len = 0;
+  const char* name = full_name;
+  if (equals != NULL) {
+    // split on equals sign
+    name = equals + 1;
+    prefix = full_name;
+    prefix_len = equals - full_name + 1;
+  } else if (!is_stdout_or_stderr) {
+    prefix = implicit_output_prefix;
+    prefix_len = strlen(prefix);
+  }
+  size_t name_len = strlen(name);
+
+  if (quoted) {
+    const char* end_quote = strchr(start_quote + 1, '"');
+    if (end_quote == NULL) {
+      errstream->print_cr("Output name has opening quote but is missing a terminating quote.");
+      return false;
+    }
+    if (start_quote != name || end_quote[1] != '\0') {
+      errstream->print_cr("Output name can not be partially quoted."
+                          " Either surround the whole name with quotation marks,"
+                          " or do not use quotation marks at all.");
+      return false;
+    }
+    // strip start and end quote
+    name++;
+    name_len -= 2;
+  }
+
+  int ret = jio_snprintf(buffer, len, "%.*s%.*s", prefix_len, prefix, name_len, name);
+  assert(ret > 0, "buffer issue");
+  return true;
+}
+
 size_t LogConfiguration::find_output(const char* name) {
   for (size_t i = 0; i < _n_outputs; i++) {
     if (strcmp(_outputs[i]->name(), name) == 0) {
@@ -116,39 +168,14 @@
   return SIZE_MAX;
 }
 
-LogOutput* LogConfiguration::new_output(char* name, const char* options, outputStream* errstream) {
-  const char* type;
-  char* equals_pos = strchr(name, '=');
-  if (equals_pos == NULL) {
-    type = "file";
-  } else {
-    *equals_pos = '\0';
-    type = name;
-    name = equals_pos + 1;
-  }
-
-  // Check if name is quoted, and if so, strip the quotes
-  char* quote = strchr(name, '"');
-  if (quote != NULL) {
-    char* end_quote = strchr(name + 1, '"');
-    if (end_quote == NULL) {
-      errstream->print_cr("Output name has opening quote but is missing a terminating quote.");
-      return NULL;
-    } else if (quote != name || end_quote[1] != '\0') {
-      errstream->print_cr("Output name can not be partially quoted."
-                          " Either surround the whole name with quotation marks,"
-                          " or do not use quotation marks at all.");
-      return NULL;
-    }
-    name++;
-    *end_quote = '\0';
-  }
-
+LogOutput* LogConfiguration::new_output(const char* name,
+                                        const char* options,
+                                        outputStream* errstream) {
   LogOutput* output;
-  if (strcmp(type, "file") == 0) {
+  if (strncmp(name, LogFileOutput::Prefix, strlen(LogFileOutput::Prefix)) == 0) {
     output = new LogFileOutput(name);
   } else {
-    errstream->print_cr("Unsupported log output type.");
+    errstream->print_cr("Unsupported log output type: %s", name);
     return NULL;
   }
 
@@ -243,6 +270,7 @@
 }
 
 void LogConfiguration::disable_output(size_t idx) {
+  assert(idx < _n_outputs, "invalid index: " SIZE_FORMAT " (_n_outputs: " SIZE_FORMAT ")", idx, _n_outputs);
   LogOutput* out = _outputs[idx];
 
   // Remove the output from all tagsets.
@@ -253,7 +281,7 @@
 
   // Delete the output unless stdout/stderr
   if (out != LogOutput::Stderr && out != LogOutput::Stdout) {
-    delete_output(find_output(out->name()));
+    delete_output(idx);
   } else {
     out->set_config_string("all=off");
   }
@@ -261,8 +289,8 @@
 
 void LogConfiguration::disable_logging() {
   ConfigurationLock cl;
-  for (size_t i = 0; i < _n_outputs; i++) {
-    disable_output(i);
+  for (size_t i = _n_outputs; i > 0; i--) {
+    disable_output(i - 1);
   }
   notify_update_listeners();
 }
@@ -289,6 +317,8 @@
   }
   expr.set_level(level);
   expr.new_combination();
+  assert(expr.verify_tagsets(),
+         "configure_stdout() called with invalid/non-existing tag set");
 
   // Apply configuration to stdout (output #0), with the same decorators as before.
   ConfigurationLock cl;
@@ -334,9 +364,16 @@
   char errbuf[512];
   stringStream ss(errbuf, sizeof(errbuf));
   bool success = parse_log_arguments(output, what, decorators, output_options, &ss);
-  if (!success) {
-    errbuf[strlen(errbuf) - 1] = '\0'; // Strip trailing newline.
-    log_error(logging)("%s", errbuf);
+
+  if (ss.size() > 0) {
+    errbuf[strlen(errbuf) - 1] = '\0'; // Strip trailing newline
+    // If it failed, log the error. If it didn't fail, but something was written
+    // to the stream, log it as a warning.
+    if (!success) {
+      log_error(logging)("%s", ss.base());
+    } else {
+      log_warning(logging)("%s", ss.base());
+    }
   }
 
   os::free(copy);
@@ -348,6 +385,7 @@
                                            const char* decoratorstr,
                                            const char* output_options,
                                            outputStream* errstream) {
+  assert(errstream != NULL, "errstream can not be NULL");
   if (outputstr == NULL || strlen(outputstr) == 0) {
     outputstr = "stdout";
   }
@@ -364,28 +402,39 @@
 
   ConfigurationLock cl;
   size_t idx;
-  if (outputstr[0] == '#') {
-    int ret = sscanf(outputstr+1, SIZE_FORMAT, &idx);
+  if (outputstr[0] == '#') { // Output specified using index
+    int ret = sscanf(outputstr + 1, SIZE_FORMAT, &idx);
     if (ret != 1 || idx >= _n_outputs) {
       errstream->print_cr("Invalid output index '%s'", outputstr);
       return false;
     }
-  } else {
-    idx = find_output(outputstr);
+  } else { // Output specified using name
+    // Normalize the name, stripping quotes and ensures it includes type prefix
+    size_t len = strlen(outputstr) + strlen(implicit_output_prefix) + 1;
+    char* normalized = NEW_C_HEAP_ARRAY(char, len, mtLogging);
+    if (!normalize_output_name(outputstr, normalized, len, errstream)) {
+      return false;
+    }
+
+    idx = find_output(normalized);
     if (idx == SIZE_MAX) {
-      char* tmp = os::strdup_check_oom(outputstr, mtLogging);
-      LogOutput* output = new_output(tmp, output_options, errstream);
-      os::free(tmp);
-      if (output == NULL) {
-        return false;
+      // Attempt to create and add the output
+      LogOutput* output = new_output(normalized, output_options, errstream);
+      if (output != NULL) {
+        idx = add_output(output);
       }
-      idx = add_output(output);
     } else if (output_options != NULL && strlen(output_options) > 0) {
       errstream->print_cr("Output options for existing outputs are ignored.");
     }
+
+    FREE_C_HEAP_ARRAY(char, normalized);
+    if (idx == SIZE_MAX) {
+      return false;
+    }
   }
   configure_output(idx, expr, decorators);
   notify_update_listeners();
+  expr.verify_tagsets(errstream);
   return true;
 }
 
--- a/hotspot/src/share/vm/logging/logConfiguration.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logConfiguration.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -59,7 +59,7 @@
   static size_t                     _n_listener_callbacks;
 
   // Create a new output. Returns NULL if failed.
-  static LogOutput* new_output(char* name, const char* options, outputStream* errstream);
+  static LogOutput* new_output(const char* name, const char* options, outputStream* errstream);
 
   // Add an output to the list of configured outputs. Returns the assigned index.
   static size_t add_output(LogOutput* out);
--- a/hotspot/src/share/vm/logging/logFileOutput.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logFileOutput.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -31,6 +31,7 @@
 #include "utilities/globalDefinitions.hpp"
 #include "utilities/defaultStream.hpp"
 
+const char* LogFileOutput::Prefix = "file=";
 const char* LogFileOutput::FileOpenMode = "a";
 const char* LogFileOutput::PidFilenamePlaceholder = "%p";
 const char* LogFileOutput::TimestampFilenamePlaceholder = "%t";
@@ -45,7 +46,8 @@
       _file_name(NULL), _archive_name(NULL), _archive_name_len(0),
       _rotate_size(DefaultFileSize), _file_count(DefaultFileCount),
       _current_size(0), _current_file(0), _rotation_semaphore(1) {
-  _file_name = make_file_name(name, _pid_str, _vm_start_time_str);
+  assert(strstr(name, Prefix) == name, "invalid output name '%s': missing prefix: %s", name, Prefix);
+  _file_name = make_file_name(name + strlen(Prefix), _pid_str, _vm_start_time_str);
 }
 
 void LogFileOutput::set_file_name_parameters(jlong vm_start_time) {
--- a/hotspot/src/share/vm/logging/logFileOutput.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logFileOutput.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -91,6 +91,7 @@
     return _name;
   }
 
+  static const char* Prefix;
   static void set_file_name_parameters(jlong start_time);
 };
 
--- a/hotspot/src/share/vm/logging/logTagLevelExpression.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logTagLevelExpression.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -29,6 +29,65 @@
 
 const char* LogTagLevelExpression::DefaultExpressionString = "all";
 
+static bool matches_tagset(const LogTagType tags[],
+                           bool allow_other_tags,
+                           const LogTagSet& ts) {
+  bool contains_all = true;
+  size_t tag_idx;
+  for (tag_idx = 0; tag_idx < LogTag::MaxTags && tags[tag_idx] != LogTag::__NO_TAG; tag_idx++) {
+    if (!ts.contains(tags[tag_idx])) {
+      contains_all = false;
+      break;
+    }
+  }
+  // All tags in the expression must be part of the tagset,
+  // and either the expression allows other tags (has a wildcard),
+  // or the number of tags in the expression and tagset must match.
+  return contains_all && (allow_other_tags || tag_idx == ts.ntags());
+}
+
+bool LogTagLevelExpression::verify_tagsets(outputStream* out) const {
+  bool valid = true;
+
+  for (size_t i = 0; i < _ncombinations; i++) {
+    bool matched = false;
+    for (LogTagSet* ts = LogTagSet::first(); ts != NULL; ts = ts->next()) {
+      if (matches_tagset(_tags[i], _allow_other_tags[i], *ts)) {
+        matched = true;
+        break;
+      }
+    }
+
+    if (!matched) {
+      // If this was the first invalid combination, write the message header
+      if (valid && out != NULL) {
+        out->print("No tag set matches selection(s): ");
+      }
+      valid = false;
+
+      // Break as soon as possible unless listing all invalid combinations
+      if (out == NULL) {
+        break;
+      }
+
+      // List the combination on the outputStream
+      for (size_t t = 0; t < LogTag::MaxTags && _tags[i][t] != LogTag::__NO_TAG; t++) {
+        out->print("%s%s", (t == 0 ? "" : "+"), LogTag::name(_tags[i][t]));
+      }
+      if (_allow_other_tags[i]) {
+        out->print("*");
+      }
+      out->print(" ");
+    }
+  }
+
+  if (!valid && out != NULL) {
+    out->cr();
+  }
+
+  return valid;
+}
+
 bool LogTagLevelExpression::parse(const char* str, outputStream* errstream) {
   bool success = true;
   if (str == NULL || strcmp(str, "") == 0) {
@@ -105,7 +164,14 @@
         success = false;
         break;
       }
-      add_tag(tag);
+      if (!add_tag(tag)) {
+        if (errstream != NULL) {
+          errstream->print_cr("Tag combination have duplicate tag '%s' in what-expression.",
+                              cur_tag);
+        }
+        success = false;
+        break;
+      }
       cur_tag = plus_pos + 1;
     } while (plus_pos != NULL);
 
@@ -120,20 +186,10 @@
   // Return NotMentioned if the given tagset isn't covered by this expression.
   LogLevelType level = LogLevel::NotMentioned;
   for (size_t combination = 0; combination < _ncombinations; combination++) {
-    bool contains_all = true;
-    size_t tag_idx;
-    for (tag_idx = 0; tag_idx < LogTag::MaxTags && _tags[combination][tag_idx] != LogTag::__NO_TAG; tag_idx++) {
-      if (!ts.contains(_tags[combination][tag_idx])) {
-        contains_all = false;
-        break;
-      }
-    }
-    // All tags in the expression must be part of the tagset,
-    // and either the expression allows other tags (has a wildcard),
-    // or the number of tags in the expression and tagset must match.
-    if (contains_all && (_allow_other_tags[combination] || tag_idx == ts.ntags())) {
+    if (matches_tagset(_tags[combination], _allow_other_tags[combination], ts)) {
       level = _level[combination];
     }
   }
   return level;
 }
+
--- a/hotspot/src/share/vm/logging/logTagLevelExpression.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logTagLevelExpression.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -59,9 +59,15 @@
     _ntags = 0;
   }
 
-  void add_tag(LogTagType tag) {
+  bool add_tag(LogTagType tag) {
     assert(_ntags < LogTag::MaxTags, "Can't have more tags than MaxTags!");
+    for (size_t i = 0; i < _ntags; i++) {
+      if (_tags[_ncombinations][i] == tag) {
+        return false;
+      }
+    }
     _tags[_ncombinations][_ntags++] = tag;
+    return true;
   }
 
   void set_level(LogLevelType level) {
@@ -83,6 +89,11 @@
 
   bool parse(const char* str, outputStream* errstream = NULL);
   LogLevelType level_for(const LogTagSet& ts) const;
+
+  // Verify the tagsets/selections mentioned in this expression.
+  // Returns false if some invalid tagset was found. If given an outputstream,
+  // this function will list all the invalid selections on the stream.
+  bool verify_tagsets(outputStream* out = NULL) const;
 };
 
 #endif // SHARE_VM_LOGGING_LOGTAGLEVELEXPRESSION_HPP
--- a/hotspot/src/share/vm/logging/logTagSet.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/logging/logTagSet.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -86,7 +86,7 @@
   }
 
   bool contains(LogTagType tag) const {
-    for (size_t i = 0; _tag[i] != LogTag::__NO_TAG; i++) {
+    for (size_t i = 0; i < LogTag::MaxTags && _tag[i] != LogTag::__NO_TAG; i++) {
       if (tag == _tag[i]) {
         return true;
       }
--- a/hotspot/src/share/vm/memory/universe.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/memory/universe.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -135,6 +135,7 @@
 oop Universe::_virtual_machine_error_instance         = NULL;
 oop Universe::_vm_exception                           = NULL;
 oop Universe::_allocation_context_notification_obj    = NULL;
+oop Universe::_reference_pending_list                 = NULL;
 
 Array<int>* Universe::_the_empty_int_array            = NULL;
 Array<u2>* Universe::_the_empty_short_array           = NULL;
@@ -212,6 +213,7 @@
   f->do_oop((oop*)&_system_thread_group);
   f->do_oop((oop*)&_vm_exception);
   f->do_oop((oop*)&_allocation_context_notification_obj);
+  f->do_oop((oop*)&_reference_pending_list);
   debug_only(f->do_oop((oop*)&_fullgc_alot_dummy_array);)
 }
 
@@ -488,6 +490,35 @@
   java_lang_Class::set_fixup_mirror_list(NULL);
 }
 
+#define assert_pll_locked(test) \
+  assert(Heap_lock->test(), "Reference pending list access requires lock")
+
+#define assert_pll_ownership() assert_pll_locked(owned_by_self)
+
+oop Universe::reference_pending_list() {
+  assert_pll_ownership();
+  return _reference_pending_list;
+}
+
+void Universe::set_reference_pending_list(oop list) {
+  assert_pll_ownership();
+  _reference_pending_list = list;
+}
+
+bool Universe::has_reference_pending_list() {
+  assert_pll_ownership();
+  return _reference_pending_list != NULL;
+}
+
+oop Universe::swap_reference_pending_list(oop list) {
+  assert_pll_locked(is_locked);
+  return (oop)Atomic::xchg_ptr(list, &_reference_pending_list);
+}
+
+#undef assert_pll_locked
+#undef assert_pll_ownership
+
+
 static bool has_run_finalizers_on_exit = false;
 
 void Universe::run_finalizers_on_exit() {
@@ -565,12 +596,14 @@
 
 oop Universe::gen_out_of_memory_error(oop default_err) {
   // generate an out of memory error:
-  // - if there is a preallocated error with backtrace available then return it wth
-  //   a filled in stack trace.
-  // - if there are no preallocated errors with backtrace available then return
-  //   an error without backtrace.
+  // - if there is a preallocated error and stack traces are available
+  //   (j.l.Throwable is initialized), then return the preallocated
+  //   error with a filled in stack trace, and with the message
+  //   provided by the default error.
+  // - otherwise, return the default error, without a stack trace.
   int next;
-  if (_preallocated_out_of_memory_error_avail_count > 0) {
+  if ((_preallocated_out_of_memory_error_avail_count > 0) &&
+      SystemDictionary::Throwable_klass()->is_initialized()) {
     next = (int)Atomic::add(-1, &_preallocated_out_of_memory_error_avail_count);
     assert(next < (int)PreallocatedOutOfMemoryErrorCount, "avail count is corrupt");
   } else {
--- a/hotspot/src/share/vm/memory/universe.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/memory/universe.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -185,6 +185,9 @@
 
   static oop          _allocation_context_notification_obj;
 
+  // References waiting to be transferred to the ReferenceHandler
+  static oop          _reference_pending_list;
+
   // The particular choice of collected heap.
   static CollectedHeap* _collectedHeap;
 
@@ -334,6 +337,17 @@
   static inline oop   allocation_context_notification_obj();
   static inline void  set_allocation_context_notification_obj(oop obj);
 
+  // Reference pending list manipulation.  Access is protected by
+  // Heap_lock.  The getter, setter and predicate require the caller
+  // owns the lock.  Swap is used by parallel non-concurrent reference
+  // processing threads, where some higher level controller owns
+  // Heap_lock, so requires the lock is locked, but not necessarily by
+  // the current thread.
+  static oop          reference_pending_list();
+  static void         set_reference_pending_list(oop list);
+  static bool         has_reference_pending_list();
+  static oop          swap_reference_pending_list(oop list);
+
   static Array<int>*       the_empty_int_array()    { return _the_empty_int_array; }
   static Array<u2>*        the_empty_short_array()  { return _the_empty_short_array; }
   static Array<Method*>* the_empty_method_array() { return _the_empty_method_array; }
--- a/hotspot/src/share/vm/oops/arrayKlass.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/arrayKlass.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -56,7 +56,9 @@
   void set_dimension(int dimension)     { _dimension = dimension; }
 
   Klass* higher_dimension() const     { return _higher_dimension; }
+  inline Klass* higher_dimension_acquire() const; // load with acquire semantics
   void set_higher_dimension(Klass* k) { _higher_dimension = k; }
+  inline void release_set_higher_dimension(Klass* k); // store with release semantics
   Klass** adr_higher_dimension()      { return (Klass**)&this->_higher_dimension;}
 
   Klass* lower_dimension() const      { return _lower_dimension; }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/oops/arrayKlass.inline.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_OOPS_ARRAYKLASS_INLINE_HPP
+#define SHARE_VM_OOPS_ARRAYKLASS_INLINE_HPP
+
+#include "runtime/orderAccess.inline.hpp"
+#include "oops/arrayKlass.hpp"
+
+inline Klass* ArrayKlass::higher_dimension_acquire() const {
+  return (Klass*) OrderAccess::load_ptr_acquire(&_higher_dimension);
+}
+
+inline void ArrayKlass::release_set_higher_dimension(Klass* k) {
+  OrderAccess::release_store_ptr(&_higher_dimension, k);
+}
+
+#endif // SHARE_VM_OOPS_ARRAYKLASS_INLINE_HPP
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1041,7 +1041,8 @@
 }
 
 Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) {
-  if (this_k->array_klasses() == NULL) {
+  // Need load-acquire for lock-free read
+  if (this_k->array_klasses_acquire() == NULL) {
     if (or_null) return NULL;
 
     ResourceMark rm;
@@ -1054,7 +1055,8 @@
       // Check if update has already taken place
       if (this_k->array_klasses() == NULL) {
         Klass*    k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL);
-        this_k->set_array_klasses(k);
+        // use 'release' to pair with lock-free load
+        this_k->release_set_array_klasses(k);
       }
     }
   }
@@ -3363,88 +3365,119 @@
 
 #if INCLUDE_JVMTI
 
-// RedefineClasses() support for previous versions:
-int InstanceKlass::_previous_version_count = 0;
-
-// Purge previous versions before adding new previous versions of the class.
-void InstanceKlass::purge_previous_versions(InstanceKlass* ik) {
-  if (ik->previous_versions() != NULL) {
-    // This klass has previous versions so see what we can cleanup
-    // while it is safe to do so.
-
-    int deleted_count = 0;    // leave debugging breadcrumbs
-    int live_count = 0;
-    ClassLoaderData* loader_data = ik->class_loader_data();
-    assert(loader_data != NULL, "should never be null");
-
-    ResourceMark rm;
-    log_trace(redefine, class, iklass, purge)("%s: previous versions", ik->external_name());
-
-    // previous versions are linked together through the InstanceKlass
-    InstanceKlass* pv_node = ik->previous_versions();
-    InstanceKlass* last = ik;
-    int version = 0;
-
-    // check the previous versions list
-    for (; pv_node != NULL; ) {
-
-      ConstantPool* pvcp = pv_node->constants();
-      assert(pvcp != NULL, "cp ref was unexpectedly cleared");
-
-      if (!pvcp->on_stack()) {
-        // If the constant pool isn't on stack, none of the methods
-        // are executing.  Unlink this previous_version.
-        // The previous version InstanceKlass is on the ClassLoaderData deallocate list
-        // so will be deallocated during the next phase of class unloading.
-        log_trace(redefine, class, iklass, purge)("previous version " INTPTR_FORMAT " is dead", p2i(pv_node));
-        // For debugging purposes.
-        pv_node->set_is_scratch_class();
-        pv_node->class_loader_data()->add_to_deallocate_list(pv_node);
-        pv_node = pv_node->previous_versions();
-        last->link_previous_versions(pv_node);
-        deleted_count++;
-        version++;
-        continue;
-      } else {
-        log_trace(redefine, class, iklass, purge)("previous version " INTPTR_FORMAT " is alive", p2i(pv_node));
-        assert(pvcp->pool_holder() != NULL, "Constant pool with no holder");
-        guarantee (!loader_data->is_unloading(), "unloaded classes can't be on the stack");
-        live_count++;
-      }
-
-      // At least one method is live in this previous version.
-      // Reset dead EMCP methods not to get breakpoints.
-      // All methods are deallocated when all of the methods for this class are no
-      // longer running.
-      Array<Method*>* method_refs = pv_node->methods();
-      if (method_refs != NULL) {
-        log_trace(redefine, class, iklass, purge)("previous methods length=%d", method_refs->length());
-        for (int j = 0; j < method_refs->length(); j++) {
-          Method* method = method_refs->at(j);
-
-          if (!method->on_stack()) {
-            // no breakpoints for non-running methods
-            if (method->is_running_emcp()) {
-              method->set_running_emcp(false);
-            }
-          } else {
-            assert (method->is_obsolete() || method->is_running_emcp(),
-                    "emcp method cannot run after emcp bit is cleared");
-            log_trace(redefine, class, iklass, purge)
-              ("purge: %s(%s): prev method @%d in version @%d is alive",
-               method->name()->as_C_string(), method->signature()->as_C_string(), j, version);
+// RedefineClasses() support for previous versions
+
+// Globally, there is at least one previous version of a class to walk
+// during class unloading, which is saved because old methods in the class
+// are still running.   Otherwise the previous version list is cleaned up.
+bool InstanceKlass::_has_previous_versions = false;
+
+// Returns true if there are previous versions of a class for class
+// unloading only. Also resets the flag to false. purge_previous_version
+// will set the flag to true if there are any left, i.e., if there's any
+// work to do for next time. This is to avoid the expensive code cache
+// walk in CLDG::do_unloading().
+bool InstanceKlass::has_previous_versions_and_reset() {
+  bool ret = _has_previous_versions;
+  log_trace(redefine, class, iklass, purge)("Class unloading: has_previous_versions = %s",
+     ret ? "true" : "false");
+  _has_previous_versions = false;
+  return ret;
+}
+
+// Purge previous versions before adding new previous versions of the class and
+// during class unloading.
+void InstanceKlass::purge_previous_version_list() {
+  assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
+  assert(has_been_redefined(), "Should only be called for main class");
+
+  // Quick exit.
+  if (previous_versions() == NULL) {
+    return;
+  }
+
+  // This klass has previous versions so see what we can cleanup
+  // while it is safe to do so.
+
+  int deleted_count = 0;    // leave debugging breadcrumbs
+  int live_count = 0;
+  ClassLoaderData* loader_data = class_loader_data();
+  assert(loader_data != NULL, "should never be null");
+
+  ResourceMark rm;
+  log_trace(redefine, class, iklass, purge)("%s: previous versions", external_name());
+
+  // previous versions are linked together through the InstanceKlass
+  InstanceKlass* pv_node = previous_versions();
+  InstanceKlass* last = this;
+  int version = 0;
+
+  // check the previous versions list
+  for (; pv_node != NULL; ) {
+
+    ConstantPool* pvcp = pv_node->constants();
+    assert(pvcp != NULL, "cp ref was unexpectedly cleared");
+
+    if (!pvcp->on_stack()) {
+      // If the constant pool isn't on stack, none of the methods
+      // are executing.  Unlink this previous_version.
+      // The previous version InstanceKlass is on the ClassLoaderData deallocate list
+      // so will be deallocated during the next phase of class unloading.
+      log_trace(redefine, class, iklass, purge)
+        ("previous version " INTPTR_FORMAT " is dead.", p2i(pv_node));
+      // For debugging purposes.
+      pv_node->set_is_scratch_class();
+      // Unlink from previous version list.
+      assert(pv_node->class_loader_data() == loader_data, "wrong loader_data");
+      InstanceKlass* next = pv_node->previous_versions();
+      pv_node->link_previous_versions(NULL);   // point next to NULL
+      last->link_previous_versions(next);
+      // Add to the deallocate list after unlinking
+      loader_data->add_to_deallocate_list(pv_node);
+      pv_node = next;
+      deleted_count++;
+      version++;
+      continue;
+    } else {
+      log_trace(redefine, class, iklass, purge)("previous version " INTPTR_FORMAT " is alive", p2i(pv_node));
+      assert(pvcp->pool_holder() != NULL, "Constant pool with no holder");
+      guarantee (!loader_data->is_unloading(), "unloaded classes can't be on the stack");
+      live_count++;
+      // found a previous version for next time we do class unloading
+      _has_previous_versions = true;
+    }
+
+    // At least one method is live in this previous version.
+    // Reset dead EMCP methods not to get breakpoints.
+    // All methods are deallocated when all of the methods for this class are no
+    // longer running.
+    Array<Method*>* method_refs = pv_node->methods();
+    if (method_refs != NULL) {
+      log_trace(redefine, class, iklass, purge)("previous methods length=%d", method_refs->length());
+      for (int j = 0; j < method_refs->length(); j++) {
+        Method* method = method_refs->at(j);
+
+        if (!method->on_stack()) {
+          // no breakpoints for non-running methods
+          if (method->is_running_emcp()) {
+            method->set_running_emcp(false);
           }
+        } else {
+          assert (method->is_obsolete() || method->is_running_emcp(),
+                  "emcp method cannot run after emcp bit is cleared");
+          log_trace(redefine, class, iklass, purge)
+            ("purge: %s(%s): prev method @%d in version @%d is alive",
+             method->name()->as_C_string(), method->signature()->as_C_string(), j, version);
         }
       }
-      // next previous version
-      last = pv_node;
-      pv_node = pv_node->previous_versions();
-      version++;
     }
-    log_trace(redefine, class, iklass, purge)
-      ("previous version stats: live=%d, deleted=%d",
-       live_count, deleted_count);
+    // next previous version
+    last = pv_node;
+    pv_node = pv_node->previous_versions();
+    version++;
   }
+  log_trace(redefine, class, iklass, purge)
+    ("previous version stats: live=%d, deleted=%d", live_count, deleted_count);
 }
 
 void InstanceKlass::mark_newly_obsolete_methods(Array<Method*>* old_methods,
@@ -3516,8 +3549,8 @@
   log_trace(redefine, class, iklass, add)
     ("adding previous version ref for %s, EMCP_cnt=%d", scratch_class->external_name(), emcp_method_count);
 
-  // Clean out old previous versions
-  purge_previous_versions(this);
+  // Clean out old previous versions for this class
+  purge_previous_version_list();
 
   // Mark newly obsolete methods in remaining previous versions.  An EMCP method from
   // a previous redefinition may be made obsolete by this redefinition.
@@ -3534,8 +3567,6 @@
     // For debugging purposes.
     scratch_class->set_is_scratch_class();
     scratch_class->class_loader_data()->add_to_deallocate_list(scratch_class());
-    // Update count for class unloading.
-    _previous_version_count--;
     return;
   }
 
@@ -3563,12 +3594,12 @@
   }
 
   // Add previous version if any methods are still running.
-  log_trace(redefine, class, iklass, add)("scratch class added; one of its methods is on_stack");
+  // Set has_previous_version flag for processing during class unloading.
+  _has_previous_versions = true;
+  log_trace(redefine, class, iklass, add) ("scratch class added; one of its methods is on_stack.");
   assert(scratch_class->previous_versions() == NULL, "shouldn't have a previous version");
   scratch_class->link_previous_versions(previous_versions());
   link_previous_versions(scratch_class());
-  // Update count for class unloading.
-  _previous_version_count++;
 } // end add_previous_version()
 
 #endif // INCLUDE_JVMTI
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -148,7 +148,7 @@
   // Package this class is defined in
   PackageEntry*   _package_entry;
   // Array classes holding elements of this class.
-  Klass*          _array_klasses;
+  Klass* volatile _array_klasses;
   // Constant pool for this class.
   ConstantPool* _constants;
   // The InnerClasses attribute and EnclosingMethod attribute. The
@@ -230,7 +230,7 @@
   OopMapCache*    volatile _oop_map_cache;   // OopMapCache for all methods in the klass (allocated lazily)
   MemberNameTable* _member_names;        // Member names
   JNIid*          _jni_ids;              // First JNI identifier for static fields in this class
-  jmethodID*      _methods_jmethod_ids;  // jmethodIDs corresponding to method_idnum, or NULL if none
+  jmethodID*      volatile _methods_jmethod_ids;  // jmethodIDs corresponding to method_idnum, or NULL if none
   intptr_t        _dep_context;          // packed DependencyContext structure
   nmethod*        _osr_nmethods_head;    // Head of list of on-stack replacement nmethods for this class
 #if INCLUDE_JVMTI
@@ -368,7 +368,9 @@
 
   // array klasses
   Klass* array_klasses() const             { return _array_klasses; }
+  inline Klass* array_klasses_acquire() const; // load with acquire semantics
   void set_array_klasses(Klass* k)         { _array_klasses = k; }
+  inline void release_set_array_klasses(Klass* k); // store with release semantics
 
   // methods
   Array<Method*>* methods() const          { return _methods; }
@@ -617,8 +619,8 @@
   objArrayOop signers() const;
 
   // host class
-  Klass* host_klass() const              {
-    Klass** hk = (Klass**)adr_host_klass();
+  InstanceKlass* host_klass() const              {
+    InstanceKlass** hk = adr_host_klass();
     if (hk == NULL) {
       return NULL;
     } else {
@@ -626,9 +628,9 @@
       return *hk;
     }
   }
-  void set_host_klass(const Klass* host) {
+  void set_host_klass(const InstanceKlass* host) {
     assert(is_anonymous(), "not anonymous");
-    const Klass** addr = (const Klass**)adr_host_klass();
+    const InstanceKlass** addr = (const InstanceKlass **)adr_host_klass();
     assert(addr != NULL, "no reversed space");
     if (addr != NULL) {
       *addr = host;
@@ -707,6 +709,7 @@
 
   // RedefineClasses() support for previous versions:
   void add_previous_version(instanceKlassHandle ikh, int emcp_method_count);
+  void purge_previous_version_list();
 
   InstanceKlass* previous_versions() const { return _previous_versions; }
 #else
@@ -766,10 +769,15 @@
   }
 
  private:
-  static int  _previous_version_count;
+  static bool  _has_previous_versions;
  public:
-  static void purge_previous_versions(InstanceKlass* ik);
-  static bool has_previous_versions() { return _previous_version_count > 0; }
+  static void purge_previous_versions(InstanceKlass* ik) {
+    if (ik->has_been_redefined()) {
+      ik->purge_previous_version_list();
+    }
+  }
+
+  static bool has_previous_versions_and_reset();
 
   // JVMTI: Support for caching a class file before it is modified by an agent that can do retransformation
   void set_cached_class_file(JvmtiCachedClassFileData *data) {
@@ -790,7 +798,7 @@
 #else // INCLUDE_JVMTI
 
   static void purge_previous_versions(InstanceKlass* ik) { return; };
-  static bool has_previous_versions() { return false; }
+  static bool has_previous_versions_and_reset() { return false; }
 
   void set_cached_class_file(JvmtiCachedClassFileData *data) {
     assert(data == NULL, "unexpected call with JVMTI disabled");
@@ -1055,13 +1063,13 @@
     }
   };
 
-  Klass** adr_host_klass() const {
+  InstanceKlass** adr_host_klass() const {
     if (is_anonymous()) {
-      Klass** adr_impl = adr_implementor();
+      InstanceKlass** adr_impl = (InstanceKlass **)adr_implementor();
       if (adr_impl != NULL) {
         return adr_impl + 1;
       } else {
-        return end_of_nonstatic_oop_maps();
+        return (InstanceKlass **)end_of_nonstatic_oop_maps();
       }
     } else {
       return NULL;
@@ -1238,10 +1246,8 @@
   // cache management logic if the caches can grow instead of just
   // going from NULL to non-NULL.
   bool idnum_can_increment() const      { return has_been_redefined(); }
-  jmethodID* methods_jmethod_ids_acquire() const
-         { return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids); }
-  void release_set_methods_jmethod_ids(jmethodID* jmeths)
-         { OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); }
+  inline jmethodID* methods_jmethod_ids_acquire() const;
+  inline void release_set_methods_jmethod_ids(jmethodID* jmeths);
 
   // Lock during initialization
 public:
--- a/hotspot/src/share/vm/oops/instanceKlass.inline.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.inline.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -29,10 +29,27 @@
 #include "oops/instanceKlass.hpp"
 #include "oops/klass.hpp"
 #include "oops/oop.inline.hpp"
+#include "runtime/orderAccess.inline.hpp"
 #include "utilities/debug.hpp"
 #include "utilities/globalDefinitions.hpp"
 #include "utilities/macros.hpp"
 
+inline Klass* InstanceKlass::array_klasses_acquire() const {
+  return (Klass*) OrderAccess::load_ptr_acquire(&_array_klasses);
+}
+
+inline void InstanceKlass::release_set_array_klasses(Klass* k) {
+  OrderAccess::release_store_ptr(&_array_klasses, k);
+}
+
+inline jmethodID* InstanceKlass::methods_jmethod_ids_acquire() const {
+  return (jmethodID*)OrderAccess::load_ptr_acquire(&_methods_jmethod_ids);
+}
+
+inline void InstanceKlass::release_set_methods_jmethod_ids(jmethodID* jmeths) {
+  OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths);
+}
+
 // The iteration over the oops in objects is a hot path in the GC code.
 // By force inlining the following functions, we get similar GC performance
 // as the previous macro based implementation.
--- a/hotspot/src/share/vm/oops/method.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/method.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -30,7 +30,6 @@
 #include "gc/shared/collectedHeap.inline.hpp"
 #include "gc/shared/gcLocker.hpp"
 #include "gc/shared/generation.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "interpreter/bytecodeStream.hpp"
 #include "interpreter/bytecodeTracer.hpp"
 #include "interpreter/bytecodes.hpp"
@@ -400,12 +399,6 @@
     return;
   }
 
-  // Do not profile method if current thread holds the pending list lock,
-  // which avoids deadlock for acquiring the MethodData_lock.
-  if (ReferencePendingListLocker::is_locked_by_self()) {
-    return;
-  }
-
   // Grab a lock here to prevent multiple
   // MethodData*s from being created.
   MutexLocker ml(MethodData_lock, THREAD);
--- a/hotspot/src/share/vm/oops/methodData.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/methodData.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -30,6 +30,9 @@
 #include "oops/method.hpp"
 #include "oops/oop.hpp"
 #include "runtime/orderAccess.hpp"
+#if INCLUDE_JVMCI
+#include "jvmci/jvmci_globals.hpp"
+#endif
 
 class BytecodeStream;
 class KlassSizeStats;
--- a/hotspot/src/share/vm/oops/objArrayKlass.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -34,6 +34,7 @@
 #include "memory/metadataFactory.hpp"
 #include "memory/resourceArea.hpp"
 #include "memory/universe.inline.hpp"
+#include "oops/arrayKlass.inline.hpp"
 #include "oops/instanceKlass.hpp"
 #include "oops/klass.inline.hpp"
 #include "oops/objArrayKlass.inline.hpp"
@@ -42,7 +43,6 @@
 #include "oops/symbol.hpp"
 #include "runtime/handles.inline.hpp"
 #include "runtime/mutexLocker.hpp"
-#include "runtime/orderAccess.inline.hpp"
 #include "utilities/copy.hpp"
 #include "utilities/macros.hpp"
 
@@ -321,7 +321,8 @@
   int dim = dimension();
   if (dim == n) return this;
 
-  if (higher_dimension() == NULL) {
+  // lock-free read needs acquire semantics
+  if (higher_dimension_acquire() == NULL) {
     if (or_null)  return NULL;
 
     ResourceMark rm;
@@ -339,8 +340,8 @@
           ObjArrayKlass::allocate_objArray_klass(class_loader_data(), dim + 1, this, CHECK_NULL);
         ObjArrayKlass* ak = ObjArrayKlass::cast(k);
         ak->set_lower_dimension(this);
-        OrderAccess::storestore();
-        set_higher_dimension(ak);
+        // use 'release' to pair with lock-free load
+        release_set_higher_dimension(ak);
         assert(ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
       }
     }
--- a/hotspot/src/share/vm/oops/symbol.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/symbol.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -229,24 +229,25 @@
 }
 
 void Symbol::increment_refcount() {
-  // Only increment the refcount if positive.  If negative either
+  // Only increment the refcount if non-negative.  If negative either
   // overflow has occurred or it is a permanent symbol in a read only
   // shared archive.
-  if (_refcount >= 0) {
+  if (_refcount >= 0) { // not a permanent symbol
     Atomic::inc(&_refcount);
     NOT_PRODUCT(Atomic::inc(&_total_count);)
   }
 }
 
 void Symbol::decrement_refcount() {
-  if (_refcount >= 0) {
-    Atomic::dec(&_refcount);
+  if (_refcount >= 0) { // not a permanent symbol
+    jshort new_value = Atomic::add(-1, &_refcount);
 #ifdef ASSERT
-    if (_refcount < 0) {
+    if (new_value == -1) { // we have transitioned from 0 -> -1
       print();
       assert(false, "reference count underflow for symbol");
     }
 #endif
+    (void)new_value;
   }
 }
 
--- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -34,6 +34,7 @@
 #include "memory/resourceArea.hpp"
 #include "memory/universe.hpp"
 #include "memory/universe.inline.hpp"
+#include "oops/arrayKlass.inline.hpp"
 #include "oops/instanceKlass.hpp"
 #include "oops/klass.inline.hpp"
 #include "oops/objArrayKlass.hpp"
@@ -41,7 +42,6 @@
 #include "oops/typeArrayKlass.inline.hpp"
 #include "oops/typeArrayOop.inline.hpp"
 #include "runtime/handles.inline.hpp"
-#include "runtime/orderAccess.inline.hpp"
 #include "utilities/macros.hpp"
 
 bool TypeArrayKlass::compute_is_subtype_of(Klass* k) {
@@ -166,7 +166,8 @@
     if (dim == n)
       return this;
 
-  if (higher_dimension() == NULL) {
+  // lock-free read needs acquire semantics
+  if (higher_dimension_acquire() == NULL) {
     if (or_null)  return NULL;
 
     ResourceMark rm;
@@ -181,8 +182,8 @@
               class_loader_data(), dim + 1, this, CHECK_NULL);
         ObjArrayKlass* h_ak = ObjArrayKlass::cast(oak);
         h_ak->set_lower_dimension(this);
-        OrderAccess::storestore();
-        set_higher_dimension(h_ak);
+        // use 'release' to pair with lock-free load
+        release_set_higher_dimension(h_ak);
         assert(h_ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
       }
     }
--- a/hotspot/src/share/vm/opto/block.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/block.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1212,6 +1212,9 @@
       if (j >= 1 && n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_CreateEx) {
         assert(j == 1 || block->get_node(j-1)->is_Phi(), "CreateEx must be first instruction in block");
       }
+      if (n->needs_anti_dependence_check()) {
+        verify_anti_dependences(block, n);
+      }
       for (uint k = 0; k < n->req(); k++) {
         Node *def = n->in(k);
         if (def && def != n) {
--- a/hotspot/src/share/vm/opto/block.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/block.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -186,14 +186,13 @@
   Block* lone_fall_through();   // Return lone fall-through Block or null
 
   Block* dom_lca(Block* that);  // Compute LCA in dominator tree.
-#ifdef ASSERT
+
   bool dominates(Block* that) {
     int dom_diff = this->_dom_depth - that->_dom_depth;
     if (dom_diff > 0)  return false;
     for (; dom_diff < 0; dom_diff++)  that = that->_idom;
     return this == that;
   }
-#endif
 
   // Report the alignment required by this block.  Must be a power of 2.
   // The previous block will insert nops to get this alignment.
@@ -481,9 +480,9 @@
   MachNode* _goto;
 
   Block* insert_anti_dependences(Block* LCA, Node* load, bool verify = false);
-  void verify_anti_dependences(Block* LCA, Node* load) {
+  void verify_anti_dependences(Block* LCA, Node* load) const {
     assert(LCA == get_block_for_node(load), "should already be scheduled");
-    insert_anti_dependences(LCA, load, true);
+    const_cast<PhaseCFG*>(this)->insert_anti_dependences(LCA, load, true);
   }
 
   bool move_to_next(Block* bx, uint b_index);
--- a/hotspot/src/share/vm/opto/c2compiler.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/c2compiler.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -530,6 +530,7 @@
   case vmIntrinsics::_isInterrupted:
 #ifdef TRACE_HAVE_INTRINSICS
   case vmIntrinsics::_counterTime:
+  case vmIntrinsics::_getClassId:
 #endif
   case vmIntrinsics::_currentTimeMillis:
   case vmIntrinsics::_nanoTime:
--- a/hotspot/src/share/vm/opto/callGenerator.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/callGenerator.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1164,7 +1164,10 @@
   GraphKit kit(jvms);
   kit.C->print_inlining_update(this);
   // Take the trap with arguments pushed on the stack.  (Cf. null_check_receiver).
-  int nargs = method()->arg_size();
+  // Callsite signature can be different from actual method being called (i.e _linkTo* sites).
+  // Use callsite signature always.
+  ciMethod* declared_method = kit.method()->get_method_at_bci(kit.bci());
+  int nargs = declared_method->arg_size();
   kit.inc_sp(nargs);
   assert(nargs <= kit.sp() && kit.sp() <= jvms->stk_size(), "sane sp w/ args pushed");
   if (_reason == Deoptimization::Reason_class_check &&
--- a/hotspot/src/share/vm/opto/cfgnode.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/cfgnode.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -119,6 +119,9 @@
 // input in slot 0.
 class PhiNode : public TypeNode {
   const TypePtr* const _adr_type; // non-null only for Type::MEMORY nodes.
+  // The following fields are only used for data PhiNodes to indicate
+  // that the PhiNode represents the value of a known instance field.
+        int _inst_mem_id; // Instance memory id (node index of the memory Phi)
   const int _inst_id;     // Instance id of the memory slice.
   const int _inst_index;  // Alias index of the instance memory slice.
   // Array elements references have the same alias_idx but different offset.
@@ -138,11 +141,13 @@
   };
 
   PhiNode( Node *r, const Type *t, const TypePtr* at = NULL,
+           const int imid = -1,
            const int iid = TypeOopPtr::InstanceTop,
            const int iidx = Compile::AliasIdxTop,
            const int ioffs = Type::OffsetTop )
     : TypeNode(t,r->req()),
       _adr_type(at),
+      _inst_mem_id(imid),
       _inst_id(iid),
       _inst_index(iidx),
       _inst_offset(ioffs)
@@ -194,11 +199,14 @@
   virtual bool pinned() const { return in(0) != 0; }
   virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; }
 
+  void  set_inst_mem_id(int inst_mem_id) { _inst_mem_id = inst_mem_id; }
+  const int inst_mem_id() const { return _inst_mem_id; }
   const int inst_id()     const { return _inst_id; }
   const int inst_index()  const { return _inst_index; }
   const int inst_offset() const { return _inst_offset; }
-  bool is_same_inst_field(const Type* tp, int id, int index, int offset) {
+  bool is_same_inst_field(const Type* tp, int mem_id, int id, int index, int offset) {
     return type()->basic_type() == tp->basic_type() &&
+           inst_mem_id() == mem_id &&
            inst_id()     == id     &&
            inst_index()  == index  &&
            inst_offset() == offset &&
--- a/hotspot/src/share/vm/opto/compile.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/compile.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1708,16 +1708,21 @@
   const TypePtr* flat = flatten_alias_type(adr_type);
 
 #ifdef ASSERT
-  assert(flat == flatten_alias_type(flat), "idempotent");
-  assert(flat != TypePtr::BOTTOM,     "cannot alias-analyze an untyped ptr");
-  if (flat->isa_oopptr() && !flat->isa_klassptr()) {
-    const TypeOopPtr* foop = flat->is_oopptr();
-    // Scalarizable allocations have exact klass always.
-    bool exact = !foop->klass_is_exact() || foop->is_known_instance();
-    const TypePtr* xoop = foop->cast_to_exactness(exact)->is_ptr();
-    assert(foop == flatten_alias_type(xoop), "exactness must not affect alias type");
+  {
+    ResourceMark rm;
+    assert(flat == flatten_alias_type(flat), "not idempotent: adr_type = %s; flat = %s => %s",
+           Type::str(adr_type), Type::str(flat), Type::str(flatten_alias_type(flat)));
+    assert(flat != TypePtr::BOTTOM, "cannot alias-analyze an untyped ptr: adr_type = %s",
+           Type::str(adr_type));
+    if (flat->isa_oopptr() && !flat->isa_klassptr()) {
+      const TypeOopPtr* foop = flat->is_oopptr();
+      // Scalarizable allocations have exact klass always.
+      bool exact = !foop->klass_is_exact() || foop->is_known_instance();
+      const TypePtr* xoop = foop->cast_to_exactness(exact)->is_ptr();
+      assert(foop == flatten_alias_type(xoop), "exactness must not affect alias type: foop = %s; xoop = %s",
+             Type::str(foop), Type::str(xoop));
+    }
   }
-  assert(flat == flatten_alias_type(flat), "exact bit doesn't matter");
 #endif
 
   int idx = AliasIdxTop;
@@ -3159,45 +3164,65 @@
     break;
 #endif
 
-  case Op_ModI:
+  case Op_ModI: {
+    Node* di = NULL;
     if (UseDivMod) {
       // Check if a%b and a/b both exist
-      Node* d = n->find_similar(Op_DivI);
-      if (d) {
+      di = n->find_similar(Op_DivI);
+      if (di) {
         // Replace them with a fused divmod if supported
         if (Matcher::has_match_rule(Op_DivModI)) {
           DivModINode* divmod = DivModINode::make(n);
-          d->subsume_by(divmod->div_proj(), this);
+          di->subsume_by(divmod->div_proj(), this);
           n->subsume_by(divmod->mod_proj(), this);
         } else {
           // replace a%b with a-((a/b)*b)
-          Node* mult = new MulINode(d, d->in(2));
-          Node* sub  = new SubINode(d->in(1), mult);
+          Node* mult = new MulINode(di, di->in(2));
+          Node* sub  = new SubINode(di->in(1), mult);
           n->subsume_by(sub, this);
         }
       }
     }
+    if (di == NULL) {
+      // Remove useless control edge in case of not mod-zero.
+      const Type *t = n->in(2)->bottom_type();
+      const TypeInt *ti = t->is_int();
+      if (n->in(0) && (ti->_hi < 0 || ti->_lo > 0)) {
+        n->set_req(0, NULL);
+      }
+    }
     break;
-
-  case Op_ModL:
+  }
+
+  case Op_ModL: {
+    Node* dl = NULL;
     if (UseDivMod) {
       // Check if a%b and a/b both exist
-      Node* d = n->find_similar(Op_DivL);
-      if (d) {
+      dl = n->find_similar(Op_DivL);
+      if (dl) {
         // Replace them with a fused divmod if supported
         if (Matcher::has_match_rule(Op_DivModL)) {
           DivModLNode* divmod = DivModLNode::make(n);
-          d->subsume_by(divmod->div_proj(), this);
+          dl->subsume_by(divmod->div_proj(), this);
           n->subsume_by(divmod->mod_proj(), this);
         } else {
           // replace a%b with a-((a/b)*b)
-          Node* mult = new MulLNode(d, d->in(2));
-          Node* sub  = new SubLNode(d->in(1), mult);
+          Node* mult = new MulLNode(dl, dl->in(2));
+          Node* sub  = new SubLNode(dl->in(1), mult);
           n->subsume_by(sub, this);
         }
       }
     }
+    if (dl == NULL) {
+      // Remove useless control edge in case of not mod-zero.
+      const Type *t = n->in(2)->bottom_type();
+      const TypeLong *tl = t->is_long();
+      if (n->in(0) && (tl->_hi < 0 || tl->_lo > 0)) {
+        n->set_req(0, NULL);
+      }
+    }
     break;
+  }
 
   case Op_LoadVector:
   case Op_StoreVector:
--- a/hotspot/src/share/vm/opto/divnode.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/divnode.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -853,13 +853,6 @@
   if( t == Type::TOP ) return NULL;
   const TypeInt *ti = t->is_int();
 
-  // Check for useless control input
-  // Check for excluding mod-zero case
-  if( in(0) && (ti->_hi < 0 || ti->_lo > 0) ) {
-    set_req(0, NULL);        // Yank control input
-    return this;
-  }
-
   // See if we are MOD'ing by 2^k or 2^k-1.
   if( !ti->is_con() ) return NULL;
   jint con = ti->get_con();
@@ -1024,13 +1017,6 @@
   if( t == Type::TOP ) return NULL;
   const TypeLong *tl = t->is_long();
 
-  // Check for useless control input
-  // Check for excluding mod-zero case
-  if( in(0) && (tl->_hi < 0 || tl->_lo > 0) ) {
-    set_req(0, NULL);        // Yank control input
-    return this;
-  }
-
   // See if we are MOD'ing by 2^k or 2^k-1.
   if( !tl->is_con() ) return NULL;
   jlong con = tl->get_con();
--- a/hotspot/src/share/vm/opto/graphKit.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/graphKit.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -664,7 +664,10 @@
   // callee (with all arguments still on the stack).
   Node* null_check_receiver_before_call(ciMethod* callee) {
     assert(!callee->is_static(), "must be a virtual method");
-    const int nargs = callee->arg_size();
+    // Callsite signature can be different from actual method being called (i.e _linkTo* sites).
+    // Use callsite signature always.
+    ciMethod* declared_method = method()->get_method_at_bci(bci());
+    const int nargs = declared_method->arg_size();
     inc_sp(nargs);
     Node* n = null_check_receiver();
     dec_sp(nargs);
--- a/hotspot/src/share/vm/opto/lcm.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/lcm.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -240,6 +240,14 @@
       continue;
     }
 
+    // Check that node's control edge is not-null block's head or dominates it,
+    // otherwise we can't hoist it because there are other control dependencies.
+    Node* ctrl = mach->in(0);
+    if (ctrl != NULL && !(ctrl == not_null_block->head() ||
+        get_block_for_node(ctrl)->dominates(not_null_block))) {
+      continue;
+    }
+
     // check if the offset is not too high for implicit exception
     {
       intptr_t offset = 0;
@@ -379,9 +387,12 @@
   block->add_inst(best);
   map_node_to_block(best, block);
 
-  // Move the control dependence
-  if (best->in(0) && best->in(0) == old_block->head())
-    best->set_req(0, block->head());
+  // Move the control dependence if it is pinned to not-null block.
+  // Don't change it in other cases: NULL or dominating control.
+  if (best->in(0) == not_null_block->head()) {
+    // Set it to control edge of null check.
+    best->set_req(0, proj->in(0)->in(0));
+  }
 
   // Check for flag-killing projections that also need to be hoisted
   // Should be DU safe because no edge updates.
@@ -437,6 +448,18 @@
 
   latency_from_uses(nul_chk);
   latency_from_uses(best);
+
+  // insert anti-dependences to defs in this block
+  if (! best->needs_anti_dependence_check()) {
+    for (uint k = 1; k < block->number_of_nodes(); k++) {
+      Node *n = block->get_node(k);
+      if (n->needs_anti_dependence_check() &&
+          n->in(LoadNode::Memory) == best->in(StoreNode::Memory)) {
+        // Found anti-dependent load
+        insert_anti_dependences(block, n);
+      }
+    }
+  }
 }
 
 
--- a/hotspot/src/share/vm/opto/library_call.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -254,6 +254,9 @@
   bool inline_native_currentThread();
 
   bool inline_native_time_funcs(address method, const char* funcName);
+#ifdef TRACE_HAVE_INTRINSICS
+  bool inline_native_classID();
+#endif
   bool inline_native_isInterrupted();
   bool inline_native_Class_query(vmIntrinsics::ID id);
   bool inline_native_subtype_check();
@@ -708,6 +711,7 @@
 
 #ifdef TRACE_HAVE_INTRINSICS
   case vmIntrinsics::_counterTime:              return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime");
+  case vmIntrinsics::_getClassId:               return inline_native_classID();
 #endif
   case vmIntrinsics::_currentTimeMillis:        return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis");
   case vmIntrinsics::_nanoTime:                 return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeNanos), "nanoTime");
@@ -2242,8 +2246,8 @@
 
 #ifndef PRODUCT
     if (C->print_intrinsics() || C->print_inlining()) {
-      tty->print("  from base type: ");  adr_type->dump();
-      tty->print("  sharpened value: ");  tjp->dump();
+      tty->print("  from base type:  ");  adr_type->dump(); tty->cr();
+      tty->print("  sharpened value: ");  tjp->dump();      tty->cr();
     }
 #endif
     // Sharpen the value type.
@@ -2308,26 +2312,30 @@
   adr = make_unsafe_address(base, offset);
   if (_gvn.type(base)->isa_ptr() != TypePtr::NULL_PTR) {
     heap_base_oop = base;
-  }
+  } else if (type == T_OBJECT) {
+    return false; // off-heap oop accesses are not supported
+  }
+
+  // Can base be NULL? Otherwise, always on-heap access.
+  bool can_access_non_heap = TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop));
+
   val = is_store ? argument(4) : NULL;
 
   const TypePtr *adr_type = _gvn.type(adr)->isa_ptr();
 
-  // Try to categorize the address.  If it comes up as TypeJavaPtr::BOTTOM,
-  // there was not enough information to nail it down.
+  // Try to categorize the address.
   Compile::AliasType* alias_type = C->alias_type(adr_type);
   assert(alias_type->index() != Compile::AliasIdxBot, "no bare pointers here");
 
-  // Only field, array element or unknown locations are supported.
-  if (alias_type->adr_type() != TypeRawPtr::BOTTOM &&
-      alias_type->adr_type() != TypeOopPtr::BOTTOM &&
-      alias_type->basic_type() == T_ILLEGAL) {
-    return false;
+  if (alias_type->adr_type() == TypeInstPtr::KLASS ||
+      alias_type->adr_type() == TypeAryPtr::RANGE) {
+    return false; // not supported
   }
 
   bool mismatched = false;
   BasicType bt = alias_type->basic_type();
   if (bt != T_ILLEGAL) {
+    assert(alias_type->adr_type()->is_oopptr(), "should be on-heap access");
     if (bt == T_BYTE && adr_type->isa_aryptr()) {
       // Alias type doesn't differentiate between byte[] and boolean[]).
       // Use address type to get the element type.
@@ -2342,10 +2350,12 @@
       return false;
     }
     mismatched = (bt != type);
-  } else if (alias_type->adr_type() == TypeOopPtr::BOTTOM) {
+  } else if (alias_type->adr_type()->isa_oopptr()) {
     mismatched = true; // conservatively mark all "wide" on-heap accesses as mismatched
   }
 
+  assert(!mismatched || alias_type->adr_type()->is_oopptr(), "off-heap access can't be mismatched");
+
   // First guess at the value type.
   const Type *value_type = Type::get_const_basic_type(type);
 
@@ -2357,7 +2367,7 @@
   bool need_mem_bar;
   switch (kind) {
       case Relaxed:
-          need_mem_bar = (alias_type->adr_type() == TypeOopPtr::BOTTOM);
+          need_mem_bar = mismatched || can_access_non_heap;
           break;
       case Opaque:
           // Opaque uses CPUOrder membars for protection against code movement.
@@ -2508,34 +2518,10 @@
       break;
     }
 
-    if (type != T_OBJECT) {
-      (void) store_to_memory(control(), adr, val, type, adr_type, mo, requires_atomic_access, unaligned, mismatched);
+    if (type == T_OBJECT) {
+      store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo, mismatched);
     } else {
-      // Possibly an oop being stored to Java heap or native memory
-      if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) {
-        // oop to Java heap.
-        (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo, mismatched);
-      } else {
-        // We can't tell at compile time if we are storing in the Java heap or outside
-        // of it. So we need to emit code to conditionally do the proper type of
-        // store.
-
-        IdealKit ideal(this);
-#define __ ideal.
-        // QQQ who knows what probability is here??
-        __ if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); {
-          // Sync IdealKit and graphKit.
-          sync_kit(ideal);
-          Node* st = store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo, mismatched);
-          // Update IdealKit memory.
-          __ sync_kit(this);
-        } __ else_(); {
-          __ store(__ ctrl(), adr, val, type, alias_type->index(), mo, requires_atomic_access, mismatched);
-        } __ end_if();
-        // Final sync IdealKit and GraphKit.
-        final_sync(ideal);
-#undef __
-      }
+      store_to_memory(control(), adr, val, type, adr_type, mo, requires_atomic_access, unaligned, mismatched);
     }
   }
 
@@ -3150,6 +3136,43 @@
   return true;
 }
 
+#ifdef TRACE_HAVE_INTRINSICS
+
+/*
+* oop -> myklass
+* myklass->trace_id |= USED
+* return myklass->trace_id & ~0x3
+*/
+bool LibraryCallKit::inline_native_classID() {
+  Node* cls = null_check(argument(0), T_OBJECT);
+  Node* kls = load_klass_from_mirror(cls, false, NULL, 0);
+  kls = null_check(kls, T_OBJECT);
+
+  ByteSize offset = TRACE_KLASS_TRACE_ID_OFFSET;
+  Node* insp = basic_plus_adr(kls, in_bytes(offset));
+  Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
+
+  Node* clsused = longcon(0x01l); // set the class bit
+  Node* orl = _gvn.transform(new OrLNode(tvalue, clsused));
+  const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
+  store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
+
+#ifdef TRACE_ID_META_BITS
+  Node* mbits = longcon(~TRACE_ID_META_BITS);
+  tvalue = _gvn.transform(new AndLNode(tvalue, mbits));
+#endif
+#ifdef TRACE_ID_CLASS_SHIFT
+  Node* cbits = intcon(TRACE_ID_CLASS_SHIFT);
+  tvalue = _gvn.transform(new URShiftLNode(tvalue, cbits));
+#endif
+
+  set_result(tvalue);
+  return true;
+
+}
+
+#endif
+
 //------------------------inline_native_currentThread------------------
 bool LibraryCallKit::inline_native_currentThread() {
   Node* junk = NULL;
--- a/hotspot/src/share/vm/opto/macro.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/macro.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -491,7 +491,7 @@
   for (DUIterator_Fast kmax, k = region->fast_outs(kmax); k < kmax; k++) {
     Node* phi = region->fast_out(k);
     if (phi->is_Phi() && phi != mem &&
-        phi->as_Phi()->is_same_inst_field(phi_type, instance_id, alias_idx, offset)) {
+        phi->as_Phi()->is_same_inst_field(phi_type, (int)mem->_idx, instance_id, alias_idx, offset)) {
       return phi;
     }
   }
@@ -510,7 +510,7 @@
   GrowableArray <Node *> values(length, length, NULL, false);
 
   // create a new Phi for the value
-  PhiNode *phi = new PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset);
+  PhiNode *phi = new PhiNode(mem->in(0), phi_type, NULL, mem->_idx, instance_id, alias_idx, offset);
   transform_later(phi);
   value_phis->push(phi, mem->_idx);
 
--- a/hotspot/src/share/vm/opto/memnode.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/memnode.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1112,7 +1112,7 @@
     for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
       Node* phi = region->fast_out(i);
       if (phi->is_Phi() && phi != mem &&
-          phi->as_Phi()->is_same_inst_field(this_type, this_iid, this_index, this_offset)) {
+          phi->as_Phi()->is_same_inst_field(this_type, (int)mem->_idx, this_iid, this_index, this_offset)) {
         return phi;
       }
     }
@@ -1395,7 +1395,7 @@
     this_iid = base->_idx;
   }
   PhaseIterGVN* igvn = phase->is_IterGVN();
-  Node* phi = new PhiNode(region, this_type, NULL, this_iid, this_index, this_offset);
+  Node* phi = new PhiNode(region, this_type, NULL, mem->_idx, this_iid, this_index, this_offset);
   for (uint i = 1; i < region->req(); i++) {
     Node* x;
     Node* the_clone = NULL;
--- a/hotspot/src/share/vm/opto/phaseX.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/phaseX.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -491,6 +491,8 @@
   uint current_idx = 0; // The current new node ID. Incremented after every assignment.
   for (uint i = 0; i < _useful.size(); i++) {
     Node* n = _useful.at(i);
+    // Sanity check that fails if we ever decide to execute this phase after EA
+    assert(!n->is_Phi() || n->as_Phi()->inst_mem_id() == -1, "should not be linked to data Phi");
     const Type* type = gvn->type_or_null(n);
     new_type_array.map(current_idx, type);
 
@@ -1448,6 +1450,18 @@
     i -= num_edges;    // we deleted 1 or more copies of this edge
   }
 
+  // Search for instance field data PhiNodes in the same region pointing to the old
+  // memory PhiNode and update their instance memory ids to point to the new node.
+  if (old->is_Phi() && old->as_Phi()->type()->has_memory() && old->in(0) != NULL) {
+    Node* region = old->in(0);
+    for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
+      PhiNode* phi = region->fast_out(i)->isa_Phi();
+      if (phi != NULL && phi->inst_mem_id() == (int)old->_idx) {
+        phi->set_inst_mem_id((int)nn->_idx);
+      }
+    }
+  }
+
   // Smash all inputs to 'old', isolating him completely
   Node *temp = new Node(1);
   temp->init_req(0,nn);     // Add a use to nn to prevent him from dying
--- a/hotspot/src/share/vm/opto/type.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/type.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1015,6 +1015,13 @@
     st->print(" [narrowklass]");
   }
 }
+
+//-----------------------------------------------------------------------------
+const char* Type::str(const Type* t) {
+  stringStream ss;
+  t->dump_on(&ss);
+  return ss.as_string();
+}
 #endif
 
 //------------------------------singleton--------------------------------------
--- a/hotspot/src/share/vm/opto/type.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/opto/type.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -210,11 +210,11 @@
   static int cmp( const Type *const t1, const Type *const t2 );
   // Test for higher or equal in lattice
   // Variant that drops the speculative part of the types
-  int higher_equal(const Type *t) const {
+  bool higher_equal(const Type *t) const {
     return !cmp(meet(t),t->remove_speculative());
   }
   // Variant that keeps the speculative part of the types
-  int higher_equal_speculative(const Type *t) const {
+  bool higher_equal_speculative(const Type *t) const {
     return !cmp(meet_speculative(t),t);
   }
 
@@ -359,6 +359,8 @@
   }
   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
   static  void dump_stats();
+
+  static const char* str(const Type* t);
 #endif
   void typerr(const Type *t) const; // Mixing types error
 
@@ -963,7 +965,7 @@
 
   // If not InstanceTop or InstanceBot, indicates that this is
   // a particular instance of this type which is distinct.
-  // This is the the node index of the allocation node creating this instance.
+  // This is the node index of the allocation node creating this instance.
   int           _instance_id;
 
   static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
--- a/hotspot/src/share/vm/prims/jvm.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvm.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -3352,6 +3352,35 @@
 JVM_END
 
 
+// java.lang.ref.Reference ///////////////////////////////////////////////////////////////
+
+
+JVM_ENTRY(jobject, JVM_GetAndClearReferencePendingList(JNIEnv* env))
+  JVMWrapper("JVM_GetAndClearReferencePendingList");
+
+  MonitorLockerEx ml(Heap_lock);
+  oop ref = Universe::reference_pending_list();
+  if (ref != NULL) {
+    Universe::set_reference_pending_list(NULL);
+  }
+  return JNIHandles::make_local(env, ref);
+JVM_END
+
+JVM_ENTRY(jboolean, JVM_HasReferencePendingList(JNIEnv* env))
+  JVMWrapper("JVM_HasReferencePendingList");
+  MonitorLockerEx ml(Heap_lock);
+  return Universe::has_reference_pending_list();
+JVM_END
+
+JVM_ENTRY(void, JVM_WaitForReferencePendingList(JNIEnv* env))
+  JVMWrapper("JVM_WaitForReferencePendingList");
+  MonitorLockerEx ml(Heap_lock);
+  while (!Universe::has_reference_pending_list()) {
+    ml.wait();
+  }
+JVM_END
+
+
 // ObjectInputStream ///////////////////////////////////////////////////////////////
 
 bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessFlags access, bool classloader_only) {
--- a/hotspot/src/share/vm/prims/jvm.h	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvm.h	Wed Jul 05 22:13:53 2017 +0200
@@ -297,6 +297,18 @@
 JVM_GetSystemPackages(JNIEnv *env);
 
 /*
+ * java.lang.ref.Reference
+ */
+JNIEXPORT jobject JNICALL
+JVM_GetAndClearReferencePendingList(JNIEnv *env);
+
+JNIEXPORT jboolean JNICALL
+JVM_HasReferencePendingList(JNIEnv *env);
+
+JNIEXPORT void JNICALL
+JVM_WaitForReferencePendingList(JNIEnv *env);
+
+/*
  * java.io.ObjectInputStream
  */
 JNIEXPORT jobject JNICALL
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -649,18 +649,14 @@
 
 jvmtiError
 JvmtiEnv::SetVerboseFlag(jvmtiVerboseFlag flag, jboolean value) {
+  LogLevelType level = value == 0 ? LogLevel::Off : LogLevel::Info;
   switch (flag) {
   case JVMTI_VERBOSE_OTHER:
     // ignore
     break;
   case JVMTI_VERBOSE_CLASS:
-    if (value == 0) {
-      LogConfiguration::parse_log_arguments("stdout", "class+unload=off", NULL, NULL, NULL);
-      LogConfiguration::parse_log_arguments("stdout", "class+load=off", NULL, NULL, NULL);
-    } else {
-      LogConfiguration::parse_log_arguments("stdout", "class+load=info", NULL, NULL, NULL);
-      LogConfiguration::parse_log_arguments("stdout", "class+unload=info", NULL, NULL, NULL);
-    }
+    LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, unload));
+    LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, load));
     break;
   case JVMTI_VERBOSE_GC:
     if (value == 0) {
--- a/hotspot/src/share/vm/prims/unsafe.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/prims/unsafe.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -324,6 +324,10 @@
 
   volatile oop v;
 
+  if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
+    OrderAccess::fence();
+  }
+
   if (UseCompressedOops) {
     volatile narrowOop n = *(volatile narrowOop*) addr;
     (void)const_cast<oop&>(v = oopDesc::decode_heap_oop(n));
@@ -779,6 +783,7 @@
 
 // define a class but do not make it known to the class loader or system dictionary
 // - host_class:  supplies context for linkage, access control, protection domain, and class loader
+//                if host_class is itself anonymous then it is replaced with its host class.
 // - data:  bytes of a class file, a raw memory address (length gives the number of bytes)
 // - cp_patches:  where non-null entries exist, they replace corresponding CP entries in data
 
@@ -787,8 +792,12 @@
 // link to any member of U.  Just after U is loaded, the only way to use it is reflectively,
 // through java.lang.Class methods like Class.newInstance.
 
+// The package of an anonymous class must either match its host's class's package or be in the
+// unnamed package.  If it is in the unnamed package then it will be put in its host class's
+// package.
+//
+
 // Access checks for linkage sites within U continue to follow the same rules as for named classes.
-// The package of an anonymous class is given by the package qualifier on the name under which it was loaded.
 // An anonymous class also has special privileges to access any member of its host class.
 // This is the main reason why this loading operation is unsafe.  The purpose of this is to
 // allow language implementations to simulate "open classes"; a host class in effect gets
@@ -870,9 +879,11 @@
 
   // Primitive types have NULL Klass* fields in their java.lang.Class instances.
   if (host_klass == NULL) {
-    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
+    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Host class is null");
   }
 
+  assert(host_klass->is_instance_klass(), "Host class must be an instance class");
+
   const char* host_source = host_klass->external_name();
   Handle      host_loader(THREAD, host_klass->class_loader());
   Handle      host_domain(THREAD, host_klass->protection_domain());
@@ -903,7 +914,7 @@
                                                 host_loader,
                                                 host_domain,
                                                 &st,
-                                                host_klass,
+                                                InstanceKlass::cast(host_klass),
                                                 cp_patches,
                                                 CHECK_NULL);
   if (anonk == NULL) {
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -33,8 +33,9 @@
 #include "gc/shared/referenceProcessor.hpp"
 #include "gc/shared/taskqueue.hpp"
 #include "logging/log.hpp"
+#include "logging/logConfiguration.hpp"
+#include "logging/logStream.hpp"
 #include "logging/logTag.hpp"
-#include "logging/logConfiguration.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/universe.inline.hpp"
 #include "oops/oop.inline.hpp"
@@ -163,26 +164,47 @@
 
 bool needs_module_property_warning = false;
 
-#define MODULE_PROPERTY_PREFIX "jdk.module"
-#define MODULE_PROPERTY_PREFIX_LEN 10
-#define MODULE_MAIN_PROPERTY "jdk.module.main"
-#define MODULE_MAIN_PROPERTY_LEN 15
-
-// Return TRUE if option matches property, or property=, or property..
-static bool matches_property_prefix(const char* option, const char* property, size_t len) {
-  return (strncmp(option, property, len) == 0) &&
-          (option[len] == '=' || option[len] == '.' || option[len] == '\0');
+#define MODULE_PROPERTY_PREFIX "jdk.module."
+#define MODULE_PROPERTY_PREFIX_LEN 11
+#define ADDEXPORTS "addexports"
+#define ADDEXPORTS_LEN 10
+#define ADDREADS "addreads"
+#define ADDREADS_LEN 8
+#define PATCH "patch"
+#define PATCH_LEN 5
+#define ADDMODS "addmods"
+#define ADDMODS_LEN 7
+#define LIMITMODS "limitmods"
+#define LIMITMODS_LEN 9
+#define PATH "path"
+#define PATH_LEN 4
+#define UPGRADE_PATH "upgrade.path"
+#define UPGRADE_PATH_LEN 12
+
+// Return TRUE if option matches 'property', or 'property=', or 'property.'.
+static bool matches_property_suffix(const char* option, const char* property, size_t len) {
+  return ((strncmp(option, property, len) == 0) &&
+          (option[len] == '=' || option[len] == '.' || option[len] == '\0'));
 }
 
-// Return true if the property is either "jdk.module" or starts with "jdk.module.",
-// but does not start with "jdk.module.main".
-// Return false if jdk.module.main because jdk.module.main and jdk.module.main.class
-// are valid non-internal system properties.
-// "property" should be passed without the leading "-D".
+// Return true if property starts with "jdk.module." and its ensuing chars match
+// any of the reserved module properties.
+// property should be passed without the leading "-D".
 bool Arguments::is_internal_module_property(const char* property) {
   assert((strncmp(property, "-D", 2) != 0), "Unexpected leading -D");
-  return (matches_property_prefix(property, MODULE_PROPERTY_PREFIX, MODULE_PROPERTY_PREFIX_LEN) &&
-          !matches_property_prefix(property, MODULE_MAIN_PROPERTY, MODULE_MAIN_PROPERTY_LEN));
+  if  (strncmp(property, MODULE_PROPERTY_PREFIX, MODULE_PROPERTY_PREFIX_LEN) == 0) {
+    const char* property_suffix = property + MODULE_PROPERTY_PREFIX_LEN;
+    if (matches_property_suffix(property_suffix, ADDEXPORTS, ADDEXPORTS_LEN) ||
+        matches_property_suffix(property_suffix, ADDREADS, ADDREADS_LEN) ||
+        matches_property_suffix(property_suffix, PATCH, PATCH_LEN) ||
+        matches_property_suffix(property_suffix, ADDMODS, ADDMODS_LEN) ||
+        matches_property_suffix(property_suffix, LIMITMODS, LIMITMODS_LEN) ||
+        matches_property_suffix(property_suffix, PATH, PATH_LEN) ||
+        matches_property_suffix(property_suffix, UPGRADE_PATH, UPGRADE_PATH_LEN)) {
+      return true;
+    }
+  }
+  return false;
 }
 
 // Process java launcher properties.
@@ -4155,7 +4177,10 @@
   if (_gc_log_filename != NULL) {
     // -Xloggc was used to specify a filename
     const char* gc_conf = PrintGCDetails ? "gc*" : "gc";
-    return  LogConfiguration::parse_log_arguments(_gc_log_filename, gc_conf, NULL, NULL, NULL);
+
+    LogTarget(Error, logging) target;
+    LogStreamCHeap errstream(target);
+    return LogConfiguration::parse_log_arguments(_gc_log_filename, gc_conf, NULL, NULL, &errstream);
   } else if (PrintGC || PrintGCDetails) {
     LogConfiguration::configure_stdout(LogLevel::Info, !PrintGCDetails, LOG_TAGS(gc));
   }
@@ -4287,8 +4312,8 @@
   }
 
   if (needs_module_property_warning) {
-    warning("Ignoring system property options whose names start with '-Djdk.module'."
-            "  They are reserved for internal use.");
+    warning("Ignoring system property options whose names match the '-Djdk.module.*'."
+            " names that are reserved for internal use.");
   }
 
 #if defined(_ALLBSD_SOURCE) || defined(AIX)  // UseLargePages is not yet supported on BSD and AIX.
--- a/hotspot/src/share/vm/runtime/atomic.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/atomic.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -76,6 +76,7 @@
 
   // Atomically add to a location. Returns updated value. add*() provide:
   // <fence> add-value-to-dest <membar StoreLoad|StoreStore>
+  inline static jshort   add    (jshort   add_value, volatile jshort*   dest);
   inline static jint     add    (jint     add_value, volatile jint*     dest);
   inline static size_t   add    (size_t   add_value, volatile size_t*   dest);
   inline static intptr_t add_ptr(intptr_t add_value, volatile intptr_t* dest);
@@ -208,10 +209,11 @@
   return old;
 }
 
-inline void Atomic::inc(volatile short* dest) {
-  // Most platforms do not support atomic increment on a 2-byte value. However,
+inline jshort Atomic::add(jshort add_value, volatile jshort* dest) {
+  // Most platforms do not support atomic add on a 2-byte value. However,
   // if the value occupies the most significant 16 bits of an aligned 32-bit
-  // word, then we can do this with an atomic add of 0x10000 to the 32-bit word.
+  // word, then we can do this with an atomic add of (add_value << 16)
+  // to the 32-bit word.
   //
   // The least significant parts of this 32-bit word will never be affected, even
   // in case of overflow/underflow.
@@ -219,21 +221,20 @@
   // Use the ATOMIC_SHORT_PAIR macro (see macros.hpp) to get the desired alignment.
 #ifdef VM_LITTLE_ENDIAN
   assert((intx(dest) & 0x03) == 0x02, "wrong alignment");
-  (void)Atomic::add(0x10000, (volatile int*)(dest-1));
+  jint new_value = Atomic::add(add_value << 16, (volatile jint*)(dest-1));
 #else
   assert((intx(dest) & 0x03) == 0x00, "wrong alignment");
-  (void)Atomic::add(0x10000, (volatile int*)(dest));
+  jint new_value = Atomic::add(add_value << 16, (volatile jint*)(dest));
 #endif
+  return (jshort)(new_value >> 16); // preserves sign
 }
 
-inline void Atomic::dec(volatile short* dest) {
-#ifdef VM_LITTLE_ENDIAN
-  assert((intx(dest) & 0x03) == 0x02, "wrong alignment");
-  (void)Atomic::add(-0x10000, (volatile int*)(dest-1));
-#else
-  assert((intx(dest) & 0x03) == 0x00, "wrong alignment");
-  (void)Atomic::add(-0x10000, (volatile int*)(dest));
-#endif
+inline void Atomic::inc(volatile jshort* dest) {
+  (void)add(1, dest);
+}
+
+inline void Atomic::dec(volatile jshort* dest) {
+  (void)add(-1, dest);
 }
 
 #endif // SHARE_VM_RUNTIME_ATOMIC_HPP
--- a/hotspot/src/share/vm/runtime/globals.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -3017,9 +3017,6 @@
           "Number of receiver types to record in call/cast profile")        \
           range(0, 8)                                                       \
                                                                             \
-  experimental(intx, MethodProfileWidth, 0,                                 \
-          "Number of methods to record in call profile")                    \
-                                                                            \
   develop(intx, BciProfileWidth,      2,                                    \
           "Number of return bci's to record in ret profile")                \
                                                                             \
--- a/hotspot/src/share/vm/runtime/interfaceSupport.hpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/interfaceSupport.hpp	Wed Jul 05 22:13:53 2017 +0200
@@ -219,6 +219,9 @@
     trans_from_java(_thread_in_vm);
   }
   ~ThreadInVMfromJava()  {
+    if (_thread->stack_yellow_reserved_zone_disabled()) {
+      _thread->enable_stack_yellow_reserved_zone();
+    }
     trans(_thread_in_vm, _thread_in_Java);
     // Check for pending. async. exceptions or suspends.
     if (_thread->has_special_runtime_exit_condition()) _thread->handle_special_runtime_exit_condition();
@@ -306,6 +309,9 @@
     trans_from_java(_thread_in_vm);
   }
   ~ThreadInVMfromJavaNoAsyncException()  {
+    if (_thread->stack_yellow_reserved_zone_disabled()) {
+      _thread->enable_stack_yellow_reserved_zone();
+    }
     trans(_thread_in_vm, _thread_in_Java);
     // NOTE: We do not check for pending. async. exceptions.
     // If we did and moved the pending async exception over into the
@@ -314,6 +320,7 @@
     // to the _thread_in_vm state. Instead we postpone the handling of
     // the async exception.
 
+
     // Check for pending. suspends only.
     if (_thread->has_special_runtime_exit_condition())
       _thread->handle_special_runtime_exit_condition(false);
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -412,13 +412,13 @@
   return result;
 }
 
-static bool under_host_klass(const InstanceKlass* ik, const Klass* host_klass) {
+static bool under_host_klass(const InstanceKlass* ik, const InstanceKlass* host_klass) {
   DEBUG_ONLY(int inf_loop_check = 1000 * 1000 * 1000);
   for (;;) {
-    const Klass* hc = (const Klass*)ik->host_klass();
+    const InstanceKlass* hc = ik->host_klass();
     if (hc == NULL)        return false;
     if (hc == host_klass)  return true;
-    ik = InstanceKlass::cast(hc);
+    ik = hc;
 
     // There's no way to make a host class loop short of patching memory.
     // Therefore there cannot be a loop here unless there's another bug.
@@ -436,8 +436,8 @@
 
   // If either is on the other's host_klass chain, access is OK,
   // because one is inside the other.
-  if (under_host_klass(accessor_ik, accessee) ||
-    under_host_klass(accessee_ik, accessor))
+  if (under_host_klass(accessor_ik, accessee_ik) ||
+    under_host_klass(accessee_ik, accessor_ik))
     return true;
 
   if ((RelaxAccessControlCheck &&
@@ -446,7 +446,7 @@
     (accessor_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION &&
     accessee_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION)) {
     return classloader_only &&
-      Verifier::relax_verify_for(accessor_ik->class_loader()) &&
+      Verifier::relax_access_for(accessor_ik->class_loader()) &&
       accessor_ik->protection_domain() == accessee_ik->protection_domain() &&
       accessor_ik->class_loader() == accessee_ik->class_loader();
   }
--- a/hotspot/src/share/vm/runtime/thread.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -35,7 +35,6 @@
 #include "compiler/compileTask.hpp"
 #include "gc/shared/gcId.hpp"
 #include "gc/shared/gcLocker.inline.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "gc/shared/workgroup.hpp"
 #include "interpreter/interpreter.hpp"
 #include "interpreter/linkResolver.hpp"
@@ -3718,14 +3717,6 @@
   Management::record_vm_init_completed();
 #endif // INCLUDE_MANAGEMENT
 
-  // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and
-  // set_init_completed has just been called, causing exceptions not to be shortcut
-  // anymore. We call vm_exit_during_initialization directly instead.
-
-  // Initialize reference pending list locker
-  bool needs_locker_thread = Universe::heap()->needs_reference_pending_list_locker_thread();
-  ReferencePendingListLocker::initialize(needs_locker_thread, CHECK_JNI_ERR);
-
   // Signal Dispatcher needs to be started before VMInit event is posted
   os::signal_init();
 
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -54,7 +54,6 @@
 #include "gc/shared/genCollectedHeap.hpp"
 #include "gc/shared/generation.hpp"
 #include "gc/shared/generationSpec.hpp"
-#include "gc/shared/referencePendingListLocker.hpp"
 #include "gc/shared/space.hpp"
 #include "interpreter/bytecodeInterpreter.hpp"
 #include "interpreter/bytecodes.hpp"
@@ -242,7 +241,7 @@
   nonstatic_field(ConstantPool,                _reference_map,                                Array<u2>*)                            \
   nonstatic_field(ConstantPoolCache,           _length,                                       int)                                   \
   nonstatic_field(ConstantPoolCache,           _constant_pool,                                ConstantPool*)                         \
-  nonstatic_field(InstanceKlass,               _array_klasses,                                Klass*)                                \
+  volatile_nonstatic_field(InstanceKlass,      _array_klasses,                                Klass*)                                \
   nonstatic_field(InstanceKlass,               _methods,                                      Array<Method*>*)                       \
   nonstatic_field(InstanceKlass,               _default_methods,                              Array<Method*>*)                       \
   nonstatic_field(InstanceKlass,               _local_interfaces,                             Array<Klass*>*)                        \
@@ -271,7 +270,7 @@
   nonstatic_field(InstanceKlass,               _osr_nmethods_head,                            nmethod*)                              \
   JVMTI_ONLY(nonstatic_field(InstanceKlass,    _breakpoints,                                  BreakpointInfo*))                      \
   nonstatic_field(InstanceKlass,               _generic_signature_index,                      u2)                                    \
-  nonstatic_field(InstanceKlass,               _methods_jmethod_ids,                          jmethodID*)                            \
+  volatile_nonstatic_field(InstanceKlass,      _methods_jmethod_ids,                          jmethodID*)                            \
   volatile_nonstatic_field(InstanceKlass,      _idnum_allocated_count,                        u2)                                    \
   nonstatic_field(InstanceKlass,               _annotations,                                  Annotations*)                          \
   nonstatic_field(InstanceKlass,               _method_ordering,                              Array<int>*)                           \
@@ -1637,7 +1636,6 @@
            declare_type(JavaThread, Thread)                               \
            declare_type(JvmtiAgentThread, JavaThread)                     \
            declare_type(ServiceThread, JavaThread)                        \
-           declare_type(ReferencePendingListLockerThread, JavaThread)     \
   declare_type(CompilerThread, JavaThread)                                \
   declare_type(CodeCacheSweeperThread, JavaThread)                        \
   declare_toplevel_type(OSThread)                                         \
@@ -2628,6 +2626,11 @@
   declare_constant(Deoptimization::Reason_rtm_state_change)               \
   declare_constant(Deoptimization::Reason_unstable_if)                    \
   declare_constant(Deoptimization::Reason_unstable_fused_if)              \
+  NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_aliasing)))                       \
+  NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_transfer_to_interpreter)))        \
+  NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_not_compiled_exception_handler))) \
+  NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_unresolved)))                     \
+  NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_jsr_mismatch)))                   \
   declare_constant(Deoptimization::Reason_tenured)                        \
   declare_constant(Deoptimization::Reason_LIMIT)                          \
   declare_constant(Deoptimization::Reason_RECORDED_LIMIT)                 \
@@ -2752,7 +2755,13 @@
   declare_constant(ConcreteRegisterImpl::number_of_registers)             \
   declare_preprocessor_constant("REG_COUNT", REG_COUNT)                \
   declare_c2_preprocessor_constant("SAVED_ON_ENTRY_REG_COUNT", SAVED_ON_ENTRY_REG_COUNT) \
-  declare_c2_preprocessor_constant("C_SAVED_ON_ENTRY_REG_COUNT", C_SAVED_ON_ENTRY_REG_COUNT)
+  declare_c2_preprocessor_constant("C_SAVED_ON_ENTRY_REG_COUNT", C_SAVED_ON_ENTRY_REG_COUNT) \
+                                                                          \
+  /****************/                                                      \
+  /* JVMCI */                                                             \
+  /****************/                                                      \
+                                                                          \
+  declare_preprocessor_constant("INCLUDE_JVMCI", INCLUDE_JVMCI)
 
 
 //--------------------------------------------------------------------------------
--- a/hotspot/src/share/vm/services/classLoadingService.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/services/classLoadingService.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -183,11 +183,8 @@
 bool ClassLoadingService::set_verbose(bool verbose) {
   MutexLocker m(Management_lock);
   // verbose will be set to the previous value
-  if (verbose) {
-    LogConfiguration::parse_log_arguments("stdout", "class+load=info", NULL, NULL, NULL);
-  } else {
-    LogConfiguration::parse_log_arguments("stdout", "class+load=off", NULL, NULL, NULL);
-  }
+  LogLevelType level = verbose ? LogLevel::Info : LogLevel::Off;
+  LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, load));
   reset_trace_class_unloading();
   return verbose;
 }
@@ -196,11 +193,8 @@
 void ClassLoadingService::reset_trace_class_unloading() {
   assert(Management_lock->owned_by_self(), "Must own the Management_lock");
   bool value = MemoryService::get_verbose() || ClassLoadingService::get_verbose();
-  if (value) {
-    LogConfiguration::parse_log_arguments("stdout", "class+unload=info", NULL, NULL, NULL);
-  } else {
-    LogConfiguration::parse_log_arguments("stdout", "class+unload=off", NULL, NULL, NULL);
-  }
+  LogLevelType level = value ? LogLevel::Info : LogLevel::Off;
+  LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, unload));
 }
 
 GrowableArray<KlassHandle>* LoadedClassesEnumerator::_loaded_classes = NULL;
--- a/hotspot/src/share/vm/utilities/internalVMTests.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/utilities/internalVMTests.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -56,12 +56,10 @@
   run_unit_test(CollectedHeap_test);
   run_unit_test(QuickSort_test);
   run_unit_test(GuardedMemory_test);
-  run_unit_test(AltHashing_test);
   run_unit_test(TestNewSize_test);
   run_unit_test(TestOldSize_test);
   run_unit_test(TestKlass_test);
   run_unit_test(TestBitMap_test);
-  run_unit_test(TestAsUtf8);
   run_unit_test(TestResourcehash_test);
   run_unit_test(ObjectMonitor_test);
   run_unit_test(Test_linked_list);
@@ -89,16 +87,12 @@
   run_unit_test(VMStructs_test);
 #endif
 #if INCLUDE_ALL_GCS
-  run_unit_test(TestOldFreeSpaceCalculation_test);
   run_unit_test(TestG1BiasedArray_test);
   run_unit_test(TestBufferingOopClosure_test);
-  run_unit_test(TestCodeCacheRemSet_test);
   if (UseG1GC) {
     run_unit_test(FreeRegionList_test);
     run_unit_test(IHOP_test);
   }
-  run_unit_test(test_memset_with_concurrent_readers);
-  run_unit_test(TestPredictions_test);
   run_unit_test(WorkerDataArray_test);
   run_unit_test(ParallelCompact_test);
 #endif
--- a/hotspot/src/share/vm/utilities/utf8.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/src/share/vm/utilities/utf8.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -547,30 +547,3 @@
 template int UNICODE::quoted_ascii_length<jchar>(jchar* base, int length);
 template void UNICODE::as_quoted_ascii<jbyte>(const jbyte* base, int length, char* buf, int buflen);
 template void UNICODE::as_quoted_ascii<jchar>(const jchar* base, int length, char* buf, int buflen);
-
-
-#ifndef PRODUCT
-void TestAsUtf8() {
-  char res[60];
-  jchar str[20];
-
-  for (int i = 0; i < 20; i++) {
-    str[i] = 0x0800; // char that is 2B in UTF-16 but 3B in UTF-8
-  }
-  str[19] = (jchar)'\0';
-
-  // The resulting string in UTF-8 is 3*19 bytes long, but should be truncated
-  UNICODE::as_utf8(str, 19, res, 10);
-  assert(strlen(res) == 9, "string should be truncated here");
-
-  UNICODE::as_utf8(str, 19, res, 18);
-  assert(strlen(res) == 15, "string should be truncated here");
-
-  UNICODE::as_utf8(str, 19, res, 20);
-  assert(strlen(res) == 18, "string should be truncated here");
-
-  // Test with an "unbounded" buffer
-  UNICODE::as_utf8(str, 19, res, INT_MAX);
-  assert(strlen(res) == 3*19, "string should end here");
-}
-#endif
--- a/hotspot/test/TEST.groups	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/TEST.groups	Wed Jul 05 22:13:53 2017 +0200
@@ -168,7 +168,6 @@
   runtime/InternalApi/ThreadCpuTimesDeadlock.java \
   runtime/NMT/JcmdSummaryDiff.java \
   runtime/RedefineTests/RedefineAnnotations.java \
-  serviceability/sa/jmap-hashcode/Test8028623.java \
   serviceability/threads/TestFalseDeadLock.java \
   compiler/codecache/jmx \
   compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java \
--- a/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeMismatchedArrayFieldAccess.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeMismatchedArrayFieldAccess.java	Wed Jul 05 22:13:53 2017 +0200
@@ -36,11 +36,11 @@
 package compiler.intrinsics.unsafe;
 
 import jdk.internal.misc.Unsafe;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 
 public class TestUnsafeMismatchedArrayFieldAccess {
 
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
 
     static {
         try {
--- a/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -62,7 +62,7 @@
 public class CallSiteDepContextTest {
     static final Unsafe               UNSAFE = Unsafe.getUnsafe();
     static final MethodHandles.Lookup LOOKUP = MethodHandleHelper.IMPL_LOOKUP;
-    static final String           CLASS_NAME = "java/lang/invoke/Test";
+    static final String           CLASS_NAME = "compiler/jsr292/Test";
     static final String          METHOD_NAME = "m";
     static final MethodType TYPE = MethodType.methodType(int.class);
 
@@ -129,8 +129,8 @@
     }
 
     public static void testSharedCallSite() throws Throwable {
-        Class<?> cls1 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("CS_1"), null);
-        Class<?> cls2 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("CS_2"), null);
+        Class<?> cls1 = UNSAFE.defineAnonymousClass(CallSiteDepContextTest.class, getClassFile("CS_1"), null);
+        Class<?> cls2 = UNSAFE.defineAnonymousClass(CallSiteDepContextTest.class, getClassFile("CS_2"), null);
 
         MethodHandle[] mhs = new MethodHandle[] {
                 LOOKUP.findStatic(cls1, METHOD_NAME, TYPE),
@@ -151,7 +151,7 @@
         execute(1, mh);
 
         // mcs.context == cls1
-        Class<?> cls1 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("NonBound_1"), null);
+        Class<?> cls1 = UNSAFE.defineAnonymousClass(CallSiteDepContextTest.class, getClassFile("NonBound_1"), null);
         MethodHandle mh1 = LOOKUP.findStatic(cls1, METHOD_NAME, TYPE);
 
         execute(1, mh1);
@@ -170,8 +170,8 @@
         mcs = new MutableCallSite(LOOKUP.findStatic(T.class, "f1", TYPE));
 
         Class<?>[] cls = new Class[] {
-                UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_1" + id), null),
-                UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_2" + id), null),
+                UNSAFE.defineAnonymousClass(CallSiteDepContextTest.class, getClassFile("GC_1" + id), null),
+                UNSAFE.defineAnonymousClass(CallSiteDepContextTest.class, getClassFile("GC_2" + id), null),
         };
 
         MethodHandle[] mhs = new MethodHandle[] {
@@ -185,7 +185,7 @@
         execute(1, mhs);
 
         ref = new PhantomReference<>(cls[0], rq);
-        cls[0] = UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_3" + id), null);
+        cls[0] = UNSAFE.defineAnonymousClass(CallSiteDepContextTest.class, getClassFile("GC_3" + id), null);
         mhs[0] = LOOKUP.findStatic(cls[0], METHOD_NAME, TYPE);
 
         do {
--- a/hotspot/test/compiler/jsr292/NullConstantReceiver.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jsr292/NullConstantReceiver.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,9 +23,10 @@
 
 /**
  * @test
- * @bug 8059556
+ * @bug 8059556 8158639
  *
  * @run main/othervm -Xbatch compiler.jsr292.NullConstantReceiver
+ * @run main/othervm -Xbatch -XX:CompileCommand=exclude,*::run compiler.jsr292.NullConstantReceiver
  */
 
 package compiler.jsr292;
--- a/hotspot/test/compiler/jvmci/compilerToVM/CompileCodeTestCase.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/CompileCodeTestCase.java	Wed Jul 05 22:13:53 2017 +0200
@@ -107,6 +107,12 @@
     }
 
     public NMethod compile(int level) {
+        String directive = "[{ match: \"" + executable.getDeclaringClass().getName().replace('.', '/')
+                + "." + (executable instanceof Constructor ? "<init>" : executable.getName())
+                + "\", " + "BackgroundCompilation: false }]";
+        if (WB.addCompilerDirective(directive) != 1) {
+            throw new Error("Failed to add compiler directive: " + directive);
+        }
         boolean enqueued = WB.enqueueMethodForCompilation(executable,
                 level, bci);
         if (!enqueued) {
--- a/hotspot/test/compiler/jvmci/compilerToVM/DisassembleCodeBlobTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/DisassembleCodeBlobTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -34,8 +34,9 @@
  *          jdk.vm.ci/jdk.vm.ci.hotspot
  *          jdk.vm.ci/jdk.vm.ci.code
  *
- * @ignore 8139700
- * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper sun.hotspot.WhiteBox
+ * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
+ * @build sun.hotspot.WhiteBox
+ *        compiler.jvmci.compilerToVM.DisassembleCodeBlobTest
  * @run driver ClassFileInstaller sun.hotspot.WhiteBox
  *                                sun.hotspot.WhiteBox$WhiteBoxPermission
  * @run main/othervm -Xbootclasspath/a:.
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -45,7 +45,7 @@
 
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.vm.ci.hotspot.CompilerToVMHelper;
 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 import jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject;
@@ -114,7 +114,7 @@
         abstract HotSpotResolvedJavaMethod getResolvedJavaMethod();
     }
 
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
     private static final WhiteBox WB = WhiteBox.getWhiteBox();
     private static final Field METASPACE_METHOD_FIELD;
     private static final Class<?> TEST_CLASS = GetResolvedJavaMethodTest.class;
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaTypeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaTypeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -53,7 +53,7 @@
 
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.vm.ci.hotspot.CompilerToVMHelper;
 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
@@ -154,7 +154,7 @@
         abstract HotSpotResolvedObjectType getResolvedJavaType();
     }
 
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
     private static final WhiteBox WB = WhiteBox.getWhiteBox();
     private static final Class TEST_CLASS = GetResolvedJavaTypeTest.class;
     /* a compressed parameter for tested method is set to false because
--- a/hotspot/test/compiler/jvmci/compilerToVM/InitializeConfigurationTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 8136421
- * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64")
- * @library / /test/lib
- * @library ../common/patches
- * @modules java.base/jdk.internal.misc
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
- * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
- * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
- *                   compiler.jvmci.compilerToVM.InitializeConfigurationTest
- */
-
-package compiler.jvmci.compilerToVM;
-
-import jdk.test.lib.Asserts;
-import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
-import jdk.vm.ci.hotspot.HotSpotVMConfigAccess;
-import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
-
-public class InitializeConfigurationTest {
-    public static void main(String args[]) {
-        new InitializeConfigurationTest().runTest();
-    }
-
-    private void runTest() {
-        TestHotSpotVMConfig config = new TestHotSpotVMConfig(HotSpotJVMCIRuntime.runtime().getConfigStore());
-        Asserts.assertNE(config.codeCacheHighBound, 0L, "Got null address");
-        Asserts.assertNE(config.stubRoutineJintArrayCopy, 0L, "Got null address");
-    }
-
-    private static class TestHotSpotVMConfig extends HotSpotVMConfigAccess {
-
-        private TestHotSpotVMConfig(HotSpotVMConfigStore store) {
-            super(store);
-        }
-
-        final long codeCacheHighBound = getFieldValue("CodeCache::_high_bound", Long.class);
-        final long stubRoutineJintArrayCopy = getFieldValue("StubRoutines::_jint_arraycopy", Long.class);
-    }
-}
--- a/hotspot/test/compiler/jvmci/compilerToVM/InvalidateInstalledCodeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/InvalidateInstalledCodeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -35,8 +35,10 @@
  *          jdk.vm.ci/jdk.vm.ci.code
  *          jdk.vm.ci/jdk.vm.ci.runtime
  *
- * @ignore 8139700
- * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper sun.hotspot.WhiteBox
+ * @ignore 8163894
+ * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
+ * @build compiler.jvmci.compilerToVM.InvalidateInstalledCodeTest
+ * @build sun.hotspot.WhiteBox
  * @run driver ClassFileInstaller sun.hotspot.WhiteBox
  *                                sun.hotspot.WhiteBox$WhiteBoxPermission
  * @run main/othervm -Xbootclasspath/a:.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/ReadConfigurationTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8136421
+ * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64")
+ * @library / /test/lib
+ * @library ../common/patches
+ * @modules java.base/jdk.internal.misc
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
+ * @build compiler.jvmci.compilerToVM.ReadConfigurationTest
+ * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
+ *                   compiler.jvmci.compilerToVM.ReadConfigurationTest
+ */
+
+package compiler.jvmci.compilerToVM;
+
+import jdk.test.lib.Asserts;
+import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
+import jdk.vm.ci.hotspot.HotSpotVMConfigAccess;
+import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
+import jdk.vm.ci.hotspot.VMIntrinsicMethod;
+
+public class ReadConfigurationTest {
+    public static void main(String args[]) {
+        new ReadConfigurationTest().runTest();
+    }
+
+    private void runTest() {
+        TestHotSpotVMConfig config = new TestHotSpotVMConfig(HotSpotJVMCIRuntime.runtime().getConfigStore());
+        Asserts.assertNE(config.codeCacheHighBound, 0L, "Got null address");
+        Asserts.assertNE(config.stubRoutineJintArrayCopy, 0L, "Got null address");
+
+        for (VMIntrinsicMethod m : config.getStore().getIntrinsics()) {
+            Asserts.assertNotNull(m);
+            Asserts.assertNotNull(m.declaringClass);
+            Asserts.assertFalse(m.declaringClass.contains("."),
+                "declaringClass should be in class file format: " + m.declaringClass);
+            Asserts.assertNotNull(m.name);
+            Asserts.assertNotNull(m.descriptor);
+            Asserts.assertTrue(m.id > 0);
+        }
+    }
+
+    private static class TestHotSpotVMConfig extends HotSpotVMConfigAccess {
+
+        private TestHotSpotVMConfig(HotSpotVMConfigStore store) {
+            super(store);
+        }
+
+        final long codeCacheHighBound = getFieldValue("CodeCache::_high_bound", Long.class);
+        final long stubRoutineJintArrayCopy = getFieldValue("StubRoutines::_jint_arraycopy", Long.class);
+    }
+}
--- a/hotspot/test/compiler/jvmci/compilerToVM/ResolveFieldInPoolTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/ResolveFieldInPoolTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -53,7 +53,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.internal.org.objectweb.asm.Opcodes;
 import jdk.test.lib.Asserts;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.vm.ci.hotspot.CompilerToVMHelper;
 import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
 import jdk.vm.ci.meta.ConstantPool;
@@ -69,7 +69,7 @@
  */
 public class ResolveFieldInPoolTest {
 
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
 
     public static void main(String[] args) throws Exception {
         Map<ConstantTypes, Validator> typeTests = new HashMap<>();
--- a/hotspot/test/compiler/jvmci/compilerToVM/ResolveMethodTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/ResolveMethodTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -52,6 +52,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
 import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.vm.ci.hotspot.CompilerToVMHelper;
 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
 import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
@@ -60,7 +61,7 @@
 import java.util.Set;
 
 public class ResolveMethodTest {
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
 
     public static void main(String args[]) {
         ResolveMethodTest test = new ResolveMethodTest();
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/MaxOopMapStackOffsetTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/MaxOopMapStackOffsetTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9") & os.arch != "aarch64"
  * @library /
  * @modules jdk.vm.ci/jdk.vm.ci.hotspot
  *          jdk.vm.ci/jdk.vm.ci.meta
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/NativeCallTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.code.test/src/jdk/vm/ci/code/test/NativeCallTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64"
+ * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9") & os.arch != "aarch64"
  * @library /test/lib /
  * @modules jdk.vm.ci/jdk.vm.ci.hotspot
  *          jdk.vm.ci/jdk.vm.ci.code
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java	Wed Jul 05 22:13:53 2017 +0200
@@ -33,19 +33,16 @@
 
 package jdk.vm.ci.runtime.test;
 
-import jdk.vm.ci.meta.ConstantPool;
-import jdk.vm.ci.meta.ExceptionHandler;
-import jdk.vm.ci.meta.ResolvedJavaMethod;
-import jdk.vm.ci.meta.ResolvedJavaType;
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import java.lang.invoke.MethodHandle;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
@@ -57,10 +54,13 @@
 import java.util.Map;
 import java.util.Set;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.Assert;
+import org.junit.Test;
+
+import jdk.vm.ci.meta.ConstantPool;
+import jdk.vm.ci.meta.ExceptionHandler;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+import jdk.vm.ci.meta.ResolvedJavaType;
 
 /**
  * Tests for {@link ResolvedJavaMethod}.
@@ -407,20 +407,6 @@
         }
     }
 
-    @Test
-    public void isSignaturePolymorphicTest() {
-        ResolvedJavaType methodHandleType = metaAccess.lookupJavaType(MethodHandle.class);
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "invokeExact", metaAccess));
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "invoke", metaAccess));
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "invokeBasic", metaAccess));
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "linkToVirtual", metaAccess));
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "linkToStatic", metaAccess));
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "linkToSpecial", metaAccess));
-        assertTrue(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "linkToInterface", metaAccess));
-        assertFalse(ResolvedJavaMethod.isSignaturePolymorphic(methodHandleType, "type", metaAccess));
-        assertFalse(ResolvedJavaMethod.isSignaturePolymorphic(metaAccess.lookupJavaType(Object.class), "toString", metaAccess));
-    }
-
     /**
      * All public non-final methods should be available in the vtable.
      */
--- a/hotspot/test/compiler/loopopts/superword/TestVectorizationWithInvariant.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/loopopts/superword/TestVectorizationWithInvariant.java	Wed Jul 05 22:13:53 2017 +0200
@@ -34,7 +34,7 @@
 package compiler.loopopts.superword;
 
 import jdk.internal.misc.Unsafe;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 
 public class TestVectorizationWithInvariant {
 
@@ -43,7 +43,7 @@
     private static final long CHAR_ARRAY_OFFSET;
 
     static {
-        unsafe = Utils.getUnsafe();
+        unsafe = UnsafeHelper.getUnsafe();
         BYTE_ARRAY_OFFSET = unsafe.arrayBaseOffset(byte[].class);
         CHAR_ARRAY_OFFSET = unsafe.arrayBaseOffset(char[].class);
     }
--- a/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -40,7 +40,7 @@
 package compiler.profiling.spectrapredefineclass;
 
 import jdk.test.lib.JDKToolLauncher;
-import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.process.OutputAnalyzer;
 
 import java.io.File;
 import java.io.IOException;
--- a/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -43,7 +43,7 @@
 package compiler.profiling.spectrapredefineclass_classloaders;
 
 import jdk.test.lib.JDKToolLauncher;
-import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.process.OutputAnalyzer;
 
 import java.io.File;
 import java.io.IOException;
--- a/hotspot/test/compiler/rtm/locking/TestRTMAbortRatio.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/rtm/locking/TestRTMAbortRatio.java	Wed Jul 05 22:13:53 2017 +0200
@@ -49,7 +49,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
 import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.test.lib.cli.CommandLineOptionTest;
 import jdk.test.lib.cli.predicate.AndPredicate;
 
@@ -125,7 +125,7 @@
     public static class Test implements CompilableTest {
         private static final int TOTAL_ITERATIONS = 10000;
         private static final int WARMUP_ITERATIONS = 1000;
-        private static final Unsafe UNSAFE = Utils.getUnsafe();
+        private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
         private final Object monitor = new Object();
         // Following field have to be static in order to avoid escape analysis.
         @SuppressWarnings("UnsuedDeclaration")
--- a/hotspot/test/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java	Wed Jul 05 22:13:53 2017 +0200
@@ -51,7 +51,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
 import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.test.lib.cli.CommandLineOptionTest;
 import jdk.test.lib.cli.predicate.AndPredicate;
 
@@ -158,7 +158,7 @@
         private static int field = 0;
         private static final int ITERATIONS = 10000;
         private static final int RANGE_CHECK_AT = ITERATIONS / 2;
-        private static final Unsafe UNSAFE = Utils.getUnsafe();
+        private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
         private final Object monitor = new Object();
 
         @Override
--- a/hotspot/test/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java	Wed Jul 05 22:13:53 2017 +0200
@@ -48,7 +48,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
 import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.test.lib.cli.CommandLineOptionTest;
 import jdk.test.lib.cli.predicate.AndPredicate;
 
@@ -133,7 +133,7 @@
     }
 
     public static class Test implements CompilableTest {
-        private static final Unsafe UNSAFE = Utils.getUnsafe();
+        private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
         private final Object monitor = new Object();
 
         @Override
--- a/hotspot/test/compiler/rtm/locking/TestRTMLockingThreshold.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/rtm/locking/TestRTMLockingThreshold.java	Wed Jul 05 22:13:53 2017 +0200
@@ -49,7 +49,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
 import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.test.lib.cli.CommandLineOptionTest;
 import jdk.test.lib.cli.predicate.AndPredicate;
 
@@ -142,7 +142,7 @@
         @SuppressWarnings("UnsuedDeclaration")
         private static int field = 0;
         private static final int TOTAL_ITERATIONS = 10000;
-        private static final Unsafe UNSAFE = Utils.getUnsafe();
+        private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
         private final Object monitor = new Object();
 
 
--- a/hotspot/test/compiler/rtm/locking/TestRTMTotalCountIncrRate.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/rtm/locking/TestRTMTotalCountIncrRate.java	Wed Jul 05 22:13:53 2017 +0200
@@ -49,7 +49,7 @@
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Asserts;
 import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.test.lib.cli.CommandLineOptionTest;
 import jdk.test.lib.cli.predicate.AndPredicate;
 
@@ -113,7 +113,7 @@
 
     public static class Test implements CompilableTest {
         private static final long TOTAL_ITERATIONS = 10000L;
-        private static final Unsafe UNSAFE = Utils.getUnsafe();
+        private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
         private final Object monitor = new Object();
         // Following field have to be static in order to avoid escape analysis.
         @SuppressWarnings("UnsuedDeclaration")
--- a/hotspot/test/compiler/testlibrary/rtm/XAbortProvoker.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/testlibrary/rtm/XAbortProvoker.java	Wed Jul 05 22:13:53 2017 +0200
@@ -25,7 +25,7 @@
 package compiler.testlibrary.rtm;
 
 import jdk.internal.misc.Unsafe;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 
 /**
  * Current RTM locking implementation force transaction abort
@@ -35,7 +35,7 @@
     // Following field have to be static in order to avoid escape analysis.
     @SuppressWarnings("UnsuedDeclaration")
     private static int field = 0;
-    private static final Unsafe UNSAFE = Utils.getUnsafe();
+    private static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
 
     public XAbortProvoker() {
         this(new Object());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/unsafe/MixedUnsafeStoreObject.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 8155635
+ * @modules java.base/jdk.internal.misc
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:-TieredCompilation compiler.unsafe.MixedUnsafeStoreObject
+ * @run main/othervm -Xbatch compiler.unsafe.MixedUnsafeStoreObject
+ */
+
+package compiler.unsafe;
+
+import jdk.internal.misc.Unsafe;
+
+public class MixedUnsafeStoreObject {
+    static final Unsafe UNSAFE = Unsafe.getUnsafe();
+
+    static final long F_OFFSET;
+
+    static {
+        try {
+            F_OFFSET = UNSAFE.objectFieldOffset(T.class.getDeclaredField("f"));
+        } catch (Exception e) {
+            throw new Error(e);
+        }
+    }
+
+    static class T {
+        Object f;
+    }
+
+    public static void testFieldInstanceObject(Object t) {
+        for (int c = 0; c < 20000; c++) { // trigger OSR compilation
+            // java/lang/Object+12 *
+            // _base = InstPtr, _ptr = BotPTR, _field = NULL, mismatched = true
+            UNSAFE.putObject(t, F_OFFSET, "foo");
+        }
+    }
+
+    public static void testFieldInstanceT(T t) {
+        for (int c = 0; c < 20000; c++) { // trigger OSR compilation
+            // ...$T+12 *
+            // _base = InstPtr, _ptr = BotPTR, _field = T.f, mismatched = false
+            UNSAFE.putObject(t, F_OFFSET, "foo");
+        }
+    }
+    public static void main(String[] args) {
+        testFieldInstanceObject(new T());
+        testFieldInstanceT(new T());
+    }
+}
+
--- a/hotspot/test/compiler/unsafe/OpaqueAccesses.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/unsafe/OpaqueAccesses.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,6 +30,22 @@
  *
  * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
  *                                 -XX:-TieredCompilation -Xbatch
+ *                                 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers
+ *                                 -XX:CompileCommand=dontinline,compiler.unsafe.OpaqueAccesses::test*
+ *                                 compiler.unsafe.OpaqueAccesses
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
+ *                                 -XX:-TieredCompilation -Xbatch
+ *                                 -XX:+UseCompressedOops -XX:-UseCompressedClassPointers
+ *                                 -XX:CompileCommand=dontinline,compiler.unsafe.OpaqueAccesses::test*
+ *                                 compiler.unsafe.OpaqueAccesses
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
+ *                                 -XX:-TieredCompilation -Xbatch
+ *                                 -XX:-UseCompressedOops -XX:+UseCompressedClassPointers
+ *                                 -XX:CompileCommand=dontinline,compiler.unsafe.OpaqueAccesses::test*
+ *                                 compiler.unsafe.OpaqueAccesses
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
+ *                                 -XX:-TieredCompilation -Xbatch
+ *                                 -XX:-UseCompressedOops -XX:-UseCompressedClassPointers
  *                                 -XX:CompileCommand=dontinline,compiler.unsafe.OpaqueAccesses::test*
  *                                 compiler.unsafe.OpaqueAccesses
  */
@@ -61,6 +77,7 @@
     }
 
     private Object f = new Object();
+    private long l1, l2;
 
     static Object testFixedOffsetField(Object o) {
         return UNSAFE.getObject(o, F_OFFSET);
@@ -74,6 +91,22 @@
         return UNSAFE.getInt(o, 4);
     }
 
+    static int testFixedOffsetHeader8(Object o) {
+        return UNSAFE.getInt(o, 8);
+    }
+
+    static int testFixedOffsetHeader12(Object o) {
+        return UNSAFE.getInt(o, 12);
+    }
+
+    static int testFixedOffsetHeader16(Object o) {
+        return UNSAFE.getInt(o, 16);
+    }
+
+    static int testFixedOffsetHeader17(Object o) {
+        return UNSAFE.getIntUnaligned(o, 17);
+    }
+
     static Object testFixedBase(long off) {
         return UNSAFE.getObject(INSTANCE, off);
     }
@@ -90,6 +123,22 @@
         return UNSAFE.getInt(arr, 4);
     }
 
+    static int testFixedOffsetHeaderArray8(Object[] arr) {
+        return UNSAFE.getInt(arr, 8);
+    }
+
+    static int testFixedOffsetHeaderArray12(Object[] arr) {
+        return UNSAFE.getInt(arr, 12);
+    }
+
+    static int testFixedOffsetHeaderArray16(Object[] arr) {
+        return UNSAFE.getInt(arr, 16);
+    }
+
+    static int testFixedOffsetHeaderArray17(Object[] arr) {
+        return UNSAFE.getIntUnaligned(arr, 17);
+    }
+
     static Object testFixedOffsetArray(Object[] arr) {
         return UNSAFE.getObject(arr, E_OFFSET);
     }
@@ -118,6 +167,10 @@
             testFixedOffsetField(INSTANCE);
             testFixedOffsetHeader0(INSTANCE);
             testFixedOffsetHeader4(INSTANCE);
+            testFixedOffsetHeader8(INSTANCE);
+            testFixedOffsetHeader12(INSTANCE);
+            testFixedOffsetHeader16(INSTANCE);
+            testFixedOffsetHeader17(INSTANCE);
             testFixedBase(F_OFFSET);
             testOpaque(INSTANCE, F_OFFSET);
             testMixedAccess();
@@ -125,6 +178,10 @@
             // Array
             testFixedOffsetHeaderArray0(ARRAY);
             testFixedOffsetHeaderArray4(ARRAY);
+            testFixedOffsetHeaderArray8(ARRAY);
+            testFixedOffsetHeaderArray12(ARRAY);
+            testFixedOffsetHeaderArray16(ARRAY);
+            testFixedOffsetHeaderArray17(ARRAY);
             testFixedOffsetArray(ARRAY);
             testFixedBaseArray(E_OFFSET);
             testOpaqueArray(ARRAY, E_OFFSET);
--- a/hotspot/test/compiler/unsafe/UnsafeRaw.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/compiler/unsafe/UnsafeRaw.java	Wed Jul 05 22:13:53 2017 +0200
@@ -35,6 +35,7 @@
 
 import jdk.internal.misc.Unsafe;
 import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 
 import java.util.Random;
 
@@ -81,7 +82,7 @@
   }
 
   public static void main(String[] args) throws Exception {
-    Unsafe unsafe = Utils.getUnsafe();
+    Unsafe unsafe = UnsafeHelper.getUnsafe();
     final int array_size = 128;
     final int element_size = 4;
     final int magic = 0x12345678;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/TestAgeOutput.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestAgeOutput
+ * @bug 8164936
+ * @summary Check that collectors using age table based aging print an age table even for the first garbage collection
+ * @key gc
+ * @requires vm.gc=="null"
+ * @modules java.base/jdk.internal.misc
+ * @library /test/lib
+ * @build sun.hotspot.WhiteBox
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -XX:+UseSerialGC TestAgeOutput UseSerialGC
+ * @run main/othervm -XX:+UseConcMarkSweepGC TestAgeOutput UseConcMarkSweepGC
+ * @run main/othervm -XX:+UseG1GC TestAgeOutput UseG1GC
+ */
+
+import sun.hotspot.WhiteBox;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jdk.test.lib.Platform;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+import static jdk.test.lib.Asserts.*;
+
+public class TestAgeOutput {
+
+    public static void checkPattern(String pattern, String what) throws Exception {
+        Pattern r = Pattern.compile(pattern);
+        Matcher m = r.matcher(what);
+
+        if (!m.find()) {
+            throw new RuntimeException("Could not find pattern " + pattern + " in output");
+        }
+    }
+
+    public static void runTest(String gcArg) throws Exception {
+        final String[] arguments = {
+            "-Xbootclasspath/a:.",
+            "-XX:+UnlockExperimentalVMOptions",
+            "-XX:+UnlockDiagnosticVMOptions",
+            "-XX:+WhiteBoxAPI",
+            "-XX:+" + gcArg,
+            "-Xmx10M",
+            "-Xlog:gc+age=trace",
+            GCTest.class.getName()
+            };
+
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(arguments);
+        OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+        output.shouldHaveExitValue(0);
+
+        System.out.println(output.getStdout());
+
+        String stdout = output.getStdout();
+
+        checkPattern(".*GC\\(0\\) .*Desired survivor size.*", stdout);
+        checkPattern(".*GC\\(0\\) .*Age table with threshold.*", stdout);
+        checkPattern(".*GC\\(0\\) .*- age   1:.*", stdout);
+    }
+
+    public static void main(String[] args) throws Exception {
+        runTest(args[0]);
+    }
+
+    static class GCTest {
+        private static final WhiteBox WB = WhiteBox.getWhiteBox();
+
+        public static Object holder;
+
+        public static void main(String [] args) {
+            holder = new byte[100];
+            WB.youngGC();
+            System.out.println(holder);
+        }
+    }
+}
+
--- a/hotspot/test/gc/TestCardTablePageCommits.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestCardTablePageCommits.java	Wed Jul 05 22:13:53 2017 +0200
@@ -34,7 +34,6 @@
  * @requires vm.gc.Parallel
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  * @run driver TestCardTablePageCommits
  */
 public class TestCardTablePageCommits {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/TestNumWorkerOutput.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestNumWorkerOutput
+ * @bug 8165292
+ * @summary Check that when PrintGCDetails is enabled, gc,task output is printed only once per collection.
+ * @key gc
+ * @requires vm.gc=="null"
+ * @modules java.base/jdk.internal.misc
+ * @library /test/lib
+ * @build sun.hotspot.WhiteBox
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -XX:+UseConcMarkSweepGC TestNumWorkerOutput UseConcMarkSweepGC
+ * @run main/othervm -XX:+UseG1GC TestNumWorkerOutput UseG1GC
+ */
+
+import sun.hotspot.WhiteBox;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jdk.test.lib.Platform;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+import static jdk.test.lib.Asserts.*;
+
+public class TestNumWorkerOutput {
+
+    public static void checkPatternOnce(String pattern, String what) throws Exception {
+        Pattern r = Pattern.compile(pattern);
+        Matcher m = r.matcher(what);
+
+        if (!m.find()) {
+            throw new RuntimeException("Could not find pattern " + pattern + " in output");
+        }
+        if (m.find()) {
+            throw new RuntimeException("Could find pattern " + pattern + " in output more than once");
+        }
+    }
+
+    public static void runTest(String gcArg) throws Exception {
+        final String[] arguments = {
+            "-Xbootclasspath/a:.",
+            "-XX:+UnlockExperimentalVMOptions",
+            "-XX:+UnlockDiagnosticVMOptions",
+            "-XX:+WhiteBoxAPI",
+            "-XX:+" + gcArg,
+            "-Xmx10M",
+            "-XX:+PrintGCDetails",
+            GCTest.class.getName()
+            };
+
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(arguments);
+        OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+        output.shouldHaveExitValue(0);
+
+        System.out.println(output.getStdout());
+
+        String stdout = output.getStdout();
+
+        checkPatternOnce(".*[info.*].*[gc,task.*].*GC\\(0\\) .*Using \\d+ workers of \\d+ for evacuation.*", stdout);
+    }
+
+    public static void main(String[] args) throws Exception {
+        runTest(args[0]);
+    }
+
+    static class GCTest {
+        private static final WhiteBox WB = WhiteBox.getWhiteBox();
+
+        public static Object holder;
+
+        public static void main(String [] args) {
+            holder = new byte[100];
+            WB.youngGC();
+            System.out.println(holder);
+        }
+    }
+}
+
--- a/hotspot/test/gc/TestObjectAlignment.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestObjectAlignment.java	Wed Jul 05 22:13:53 2017 +0200
@@ -28,7 +28,6 @@
  * @summary G1: Concurrent marking crashes with -XX:ObjectAlignmentInBytes>=32 in 64bit VMs
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=8
  * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=16
  * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32
--- a/hotspot/test/gc/TestSmallHeap.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestSmallHeap.java	Wed Jul 05 22:13:53 2017 +0200
@@ -28,7 +28,6 @@
  * @summary Verify that starting the VM with a small heap works
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- * @modules java.management/sun.management
  * @build sun.hotspot.WhiteBox
  * @run main ClassFileInstaller sun.hotspot.WhiteBox
  * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestSmallHeap
--- a/hotspot/test/gc/TestSoftReferencesBehaviorOnOOME.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestSoftReferencesBehaviorOnOOME.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
  * @summary Tests that all SoftReferences has been cleared at time of OOM.
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  * @run main/othervm -Xmx128m TestSoftReferencesBehaviorOnOOME 512 2k
  * @run main/othervm -Xmx128m TestSoftReferencesBehaviorOnOOME 128k 256k
  * @run main/othervm -Xmx128m TestSoftReferencesBehaviorOnOOME 2k 32k
--- a/hotspot/test/gc/TestVerifyDuringStartup.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestVerifyDuringStartup.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
  * @summary Simple test run with -XX:+VerifyDuringStartup -XX:-UseTLAB to verify 8010463
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  */
 
 import jdk.test.lib.JDKToolFinder;
--- a/hotspot/test/gc/TestVerifySilently.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestVerifySilently.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
  * @summary Test silent verification.
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  */
 
 import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/gc/TestVerifySubSet.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/TestVerifySubSet.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,7 +27,6 @@
  * @summary Test VerifySubSet option
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  */
 
 import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/gc/arguments/TestAlignmentToUseLargePages.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/arguments/TestAlignmentToUseLargePages.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,16 +29,16 @@
  * @key gc
  * @key regression
  * @requires vm.gc=="null"
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:-UseParallelOldGC -XX:+UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:-UseParallelOldGC -XX:-UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:-UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseSerialGC -XX:+UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseSerialGC -XX:-UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseConcMarkSweepGC -XX:+UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseConcMarkSweepGC -XX:-UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseG1GC -XX:+UseLargePages TestAlignmentToUseLargePages
- * @run main/othervm -Xms7M -Xmx9M -XX:+UseG1GC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseParallelGC -XX:-UseParallelOldGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseParallelGC -XX:-UseParallelOldGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseSerialGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseSerialGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseConcMarkSweepGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseConcMarkSweepGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseG1GC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms71M -Xmx91M -XX:+UseG1GC -XX:-UseLargePages TestAlignmentToUseLargePages
  */
 
 public class TestAlignmentToUseLargePages {
--- a/hotspot/test/gc/arguments/TestMaxMinHeapFreeRatioFlags.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/arguments/TestMaxMinHeapFreeRatioFlags.java	Wed Jul 05 22:13:53 2017 +0200
@@ -37,6 +37,7 @@
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 
 public class TestMaxMinHeapFreeRatioFlags {
@@ -133,7 +134,7 @@
      */
     public static class RatioVerifier {
 
-        private static final Unsafe unsafe = Utils.getUnsafe();
+        private static final Unsafe unsafe = UnsafeHelper.getUnsafe();
 
         // Size of byte array that will be allocated
         public static final int CHUNK_SIZE = 1024;
--- a/hotspot/test/gc/arguments/TestTargetSurvivorRatioFlag.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/arguments/TestTargetSurvivorRatioFlag.java	Wed Jul 05 22:13:53 2017 +0200
@@ -46,6 +46,7 @@
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import sun.hotspot.WhiteBox;
 
 /* In order to test that TargetSurvivorRatio affects survivor space occupancy
@@ -248,7 +249,7 @@
     public static class TargetSurvivorRatioVerifier {
 
         static final WhiteBox wb = WhiteBox.getWhiteBox();
-        static final Unsafe unsafe = Utils.getUnsafe();
+        static final Unsafe unsafe = UnsafeHelper.getUnsafe();
 
         // Desired size of memory allocated at once
         public static final int CHUNK_SIZE = 1024;
--- a/hotspot/test/gc/cms/TestBubbleUpRef.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/cms/TestBubbleUpRef.java	Wed Jul 05 22:13:53 2017 +0200
@@ -35,7 +35,7 @@
  *          stays nearly full.
  * @run main/othervm
  *  -XX:+UseConcMarkSweepGC -XX:-CMSYield -XX:-CMSPrecleanRefLists1
- *  -XX:CMSInitiatingOccupancyFraction=0 -Xmx8m TestBubbleUpRef 16000 50 10000
+ *  -XX:CMSInitiatingOccupancyFraction=0 -Xmx80m TestBubbleUpRef 16000 50 10000
  */
 
 /**
@@ -53,7 +53,7 @@
  * Do it again.
  *
  * Use the following VM options
- *     -Xmx8m -XX:-CMSYield [-XX:+UseConcMarkSweepGC] -XX:-CMSPrecleanRefLists1
+ *     -Xmx80m -XX:-CMSYield [-XX:+UseConcMarkSweepGC] -XX:-CMSPrecleanRefLists1
  *      -XX:CMSInitiatingOccupancyFraction=0
  *
  * Use parameter:
--- a/hotspot/test/gc/g1/TestEagerReclaimHumongousRegions.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestEagerReclaimHumongousRegions.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,6 +27,7 @@
  * @summary Test to make sure that eager reclaim of humongous objects work. We simply try to fill
  * up the heap with humongous objects that should be eagerly reclaimable to avoid Full GC.
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestEagerReclaimHumongousRegionsClearMarkBits.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestEagerReclaimHumongousRegionsClearMarkBits.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,6 +27,7 @@
  * @summary Test to make sure that eager reclaim of humongous objects correctly clears
  * mark bitmaps at reclaim.
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestEagerReclaimHumongousRegionsWithRefs.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestEagerReclaimHumongousRegionsWithRefs.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,6 +30,7 @@
  * referencing that we know is in the old gen. After changing this reference, the object
  * should still be eagerly reclaimable to avoid Full GC.
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestG1TraceEagerReclaimHumongousObjects.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestG1TraceEagerReclaimHumongousObjects.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,6 +27,7 @@
  * @summary Ensure that the output for a G1TraceEagerReclaimHumongousObjects
  * includes the expected necessary messages.
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestGCLogMessages.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestGCLogMessages.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,6 +27,7 @@
  * @summary Ensure the output for a minor GC with G1
  * includes the expected necessary messages.
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestHumongousAllocInitialMark.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestHumongousAllocInitialMark.java	Wed Jul 05 22:13:53 2017 +0200
@@ -25,6 +25,7 @@
  * @test TestHumongousAllocInitialMark
  * @bug 7168848
  * @summary G1: humongous object allocations should initiate marking cycles when necessary
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestHumongousAllocNearlyFullRegion.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestHumongousAllocNearlyFullRegion.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @bug 8143587
  * @summary G1: humongous object allocations should work even when there is
  *              not enough space in the heapRegion to fit a filler object.
+ * @requires vm.gc.G1
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
  * @run driver TestHumongousAllocNearlyFullRegion
--- a/hotspot/test/gc/g1/TestHumongousCodeCacheRoots.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestHumongousCodeCacheRoots.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @key regression
  * @key gc
  * @bug 8027756
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestPrintRegionRememberedSetInfo.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestPrintRegionRememberedSetInfo.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @key gc
  * @bug 8014240
  * @summary Test output of G1PrintRegionRememberedSetInfo
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication age threshold
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication during full GC
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationInterned.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationInterned.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication of interned strings
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication print options
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication table rehash
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication table resize
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @summary Test string deduplication during young GC
  * @bug 8029075
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/g1/TestStringSymbolTableStats.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringSymbolTableStats.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @bug 8027476 8027455
  * @summary Ensure that the G1TraceStringSymbolTableScrubbing prints the expected message.
  * @key gc
+ * @requires vm.gc.G1
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
--- a/hotspot/test/gc/serial/HeapChangeLogging.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/serial/HeapChangeLogging.java	Wed Jul 05 22:13:53 2017 +0200
@@ -24,9 +24,9 @@
 /*
  * @test HeapChangeLogging.java
  * @bug 8027440
+ * @requires vm.gc.Serial
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- *          java.management
  * @summary Allocate to get a promotion failure and verify that that heap change logging is present.
  * @run main HeapChangeLogging
  */
--- a/hotspot/test/gc/testlibrary/Helpers.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/gc/testlibrary/Helpers.java	Wed Jul 05 22:13:53 2017 +0200
@@ -32,7 +32,6 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 
 public class Helpers {
 
@@ -124,20 +123,13 @@
      */
     public static String generate(String className, String superClass, String constructor, long fieldCount) {
 
-        StringBuilder builder = new StringBuilder();
-        builder.append(String.format("public class %s%s {\n", className, superClass == null ? ""
-                : " extends " + superClass));
-
-        if (constructor != null) {
-            builder.append(constructor);
-        }
-
-        for (int i = 0; i < fieldCount; ++i) {
-            builder.append(String.format("long f%d;\n", i));
-        }
-
-        builder.append("}\n");
-        return builder.toString();
+        return new StringBuilder()
+                .append(String.format("public class %s%s {\n", className, superClass == null ? ""
+                        : " extends " + superClass))
+                .append(constructor == null ? "" : constructor)
+                .append(fieldsGenerator(fieldCount))
+                .append("}\n")
+                .toString();
     }
 
     /**
@@ -212,50 +204,9 @@
                                                   Path workDir, String prefix)
             throws IOException, ClassNotFoundException {
 
-        if (instanceSize % SIZE_OF_LONG != 0L) {
-            throw new Error(String.format("Test bug: only sizes aligned by 8 bytes are supported and %d was specified",
-                    instanceSize));
-        }
-
-        long instanceSizeWithoutObjectHeader = instanceSize - WhiteBox.getWhiteBox().getObjectSize(new Object());
-
-        int generatedClassesCount;
-        int fieldsInLastClassCount;
-
-        int sizeOfLastFile = (int) (instanceSizeWithoutObjectHeader
-                % (MAXIMUM_AMOUNT_OF_FIELDS_IN_CLASS * SIZE_OF_LONG));
+        generateByTemplateAndCompile(className, null, "public class ${ClassName} extends ${BaseClass} {\n${Fields}}\n",
+                "", instanceSize, workDir, prefix);
 
-        if (sizeOfLastFile != 0) {
-            generatedClassesCount = (int) instanceSizeWithoutObjectHeader
-                    / (MAXIMUM_AMOUNT_OF_FIELDS_IN_CLASS * SIZE_OF_LONG) + 1;
-            fieldsInLastClassCount = sizeOfLastFile / SIZE_OF_LONG;
-        } else {
-            generatedClassesCount = (int) instanceSizeWithoutObjectHeader
-                    / (MAXIMUM_AMOUNT_OF_FIELDS_IN_CLASS * SIZE_OF_LONG);
-            fieldsInLastClassCount = MAXIMUM_AMOUNT_OF_FIELDS_IN_CLASS;
-        }
-
-        for (int i = 0; i < generatedClassesCount; i++) {
-            // for the last generated class we use specified class name
-            String clsName = (i == generatedClassesCount - 1) ? className : prefix + i;
-
-            // If we already have a file with the same name we do not create it again
-            if (Files.notExists(Paths.get(clsName + ".java"))) {
-                Helpers.compileClass(clsName, workDir,
-                        Helpers.generate(
-                                clsName,
-                                // for first generated class we don't have 'extends'
-                                (i == 0 ? null : prefix + (i - 1)),
-                                null,
-                                // for the last generated class we use different field count
-                                (i == generatedClassesCount - 1) ? fieldsInLastClassCount
-                                        : MAXIMUM_AMOUNT_OF_FIELDS_IN_CLASS));
-            } else {
-                System.out.println("Class " + clsName +
-                        ".java already exists, skipping class' generation and compilation");
-            }
-
-        }
         return classLoader.loadClass(className);
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/classfile/test_AltHashing.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+#include "precompiled.hpp"
+#include "classfile/altHashing.hpp"
+#include "unittest.hpp"
+
+// Internal test for alternate hashing.  Translated from JDK version
+// test/sun/misc/Hashing.java
+static const jbyte ONE_BYTE[] = {(jbyte) 0x80};
+static const jbyte TWO_BYTE[] = {(jbyte) 0x80, (jbyte) 0x81};
+static const jchar ONE_CHAR[] = {(jchar) 0x8180};
+static const jbyte THREE_BYTE[] = {(jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82};
+static const jbyte FOUR_BYTE[] = {(jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83};
+static const jchar TWO_CHAR[] = {(jchar) 0x8180, (jchar) 0x8382};
+static const jint ONE_INT[] = {(jint) 0x83828180};
+static const jbyte SIX_BYTE[] = {(jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82, (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85};
+static const jchar THREE_CHAR[] = {(jchar) 0x8180, (jchar) 0x8382, (jchar) 0x8584};
+static const jbyte EIGHT_BYTE[] = {
+  (jbyte) 0x80, (jbyte) 0x81, (jbyte) 0x82,
+  (jbyte) 0x83, (jbyte) 0x84, (jbyte) 0x85,
+  (jbyte) 0x86, (jbyte) 0x87
+};
+static const jchar FOUR_CHAR[] = {
+  (jchar) 0x8180, (jchar) 0x8382,
+  (jchar) 0x8584, (jchar) 0x8786
+};
+
+static const jint TWO_INT[] = {(jint) 0x83828180, (jint) 0x87868584};
+static const juint MURMUR3_32_X86_CHECK_VALUE = 0xB0F57EE3;
+
+class AltHashingTest : public ::testing::Test {
+ public:
+
+  static juint murmur3_32(const int* data, int len) {
+    return AltHashing::murmur3_32(data, len);
+  }
+};
+
+TEST_F(AltHashingTest, murmur3_32_byte_array_test) {
+  jbyte vector[256];
+  jbyte hashes[4 * 256];
+
+  for (int i = 0; i < 256; i++) {
+    vector[i] = (jbyte) i;
+  }
+
+  // Hash subranges {}, {0}, {0,1}, {0,1,2}, ..., {0,...,255}
+  for (int i = 0; i < 256; i++) {
+    juint hash = AltHashing::murmur3_32(256 - i, vector, i);
+    hashes[i * 4] = (jbyte) hash;
+    hashes[i * 4 + 1] = (jbyte) (hash >> 8);
+    hashes[i * 4 + 2] = (jbyte) (hash >> 16);
+    hashes[i * 4 + 3] = (jbyte) (hash >> 24);
+  }
+
+  // hash to get const result.
+  juint final_hash = AltHashing::murmur3_32(0, hashes, 4 * 256);
+
+  ASSERT_EQ(MURMUR3_32_X86_CHECK_VALUE, final_hash)
+          << "Calculated hash result not as expected.";
+}
+
+TEST_F(AltHashingTest, equivalent_hashes_test) {
+  juint jbytes, jchars, ints;
+
+  jbytes = AltHashing::murmur3_32(0, TWO_BYTE, 2);
+  jchars = AltHashing::murmur3_32(0, ONE_CHAR, 1);
+  ASSERT_EQ(jbytes, jchars) << "Hashes did not match.";
+
+  jbytes = AltHashing::murmur3_32(0, FOUR_BYTE, 4);
+  jchars = AltHashing::murmur3_32(0, TWO_CHAR, 2);
+  ints = AltHashingTest::murmur3_32(ONE_INT, 1);
+
+  ASSERT_EQ(jbytes, jchars) << "Hashes did not match.";
+  ASSERT_EQ(jbytes, ints) << "Hashes did not match.";
+
+  jbytes = AltHashing::murmur3_32(0, SIX_BYTE, 6);
+  jchars = AltHashing::murmur3_32(0, THREE_CHAR, 3);
+  ASSERT_EQ(jbytes, jchars) << "Hashes did not match.";
+
+  jbytes = AltHashing::murmur3_32(0, EIGHT_BYTE, 8);
+  jchars = AltHashing::murmur3_32(0, FOUR_CHAR, 4);
+  ints = AltHashingTest::murmur3_32(TWO_INT, 2);
+
+  ASSERT_EQ(jbytes, jchars) << "Hashes did not match.";
+  ASSERT_EQ(jbytes, ints) << "Hashes did not match.";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/gc/g1/test_g1CodeCacheRemSet.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "precompiled.hpp"
+#include "gc/g1/g1CodeRootSetTable.hpp"
+#include "gc/g1/g1CodeCacheRemSet.hpp"
+#include "unittest.hpp"
+
+class G1CodeRootSetTest : public ::testing::Test {
+ public:
+
+  size_t threshold() {
+    return G1CodeRootSet::Threshold;
+  }
+
+  G1CodeRootSetTable* purge_list() {
+    return G1CodeRootSetTable::_purge_list;
+  }
+};
+
+TEST_VM_F(G1CodeRootSetTest, g1_code_cache_rem_set) {
+  G1CodeRootSet root_set;
+
+  ASSERT_TRUE(root_set.is_empty()) << "Code root set must be initially empty "
+          "but is not.";
+
+  ASSERT_EQ(G1CodeRootSet::static_mem_size(), sizeof (void*)) <<
+          "The code root set's static memory usage is incorrect, "
+          << G1CodeRootSet::static_mem_size() << " bytes";
+
+  root_set.add((nmethod*) 1);
+  ASSERT_EQ(root_set.length(), (size_t) 1) << "Added exactly one element, but"
+          " set contains " << root_set.length() << " elements";
+
+  const size_t num_to_add = (size_t) threshold() + 1;
+
+  for (size_t i = 1; i <= num_to_add; i++) {
+    root_set.add((nmethod*) 1);
+  }
+  ASSERT_EQ(root_set.length(), (size_t) 1)
+          << "Duplicate detection should not have increased the set size but "
+          << "is " << root_set.length();
+
+  for (size_t i = 2; i <= num_to_add; i++) {
+    root_set.add((nmethod*) (uintptr_t) (i));
+  }
+
+  ASSERT_EQ(root_set.length(), num_to_add)
+          << "After adding in total " << num_to_add << " distinct code roots, "
+          "they need to be in the set, but there are only " << root_set.length();
+
+  ASSERT_NE(purge_list(), (G1CodeRootSetTable*) NULL)
+          << "should have grown to large hashtable";
+
+  size_t num_popped = 0;
+  for (size_t i = 1; i <= num_to_add; i++) {
+    bool removed = root_set.remove((nmethod*) i);
+    if (removed) {
+      num_popped += 1;
+    } else {
+      break;
+    }
+  }
+  ASSERT_EQ(num_popped, num_to_add)
+          << "Managed to pop " << num_popped << " code roots, but only "
+          << num_to_add << " were added";
+  ASSERT_NE(purge_list(), (G1CodeRootSetTable*) NULL)
+          << "should have grown to large hashtable";
+
+  G1CodeRootSet::purge();
+
+  ASSERT_EQ(purge_list(), (G1CodeRootSetTable*) NULL)
+          << "should have purged old small tables";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/gc/g1/test_g1Predictions.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "gc/g1/g1Predictions.hpp"
+#include "unittest.hpp"
+
+static const double epsilon = 1e-6;
+
+// Some basic formula tests with confidence = 0.0
+TEST_VM(G1Predictions, basic_predictions) {
+  G1Predictions predictor(0.0);
+  TruncatedSeq s;
+
+  double p0 = predictor.get_new_prediction(&s);
+  ASSERT_LT(p0, epsilon) << "Initial prediction of empty sequence must be 0.0";
+
+  s.add(5.0);
+  double p1 = predictor.get_new_prediction(&s);
+  ASSERT_NEAR(p1, 5.0, epsilon);
+
+  for (int i = 0; i < 40; i++) {
+    s.add(5.0);
+  }
+  double p2 = predictor.get_new_prediction(&s);
+  ASSERT_NEAR(p2, 5.0, epsilon);
+}
+
+// The following tests checks that the initial predictions are based on
+// the average of the sequence and not on the stddev (which is 0).
+TEST_VM(G1Predictions, average_not_stdev_predictions) {
+  G1Predictions predictor(0.5);
+  TruncatedSeq s;
+
+  s.add(1.0);
+  double p1 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p1, s.davg()) << "First prediction must be greater than average";
+
+  s.add(1.0);
+  double p2 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p1, p2) << "First prediction must be greater than second";
+
+  s.add(1.0);
+  double p3 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p2, p3) << "Second prediction must be greater than third";
+
+  s.add(1.0);
+  s.add(1.0); // Five elements are now in the sequence.
+  double p4 = predictor.get_new_prediction(&s);
+  ASSERT_LT(p4, p3) << "Fourth prediction must be smaller than third";
+  ASSERT_NEAR(p4, 1.0, epsilon);
+}
+
+// The following tests checks that initially prediction based on
+// the average is used, that gets overridden by the stddev prediction at
+// the end.
+TEST_VM(G1Predictions, average_stdev_predictions) {
+  G1Predictions predictor(0.5);
+  TruncatedSeq s;
+
+  s.add(0.5);
+  double p1 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p1, s.davg()) << "First prediction must be greater than average";
+
+  s.add(0.2);
+  double p2 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p1, p2) << "First prediction must be greater than second";
+
+  s.add(0.5);
+  double p3 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p2, p3) << "Second prediction must be greater than third";
+
+  s.add(0.2);
+  s.add(2.0);
+  double p4 = predictor.get_new_prediction(&s);
+  ASSERT_GT(p4, p3) << "Fourth prediction must be greater than third";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/gc/parallel/test_psAdaptiveSizePolicy.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "utilities/macros.hpp"
+#include "gc/parallel/psAdaptiveSizePolicy.hpp"
+#include "unittest.hpp"
+
+#if INCLUDE_ALL_GCS
+
+  TEST_VM(gc, oldFreeSpaceCalculation) {
+
+    struct TestCase {
+        size_t live;
+        uintx ratio;
+        size_t expectedResult;
+    };
+
+    TestCase test_cases[] = {
+                                {100, 20, 25},
+                                {100, 50, 100},
+                                {100, 60, 150},
+                                {100, 75, 300},
+                                {400, 20, 100},
+                                {400, 50, 400},
+                                {400, 60, 600},
+                                {400, 75, 1200},
+                            };
+
+    size_t array_len = sizeof(test_cases) / sizeof(TestCase);
+    for (size_t i = 0; i < array_len; ++i) {
+      ASSERT_EQ(PSAdaptiveSizePolicy::calculate_free_based_on_live(
+          test_cases[i].live, test_cases[i].ratio),
+          test_cases[i].expectedResult)
+          << " Calculation of free memory failed"
+          << " - Test case " << i << ": live = " << test_cases[i].live
+          << "; ratio = " << test_cases[i].ratio;
+    }
+  }
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/gc/shared/test_memset_with_concurrent_readers.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "precompiled.hpp"
+#include <string.h>
+#include "utilities/globalDefinitions.hpp"
+#include <sstream>
+#include "gc/shared/memset_with_concurrent_readers.hpp"
+#include "unittest.hpp"
+
+#if INCLUDE_ALL_GCS
+
+static unsigned line_byte(const char* line, size_t i) {
+  return unsigned(line[i]) & 0xFF;
+}
+
+TEST(gc, memset_with_concurrent_readers) {
+  const size_t chunk_size = 8 * BytesPerWord;
+  const unsigned chunk_count = 4;
+  const size_t block_size = (chunk_count + 4) * chunk_size;
+  char block[block_size];
+  char clear_block[block_size];
+  char set_block[block_size];
+
+  // block format:
+  // 0: unused leading chunk
+  // 1: chunk written from start index to end of chunk
+  // ... nchunks fully written chunks
+  // N: chunk written from start of chunk to end index
+  // N+1: unused trailing chunk
+
+  const int clear_value = 0;
+  const int set_value = 0xAC;
+
+  memset(clear_block, clear_value, block_size);
+  memset(set_block, set_value, block_size);
+
+  for (unsigned nchunks = 0; nchunks <= chunk_count; ++nchunks) {
+    for (size_t start = 1; start <= chunk_size; ++start) {
+      for (size_t end = 0; end <= chunk_size; ++end) {
+        size_t set_start = chunk_size + start;
+        size_t set_end = (2 + nchunks) * chunk_size + end;
+        size_t set_size = set_end - set_start;
+
+        memset(block, clear_value, block_size);
+        memset_with_concurrent_readers(&block[set_start], set_value, set_size);
+        bool head_clear = !memcmp(clear_block, block, set_start);
+        bool middle_set = !memcmp(set_block, block + set_start, set_size);
+        bool tail_clear = !memcmp(clear_block, block + set_end, block_size - set_end);
+        if (!(head_clear && middle_set && tail_clear)) {
+          std::ostringstream err_stream;
+          err_stream << "*** memset_with_concurrent_readers failed: set start "
+                     << set_start << ", set end " << set_end << std::endl;
+          for (unsigned chunk = 0; chunk < (block_size / chunk_size); ++chunk) {
+            for (unsigned line = 0; line < (chunk_size / BytesPerWord); ++line) {
+
+              const char* lp = &block[chunk * chunk_size + line * BytesPerWord];
+
+              err_stream << std::dec << chunk << "," << line << ": " << std::hex
+                         << std::setw(2) << line_byte(lp, 0) << " "
+                         << std::setw(2) << line_byte(lp, 1) << "  "
+                         << std::setw(2) << line_byte(lp, 2) << " "
+                         << std::setw(2) << line_byte(lp, 3) << "  "
+                         << std::setw(2) << line_byte(lp, 4) << " "
+                         << std::setw(2) << line_byte(lp, 5) << "  "
+                         << std::setw(2) << line_byte(lp, 6) << " "
+                         << std::setw(2) << line_byte(lp, 7) << std::endl;
+            }
+          }
+          EXPECT_TRUE(head_clear) << "leading byte not clear";
+          EXPECT_TRUE(middle_set) << "memset byte not set";
+          EXPECT_TRUE(tail_clear) << "trailing bye not clear";
+          ASSERT_TRUE(head_clear && middle_set && tail_clear) << err_stream.str();
+        }
+      }
+    }
+  }
+}
+#endif
--- a/hotspot/test/native/logging/test_logConfiguration.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/native/logging/test_logConfiguration.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -164,10 +164,17 @@
   // Add TestLogFileName as an output
   set_log_config(TestLogFileName, "logging=info");
 
+  // Add a second file output
+  char other_file_name[2 * K];
+  jio_snprintf(other_file_name, sizeof(other_file_name), "%s-other", TestLogFileName);
+  set_log_config(other_file_name, "logging=info");
+
   LogConfiguration::disable_logging();
 
-  // Verify TestLogFileName was disabled
+  // Verify that both file outputs were disabled
   EXPECT_FALSE(is_described(TestLogFileName));
+  EXPECT_FALSE(is_described(other_file_name));
+  delete_file(other_file_name);
 
   // Verify that no tagset has logging enabled
   for (LogTagSet* ts = LogTagSet::first(); ts != NULL; ts = ts->next()) {
@@ -287,5 +294,44 @@
     const LogDecorators::Decorator decorator = static_cast<LogDecorators::Decorator>(d);
     EXPECT_TRUE(LogConfiguration::parse_log_arguments("#0", "", LogDecorators::name(decorator), "", &ss));
   }
-  EXPECT_STREQ("", ss.as_string()) << "Error reported while parsing: " << ss.as_string();
+}
+
+TEST_F(LogConfigurationTest, parse_invalid_tagset) {
+  static const char* invalid_tagset = "logging+start+exit+safepoint+gc"; // Must not exist for test to function.
+
+  // Make sure warning is produced if one or more configured tagsets are invalid
+  ResourceMark rm;
+  stringStream ss;
+  bool success = LogConfiguration::parse_log_arguments("stdout", invalid_tagset, NULL, NULL, &ss);
+  const char* msg = ss.as_string();
+  EXPECT_TRUE(success) << "Should only cause a warning, not an error";
+  EXPECT_TRUE(string_contains_substring(msg, "No tag set matches selection(s):"));
+  EXPECT_TRUE(string_contains_substring(msg, invalid_tagset));
 }
+
+TEST_F(LogConfigurationTest, output_name_normalization) {
+  const char* patterns[] = { "%s", "file=%s", "\"%s\"", "file=\"%s\"" };
+  char buf[1 * K];
+  for (size_t i = 0; i < ARRAY_SIZE(patterns); i++) {
+    int ret = jio_snprintf(buf, sizeof(buf), patterns[i], TestLogFileName);
+    ASSERT_NE(-1, ret);
+    set_log_config(buf, "logging=trace");
+    EXPECT_TRUE(is_described("#2: "));
+    EXPECT_TRUE(is_described(TestLogFileName));
+    EXPECT_FALSE(is_described("#3: "))
+        << "duplicate file output due to incorrect normalization for pattern: " << patterns[i];
+  }
+
+  // Make sure prefixes are ignored when used within quotes
+  // (this should create a log with "file=" in its filename)
+  int ret = jio_snprintf(buf, sizeof(buf), "\"file=%s\"", TestLogFileName);
+  ASSERT_NE(-1, ret);
+  set_log_config(buf, "logging=trace");
+  EXPECT_TRUE(is_described("#3: ")) << "prefix within quotes not ignored as it should be";
+  set_log_config(buf, "all=off");
+
+  // Remove the extra log file created
+  ret = jio_snprintf(buf, sizeof(buf), "file=%s", TestLogFileName);
+  ASSERT_NE(-1, ret);
+  delete_file(buf);
+}
--- a/hotspot/test/native/logging/test_logDecorations.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/native/logging/test_logDecorations.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -144,7 +144,7 @@
   reported_time.tm_hour = h;
   reported_time.tm_min = m;
   reported_time.tm_sec = s;
-  reported_time.tm_isdst = daylight;
+  reported_time.tm_isdst = -1; // let mktime deduce DST settings
   time_t reported_ts = mktime(&reported_time);
   expected_ts = mktime(localtime(&expected_ts));
   time_t diff = reported_ts - expected_ts;
--- a/hotspot/test/native/logging/test_logFileOutput.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/native/logging/test_logFileOutput.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -29,7 +29,7 @@
 #include "utilities/globalDefinitions.hpp"
 #include "utilities/ostream.hpp"
 
-static const char* name = "testlog.pid%p.%t.log";
+static const char* name = "file=testlog.pid%p.%t.log";
 
 // Test parsing a bunch of valid file output options
 TEST(LogFileOutput, parse_valid) {
--- a/hotspot/test/native/logging/test_logTagLevelExpression.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/native/logging/test_logTagLevelExpression.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -33,7 +33,7 @@
   const char* invalid_substr[] = {
     "=", "+", " ", "+=", "+=*", "*+", " +", "**", "++", ".", ",", ",," ",+",
     " *", "all+", "all*", "+all", "+all=Warning", "==Info", "=InfoWarning",
-    "BadTag+", "logging++", "logging*+", ",=", "gc+gc+gc+gc+gc+gc"
+    "BadTag+", "logging++", "logging*+", ",=", "gc+gc+"
   };
   const char* valid_expression[] = {
     "all", "gc", "gc,logging", "gc+logging", "logging+gc", "logging+gc,gc", "logging+gc*", "gc=trace",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/utilities/test_utf8.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "precompiled.hpp"
+#include "utilities/utf8.hpp"
+#include "unittest.hpp"
+
+TEST(utf8, length) {
+  char res[60];
+  jchar str[20];
+
+  for (int i = 0; i < 20; i++) {
+    str[i] = 0x0800; // char that is 2B in UTF-16 but 3B in UTF-8
+  }
+  str[19] = (jchar) '\0';
+
+  // The resulting string in UTF-8 is 3*19 bytes long, but should be truncated
+  UNICODE::as_utf8(str, 19, res, 10);
+  ASSERT_EQ(strlen(res), (size_t) 9) << "string should be truncated here";
+
+  UNICODE::as_utf8(str, 19, res, 18);
+  ASSERT_EQ(strlen(res), (size_t) 15) << "string should be truncated here";
+
+  UNICODE::as_utf8(str, 19, res, 20);
+  ASSERT_EQ(strlen(res), (size_t) 18) << "string should be truncated here";
+
+  // Test with an "unbounded" buffer
+  UNICODE::as_utf8(str, 19, res, INT_MAX);
+  ASSERT_EQ(strlen(res), (size_t) 3 * 19) << "string should end here";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/ClassFile/BadHelloWorld.jcod	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This file fuzzes the class name #15 to have a leading 'L' and ending ';'.
+ */
+
+class BadHelloWorld {
+  0xCAFEBABE;
+  0; // minor version
+  52; // version
+  [31] { // Constant Pool
+    ; // first element is empty
+    Utf8 "BadHelloWorld"; // #1     at 0x0A
+    class #1; // #2     at 0x1A
+    Utf8 "java/lang/Object"; // #3     at 0x1D
+    class #3; // #4     at 0x30
+    Utf8 "<init>"; // #5     at 0x33
+    Utf8 "()V"; // #6     at 0x3C
+    NameAndType #5 #6; // #7     at 0x42
+    Method #4 #7; // #8     at 0x47
+    Utf8 "toString"; // #9     at 0x4C
+    Utf8 "()Ljava/lang/String;"; // #10     at 0x57
+    Utf8 "Hello, world!"; // #11     at 0x6E
+    String #11; // #12     at 0x7E
+    Utf8 "main"; // #13     at 0x81
+    Utf8 "([Ljava/lang/String;)V"; // #14     at 0x88
+    Utf8 "LBadHelloWorld;"; // #15     at 0xA1
+    class #15; // #16     at 0xB3
+    Method #16 #7; // #17     at 0xB6
+    Utf8 "java/lang/System"; // #18     at 0xBB
+    class #18; // #19     at 0xCE
+    Utf8 "out"; // #20     at 0xD1
+    Utf8 "Ljava/io/PrintStream;"; // #21     at 0xD7
+    NameAndType #20 #21; // #22     at 0xEF
+    Field #19 #22; // #23     at 0xF4
+    Utf8 "java/io/PrintStream"; // #24     at 0xF9
+    class #24; // #25     at 0x010F
+    Utf8 "println"; // #26     at 0x0112
+    Utf8 "(Ljava/lang/Object;)V"; // #27     at 0x011C
+    NameAndType #26 #27; // #28     at 0x0134
+    Method #25 #28; // #29     at 0x0139
+    Utf8 "Code"; // #30     at 0x013E
+  } // Constant Pool
+
+  0x0021; // access
+  #2;// this_cpx
+  #4;// super_cpx
+
+  [0] { // Interfaces
+  } // Interfaces
+
+  [0] { // fields
+  } // fields
+
+  [3] { // methods
+    { // Member at 0x0151
+      0x0001; // access
+      #5; // name_cpx
+      #6; // sig_cpx
+      [1] { // Attributes
+        Attr(#30, 17) { // Code at 0x0159
+          1; // max_stack
+          1; // max_locals
+          Bytes[5]{
+            0x2AB70008B1;
+          };
+          [0] { // Traps
+          } // end Traps
+          [0] { // Attributes
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+    ;
+    { // Member at 0x0170
+      0x0001; // access
+      #9; // name_cpx
+      #10; // sig_cpx
+      [1] { // Attributes
+        Attr(#30, 15) { // Code at 0x0178
+          1; // max_stack
+          1; // max_locals
+          Bytes[3]{
+            0x120CB0;
+          };
+          [0] { // Traps
+          } // end Traps
+          [0] { // Attributes
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+    ;
+    { // Member at 0x018D
+      0x0089; // access
+      #13; // name_cpx
+      #14; // sig_cpx
+      [1] { // Attributes
+        Attr(#30, 28) { // Code at 0x0195
+          2; // max_stack
+          2; // max_locals
+          Bytes[16]{
+            0xBB001059B700114C;
+            0xB200172BB6001DB1;
+          };
+          [0] { // Traps
+          } // end Traps
+          [0] { // Attributes
+          } // Attributes
+        } // end Code
+      } // Attributes
+    } // Member
+  } // methods
+
+  [0] { // Attributes
+  } // Attributes
+} // end class BadHelloWorld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/ClassFile/FormatCheckingTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8148854
+ * @summary Ensure class name loaded by app class loader is format checked by default
+ * @library /test/lib
+ * @compile BadHelloWorld.jcod
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ * @run main FormatCheckingTest
+ */
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+public class FormatCheckingTest {
+    public static void main(String args[]) throws Throwable {
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("BadHelloWorld");
+        OutputAnalyzer output = new OutputAnalyzer(pb.start());
+        output.shouldContain("java.lang.ClassFormatError: Illegal class name");
+        output.shouldHaveExitValue(1);
+    }
+}
--- a/hotspot/test/runtime/ErrorHandling/CreateCoredumpOnCrash.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/ErrorHandling/CreateCoredumpOnCrash.java	Wed Jul 05 22:13:53 2017 +0200
@@ -34,13 +34,13 @@
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.Platform;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 
 public class CreateCoredumpOnCrash {
     private static class Crasher {
         public static void main(String[] args) {
-            Utils.getUnsafe().putInt(0L, 0);
+            UnsafeHelper.getUnsafe().putInt(0L, 0);
         }
     }
 
--- a/hotspot/test/runtime/ErrorHandling/ProblematicFrameTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/ErrorHandling/ProblematicFrameTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -35,14 +35,14 @@
 
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 
 import jdk.internal.misc.Unsafe;
 
 public class ProblematicFrameTest {
     private static class Crasher {
         public static void main(String[] args) {
-            Utils.getUnsafe().getInt(0);
+            UnsafeHelper.getUnsafe().getInt(0);
         }
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/RedefineTests/RedefinePreviousVersions.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8165246
+ * @summary Test has_previous_versions flag and processing during class unloading.
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ * @modules java.compiler
+ *          java.instrument
+ *          jdk.jartool/sun.tools.jar
+ * @run main RedefineClassHelper
+ * @run main/othervm RedefinePreviousVersions test
+ */
+
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class RedefinePreviousVersions {
+
+    public static String newB =
+                "class RedefinePreviousVersions$B {" +
+                "}";
+
+    static class B { }
+
+    public static String newRunning =
+        "class RedefinePreviousVersions$Running {" +
+        "    public static volatile boolean stop = true;" +
+        "    static void localSleep() { }" +
+        "    public static void infinite() { }" +
+        "}";
+
+    static class Running {
+        public static volatile boolean stop = false;
+        static void localSleep() {
+          try{
+            Thread.currentThread().sleep(10);//sleep for 10 ms
+          } catch(InterruptedException ie) {
+          }
+        }
+
+        public static void infinite() {
+            while (!stop) { localSleep(); }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        if (args.length > 0) {
+
+            String jarFile = System.getProperty("test.src") + "/testcase.jar";
+
+            // java -javaagent:redefineagent.jar -Xlog:stuff RedefinePreviousVersions
+            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( "-javaagent:redefineagent.jar",
+               "-Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace",
+               "RedefinePreviousVersions");
+            new OutputAnalyzer(pb.start())
+              .shouldContain("Class unloading: has_previous_versions = false")
+              .shouldContain("Class unloading: has_previous_versions = true")
+              .shouldHaveExitValue(0);
+            return;
+        }
+
+        // Redefine a class and create some garbage
+        // Since there are no methods running, the previous version is never added to the
+        // previous_version_list and the flag _has_previous_versions should stay false
+        RedefineClassHelper.redefineClass(B.class, newB);
+
+        for (int i = 0; i < 10 ; i++) {
+            String s = new String("some garbage");
+            System.gc();
+        }
+
+        // Start a class that has a method running
+        new Thread() {
+            public void run() {
+                Running.infinite();
+            }
+        }.start();
+
+        // Since a method of newRunning is running, this class should be added to the previous_version_list
+        // of Running, and _has_previous_versions should return true at class unloading.
+        RedefineClassHelper.redefineClass(Running.class, newRunning);
+
+        for (int i = 0; i < 10 ; i++) {
+            String s = new String("some garbage");
+            System.gc();
+        }
+
+        // purge should clean everything up, except Xcomp it might not.
+        Running.stop = true;
+
+        for (int i = 0; i < 10 ; i++) {
+            String s = new String("some garbage");
+            System.gc();
+        }
+    }
+}
--- a/hotspot/test/runtime/Unsafe/AllocateInstance.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/AllocateInstance.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,12 +30,12 @@
  * @run main AllocateInstance
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class AllocateInstance {
-    static final Unsafe UNSAFE = Utils.getUnsafe();
+    static final Unsafe UNSAFE = UnsafeHelper.getUnsafe();
 
     class TestClass {
         public boolean calledConstructor = false;
--- a/hotspot/test/runtime/Unsafe/AllocateMemory.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/AllocateMemory.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:MallocMaxTestWords=100m AllocateMemory
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class AllocateMemory {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
 
         // Allocate a byte, write to the location and read back the value
         long address = unsafe.allocateMemory(1);
--- a/hotspot/test/runtime/Unsafe/CopyMemory.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/CopyMemory.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,14 +30,14 @@
  * @run main CopyMemory
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class CopyMemory {
     final static int LENGTH = 8;
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         long src = unsafe.allocateMemory(LENGTH);
         long dst = unsafe.allocateMemory(LENGTH);
         assertNotEquals(src, 0L);
--- a/hotspot/test/runtime/Unsafe/DefineClass.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/DefineClass.java	Wed Jul 05 22:13:53 2017 +0200
@@ -34,13 +34,13 @@
 import java.security.ProtectionDomain;
 import java.io.InputStream;
 import jdk.test.lib.InMemoryJavaCompiler;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class DefineClass {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         TestClassLoader classloader = new TestClassLoader();
         ProtectionDomain pd = new ProtectionDomain(null, null);
 
--- a/hotspot/test/runtime/Unsafe/FieldOffset.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/FieldOffset.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,14 +31,14 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import java.lang.reflect.*;
 import static jdk.test.lib.Asserts.*;
 
 public class FieldOffset {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Field[] fields = Test.class.getDeclaredFields();
 
         for (int i = 0; i < fields.length; i++) {
--- a/hotspot/test/runtime/Unsafe/GetField.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetField.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,14 +30,14 @@
  * @run main GetField
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import java.lang.reflect.*;
 import static jdk.test.lib.Asserts.*;
 
 public class GetField {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         // Unsafe.INVALID_FIELD_OFFSET is a static final int field,
         // make sure getField returns the correct field
         Field field = Unsafe.class.getField("INVALID_FIELD_OFFSET");
--- a/hotspot/test/runtime/Unsafe/GetPutAddress.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutAddress.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import jdk.test.lib.Platform;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutAddress {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         int addressSize = unsafe.addressSize();
         // Ensure the size returned from Unsafe.addressSize is correct
         assertEquals(unsafe.addressSize(), Platform.is32bit() ? 4 : 8);
--- a/hotspot/test/runtime/Unsafe/GetPutBoolean.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutBoolean.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutBoolean {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("b1");
 
--- a/hotspot/test/runtime/Unsafe/GetPutByte.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutByte.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutByte {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("b");
 
--- a/hotspot/test/runtime/Unsafe/GetPutChar.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutChar.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutChar {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("c");
 
--- a/hotspot/test/runtime/Unsafe/GetPutDouble.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutDouble.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutDouble {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("d");
 
--- a/hotspot/test/runtime/Unsafe/GetPutFloat.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutFloat.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutFloat {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("f");
 
--- a/hotspot/test/runtime/Unsafe/GetPutInt.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutInt.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,13 +30,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutInt {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("i");
 
--- a/hotspot/test/runtime/Unsafe/GetPutLong.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutLong.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutLong {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("l");
 
--- a/hotspot/test/runtime/Unsafe/GetPutObject.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutObject.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutObject {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Object o = new Object();
         Field field = Test.class.getField("o");
--- a/hotspot/test/runtime/Unsafe/GetPutShort.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetPutShort.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class GetPutShort {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         Test t = new Test();
         Field field = Test.class.getField("s");
 
--- a/hotspot/test/runtime/Unsafe/GetUncompressedObject.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/GetUncompressedObject.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,13 +30,13 @@
 
 import static jdk.test.lib.Asserts.*;
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 
 public class GetUncompressedObject {
 
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
 
         // Allocate some memory and fill it with non-zero values.
         final int size = 32;
--- a/hotspot/test/runtime/Unsafe/NestedUnsafe.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/NestedUnsafe.java	Wed Jul 05 22:13:53 2017 +0200
@@ -35,7 +35,7 @@
 import java.io.InputStream;
 import java.lang.*;
 import jdk.test.lib.InMemoryJavaCompiler;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
@@ -50,7 +50,7 @@
         " } } ");
 
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
 
         Class klass = unsafe.defineAnonymousClass(NestedUnsafe.class, klassbuf, new Object[0]);
         unsafe.ensureClassInitialized(klass);
--- a/hotspot/test/runtime/Unsafe/PageSize.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/PageSize.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  */
 
 import java.lang.reflect.Field;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class PageSize {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         int pageSize = unsafe.pageSize();
 
         for (int n = 1; n != 0; n <<= 1) {
--- a/hotspot/test/runtime/Unsafe/RangeCheck.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/RangeCheck.java	Wed Jul 05 22:13:53 2017 +0200
@@ -33,7 +33,7 @@
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.Platform;
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 
 import jdk.internal.misc.Unsafe;
 
@@ -60,7 +60,7 @@
 
     public static class DummyClassWithMainRangeCheck {
         public static void main(String args[]) throws Exception {
-            Unsafe unsafe = Utils.getUnsafe();
+            Unsafe unsafe = UnsafeHelper.getUnsafe();
             unsafe.getObject(new DummyClassWithMainRangeCheck(), Short.MAX_VALUE);
         }
     }
--- a/hotspot/test/runtime/Unsafe/Reallocate.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/Reallocate.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,13 +31,13 @@
  * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:MallocMaxTestWords=100m Reallocate
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class Reallocate {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
 
         long address = unsafe.allocateMemory(1);
         assertNotEquals(address, 0L);
--- a/hotspot/test/runtime/Unsafe/SetMemory.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/SetMemory.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,13 +30,13 @@
  * @run main SetMemory
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class SetMemory {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         long address = unsafe.allocateMemory(1);
         assertNotEquals(address, 0L);
         unsafe.setMemory(address, 1, (byte)17);
--- a/hotspot/test/runtime/Unsafe/ThrowException.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/ThrowException.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,13 +30,13 @@
  * @run main ThrowException
  */
 
-import jdk.test.lib.Utils;
+import jdk.test.lib.unsafe.UnsafeHelper;
 import jdk.internal.misc.Unsafe;
 import static jdk.test.lib.Asserts.*;
 
 public class ThrowException {
     public static void main(String args[]) throws Exception {
-        Unsafe unsafe = Utils.getUnsafe();
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
         try {
             unsafe.throwException(new TestException());
         } catch (Throwable t) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/defineAnonClass/DefineAnon.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test DefineAnon
+ * @bug 8058575
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.org.objectweb.asm
+ *          java.management
+ * @compile -XDignore.symbol.file=true DefineAnon.java
+ * @run main/othervm p1.DefineAnon
+ */
+
+package p1;
+
+import jdk.internal.org.objectweb.asm.ClassWriter;
+import jdk.internal.org.objectweb.asm.MethodVisitor;
+import jdk.internal.org.objectweb.asm.Opcodes;
+import sun.misc.Unsafe;
+
+
+class T {
+    static           protected void test0() { System.out.println("test0 (public)"); }
+    static           protected void test1() { System.out.println("test1 (protected)"); }
+    static /*package-private*/ void test2() { System.out.println("test2 (package)"); }
+    static             private void test3() { System.out.println("test3 (private)"); }
+}
+
+public class DefineAnon {
+
+    private static Unsafe getUnsafe() {
+        try {
+            java.lang.reflect.Field singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
+            singleoneInstanceField.setAccessible(true);
+            return (Unsafe) singleoneInstanceField.get(null);
+        } catch (Throwable ex) {
+            throw new RuntimeException("Was unable to get Unsafe instance.");
+        }
+    }
+
+    static Unsafe UNSAFE = DefineAnon.getUnsafe();
+
+    static Class<?> getAnonClass(Class<?> hostClass, final String className) {
+        final String superName = "java/lang/Object";
+        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
+        cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
+
+        MethodVisitor mv = cw.visitMethod(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, "test", "()V", null, null);
+        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "p1/T", "test0", "()V", false);
+        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "p1/T", "test1", "()V", false);
+        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "p1/T", "test2", "()V", false);
+        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "p1/T", "test3", "()V", false);
+        mv.visitInsn(Opcodes.RETURN);
+        mv.visitMaxs(0, 0);
+        mv.visitEnd();
+
+        final byte[] classBytes = cw.toByteArray();
+        Class<?> invokerClass = UNSAFE.defineAnonymousClass(hostClass, classBytes, new Object[0]);
+        UNSAFE.ensureClassInitialized(invokerClass);
+        return invokerClass;
+    }
+
+    public static void main(String[] args) throws Throwable {
+        Throwable fail = null;
+
+        // Anonymous class has the privileges of its host class, so test[0123] should all work.
+        System.out.println("Injecting from the same package (p1):");
+        Class<?> p1cls = getAnonClass(T.class, "p1/AnonClass");
+        try {
+            p1cls.getMethod("test").invoke(null);
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+            fail = ex;  // throw this to make test fail, since subtest failed
+        }
+
+        // Anonymous class has different package name from host class.  Should throw
+        // IllegalArgumentException.
+        System.out.println("Injecting from the wrong package (p2):");
+        try {
+            Class<?> p2cls = getAnonClass(DefineAnon.class, "p2/AnonClass");
+            p2cls.getMethod("test").invoke(null);
+            System.out.println("Failed, did not get expected IllegalArgumentException");
+        } catch (java.lang.IllegalArgumentException e) {
+            if (e.getMessage().contains("Host class p1/DefineAnon and anonymous class p2/AnonClass")) {
+                System.out.println("Got expected IllegalArgumentException: " + e.getMessage());
+            } else {
+                throw new RuntimeException("Unexpected message: " + e.getMessage());
+            }
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+            fail = ex;  // throw this to make test fail, since subtest failed
+        }
+
+        // Inject a class in the unnamed package into p1.T.  It should be able
+        // to access all methods in p1.T.
+        System.out.println("Injecting unnamed package into correct host class:");
+        try {
+            Class<?> p3cls = getAnonClass(T.class, "AnonClass");
+            p3cls.getMethod("test").invoke(null);
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+            fail = ex;  // throw this to make test fail, since subtest failed
+        }
+
+        // Try using an array class as the host class.  This should throw IllegalArgumentException.
+        try {
+            Class<?> p3cls = getAnonClass(String[].class, "AnonClass");
+            throw new RuntimeException("Expected IllegalArgumentException not thrown");
+        } catch (IllegalArgumentException ex) {
+        }
+
+        if (fail != null) throw fail;  // make test fail, since subtest failed
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/defineAnonClass/NestedUnsafe.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8058575
+ * @summary Creates an anonymous class inside of an anonymous class.
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ *          java.compiler
+ *          java.management
+ * @run main p.NestedUnsafe
+ */
+
+package p;
+
+import java.security.ProtectionDomain;
+import java.io.InputStream;
+import java.lang.*;
+import jdk.test.lib.*;
+import jdk.internal.misc.Unsafe;
+import jdk.test.lib.unsafe.UnsafeHelper;
+
+
+// Test that an anonymous class in package 'p' cannot define its own anonymous class
+// in another package.
+public class NestedUnsafe {
+    // The String concatenation should create the nested anonymous class.
+    static byte klassbuf[] = InMemoryJavaCompiler.compile("q.TestClass",
+        "package q; " +
+        "public class TestClass { " +
+        "    public static void concat(String one, String two) throws Throwable { " +
+        "        System.out.println(one + two);" +
+        " } } ");
+
+    public static void main(String args[]) throws Exception {
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
+
+        // The anonymous class calls defineAnonymousClass creating a nested anonymous class.
+        byte klassbuf2[] = InMemoryJavaCompiler.compile("p.TestClass2",
+            "package p; " +
+            "import jdk.internal.misc.Unsafe; " +
+            "public class TestClass2 { " +
+            "    public static void doit() throws Throwable { " +
+            "        Unsafe unsafe = jdk.internal.misc.Unsafe.getUnsafe(); " +
+            "        Class klass2 = unsafe.defineAnonymousClass(TestClass2.class, p.NestedUnsafe.klassbuf, new Object[0]); " +
+            "        unsafe.ensureClassInitialized(klass2); " +
+            "        Class[] dArgs = new Class[2]; " +
+            "        dArgs[0] = String.class; " +
+            "        dArgs[1] = String.class; " +
+            "        try { " +
+            "            klass2.getMethod(\"concat\", dArgs).invoke(null, \"CC\", \"DD\"); " +
+            "        } catch (Throwable ex) { " +
+            "            throw new RuntimeException(\"Exception: \" + ex.toString()); " +
+            "        } " +
+            "} } ",
+            "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED");
+
+        Class klass2 = unsafe.defineAnonymousClass(p.NestedUnsafe.class, klassbuf2, new Object[0]);
+        try {
+            klass2.getMethod("doit").invoke(null);
+            throw new RuntimeException("Expected exception not thrown");
+        } catch (Throwable ex) {
+            Throwable iae = ex.getCause();
+            if (!iae.toString().contains(
+                "IllegalArgumentException: Host class p/NestedUnsafe and anonymous class q/TestClass")) {
+                throw new RuntimeException("Exception: " + iae.toString());
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/defineAnonClass/NestedUnsafe2.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8058575
+ * @summary Creates an anonymous class inside of an anonymous class.
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ *          java.compiler
+ *          java.management
+ * @run main p.NestedUnsafe2
+ */
+
+package p;
+
+import java.security.ProtectionDomain;
+import java.io.InputStream;
+import java.lang.*;
+import jdk.test.lib.*;
+import jdk.internal.misc.Unsafe;
+import jdk.test.lib.unsafe.UnsafeHelper;
+
+
+// Test that an anonymous class that gets put in its host's package cannot define
+// an anonymous class in another package.
+public class NestedUnsafe2 {
+    // The String concatenation should create the nested anonymous class.
+    public static byte klassbuf[] = InMemoryJavaCompiler.compile("q.TestClass",
+        "package q; " +
+        "public class TestClass { " +
+        "    public static void concat(String one, String two) throws Throwable { " +
+        "        System.out.println(one + two);" +
+        " } } ");
+
+    public static void main(String args[]) throws Exception {
+        Unsafe unsafe = UnsafeHelper.getUnsafe();
+
+        // The anonymous class calls defineAnonymousClass creating a nested anonymous class.
+        byte klassbuf2[] = InMemoryJavaCompiler.compile("TestClass2",
+            "import jdk.internal.misc.Unsafe; " +
+            "public class TestClass2 { " +
+            "    public static void doit() throws Throwable { " +
+            "        Unsafe unsafe = jdk.internal.misc.Unsafe.getUnsafe(); " +
+            "        Class klass2 = unsafe.defineAnonymousClass(TestClass2.class, p.NestedUnsafe2.klassbuf, new Object[0]); " +
+            "        unsafe.ensureClassInitialized(klass2); " +
+            "        Class[] dArgs = new Class[2]; " +
+            "        dArgs[0] = String.class; " +
+            "        dArgs[1] = String.class; " +
+            "        try { " +
+            "            klass2.getMethod(\"concat\", dArgs).invoke(null, \"CC\", \"DD\"); " +
+            "        } catch (Throwable ex) { " +
+            "            throw new RuntimeException(\"Exception: \" + ex.toString()); " +
+            "        } " +
+            "} } ",
+            "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED");
+
+        Class klass2 = unsafe.defineAnonymousClass(p.NestedUnsafe2.class, klassbuf2, new Object[0]);
+        try {
+            klass2.getMethod("doit").invoke(null);
+            throw new RuntimeException("Expected exception not thrown");
+        } catch (Throwable ex) {
+            Throwable iae = ex.getCause();
+            if (!iae.toString().contains(
+                "IllegalArgumentException: Host class p/NestedUnsafe2 and anonymous class q/TestClass")) {
+                throw new RuntimeException("Exception: " + iae.toString());
+            }
+        }
+    }
+}
--- a/hotspot/test/runtime/modules/ModuleOptionsWarn.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/runtime/modules/ModuleOptionsWarn.java	Wed Jul 05 22:13:53 2017 +0200
@@ -29,6 +29,7 @@
  * @library /test/lib
  */
 
+import java.util.Map;
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.process.ProcessTools;
 
@@ -37,16 +38,65 @@
 
     public static void main(String[] args) throws Exception {
 
-        // Test that a warning is issued for module related properties that get ignored.
+        // Test that a warning is not issued for extraneous jdk.module properties.
         ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
             "-XX:+PrintWarnings", "-Djdk.module.ignored", "-version");
         OutputAnalyzer output = new OutputAnalyzer(pb.start());
+        output.shouldNotContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property.
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.addmods", "-version");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property ending in '.'.
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.limitmods.", "-version");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property ending in '='.
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.addexports=", "-version");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property ending in ".stuff"
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.addreads.stuff", "-version");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property ending in "=stuff"
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.path=stuff", "-version");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property ending in ".="
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.upgrade.path.=xx", "-version");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for a reserved jdk.module property ending in ".<num>"
+        pb = ProcessTools.createJavaProcessBuilder(
+            "-XX:+PrintWarnings", "-Djdk.module.patch.3=xx", "-version");
+        output = new OutputAnalyzer(pb.start());
         output.shouldContain("Ignoring system property option");
         output.shouldHaveExitValue(0);
 
         // Test that a warning can be suppressed for module related properties that get ignored.
         pb = ProcessTools.createJavaProcessBuilder(
-            "-Djdk.module.ignored", "-XX:-PrintWarnings", "-version");
+            "-Djdk.module.addmods", "-XX:-PrintWarnings", "-version");
         output = new OutputAnalyzer(pb.start());
         output.shouldNotContain("Ignoring system property option");
         output.shouldHaveExitValue(0);
@@ -57,5 +107,13 @@
         output = new OutputAnalyzer(pb.start());
         output.shouldNotContain("Ignoring system property option");
         output.shouldHaveExitValue(0);
+
+        // Test that a warning is issued for module related properties specified using _JAVA_OPTIONS.
+        pb = ProcessTools.createJavaProcessBuilder("-XX:+PrintWarnings", "-version");
+        Map<String, String> env = pb.environment();
+        env.put("_JAVA_OPTIONS", "-Djdk.module.addreads");
+        output = new OutputAnalyzer(pb.start());
+        output.shouldContain("Ignoring system property option");
+        output.shouldHaveExitValue(0);
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.concurrent.CountDownLatch;
+import java.util.Set;
+import java.util.HashSet;
+import static jdk.test.lib.Asserts.assertTrue;
+
+/**
+ * @test
+ * @summary Tests AllModules JDWP command
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ * @compile AllModulesCommandTestDebuggee.java
+ * @run main/othervm AllModulesCommandTest
+ */
+public class AllModulesCommandTest implements DebuggeeLauncher.Listener {
+
+    private DebuggeeLauncher launcher;
+    private JdwpChannel channel;
+    private CountDownLatch jdwpLatch = new CountDownLatch(1);
+    private Set<String> jdwpModuleNames = new HashSet<>();
+    private Set<String> javaModuleNames = new HashSet<>();
+
+    public static void main(String[] args) throws Throwable {
+        new AllModulesCommandTest().doTest();
+    }
+
+    private void doTest() throws Throwable {
+        launcher = new DebuggeeLauncher(this);
+        launcher.launchDebuggee();
+        // Await till the debuggee sends all the necessary modules info to check against
+        // then start the JDWP session
+        jdwpLatch.await();
+        doJdwp();
+    }
+
+    @Override
+    public void onDebuggeeModuleInfo(String modName) {
+        // The debuggee has sent out info about a loaded module
+        javaModuleNames.add(modName);
+    }
+
+    @Override
+    public void onDebuggeeSendingCompleted() {
+        // The debuggee has completed sending all the info
+        // We can start the JDWP session
+        jdwpLatch.countDown();
+    }
+
+    @Override
+    public void onDebuggeeError(String message) {
+        System.err.println("Debuggee error: '" + message + "'");
+        System.exit(1);
+    }
+
+    private void doJdwp() throws Exception {
+        try {
+            // Establish JDWP socket connection
+            channel = new JdwpChannel();
+            channel.connect();
+            // Send out ALLMODULES JDWP command
+            // and verify the reply
+            JdwpAllModulesReply reply = new JdwpAllModulesCmd().send(channel);
+            assertReply(reply);
+            for (int i = 0; i < reply.getModulesCount(); ++i) {
+                long modId = reply.getModuleId(i);
+                // For each module reported by JDWP get its name using the JDWP  NAME command
+                getModuleName(modId);
+                // Assert the JDWP CANREAD and CLASSLOADER commands
+                assertCanRead(modId);
+                assertClassLoader(modId);
+            }
+
+            System.out.println("Module names reported by JDWP: " + Arrays.toString(jdwpModuleNames.toArray()));
+            System.out.println("Module names reported by Java: " + Arrays.toString(javaModuleNames.toArray()));
+
+            // Modules reported by the JDWP should be the same as reported by the Java API
+            if (!jdwpModuleNames.equals(javaModuleNames)) {
+                throw new RuntimeException("Modules info reported by Java API differs from that reported by JDWP.");
+            } else {
+                System.out.println("Test passed!");
+            }
+
+        } finally {
+            launcher.terminateDebuggee();
+            try {
+                new JdwpExitCmd(0).send(channel);
+                channel.disconnect();
+            } catch (Exception x) {
+            }
+        }
+    }
+
+    private void getModuleName(long modId) throws IOException {
+        // Send out the JDWP NAME command and store the reply
+        JdwpModNameReply reply = new JdwpModNameCmd(modId).send(channel);
+        assertReply(reply);
+        String modName = reply.getModuleName();
+        if (modName != null) { // JDWP reports unnamed modules, ignore them
+            jdwpModuleNames.add(modName);
+        }
+    }
+
+    private void assertReply(JdwpReply reply) {
+        // Simple assert for any JDWP reply
+        if (reply.getErrorCode() != 0) {
+            throw new RuntimeException("Unexpected reply error code " + reply.getErrorCode() + " for reply " + reply);
+        }
+    }
+
+    private void assertCanRead(long modId) throws IOException {
+        // Simple assert for the CANREAD command
+        JdwpCanReadReply reply = new JdwpCanReadCmd(modId, modId).send(channel);
+        assertReply(reply);
+        assertTrue(reply.canRead(), "canRead() reports false for reading from the same module");
+    }
+
+    private void assertClassLoader(long modId) throws IOException {
+        // Simple assert for the CLASSLOADER command
+        JdwpClassLoaderReply reply = new JdwpClassLoaderCmd(modId).send(channel);
+        assertReply(reply);
+        long clId = reply.getClassLoaderId();
+        assertTrue(clId >= 0, "bad classloader refId " + clId + " for module id " + modId);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/AllModulesCommandTestDebuggee.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.lang.reflect.Module;
+import java.lang.reflect.Layer;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * The debuggee to be launched by the test
+ * Sends out the info about the loaded modules
+ * then stays to respond to the JDWP commands
+ */
+public class AllModulesCommandTestDebuggee {
+
+    public static void main(String[] args) throws InterruptedException {
+
+        int modCount = Layer.boot().modules().size();
+
+        // Send all modules names via the process output
+        for (Module mod : Layer.boot().modules()) {
+            String info = String.format("module %s", mod.getName());
+            write(info);
+        }
+        // Signal that the sending is done
+        write("ready");
+        Thread.sleep(Long.MAX_VALUE);
+    }
+
+    private static void write(String s) {
+        System.out.println(s);
+        System.out.flush();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/DebuggeeLauncher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.util.StringTokenizer;
+import jdk.test.lib.JDKToolFinder;
+import jdk.test.lib.Utils;
+import static jdk.test.lib.Asserts.assertFalse;
+
+/**
+ * Launches the debuggee with the necessary JDWP options and handles the output
+ */
+public class DebuggeeLauncher implements StreamHandler.Listener {
+
+    public interface Listener {
+
+        /**
+         * Callback to use when a module name is received from the debuggee
+         *
+         * @param modName module name reported by the debuggee
+         */
+        void onDebuggeeModuleInfo(String modName);
+
+        /**
+         * Callback to use when the debuggee completes sending out the info
+         */
+        void onDebuggeeSendingCompleted();
+
+        /**
+         * Callback to handle any debuggee error
+         *
+         * @param line line from the debuggee's stderr
+         */
+        void onDebuggeeError(String line);
+    }
+
+    private static int jdwpPort = -1;
+    private static final String CLS_DIR = System.getProperty("test.classes", "").trim();
+    private static final String DEBUGGEE = "AllModulesCommandTestDebuggee";
+    private Process p;
+    private final Listener listener;
+    private StreamHandler inputHandler;
+    private StreamHandler errorHandler;
+
+    /**
+     * @param listener the listener we report the debuggee events to
+     */
+    public DebuggeeLauncher(Listener listener) {
+        this.listener = listener;
+    }
+
+    /**
+     * Starts the debuggee with the necessary JDWP options and handles the
+     * debuggee's stdout and stderr outputs
+     *
+     * @throws Throwable
+     */
+    public void launchDebuggee() throws Throwable {
+
+        ProcessBuilder pb = new ProcessBuilder(getCommand());
+        p = pb.start();
+        inputHandler = new StreamHandler(p.getInputStream(), this);
+        errorHandler = new StreamHandler(p.getErrorStream(), this);
+        inputHandler.start();
+        errorHandler.start();
+    }
+
+    /**
+     * Command to start the debuggee with the JDWP options and using the JDK
+     * under test
+     *
+     * @return the command
+     */
+    private String[] getCommand() {
+        return new String[]{
+            JDKToolFinder.getTestJDKTool("java"),
+            getJdwpOptions(),
+            "-cp",
+            CLS_DIR,
+            DEBUGGEE
+        };
+    }
+
+    /**
+     * Terminates the debuggee
+     */
+    public void terminateDebuggee() {
+        if (p.isAlive()) {
+            p.destroyForcibly();
+        }
+    }
+
+    /**
+     * Debuggee JDWP options
+     *
+     * @return the JDWP options to start the debuggee with
+     */
+    private static String getJdwpOptions() {
+        return "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=" + getJdwpPort();
+    }
+
+    /**
+     * Find an available port for the JDWP session
+     *
+     * @return JDWP port
+     */
+    public static int getJdwpPort() {
+        if (jdwpPort == -1) {
+            jdwpPort = findFreePort();
+            assertFalse(jdwpPort == -1, "Can not find vailbale port for JDWP");
+        }
+        return jdwpPort;
+    }
+
+    private static int findFreePort() {
+        try (ServerSocket socket = new ServerSocket(0)) {
+            return socket.getLocalPort();
+        } catch (IOException e) {
+        }
+        return -1;
+    }
+
+    @Override
+    public void onStringRead(StreamHandler handler, String line) {
+        if (handler.equals(errorHandler)) {
+            terminateDebuggee();
+            listener.onDebuggeeError(line);
+        } else {
+            processDebuggeeOutput(line);
+        }
+    }
+
+    private void processDebuggeeOutput(String line) {
+        StringTokenizer st = new StringTokenizer(line);
+        String token = st.nextToken();
+        switch (token) {
+            case "module":
+                listener.onDebuggeeModuleInfo(st.nextToken());
+                break;
+            case "ready":
+                listener.onDebuggeeSendingCompleted();
+                break;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpAllModulesCmd.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * The JDWP ALLMODULES command
+ */
+public class JdwpAllModulesCmd extends JdwpCmd<JdwpAllModulesReply> {
+
+    public JdwpAllModulesCmd() {
+        super(22, 1, JdwpAllModulesReply.class, 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpAllModulesReply.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ * The JDWP reply to the ALLMODULES command
+ */
+public class JdwpAllModulesReply extends JdwpReply {
+
+    private int modulesCount;
+    private long[] modulesId;
+
+    protected void parseData(DataInputStream ds) throws IOException {
+        modulesCount = ds.readInt();
+        modulesId = new long[modulesCount];
+        for (int nmod = 0; nmod < modulesCount; ++nmod) {
+            modulesId[nmod] = readRefId(ds);
+        }
+    }
+
+    /**
+     * Number of modules reported
+     *
+     * @return modules count
+     */
+    public int getModulesCount() {
+        return modulesCount;
+    }
+
+    /**
+     * The id of a module reported
+     *
+     * @param ndx module index in the array of the reported ids
+     * @return module id
+     */
+    public long getModuleId(int ndx) {
+        return modulesId[ndx];
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpCanReadCmd.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * The JDWP CANREAD command
+ */
+public class JdwpCanReadCmd extends JdwpCmd<JdwpCanReadReply> {
+
+    public JdwpCanReadCmd(long modId, long srcModId) {
+        super(3, 18, JdwpCanReadReply.class, 2 * refLen());
+        putRefId(modId);
+        putRefId(srcModId);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpCanReadReply.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ * The reply to the JDWP CANREAD command
+ */
+public class JdwpCanReadReply extends JdwpReply {
+
+    private boolean canRead;
+
+    protected void parseData(DataInputStream ds) throws IOException {
+        canRead = ds.read() == 1;
+    }
+
+    public boolean canRead() {
+        return canRead;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpChannel.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import java.util.Arrays;
+
+/**
+ * JDWP socket transport
+ */
+public class JdwpChannel {
+
+    private Socket sock;
+
+    public void connect() throws IOException {
+        sock = new Socket("localhost", DebuggeeLauncher.getJdwpPort());
+        handshake();
+    }
+
+    /**
+     * Sends JDWP handshake and verifies the reply
+     * @throws IOException
+     */
+    private void handshake() throws IOException {
+        final byte[] HANDSHAKE = "JDWP-Handshake".getBytes();
+        sock.getOutputStream().write(HANDSHAKE, 0, HANDSHAKE.length);
+
+        byte[] reply = new byte[14];
+        sock.getInputStream().read(reply, 0, 14);
+        if (!Arrays.equals(HANDSHAKE, reply)) {
+            throw new RuntimeException("Error during handshake. Reply was: " + new String(reply) + " expected " + new String(HANDSHAKE));
+        }
+    }
+
+    public void disconnect() {
+        try {
+            sock.close();
+        } catch (IOException x) {
+        }
+    }
+
+    public void write(byte[] data, int length) throws IOException {
+        sock.getOutputStream().write(data, 0, length);
+    }
+
+    public InputStream getInputStream() throws IOException {
+        return sock.getInputStream();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpClassLoaderCmd.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * The JDWP CLASSLOADER command
+ */
+public class JdwpClassLoaderCmd extends JdwpCmd<JdwpClassLoaderReply> {
+
+    public JdwpClassLoaderCmd(long modId) {
+        super(2, 18, JdwpClassLoaderReply.class, refLen());
+        putRefId(modId);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpClassLoaderReply.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ * The JDWP CLASSLOADER reply
+ */
+public class JdwpClassLoaderReply extends JdwpReply {
+
+    private long refId;
+
+    protected void parseData(DataInputStream ds) throws IOException {
+        refId = readRefId(ds);
+    }
+
+    public long getClassLoaderId() {
+        return refId;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpCmd.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * Generic JDWP command
+ * @param <T> the corresponding JDWP reply class, to construct a reply object
+ */
+public abstract class JdwpCmd<T extends JdwpReply> {
+
+    private ByteBuffer data;
+    private static int id = 1;
+    private final byte FLAGS = 0;
+    private T reply;
+    private final int dataLen;
+    private final int HEADER_LEN = 11;
+
+    /**
+     * JDWWp command
+     * @param cmd command code
+     * @param cmdSet command set
+     * @param replyClz command reply class
+     * @param dataLen length of additional data for the command
+     */
+    JdwpCmd(int cmd, int cmdSet, Class<T> replyClz, int dataLen) {
+        this.dataLen = dataLen;
+        data = ByteBuffer.allocate(HEADER_LEN + dataLen);
+        data.putInt(HEADER_LEN + dataLen);
+        data.putInt(id++);
+        data.put(FLAGS);
+        data.put((byte) cmdSet);
+        data.put((byte) cmd);
+        if (replyClz != null) {
+            try {
+                reply = replyClz.newInstance();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    JdwpCmd(int cmd, int cmdSet, Class<T> replyClz) {
+        this(cmd, cmdSet, replyClz, 0);
+    }
+
+    int getDataLength() {
+        return dataLen;
+    }
+
+    public final T send(JdwpChannel channel) throws IOException {
+        System.err.println("Sending command: " + this);
+        channel.write(data.array(), HEADER_LEN + getDataLength());
+        if (reply != null) {
+            reply.initFromStream(channel.getInputStream());
+        }
+        return (T) reply;
+    }
+
+    protected void putRefId(long refId) {
+        data.putLong(refId);
+    }
+
+    protected void putInt(int val) {
+        data.putInt(val);
+    }
+
+    protected static int refLen() {
+        return 8;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpExitCmd.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * The JDWP EXIT command to terminate the debuggee
+ */
+public class JdwpExitCmd extends JdwpCmd {
+
+    public JdwpExitCmd(int exitCode) {
+        super(10, 1, null, 4);
+        putInt(exitCode);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpModNameCmd.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * The JDWP NAME command
+ */
+public class JdwpModNameCmd extends JdwpCmd<JdwpModNameReply> {
+
+    public JdwpModNameCmd(long modId) {
+        super(1, 18, JdwpModNameReply.class, refLen());
+        putRefId(modId);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpModNameReply.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ * JDWP reply to the NAME command
+ */
+public class JdwpModNameReply extends JdwpReply {
+
+    private byte[] name;
+
+    protected void parseData(DataInputStream ds) throws IOException {
+        name = readJdwpString(ds);
+    }
+
+    public String getModuleName() {
+        return name == null ? null : new String(name);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/JdwpReply.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Generic JDWP reply
+ */
+public abstract class JdwpReply {
+
+    protected final static int HEADER_LEN = 11;
+    private byte[] errCode = new byte[2];
+    private byte[] data;
+
+    public final void initFromStream(InputStream is) throws IOException {
+        DataInputStream ds = new DataInputStream(is);
+
+        int length = ds.readInt();
+        int id = ds.readInt();
+        byte flags = (byte) ds.read();
+
+        ds.read(errCode, 0, 2);
+
+        int dataLength = length - HEADER_LEN;
+        if (dataLength > 0) {
+            data = new byte[dataLength];
+            ds.read(data, 0, dataLength);
+            parseData(new DataInputStream(new ByteArrayInputStream(data)));
+        }
+    }
+
+    protected void parseData(DataInputStream ds) throws IOException {
+    }
+
+    protected byte[] readJdwpString(DataInputStream ds) throws IOException {
+        byte[] str = null;
+        int len = ds.readInt();
+        if (len > 0) {
+            str = new byte[len];
+            ds.read(str, 0, len);
+        }
+        return str;
+    }
+
+    protected long readRefId(DataInputStream ds) throws IOException {
+        return ds.readLong();
+    }
+
+    public int getErrorCode() {
+        return (((errCode[0] & 0xFF) << 8) | (errCode[1] & 0xFF));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jdwp/StreamHandler.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Handles the process output (either stdin or stdout)
+ * passing the lines to a listener
+ */
+public class StreamHandler implements Runnable {
+
+    public interface Listener {
+        /**
+         * Called when a line has been read from the process output stream
+         * @param handler this StreamHandler
+         * @param s the line
+         */
+        void onStringRead(StreamHandler handler, String s);
+    }
+
+    private final ExecutorService executor;
+    private final InputStream is;
+    private final Listener listener;
+
+    /**
+     * @param is input stream to read from
+     * @param listener listener to pass the read lines to
+     * @throws IOException
+     */
+    public StreamHandler(InputStream is, Listener listener) throws IOException {
+        this.is = is;
+        this.listener = listener;
+        executor = Executors.newSingleThreadExecutor();
+    }
+
+    /**
+     * Starts asynchronous reading
+     */
+    public void start() {
+        executor.submit(this);
+    }
+
+    @Override
+    public void run() {
+        try {
+            BufferedReader br = new BufferedReader(new InputStreamReader(is));
+            String line;
+            while ((line = br.readLine()) != null) {
+                listener.onStringRead(this, line);
+            }
+        } catch (Exception x) {
+            throw new RuntimeException(x);
+        }
+    }
+
+}
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSize.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/serviceability/sa/TestInstanceKlassSize.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,6 +23,7 @@
 
 import sun.jvm.hotspot.HotSpotAgent;
 import sun.jvm.hotspot.utilities.SystemDictionaryHelper;
+import sun.jvm.hotspot.oops.InstanceKlass;
 import sun.jvm.hotspot.debugger.*;
 
 import java.util.ArrayList;
@@ -44,15 +45,19 @@
  * @test
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- * @modules jdk.hotspot.agent
- * @modules jdk.hotspot.agent/sun.jvm.hotspot
- * @modules jdk.hotspot.agent/sun.jvm.hotspot.utilities
- * @modules jdk.hotspot.agent/sun.jvm.hotspot.oops
- * @compile -XDignore.symbol.file=true -Xmodule:jdk.hotspot.agent
- *          -XaddExports:java.base/jdk.internal.misc=jdk.hotspot.agent
- *          -XaddExports:java.management/java.lang.management=jdk.hotspot.agent
+ * @compile -XDignore.symbol.file=true
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED
  *          TestInstanceKlassSize.java
- * @run main/othervm  TestInstanceKlassSize
+ * @run main/othervm
+ *          --add-modules=jdk.hotspot.agent
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED
+ *          TestInstanceKlassSize
  */
 
 public class TestInstanceKlassSize {
@@ -112,11 +117,11 @@
                                               " java.lang.Byte",
                                           };
             String[] toolArgs = {
-                "-XX:+UnlockDiagnosticVMOptions",
                 "--add-modules=jdk.hotspot.agent",
                 "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
                 "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
                 "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
+                "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED",
                 "TestInstanceKlassSize",
                 Long.toString(app.getPid())
             };
@@ -136,6 +141,8 @@
                 String jcmdInstanceKlassSize = getJcmdInstanceKlassSize(
                                                       jcmdOutput,
                                                       instanceKlassName);
+                Asserts.assertNotNull(jcmdInstanceKlassSize,
+                    "Could not get the instance klass size from the jcmd output");
                 for (String s : output.asLines()) {
                     if (s.contains(instanceKlassName)) {
                        Asserts.assertTrue(
@@ -165,10 +172,12 @@
         }
 
         for (String SAInstanceKlassName : SAInstanceKlassNames) {
-            Long size = SystemDictionaryHelper.findInstanceKlass(
-                            SAInstanceKlassName).getSize();
+            InstanceKlass ik = SystemDictionaryHelper.findInstanceKlass(
+                               SAInstanceKlassName);
+            Asserts.assertNotNull(ik,
+                String.format("Unable to find instance klass for %s", ik));
             System.out.println("SA: The size of " + SAInstanceKlassName +
-                               " is " + size);
+                               " is " + ik.getSize());
         }
         agent.detach();
     }
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java	Wed Jul 05 22:13:53 2017 +0200
@@ -38,15 +38,20 @@
  * @test
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
- * @modules jdk.hotspot.agent
- * @modules jdk.hotspot.agent/sun.jvm.hotspot
- * @modules jdk.hotspot.agent/sun.jvm.hotspot.utilities
- * @modules jdk.hotspot.agent/sun.jvm.hotspot.oops
- * @compile -XDignore.symbol.file=true -Xmodule:jdk.hotspot.agent
- *          -XaddExports:java.base/jdk.internal.misc=jdk.hotspot.agent
- *          -XaddExports:java.management/java.lang.management=jdk.hotspot.agent
+ * @compile -XDignore.symbol.file=true
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED
  *          TestInstanceKlassSizeForInterface.java
- * @run main/othervm TestInstanceKlassSizeForInterface
+ * @run main/othervm
+ *          -XX:+UnlockDiagnosticVMOptions
+ *          --add-modules=jdk.hotspot.agent
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
+ *          --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED
+ *          TestInstanceKlassSizeForInterface
  */
 
 interface Language {
@@ -80,6 +85,8 @@
         for (String instanceKlassName : instanceKlassNames) {
             InstanceKlass iKlass = SystemDictionaryHelper.findInstanceKlass(
                                        instanceKlassName);
+            Asserts.assertNotNull(iKlass,
+                String.format("Unable to find instance klass for %s", instanceKlassName));
             System.out.println("SA: The size of " + instanceKlassName +
                                " is " + iKlass.getSize());
         }
@@ -106,11 +113,11 @@
 
         // Grab the pid from the current java process and pass it
         String[] toolArgs = {
-            "-XX:+UnlockDiagnosticVMOptions",
             "--add-modules=jdk.hotspot.agent",
             "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
             "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
             "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
+            "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED",
             "TestInstanceKlassSizeForInterface",
             Long.toString(ProcessTools.getProcessId())
         };
@@ -138,6 +145,8 @@
             String jcmdInstanceKlassSize = getJcmdInstanceKlassSize(
                                                       jcmdOutput,
                                                       instanceKlassName);
+            Asserts.assertNotNull(jcmdInstanceKlassSize,
+                "Could not get the instance klass size from the jcmd output");
             for (String s : SAOutput.asLines()) {
                 if (s.contains(instanceKlassName)) {
                    Asserts.assertTrue(
@@ -162,7 +171,7 @@
             return;
         }
 
-        if ( args == null || args.length == 0 ) {
+        if (args == null || args.length == 0) {
             ParselTongue lang = new ParselTongue();
 
             Language ventro = new Language() {
--- a/hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import jdk.test.lib.JDKToolLauncher;
-import jdk.test.lib.process.OutputBuffer;
-import jdk.test.lib.Platform;
-import jdk.test.lib.process.ProcessTools;
-
-import java.io.File;
-
-/*
- * @test
- * @bug 8028623
- * @summary Test hashing of extended characters in Serviceability Agent.
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.compiler
- *          java.management
- *          jdk.jvmstat/sun.jvmstat.monitor
- * @compile -encoding utf8 Test8028623.java
- * @run main/othervm -XX:+UsePerfData Test8028623
- */
-public class Test8028623 {
-
-  public static int \u00CB = 1;
-  public static String dumpFile = "heap.bin";
-
-  public static void main (String[] args) {
-
-    System.out.println(\u00CB);
-
-    try {
-        if (!Platform.shouldSAAttach()) {
-            System.out.println("SA attach not expected to work - test skipped.");
-            return;
-        }
-        long pid = ProcessTools.getProcessId();
-        JDKToolLauncher jmap = JDKToolLauncher.create("jhsdb")
-                                              .addToolArg("jmap")
-                                              .addToolArg("--binaryheap")
-                                              .addToolArg("--pid")
-                                              .addToolArg(Long.toString(pid));
-        ProcessBuilder pb = new ProcessBuilder(jmap.getCommand());
-        OutputBuffer output = ProcessTools.getOutput(pb);
-        Process p = pb.start();
-        int e = p.waitFor();
-        System.out.println("stdout:");
-        System.out.println(output.getStdout());
-        System.out.println("stderr:");
-        System.out.println(output.getStderr());
-
-        if (e != 0) {
-            throw new RuntimeException("jmap returns: " + e);
-        }
-        if (! new File(dumpFile).exists()) {
-            throw new RuntimeException("dump file NOT created: '" + dumpFile + "'");
-        }
-    } catch (Throwable t) {
-        t.printStackTrace();
-        throw new RuntimeException("Test failed with: " + t);
-    }
-  }
-}
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/PathHandler.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/PathHandler.java	Wed Jul 05 22:13:53 2017 +0200
@@ -39,7 +39,7 @@
  * Concrete subclasses should implement method {@link #process()}.
  */
 public abstract class PathHandler {
-    private static final Unsafe UNSAFE = jdk.test.lib.Utils.getUnsafe();
+    private static final Unsafe UNSAFE = jdk.test.lib.unsafe.UnsafeHelper.getUnsafe();
     private static final AtomicLong CLASS_COUNT = new AtomicLong(0L);
     private static volatile boolean CLASSES_LIMIT_REACHED = false;
     private static final Pattern JAR_IN_DIR_PATTERN
--- a/hotspot/test/testlibrary/jittester/Makefile	Thu Sep 15 17:15:55 2016 +0000
+++ b/hotspot/test/testlibrary/jittester/Makefile	Wed Jul 05 22:13:53 2017 +0200
@@ -70,17 +70,17 @@
 DIST_JAR = $(DIST_DIR)/JITtester.jar
 
 SRC_FILES = $(shell find $(SRC_DIR) -name '*.java')
-TESTLIBRARY_SRC_DIR = ../jdk/test/lib
+TESTLIBRARY_SRC_DIR = ../../../../test/lib/jdk/test/lib
 TESTLIBRARY_SRC_FILES = $(TESTLIBRARY_SRC_DIR)/Asserts.java \
                         $(TESTLIBRARY_SRC_DIR)/JDKToolFinder.java \
                         $(TESTLIBRARY_SRC_DIR)/JDKToolLauncher.java \
-                        $(TESTLIBRARY_SRC_DIR)/OutputAnalyzer.java \
-                        $(TESTLIBRARY_SRC_DIR)/OutputBuffer.java \
-                        $(TESTLIBRARY_SRC_DIR)/Pair.java \
                         $(TESTLIBRARY_SRC_DIR)/Platform.java \
-                        $(TESTLIBRARY_SRC_DIR)/ProcessTools.java \
-                        $(TESTLIBRARY_SRC_DIR)/StreamPumper.java \
-                        $(TESTLIBRARY_SRC_DIR)/Utils.java
+                        $(TESTLIBRARY_SRC_DIR)/Utils.java \
+                        $(TESTLIBRARY_SRC_DIR)/process/OutputAnalyzer.java \
+                        $(TESTLIBRARY_SRC_DIR)/process/OutputBuffer.java \
+                        $(TESTLIBRARY_SRC_DIR)/process/ProcessTools.java \
+                        $(TESTLIBRARY_SRC_DIR)/process/StreamPumper.java \
+                        $(TESTLIBRARY_SRC_DIR)/util/Pair.java
 
 .PHONY: cleantmp
 
@@ -120,7 +120,6 @@
 
 copytestlibrary: $(DRIVER_DIR)
 	@cp -r src/jdk/test/lib/jittester/jtreg/*.java $(DRIVER_DIR)
-	@cp -r ../jdk $(TESTBASE_DIR)/
 
 testgroup: $(TESTBASE_DIR)
 	@echo 'jittester_all = \\' > $(TESTGROUP_FILE)
--- a/jdk/.hgtags	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/.hgtags	Wed Jul 05 22:13:53 2017 +0200
@@ -378,3 +378,4 @@
 3cdae27c90b5e41afe75eab904fda19fac076330 jdk-9+133
 803adcd526d74ae0b64948d1f8260c2dbe514779 jdk-9+134
 021369229cfd0b5feb76834b2ea498f47f43c0f3 jdk-9+135
+54c5931849a33a363e03fdffa141503f5cc4779d jdk-9+136
--- a/jdk/make/data/currency/CurrencyData.properties	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/make/data/currency/CurrencyData.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -32,14 +32,14 @@
 # Version of the currency code information in this class.
 # It is a serial number that accompanies with each amendment.
 
-dataVersion=160
+dataVersion=162
 
 # List of all valid ISO 4217 currency codes.
 # To ensure compatibility, do not remove codes.
 
 all=ADP020-AED784-AFA004-AFN971-ALL008-AMD051-ANG532-AOA973-ARS032-ATS040-AUD036-\
     AWG533-AYM945-AZM031-AZN944-BAM977-BBD052-BDT050-BEF056-BGL100-BGN975-BHD048-BIF108-\
-    BMD060-BND096-BOB068-BOV984-BRL986-BSD044-BTN064-BWP072-BYB112-BYR974-\
+    BMD060-BND096-BOB068-BOV984-BRL986-BSD044-BTN064-BWP072-BYB112-BYR974-BYN933-\
     BZD084-CAD124-CDF976-CHE947-CHF756-CHW948-CLF990-CLP152-CNY156-COP170-COU970-CRC188-CSD891-CUP192-CUC931-\
     CVE132-CYP196-CZK203-DEM276-DJF262-DKK208-DOP214-DZD012-EEK233-EGP818-\
     ERN232-ESP724-ETB230-EUR978-FIM246-FJD242-FKP238-FRF250-GBP826-GEL981-\
@@ -119,7 +119,7 @@
 # BARBADOS
 BB=BBD
 # BELARUS
-BY=BYR
+BY=BYN
 # BELGIUM
 BE=EUR
 # BELIZE
--- a/jdk/make/mapfiles/libattach/mapfile-linux	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/make/mapfiles/libattach/mapfile-linux	Wed Jul 05 22:13:53 2017 +0200
@@ -30,8 +30,6 @@
 	    Java_sun_tools_attach_VirtualMachineImpl_checkPermissions;
 	    Java_sun_tools_attach_VirtualMachineImpl_close;
 	    Java_sun_tools_attach_VirtualMachineImpl_connect;
-	    Java_sun_tools_attach_VirtualMachineImpl_getLinuxThreadsManager;
-	    Java_sun_tools_attach_VirtualMachineImpl_isLinuxThreads;
 	    Java_sun_tools_attach_VirtualMachineImpl_open;
 	    Java_sun_tools_attach_VirtualMachineImpl_sendQuitTo;
             Java_sun_tools_attach_VirtualMachineImpl_sendQuitToChildrenOf;
--- a/jdk/make/mapfiles/libjava/mapfile-vers	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/make/mapfiles/libjava/mapfile-vers	Wed Jul 05 22:13:53 2017 +0200
@@ -176,6 +176,9 @@
 		Java_java_lang_ProcessHandleImpl_00024Info_info0;
 		Java_java_lang_ProcessImpl_init;
 		Java_java_lang_ProcessImpl_forkAndExec;
+		Java_java_lang_ref_Reference_getAndClearReferencePendingList;
+		Java_java_lang_ref_Reference_hasReferencePendingList;
+		Java_java_lang_ref_Reference_waitForReferencePendingList;
 		Java_java_lang_reflect_Array_get;
 		Java_java_lang_reflect_Array_getBoolean;
 		Java_java_lang_reflect_Array_getByte;
--- a/jdk/make/mapfiles/libjpeg/mapfile-vers	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/make/mapfiles/libjpeg/mapfile-vers	Wed Jul 05 22:13:53 2017 +0200
@@ -42,6 +42,7 @@
         Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_resetReader;
         Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_disposeReader;
         Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_resetLibraryState;
+        Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_clearNativeReadAbortFlag;
         Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs;
         Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initJPEGImageWriter;
         Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_setDest;
--- a/jdk/src/java.base/aix/native/libnet/aix_close.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/aix/native/libnet/aix_close.c	Wed Jul 05 22:13:53 2017 +0200
@@ -410,6 +410,10 @@
     BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) );
 }
 
+int NET_NonBlockingRead(int s, void* buf, size_t len) {
+    BLOCKING_IO_RETURN_INT(s, recv(s, buf, len, MSG_NONBLOCK));
+}
+
 int NET_ReadV(int s, const struct iovec * vector, int count) {
     BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) );
 }
@@ -503,8 +507,8 @@
  * Auto restarts with adjusted timeout if interrupted by
  * signal other than our wakeup signal.
  */
-int NET_Timeout(int s, long timeout) {
-    long prevtime = 0, newtime;
+int NET_Timeout0(int s, long timeout, long currentTime) {
+    long prevtime = currentTime, newtime;
     struct timeval t;
     fdEntry_t *fdEntry = getFdEntry(s);
 
@@ -516,14 +520,6 @@
         return -1;
     }
 
-    /*
-     * Pick up current time as may need to adjust timeout
-     */
-    if (timeout > 0) {
-        gettimeofday(&t, NULL);
-        prevtime = t.tv_sec * 1000  +  t.tv_usec / 1000;
-    }
-
     for(;;) {
         struct pollfd pfd;
         int rv;
--- a/jdk/src/java.base/linux/native/libnet/linux_close.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/linux/native/libnet/linux_close.c	Wed Jul 05 22:13:53 2017 +0200
@@ -367,6 +367,10 @@
     BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) );
 }
 
+int NET_NonBlockingRead(int s, void* buf, size_t len) {
+    BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, MSG_DONTWAIT) );
+}
+
 int NET_ReadV(int s, const struct iovec * vector, int count) {
     BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) );
 }
@@ -406,8 +410,8 @@
  * Auto restarts with adjusted timeout if interrupted by
  * signal other than our wakeup signal.
  */
-int NET_Timeout(int s, long timeout) {
-    long prevtime = 0, newtime;
+int NET_Timeout0(int s, long timeout, long currentTime) {
+    long prevtime = currentTime, newtime;
     struct timeval t;
     fdEntry_t *fdEntry = getFdEntry(s);
 
@@ -419,14 +423,6 @@
         return -1;
     }
 
-    /*
-     * Pick up current time as may need to adjust timeout
-     */
-    if (timeout > 0) {
-        gettimeofday(&t, NULL);
-        prevtime = t.tv_sec * 1000  +  t.tv_usec / 1000;
-    }
-
     for(;;) {
         struct pollfd pfd;
         int rv;
--- a/jdk/src/java.base/macosx/native/libnet/bsd_close.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/macosx/native/libnet/bsd_close.c	Wed Jul 05 22:13:53 2017 +0200
@@ -371,6 +371,10 @@
     BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) );
 }
 
+int NET_NonBlockingRead(int s, void* buf, size_t len) {
+    BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, MSG_DONTWAIT));
+}
+
 int NET_ReadV(int s, const struct iovec * vector, int count) {
     BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) );
 }
@@ -410,8 +414,8 @@
  * Auto restarts with adjusted timeout if interrupted by
  * signal other than our wakeup signal.
  */
-int NET_Timeout(int s, long timeout) {
-    long prevtime = 0, newtime;
+int NET_Timeout0(int s, long timeout, long currentTime) {
+    long prevtime = currentTime, newtime;
     struct timeval t, *tp = &t;
     fd_set fds;
     fd_set* fdsp = NULL;
@@ -432,9 +436,6 @@
      */
     if (timeout > 0) {
         /* Timed */
-        struct timeval now;
-        gettimeofday(&now, NULL);
-        prevtime = now.tv_sec * 1000  +  now.tv_usec / 1000;
         t.tv_sec = timeout / 1000;
         t.tv_usec = (timeout % 1000) * 1000;
     } else if (timeout < 0) {
--- a/jdk/src/java.base/share/classes/java/lang/ref/Reference.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/ref/Reference.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -110,22 +110,6 @@
     private transient Reference<T> discovered;  /* used by VM */
 
 
-    /* Object used to synchronize with the garbage collector.  The collector
-     * must acquire this lock at the beginning of each collection cycle.  It is
-     * therefore critical that any code holding this lock complete as quickly
-     * as possible, allocate no new objects, and avoid calling user code.
-     */
-    private static class Lock { }
-    private static Lock lock = new Lock();
-
-
-    /* List of References waiting to be enqueued.  The collector adds
-     * References to this list, while the Reference-handler thread removes
-     * them.  This list is protected by the above lock object. The
-     * list uses the discovered field to link its elements.
-     */
-    private static Reference<Object> pending = null;
-
     /* High-priority thread to enqueue pending References
      */
     private static class ReferenceHandler extends Thread {
@@ -139,10 +123,9 @@
         }
 
         static {
-            // pre-load and initialize InterruptedException and Cleaner classes
-            // so that we don't get into trouble later in the run loop if there's
-            // memory shortage while loading/initializing them lazily.
-            ensureClassInitialized(InterruptedException.class);
+            // pre-load and initialize Cleaner class so that we don't
+            // get into trouble later in the run loop if there's
+            // memory shortage while loading/initializing it lazily.
             ensureClassInitialized(Cleaner.class);
         }
 
@@ -152,72 +135,80 @@
 
         public void run() {
             while (true) {
-                tryHandlePending(true);
+                processPendingReferences();
             }
         }
     }
 
-    /**
-     * Try handle pending {@link Reference} if there is one.<p>
-     * Return {@code true} as a hint that there might be another
-     * {@link Reference} pending or {@code false} when there are no more pending
-     * {@link Reference}s at the moment and the program can do some other
-     * useful work instead of looping.
-     *
-     * @param waitForNotify if {@code true} and there was no pending
-     *                      {@link Reference}, wait until notified from VM
-     *                      or interrupted; if {@code false}, return immediately
-     *                      when there is no pending {@link Reference}.
-     * @return {@code true} if there was a {@link Reference} pending and it
-     *         was processed, or we waited for notification and either got it
-     *         or thread was interrupted before being notified;
-     *         {@code false} otherwise.
+    /* Atomically get and clear (set to null) the VM's pending list.
+     */
+    private static native Reference<Object> getAndClearReferencePendingList();
+
+    /* Test whether the VM's pending list contains any entries.
+     */
+    private static native boolean hasReferencePendingList();
+
+    /* Wait until the VM's pending list may be non-null.
      */
-    static boolean tryHandlePending(boolean waitForNotify) {
-        Reference<Object> r;
-        Cleaner c;
-        try {
-            synchronized (lock) {
-                if (pending != null) {
-                    r = pending;
-                    // 'instanceof' might throw OutOfMemoryError sometimes
-                    // so do this before un-linking 'r' from the 'pending' chain...
-                    c = r instanceof Cleaner ? (Cleaner) r : null;
-                    // unlink 'r' from 'pending' chain
-                    pending = r.discovered;
-                    r.discovered = null;
-                } else {
-                    // The waiting on the lock may cause an OutOfMemoryError
-                    // because it may try to allocate exception objects.
-                    if (waitForNotify) {
-                        lock.wait();
-                    }
-                    // retry if waited
-                    return waitForNotify;
+    private static native void waitForReferencePendingList();
+
+    private static final Object processPendingLock = new Object();
+    private static boolean processPendingActive = false;
+
+    private static void processPendingReferences() {
+        // Only the singleton reference processing thread calls
+        // waitForReferencePendingList() and getAndClearReferencePendingList().
+        // These are separate operations to avoid a race with other threads
+        // that are calling waitForReferenceProcessing().
+        waitForReferencePendingList();
+        Reference<Object> pendingList;
+        synchronized (processPendingLock) {
+            pendingList = getAndClearReferencePendingList();
+            processPendingActive = true;
+        }
+        while (pendingList != null) {
+            Reference<Object> ref = pendingList;
+            pendingList = ref.discovered;
+            ref.discovered = null;
+
+            if (ref instanceof Cleaner) {
+                ((Cleaner)ref).clean();
+                // Notify any waiters that progress has been made.
+                // This improves latency for nio.Bits waiters, which
+                // are the only important ones.
+                synchronized (processPendingLock) {
+                    processPendingLock.notifyAll();
                 }
+            } else {
+                ReferenceQueue<? super Object> q = ref.queue;
+                if (q != ReferenceQueue.NULL) q.enqueue(ref);
             }
-        } catch (OutOfMemoryError x) {
-            // Give other threads CPU time so they hopefully drop some live references
-            // and GC reclaims some space.
-            // Also prevent CPU intensive spinning in case 'r instanceof Cleaner' above
-            // persistently throws OOME for some time...
-            Thread.yield();
-            // retry
-            return true;
-        } catch (InterruptedException x) {
-            // retry
-            return true;
+        }
+        // Notify any waiters of completion of current round.
+        synchronized (processPendingLock) {
+            processPendingActive = false;
+            processPendingLock.notifyAll();
         }
+    }
 
-        // Fast path for cleaners
-        if (c != null) {
-            c.clean();
-            return true;
+    // Wait for progress in reference processing.
+    //
+    // Returns true after waiting (for notification from the reference
+    // processing thread) if either (1) the VM has any pending
+    // references, or (2) the reference processing thread is
+    // processing references. Otherwise, returns false immediately.
+    private static boolean waitForReferenceProcessing()
+        throws InterruptedException
+    {
+        synchronized (processPendingLock) {
+            if (processPendingActive || hasReferencePendingList()) {
+                // Wait for progress, not necessarily completion.
+                processPendingLock.wait();
+                return true;
+            } else {
+                return false;
+            }
         }
-
-        ReferenceQueue<? super Object> q = r.queue;
-        if (q != ReferenceQueue.NULL) q.enqueue(r);
-        return true;
     }
 
     static {
@@ -236,8 +227,10 @@
         // provide access in SharedSecrets
         SharedSecrets.setJavaLangRefAccess(new JavaLangRefAccess() {
             @Override
-            public boolean tryHandlePendingReference() {
-                return tryHandlePending(false);
+            public boolean waitForReferenceProcessing()
+                throws InterruptedException
+            {
+                return Reference.waitForReferenceProcessing();
             }
         });
     }
--- a/jdk/src/java.base/share/classes/java/nio/Bits.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/nio/Bits.java	Wed Jul 05 22:13:53 2017 +0200
@@ -131,23 +131,38 @@
         }
 
         final JavaLangRefAccess jlra = SharedSecrets.getJavaLangRefAccess();
-
-        // retry while helping enqueue pending Reference objects
-        // which includes executing pending Cleaner(s) which includes
-        // Cleaner(s) that free direct buffer memory
-        while (jlra.tryHandlePendingReference()) {
-            if (tryReserveMemory(size, cap)) {
-                return;
-            }
-        }
-
-        // trigger VM's Reference processing
-        System.gc();
-
-        // a retry loop with exponential back-off delays
-        // (this gives VM some time to do it's job)
         boolean interrupted = false;
         try {
+
+            // Retry allocation until success or there are no more
+            // references (including Cleaners that might free direct
+            // buffer memory) to process and allocation still fails.
+            boolean refprocActive;
+            do {
+                try {
+                    refprocActive = jlra.waitForReferenceProcessing();
+                } catch (InterruptedException e) {
+                    // Defer interrupts and keep trying.
+                    interrupted = true;
+                    refprocActive = true;
+                }
+                if (tryReserveMemory(size, cap)) {
+                    return;
+                }
+            } while (refprocActive);
+
+            // trigger VM's Reference processing
+            System.gc();
+
+            // A retry loop with exponential back-off delays.
+            // Sometimes it would suffice to give up once reference
+            // processing is complete.  But if there are many threads
+            // competing for memory, this gives more opportunities for
+            // any given thread to make progress.  In particular, this
+            // seems to be enough for a stress test like
+            // DirectBufferAllocTest to (usually) succeed, while
+            // without it that test likely fails.  Since failure here
+            // ends in OOME, there's no need to hurry.
             long sleepTime = 1;
             int sleeps = 0;
             while (true) {
@@ -157,14 +172,14 @@
                 if (sleeps >= MAX_SLEEPS) {
                     break;
                 }
-                if (!jlra.tryHandlePendingReference()) {
-                    try {
+                try {
+                    if (!jlra.waitForReferenceProcessing()) {
                         Thread.sleep(sleepTime);
                         sleepTime <<= 1;
                         sleeps++;
-                    } catch (InterruptedException e) {
-                        interrupted = true;
                     }
+                } catch (InterruptedException e) {
+                    interrupted = true;
                 }
             }
 
--- a/jdk/src/java.base/share/classes/java/util/ListResourceBundle.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/ListResourceBundle.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -206,5 +206,5 @@
         lookup = temp;
     }
 
-    private Map<String,Object> lookup = null;
+    private volatile Map<String,Object> lookup = null;
 }
--- a/jdk/src/java.base/share/classes/java/util/PropertyResourceBundle.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/PropertyResourceBundle.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,8 +46,6 @@
 import java.nio.charset.MalformedInputException;
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.UnmappableCharacterException;
-import java.security.AccessController;
-import java.util.Locale;
 import sun.security.action.GetPropertyAction;
 import sun.util.PropertyResourceBundleCharset;
 import sun.util.ResourceBundleEnumeration;
@@ -236,5 +234,5 @@
 
     // ==================privates====================
 
-    private Map<String,Object> lookup;
+    private final Map<String,Object> lookup;
 }
--- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Wed Jul 05 22:13:53 2017 +0200
@@ -536,19 +536,6 @@
      * @return an ordered {@code Stream} of entries in this jar file
      * @throws IllegalStateException if the jar file has been closed
      * @since 1.8
-     *
-     * @apiNote  A versioned view of the stream obtained from a {@code JarFile}
-     * configured to process a multi-release jar file can be created with code
-     * similar to the following:
-     * <pre>
-     * {@code
-     *     Stream<JarEntry> versionedStream(JarFile jf) {
-     *         return jf.stream().map(JarEntry::getName)
-     *                  .filter(name -> !name.startsWith("META-INF/versions/"))
-     *                  .map(jf::getJarEntry);
-     *     }
-     * }
-     * </pre>
      */
     public Stream<JarEntry> stream() {
         return StreamSupport.stream(Spliterators.spliterator(
@@ -571,7 +558,7 @@
 
     private ZipEntry getVersionedEntry(ZipEntry ze) {
         ZipEntry vze = null;
-        if (BASE_VERSION_MAJOR < versionMajor && !ze.isDirectory()) {
+        if (BASE_VERSION_MAJOR < versionMajor) {
             String name = ze.getName();
             if (!name.startsWith(META_INF)) {
                 vze = searchForVersionedEntry(versionMajor, name);
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangRefAccess.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangRefAccess.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,12 +28,12 @@
 public interface JavaLangRefAccess {
 
     /**
-     * Help ReferenceHandler thread process next pending
-     * {@link java.lang.ref.Reference}
+     * Wait for progress in {@link java.lang.ref.Reference}
+     * processing.  If there aren't any pending {@link
+     * java.lang.ref.Reference}s, return immediately.
      *
-     * @return {@code true} if there was a pending reference and it
-     *         was enqueue-ed or {@code false} if there was no
-     *         pending reference
+     * @return {@code true} if there were any pending
+     * {@link java.lang.ref.Reference}s, {@code false} otherwise.
      */
-    boolean tryHandlePendingReference();
+    boolean waitForReferenceProcessing() throws InterruptedException;
 }
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/Unsafe.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/Unsafe.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1197,6 +1197,9 @@
         if (hostClass == null || data == null) {
             throw new NullPointerException();
         }
+        if (hostClass.isArray() || hostClass.isPrimitive()) {
+            throw new IllegalArgumentException();
+        }
 
         return defineAnonymousClass0(hostClass, data, cpPatches);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/jar/VersionedStream.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.internal.util.jar;
+
+import java.util.Objects;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Stream;
+
+public class VersionedStream {
+    private static final String META_INF_VERSIONS = "META-INF/versions/";
+
+    /**
+     * Returns a stream of versioned entries, derived from the base names of
+     * all entries in a multi-release {@code JarFile} that are present either in
+     * the base directory or in any versioned directory with a version number
+     * less than or equal to the {@code Runtime.Version::major} that the
+     * {@code JarFile} was opened with.  These versioned entries are aliases
+     * for the real entries -- i.e. the names are base names and the content
+     * may come from a versioned directory entry.  If the {@code jarFile} is not
+     * a multi-release jar, a stream of all entries is returned.
+     *
+     * @param jf the input JarFile
+     * @return stream of entries
+     * @since 9
+     */
+    public static Stream<JarEntry> stream(JarFile jf) {
+        if (jf.isMultiRelease()) {
+            int version = jf.getVersion().major();
+            return jf.stream()
+                    .map(je -> getBaseSuffix(je, version))
+                    .filter(Objects::nonNull)
+                    .distinct()
+                    .map(jf::getJarEntry);
+        }
+        return jf.stream();
+    }
+
+    private static String getBaseSuffix(JarEntry je, int version) {
+        String name = je.getName();
+        if (name.startsWith(META_INF_VERSIONS)) {
+            int len = META_INF_VERSIONS.length();
+            int index = name.indexOf('/', len);
+            if (index == -1 || index == (name.length() - 1)) {
+                // filter out META-INF/versions/* and META-INF/versions/*/
+                return null;
+            }
+            try {
+                if (Integer.parseInt(name, len, index, 10) > version) {
+                    // not an integer
+                    return null;
+                }
+            } catch (NumberFormatException x) {
+                // silently remove malformed entries
+                return null;
+            }
+            // We know name looks like META-INF/versions/*/*
+            return name.substring(index + 1);
+        }
+        return name;
+    }
+}
--- a/jdk/src/java.base/share/classes/module-info.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/module-info.java	Wed Jul 05 22:13:53 2017 +0200
@@ -143,7 +143,8 @@
     exports jdk.internal.org.objectweb.asm.signature to
         jdk.scripting.nashorn;
     exports jdk.internal.loader to
-        java.instrument;
+        java.instrument,
+        java.logging;
     exports jdk.internal.math to
         java.desktop;
     exports jdk.internal.module to
--- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -103,34 +103,42 @@
 
 # Translators please note do not translate the options themselves
 java.launcher.X.usage=\
-\    -Xmixed           mixed mode execution (default)\n\
-\    -Xint             interpreted mode execution only\n\
+\    -Xbatch           disable background compilation\n\
 \    -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n\
 \                      append to end of bootstrap class path\n\
+\    -Xcheck:jni       perform additional checks for JNI functions\n\
+\    -Xcomp            forces compilation of methods on first invocation\n\
+\    -Xdebug           provided for backward compatibility\n\
 \    -Xdiag            show additional diagnostic messages\n\
 \    -Xdiag:resolver   show resolver diagnostic messages\n\
-\    -Xnoclassgc       disable class garbage collection\n\
+\    -Xdisable-@files  disable further argument file expansion\n\
+\    -Xfuture          enable strictest checks, anticipating future default\n\
+\    -Xint             interpreted mode execution only\n\
+\    -Xinternalversion\n\
+\                      displays more detailed JVM version information than the\n\
+\                      -version option\n\
 \    -Xloggc:<file>    log GC status to a file with time stamps\n\
-\    -Xbatch           disable background compilation\n\
+\    -Xmixed           mixed mode execution (default)\n\
+\    -Xmn<size>        sets the initial and maximum size (in bytes) of the heap\n\
+\                      for the young generation (nursery)\n\
 \    -Xms<size>        set initial Java heap size\n\
 \    -Xmx<size>        set maximum Java heap size\n\
-\    -Xss<size>        set java thread stack size\n\
+\    -Xnoclassgc       disable class garbage collection\n\
 \    -Xprof            output cpu profiling data\n\
-\    -Xfuture          enable strictest checks, anticipating future default\n\
 \    -Xrs              reduce use of OS signals by Java/VM (see documentation)\n\
-\    -Xcheck:jni       perform additional checks for JNI functions\n\
+\    -Xshare:auto      use shared class data if possible (default)\n\
 \    -Xshare:off       do not attempt to use shared class data\n\
-\    -Xshare:auto      use shared class data if possible (default)\n\
 \    -Xshare:on        require using shared class data, otherwise fail.\n\
 \    -XshowSettings    show all settings and continue\n\
 \    -XshowSettings:all\n\
 \                      show all settings and continue\n\
-\    -XshowSettings:vm show all vm related settings and continue\n\
+\    -XshowSettings:locale\n\
+\                      show all locale related settings and continue\n\
 \    -XshowSettings:properties\n\
 \                      show all property settings and continue\n\
-\    -XshowSettings:locale\n\
-\                      show all locale related settings and continue\n\
-\    -Xdisable-@files  disable further argument file expansion\n\
+\    -XshowSettings:vm show all vm related settings and continue\n\
+\    -Xss<size>        set java thread stack size\n\
+\    -Xverify          sets the mode of the bytecode verifier\n\
 \    --add-reads <module>=<target-module>(,<target-module>)*\n\
 \                      updates <module> to read <target-module>, regardless\n\
 \                      of module declaration. \n\
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java	Wed Jul 05 22:13:53 2017 +0200
@@ -125,7 +125,9 @@
              * to get the jarFile, and set it as our permission.
              */
             if (getUseCaches()) {
+                boolean oldUseCaches = jarFileURLConnection.getUseCaches();
                 jarFileURLConnection = factory.getConnection(jarFile);
+                jarFileURLConnection.setUseCaches(oldUseCaches);
             }
 
             if ((entryName != null)) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSP.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSP.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -125,7 +125,7 @@
                 ("Exception while encoding OCSPRequest", e);
         }
         OCSPResponse ocspResponse = check(Collections.singletonList(certId),
-            responderURI, issuerCert, null, null,
+            responderURI, new OCSPResponse.IssuerInfo(issuerCert), null, null,
             Collections.<Extension>emptyList());
         return (RevocationStatus)ocspResponse.getSingleResponse(certId);
     }
@@ -173,7 +173,8 @@
                 ("Exception while encoding OCSPRequest", e);
         }
         OCSPResponse ocspResponse = check(Collections.singletonList(certId),
-            responderURI, issuerCert, responderCert, date, extensions);
+            responderURI, new OCSPResponse.IssuerInfo(issuerCert),
+            responderCert, date, extensions);
         return (RevocationStatus) ocspResponse.getSingleResponse(certId);
     }
 
@@ -182,7 +183,7 @@
      *
      * @param certIds the CertIds to be checked
      * @param responderURI the URI of the OCSP responder
-     * @param issuerCert the issuer's certificate
+     * @param issuerInfo the issuer's certificate and/or subject and public key
      * @param responderCert the OCSP responder's certificate
      * @param date the time the validity of the OCSP responder's certificate
      *    should be checked against. If null, the current time is used.
@@ -195,8 +196,8 @@
      * @throws CertPathValidatorException if an exception occurs while
      *    encoding the OCSP Request or validating the OCSP Response
      */
-    static OCSPResponse check(List<CertId> certIds, URI responderURI,
-                              X509Certificate issuerCert,
+        static OCSPResponse check(List<CertId> certIds, URI responderURI,
+                              OCSPResponse.IssuerInfo issuerInfo,
                               X509Certificate responderCert, Date date,
                               List<Extension> extensions)
         throws IOException, CertPathValidatorException
@@ -214,7 +215,7 @@
             ocspResponse = new OCSPResponse(response);
 
             // verify the response
-            ocspResponse.verify(certIds, issuerCert, responderCert, date,
+            ocspResponse.verify(certIds, issuerInfo, responderCert, date,
                     nonce);
         } catch (IOException ioe) {
             throw new CertPathValidatorException(
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPResponse.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/OCSPResponse.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import javax.security.auth.x500.X500Principal;
 
@@ -373,8 +374,8 @@
         }
     }
 
-    void verify(List<CertId> certIds, X509Certificate issuerCert,
-                X509Certificate responderCert, Date date, byte[] nonce)
+    void verify(List<CertId> certIds, IssuerInfo issuerInfo,
+            X509Certificate responderCert, Date date, byte[] nonce)
         throws CertPathValidatorException
     {
         switch (responseStatus) {
@@ -414,7 +415,9 @@
             // Add the Issuing CA cert and/or Trusted Responder cert to the list
             // of certs from the OCSP response
             try {
-                certs.add(X509CertImpl.toImpl(issuerCert));
+                if (issuerInfo.getCertificate() != null) {
+                    certs.add(X509CertImpl.toImpl(issuerInfo.getCertificate()));
+                }
                 if (responderCert != null) {
                     certs.add(X509CertImpl.toImpl(responderCert));
                 }
@@ -464,7 +467,10 @@
         // Check whether the signer cert returned by the responder is trusted
         if (signerCert != null) {
             // Check if the response is signed by the issuing CA
-            if (signerCert.equals(issuerCert)) {
+            if (signerCert.getSubjectX500Principal().equals(
+                    issuerInfo.getName()) &&
+                    signerCert.getPublicKey().equals(
+                            issuerInfo.getPublicKey())) {
                 if (debug != null) {
                     debug.println("OCSP response is signed by the target's " +
                         "Issuing CA");
@@ -481,7 +487,7 @@
 
             // Check if the response is signed by an authorized responder
             } else if (signerCert.getIssuerX500Principal().equals(
-                       issuerCert.getSubjectX500Principal())) {
+                    issuerInfo.getName())) {
 
                 // Check for the OCSPSigning key purpose
                 try {
@@ -502,7 +508,8 @@
                 // Check algorithm constraints specified in security property
                 // "jdk.certpath.disabledAlgorithms".
                 AlgorithmChecker algChecker = new AlgorithmChecker(
-                                    new TrustAnchor(issuerCert, null));
+                        new TrustAnchor(issuerInfo.getName(),
+                                issuerInfo.getPublicKey(), null));
                 algChecker.init(false);
                 algChecker.check(signerCert, Collections.<String>emptySet());
 
@@ -540,7 +547,7 @@
 
                 // verify the signature
                 try {
-                    signerCert.verify(issuerCert.getPublicKey());
+                    signerCert.verify(issuerInfo.getPublicKey());
                     if (debug != null) {
                         debug.println("OCSP response is signed by an " +
                             "Authorized Responder");
@@ -971,4 +978,86 @@
             return sb.toString();
         }
     }
+
+    /**
+     * Helper class that allows consumers to pass in issuer information.  This
+     * will always consist of the issuer's name and public key, but may also
+     * contain a certificate if the originating data is in that form.
+     */
+    static final class IssuerInfo {
+        private final X509Certificate certificate;
+        private final X500Principal name;
+        private final PublicKey pubKey;
+
+        IssuerInfo(X509Certificate issuerCert) {
+            certificate = Objects.requireNonNull(issuerCert,
+                    "Constructor requires non-null certificate");
+            name = certificate.getSubjectX500Principal();
+            pubKey = certificate.getPublicKey();
+        }
+
+        IssuerInfo(X500Principal subjectName, PublicKey key) {
+            certificate = null;
+            name = Objects.requireNonNull(subjectName,
+                    "Constructor requires non-null subject");
+            pubKey = Objects.requireNonNull(key,
+                    "Constructor requires non-null public key");
+        }
+
+        IssuerInfo(TrustAnchor anchor) {
+            certificate = anchor.getTrustedCert();
+            if (certificate != null) {
+                name = certificate.getSubjectX500Principal();
+                pubKey = certificate.getPublicKey();
+            } else {
+                name = anchor.getCA();
+                pubKey = anchor.getCAPublicKey();
+            }
+        }
+
+        /**
+         * Get the certificate in this IssuerInfo if present.
+         *
+         * @return the {@code X509Certificate} used to create this IssuerInfo
+         * object, or {@code null} if a certificate was not used in its
+         * creation.
+         */
+        X509Certificate getCertificate() {
+            return certificate;
+        }
+
+        /**
+         * Get the name of this issuer.
+         *
+         * @return an {@code X500Principal} corresponding to this issuer's
+         * name.  If derived from an issuer's {@code X509Certificate} this
+         * would be equivalent to the certificate subject name.
+         */
+        X500Principal getName() {
+            return name;
+        }
+
+        /**
+         * Get the public key for this issuer.
+         *
+         * @return a {@code PublicKey} for this issuer.
+         */
+        PublicKey getPublicKey() {
+            return pubKey;
+        }
+
+        /**
+         * Create a string representation of this IssuerInfo.
+         *
+         * @return a {@code String} form of this IssuerInfo object.
+         */
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("Issuer Info:\n");
+            sb.append("Name: ").append(name.toString()).append("\n");
+            sb.append("Public Key:\n").append(pubKey.toString()).append("\n");
+            return sb.toString();
+        }
+    }
 }
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -61,12 +61,12 @@
     private List<CertStore> certStores;
     private Map<X509Certificate, byte[]> ocspResponses;
     private List<Extension> ocspExtensions;
-    private boolean legacy;
+    private final boolean legacy;
     private LinkedList<CertPathValidatorException> softFailExceptions =
         new LinkedList<>();
 
     // state variables
-    private X509Certificate issuerCert;
+    private OCSPResponse.IssuerInfo issuerInfo;
     private PublicKey prevPubKey;
     private boolean crlSignFlag;
     private int certIndex;
@@ -301,9 +301,9 @@
                 CertPathValidatorException("forward checking not supported");
         }
         if (anchor != null) {
-            issuerCert = anchor.getTrustedCert();
-            prevPubKey = (issuerCert != null) ? issuerCert.getPublicKey()
-                                              : anchor.getCAPublicKey();
+            issuerInfo = new OCSPResponse.IssuerInfo(anchor);
+            prevPubKey = issuerInfo.getPublicKey();
+
         }
         crlSignFlag = true;
         if (params != null && params.certPath() != null) {
@@ -437,7 +437,7 @@
     private void updateState(X509Certificate cert)
         throws CertPathValidatorException
     {
-        issuerCert = cert;
+        issuerInfo = new OCSPResponse.IssuerInfo(cert);
 
         // Make new public key if parameters are missing
         PublicKey pubKey = cert.getPublicKey();
@@ -708,14 +708,8 @@
         OCSPResponse response = null;
         CertId certId = null;
         try {
-            if (issuerCert != null) {
-                certId = new CertId(issuerCert,
-                                    currCert.getSerialNumberObject());
-            } else {
-                // must be an anchor name and key
-                certId = new CertId(anchor.getCA(), anchor.getCAPublicKey(),
-                                    currCert.getSerialNumberObject());
-            }
+            certId = new CertId(issuerInfo.getName(), issuerInfo.getPublicKey(),
+                    currCert.getSerialNumberObject());
 
             // check if there is a cached OCSP response available
             byte[] responseBytes = ocspResponses.get(cert);
@@ -732,8 +726,8 @@
                         nonce = ext.getValue();
                     }
                 }
-                response.verify(Collections.singletonList(certId), issuerCert,
-                                responderCert, params.date(), nonce);
+                response.verify(Collections.singletonList(certId), issuerInfo,
+                        responderCert, params.date(), nonce);
 
             } else {
                 URI responderURI = (this.responderURI != null)
@@ -746,8 +740,8 @@
                 }
 
                 response = OCSP.check(Collections.singletonList(certId),
-                                      responderURI, issuerCert, responderCert,
-                                      null, ocspExtensions);
+                                      responderURI, issuerInfo,
+                                      responderCert, null, ocspExtensions);
             }
         } catch (IOException e) {
             throw new CertPathValidatorException(
--- a/jdk/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -92,6 +92,7 @@
 BTN=BTN
 BWP=BWP
 BYB=BYB
+BYN=BYN
 BYR=BYR
 BZD=BZD
 CAD=CAD
@@ -310,8 +311,9 @@
 bsd=Bahamian Dollar
 btn=Bhutanese Ngultrum
 bwp=Botswanan Pula
-byb=Belarusian New Ruble (1994-1999)
-byr=Belarusian Ruble
+byb=Belarusian Ruble (1994-1999)
+byn=Belarusian Ruble
+byr=Belarusian Ruble (2000-2016)
 bzd=Belize Dollar
 cad=Canadian Dollar
 cdf=Congolese Franc
@@ -399,7 +401,7 @@
 mtl=Maltese Lira
 mur=Mauritian Rupee
 mvr=Maldivian Rufiyaa
-mwk=Malawian Kwacha
+mwk=Malawian Malawi Kwacha
 mxn=Mexican Peso
 mxv=Mexican Investment Unit
 myr=Malaysian Ringgit
@@ -414,7 +416,7 @@
 nzd=New Zealand Dollar
 omr=Omani Rial
 pab=Panamanian Balboa
-pen=Peruvian Nuevo Sol
+pen=Peruvian Sol
 pgk=Papua New Guinean Kina
 php=Philippine Peso
 pkr=Pakistani Rupee
--- a/jdk/src/java.base/share/native/include/jvm.h	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/native/include/jvm.h	Wed Jul 05 22:13:53 2017 +0200
@@ -282,6 +282,18 @@
 JVM_GetSystemPackages(JNIEnv *env);
 
 /*
+ * java.lang.ref.Reference
+ */
+JNIEXPORT jobject JNICALL
+JVM_GetAndClearReferencePendingList(JNIEnv *env);
+
+JNIEXPORT jboolean JNICALL
+JVM_HasReferencePendingList(JNIEnv *env);
+
+JNIEXPORT void JNICALL
+JVM_WaitForReferencePendingList(JNIEnv *env);
+
+/*
  * java.io.ObjectInputStream
  */
 JNIEXPORT jobject JNICALL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/native/libjava/Reference.c	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  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.
+ */
+
+#include "jvm.h"
+#include "java_lang_ref_Reference.h"
+
+JNIEXPORT jobject JNICALL
+Java_java_lang_ref_Reference_getAndClearReferencePendingList(JNIEnv *env, jclass ignore)
+{
+    return JVM_GetAndClearReferencePendingList(env);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_java_lang_ref_Reference_hasReferencePendingList(JNIEnv *env, jclass ignore)
+{
+    return JVM_HasReferencePendingList(env);
+}
+
+JNIEXPORT void JNICALL
+Java_java_lang_ref_Reference_waitForReferencePendingList(JNIEnv *env, jclass ignore)
+{
+    JVM_WaitForReferencePendingList(env);
+}
--- a/jdk/src/java.base/share/native/libjli/java.h	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/share/native/libjli/java.h	Wed Jul 05 22:13:53 2017 +0200
@@ -112,6 +112,9 @@
 jboolean
 GetApplicationHome(char *buf, jint bufsize);
 
+jboolean
+GetApplicationHomeFromDll(char *buf, jint bufsize);
+
 #define GetArch() GetArchPath(CURRENT_DATA_MODEL)
 
 /*
--- a/jdk/src/java.base/solaris/native/libnet/solaris_close.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/solaris/native/libnet/solaris_close.c	Wed Jul 05 22:13:53 2017 +0200
@@ -35,7 +35,7 @@
     if (1) {                                          \
         do {                                          \
             _result = _cmd;                           \
-        } while((_result == -1) && (errno == EINTR)); \
+        } while((_result == -1) && (errno == EINTR));      \
         return _result;                               \
     }                                                 \
 } while(0)
@@ -44,6 +44,10 @@
     RESTARTABLE_RETURN_INT(recv(s, buf, len, 0));
 }
 
+int NET_NonBlockingRead(int s, void* buf, size_t len) {
+    RESTARTABLE_RETURN_INT(recv(s, buf, len, MSG_DONTWAIT));
+}
+
 int NET_RecvFrom(int s, void *buf, int len, unsigned int flags,
                  struct sockaddr *from, socklen_t *fromlen) {
     RESTARTABLE_RETURN_INT(recvfrom(s, buf, len, flags, from, fromlen));
@@ -86,19 +90,14 @@
     RESTARTABLE_RETURN_INT(poll(ufds, nfds, timeout));
 }
 
-int NET_Timeout(int s, long timeout) {
+int NET_Timeout0(int s, long timeout, long currentTime) {
     int result;
     struct timeval t;
-    long prevtime, newtime;
+    long prevtime = currentTime, newtime;
     struct pollfd pfd;
     pfd.fd = s;
     pfd.events = POLLIN;
 
-    if (timeout > 0) {
-        gettimeofday(&t, NULL);
-        prevtime = (t.tv_sec * 1000)  +  t.tv_usec / 1000;
-    }
-
     for(;;) {
         result = poll(&pfd, 1, timeout);
         if (result < 0 && errno == EINTR) {
--- a/jdk/src/java.base/unix/native/libjava/TimeZone_md.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/unix/native/libjava/TimeZone_md.c	Wed Jul 05 22:13:53 2017 +0200
@@ -128,13 +128,20 @@
     char *dbuf = NULL;
     char *tz = NULL;
     int res;
+    long name_max = 0;
 
     dirp = opendir(dir);
     if (dirp == NULL) {
         return NULL;
     }
 
-    entry = (struct dirent64 *) malloc((size_t) pathconf(dir, _PC_NAME_MAX));
+    name_max = pathconf(dir, _PC_NAME_MAX);
+    // If pathconf did not work, fall back to a mimimum buffer size.
+    if (name_max < 1024) {
+        name_max = 1024;
+    }
+
+    entry = (struct dirent64 *)malloc(offsetof(struct dirent64, d_name) + name_max + 1);
     if (entry == NULL) {
         (void) closedir(dirp);
         return NULL;
--- a/jdk/src/java.base/unix/native/libjli/java_md_common.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/unix/native/libjli/java_md_common.c	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,49 @@
 #include "java.h"
 
 /*
- * If app is "/foo/bin/javac", or "/foo/bin/sparcv9/javac" then put
- * "/foo" into buf.
+ * Find the last occurrence of a string
+ */
+char* findLastPathComponent(char *buffer, const char *comp) {
+    char* t = buffer;
+    char* p = NULL;
+    size_t l = JLI_StrLen(comp);
+    t = JLI_StrStr(t, comp);
+
+    while (t != NULL) {
+        p = t;
+        t += l;
+        t = JLI_StrStr(t, comp);
+    }
+    return p;
+}
+
+/*
+ * Removes the trailing file name and any intermediate platform
+ * directories, if any, and its enclosing directory.
+ * Ex: if a buffer contains "/foo/bin/javac" or "/foo/bin/x64/javac", the
+ * truncated resulting buffer will contain "/foo".
+ */
+jboolean
+TruncatePath(char *buf)
+{
+    // try bin directory, maybe an executable
+    char *p = findLastPathComponent(buf, "/bin/");
+    if (p != NULL) {
+        *p = '\0';
+        return JNI_TRUE;
+    }
+    // try lib directory, maybe a library
+    p = findLastPathComponent(buf, "/lib/");
+    if (p != NULL) {
+        *p = '\0';
+        return JNI_TRUE;
+    }
+    return JNI_FALSE;
+}
+
+/*
+ * Retrieves the path to the JRE home by locating the executable file
+ * of the current process and then truncating the path to the executable
  */
 jboolean
 GetApplicationHome(char *buf, jint bufsize)
@@ -38,26 +79,27 @@
     } else {
         return JNI_FALSE;
     }
+    return TruncatePath(buf);
+}
 
-    if (JLI_StrRChr(buf, '/') == 0) {
-        buf[0] = '\0';
-        return JNI_FALSE;
-    }
-    *(JLI_StrRChr(buf, '/')) = '\0';    /* executable file      */
-    if (JLI_StrLen(buf) < 4 || JLI_StrRChr(buf, '/') == 0) {
-        buf[0] = '\0';
-        return JNI_FALSE;
+/*
+ * Retrieves the path to the JRE home by locating the
+ * shared library and then truncating the path to it.
+ */
+jboolean
+GetApplicationHomeFromDll(char *buf, jint bufsize)
+{
+    /* try to find ourselves instead */
+    Dl_info info;
+    if (dladdr((void*)&GetApplicationHomeFromDll, &info) != 0) {
+        char *path = realpath(info.dli_fname, buf);
+        if (path == buf) {
+            return TruncatePath(buf);
+        }
     }
-    if (JLI_StrCmp("/bin", buf + JLI_StrLen(buf) - 4) != 0)
-        *(JLI_StrRChr(buf, '/')) = '\0';        /* sparcv9 or amd64     */
-    if (JLI_StrLen(buf) < 4 || JLI_StrCmp("/bin", buf + JLI_StrLen(buf) - 4) != 0) {
-        buf[0] = '\0';
-        return JNI_FALSE;
-    }
-    *(JLI_StrRChr(buf, '/')) = '\0';    /* bin                  */
+    return JNI_FALSE;
+}
 
-    return JNI_TRUE;
-}
 /*
  * Return true if the named program exists
  */
--- a/jdk/src/java.base/unix/native/libjli/java_md_solinux.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/unix/native/libjli/java_md_solinux.c	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -666,6 +666,7 @@
 GetJREPath(char *path, jint pathsize, const char * arch, jboolean speculative)
 {
     char libjava[MAXPATHLEN];
+    struct stat s;
 
     if (GetApplicationHome(path, pathsize)) {
         /* Is JRE co-located with the application? */
@@ -688,6 +689,14 @@
         }
     }
 
+    if (GetApplicationHomeFromDll(path, pathsize)) {
+        JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/%s/" JAVA_DLL, path, arch);
+        if (stat(libjava, &s) == 0) {
+            JLI_TraceLauncher("JRE path is %s\n", path);
+            return JNI_TRUE;
+        }
+    }
+
     if (!speculative)
       JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL);
     return JNI_FALSE;
--- a/jdk/src/java.base/unix/native/libnet/SocketInputStream.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/unix/native/libnet/SocketInputStream.c	Wed Jul 05 22:13:53 2017 +0200
@@ -35,7 +35,6 @@
 
 #include "java_net_SocketInputStream.h"
 
-
 /************************************************************************
  * SocketInputStream
  */
@@ -52,6 +51,40 @@
     IO_fd_fdID = NET_GetFileDescriptorID(env);
 }
 
+static int NET_ReadWithTimeout(JNIEnv *env, int fd, char *bufP, int len, long timeout) {
+    int result = 0;
+    long prevtime = NET_GetCurrentTime(), newtime;
+    while (timeout > 0) {
+        result = NET_TimeoutWithCurrentTime(fd, timeout, prevtime);
+        if (result <= 0) {
+            if (result == 0) {
+                JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException", "Read timed out");
+            } else if (result == -1) {
+                if (errno == EBADF) {
+                    JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
+                } else if (errno == ENOMEM) {
+                    JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
+                } else {
+                    JNU_ThrowByNameWithMessageAndLastError
+                            (env, JNU_JAVANETPKG "SocketException", "select/poll failed");
+                }
+            }
+            return -1;
+        }
+        result = NET_NonBlockingRead(fd, bufP, len);
+        if (result == -1 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) {
+            newtime = NET_GetCurrentTime();
+            timeout -= newtime - prevtime;
+            if (timeout > 0) {
+                prevtime = newtime;
+            }
+        } else {
+            break;
+        }
+    }
+    return result;
+}
+
 /*
  * Class:     java_net_SocketInputStream
  * Method:    socketRead0
@@ -98,32 +131,18 @@
     } else {
         bufP = BUF;
     }
-
     if (timeout) {
-        nread = NET_Timeout(fd, timeout);
-        if (nread <= 0) {
-            if (nread == 0) {
-                JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException",
-                            "Read timed out");
-            } else if (nread == -1) {
-                if (errno == EBADF) {
-                     JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
-                } else if (errno == ENOMEM) {
-                    JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
-                } else {
-                    JNU_ThrowByNameWithMessageAndLastError
-                        (env, JNU_JAVANETPKG "SocketException", "select/poll failed");
-                }
-            }
+        nread = NET_ReadWithTimeout(env, fd, bufP, len, timeout);
+        if ((*env)->ExceptionCheck(env)) {
             if (bufP != BUF) {
                 free(bufP);
             }
-            return -1;
+            return nread;
         }
+    } else {
+        nread = NET_Read(fd, bufP, len);
     }
 
-    nread = NET_Read(fd, bufP, len);
-
     if (nread <= 0) {
         if (nread < 0) {
 
@@ -143,7 +162,6 @@
                      JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException",
                            "Operation interrupted");
                      break;
-
                 default:
                     JNU_ThrowByNameWithMessageAndLastError
                         (env, JNU_JAVANETPKG "SocketException", "Read failed");
--- a/jdk/src/java.base/unix/native/libnet/net_util_md.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/unix/native/libnet/net_util_md.c	Wed Jul 05 22:13:53 2017 +0200
@@ -33,6 +33,7 @@
 #include <netdb.h>
 #include <stdlib.h>
 #include <dlfcn.h>
+#include <sys/time.h>
 
 #ifndef _ALLBSD_SOURCE
 #include <values.h>
@@ -1669,3 +1670,18 @@
 
     return timeout;
 }
+
+long NET_GetCurrentTime() {
+    struct timeval time;
+    gettimeofday(&time, NULL);
+    return (time.tv_sec * 1000 + time.tv_usec / 1000);
+}
+
+int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime) {
+    return NET_Timeout0(s, timeout, currentTime);
+}
+
+int NET_Timeout(int s, long timeout) {
+    long currentTime = (timeout > 0) ? NET_GetCurrentTime() : 0;
+    return NET_Timeout0(s, timeout, currentTime);
+}
--- a/jdk/src/java.base/unix/native/libnet/net_util_md.h	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/unix/native/libnet/net_util_md.h	Wed Jul 05 22:13:53 2017 +0200
@@ -35,7 +35,11 @@
 #include <sys/poll.h>
 
 int NET_Timeout(int s, long timeout);
+int NET_Timeout0(int s, long timeout, long currentTime);
 int NET_Read(int s, void* buf, size_t len);
+int NET_NonBlockingRead(int s, void* buf, size_t len);
+int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime);
+long NET_GetCurrentTime();
 int NET_RecvFrom(int s, void *buf, int len, unsigned int flags,
                  struct sockaddr *from, socklen_t *fromlen);
 int NET_ReadV(int s, const struct iovec * vector, int count);
--- a/jdk/src/java.base/windows/native/libjli/java_md.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/windows/native/libjli/java_md.c	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -348,7 +348,6 @@
 
     JLI_ReportErrorMessage(JRE_ERROR8 JAVA_DLL);
     return JNI_FALSE;
-
 }
 
 /*
@@ -423,11 +422,11 @@
     *JLI_StrRChr(buf, '\\') = '\0'; /* remove .exe file name */
     if ((cp = JLI_StrRChr(buf, '\\')) == 0) {
         /* This happens if the application is in a drive root, and
-        * there is no bin directory. */
+         * there is no bin directory. */
         buf[0] = '\0';
         return JNI_FALSE;
     }
-    *cp = '\0';  /* remove the bin\ part */
+    *cp = '\0'; /* remove the bin\ part */
     return JNI_TRUE;
 }
 
@@ -449,16 +448,16 @@
 jboolean
 GetApplicationHomeFromDll(char *buf, jint bufsize)
 {
-    HMODULE hModule;
-    DWORD dwFlags =
-        GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
-        GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
+    HMODULE module;
+    DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
+                  GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
 
-    if (GetModuleHandleEx(dwFlags, (LPCSTR)&GetJREPath, &hModule) == 0) {
-        return JNI_FALSE;
-    };
-    GetModuleFileName(hModule, buf, bufsize);
-    return TruncatePath(buf);
+    if (GetModuleHandleEx(flags, (LPCSTR)&GetJREPath, &module) != 0) {
+        if (GetModuleFileName(module, buf, bufsize) != 0) {
+            return TruncatePath(buf);
+        }
+    }
+    return JNI_FALSE;
 }
 
 /*
--- a/jdk/src/java.base/windows/native/libjli/java_md.h	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.base/windows/native/libjli/java_md.h	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,4 @@
 
 int UnsetEnv(char *name);
 
-jboolean
-GetApplicationHomeFromDll(char *buf, jint bufsize);
-
 #endif /* JAVA_MD_H */
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java	Wed Jul 05 22:13:53 2017 +0200
@@ -187,6 +187,7 @@
 
         updateAlwaysOnTopState();
         updateMinimumSize();
+        updateFocusableWindowState();
 
         final Shape shape = getTarget().getShape();
         if (shape != null) {
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Wed Jul 05 22:13:53 2017 +0200
@@ -63,6 +63,7 @@
     private static native void nativeSetNSWindowRepresentedFilename(long nsWindowPtr, String representedFilename);
     private static native void nativeSetEnabled(long nsWindowPtr, boolean isEnabled);
     private static native void nativeSynthesizeMouseEnteredExitedEvents();
+    private static native void nativeSynthesizeMouseEnteredExitedEvents(long nsWindowPtr, int eventType);
     private static native void nativeDispose(long nsWindowPtr);
     private static native void nativeEnterFullScreenMode(long nsWindowPtr);
     private static native void nativeExitFullScreenMode(long nsWindowPtr);
@@ -825,6 +826,13 @@
             return;
         }
 
+        if (blocked) {
+            // We are going to show a modal window. Previously displayed window will be
+            // blocked/disabled. So we have to send mouse exited event to it now, since
+            // all mouse events are discarded for blocked/disabled windows.
+            nativeSynthesizeMouseEnteredExitedEvents(getNSWindowPtr(), CocoaConstants.NSMouseExited);
+        }
+
         nativeSetEnabled(getNSWindowPtr(), !blocked);
         checkBlockingAndOrder();
     }
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m	Wed Jul 05 22:13:53 2017 +0200
@@ -1333,9 +1333,9 @@
 /*
  * Class:     sun_lwawt_macosx_CPlatformWindow
  * Method:    nativeSynthesizeMouseEnteredExitedEvents
- * Signature: (J)V
+ * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMouseEnteredExitedEvents
+JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMouseEnteredExitedEvents__
 (JNIEnv *env, jclass clazz)
 {
     JNF_COCOA_ENTER(env);
@@ -1349,6 +1349,29 @@
 
 /*
  * Class:     sun_lwawt_macosx_CPlatformWindow
+ * Method:    nativeSynthesizeMouseEnteredExitedEvents
+ * Signature: (JI)V
+ */
+JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMouseEnteredExitedEvents__JI
+(JNIEnv *env, jclass clazz, jlong windowPtr, jint eventType)
+{
+JNF_COCOA_ENTER(env);
+
+    if (eventType == NSMouseEntered || eventType == NSMouseExited) {
+        NSWindow *nsWindow = OBJC(windowPtr);
+
+        [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+            [AWTWindow synthesizeMouseEnteredExitedEvents:nsWindow withType:eventType];
+        }];
+    } else {
+        [JNFException raise:env as:kIllegalArgumentException reason:"unknown event type"];
+    }
+    
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class:     sun_lwawt_macosx_CPlatformWindow
  * Method:    _toggleFullScreenMode
  * Signature: (J)V
  */
--- a/jdk/src/java.desktop/share/classes/com/sun/awt/AWTUtilities.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/awt/AWTUtilities.java	Wed Jul 05 22:13:53 2017 +0200
@@ -447,6 +447,7 @@
      * @param shape the new 'mixing-cutout' shape
      * @throws NullPointerException if the component argument is {@code null}
      */
+    @Deprecated(since = "9")
     public static void setComponentMixingCutoutShape(Component component,
             Shape shape)
     {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/bmp/BMPImageReader.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/bmp/BMPImageReader.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -749,6 +749,10 @@
         checkIndex(imageIndex);
         clearAbortRequest();
         processImageStarted(imageIndex);
+        if (abortRequested()) {
+            processReadAborted();
+            return bi;
+        }
 
         if (param == null)
             param = getDefaultReadParam();
@@ -1005,9 +1009,6 @@
             int j = isBottomUp ? (height -1)*bytesPerScanline : 0;
 
             for (int i=0; i<height; i++) {
-                if (abortRequested()) {
-                    break;
-                }
                 iis.readFully(bdata, j, bytesPerScanline);
                 iis.skipBytes(padding);
                 j += isBottomUp ? -bytesPerScanline : bytesPerScanline;
@@ -1015,6 +1016,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F * i/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         } else {
             byte[] buf = new byte[lineLength];
@@ -1051,9 +1055,6 @@
 
             for (int j = 0, y = sourceRegion.y;
                  j < destinationRegion.height; j++, y+=scaleY) {
-
-                if (abortRequested())
-                    break;
                 iis.read(buf, 0, lineLength);
                 for (int i = 0; i < destinationRegion.width; i++) {
                     //get the bit and assign to the data buffer of the raster
@@ -1067,6 +1068,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F*j/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         }
     }
@@ -1087,9 +1091,6 @@
             int j = isBottomUp ? (height -1) * bytesPerScanline : 0;
 
             for (int i=0; i<height; i++) {
-                if (abortRequested()) {
-                    break;
-                }
                 iis.readFully(bdata, j, bytesPerScanline);
                 iis.skipBytes(padding);
                 j += isBottomUp ? -bytesPerScanline : bytesPerScanline;
@@ -1097,6 +1098,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F * i/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         } else {
             byte[] buf = new byte[lineLength];
@@ -1133,9 +1137,6 @@
 
             for (int j = 0, y = sourceRegion.y;
                  j < destinationRegion.height; j++, y+=scaleY) {
-
-                if (abortRequested())
-                    break;
                 iis.read(buf, 0, lineLength);
                 for (int i = 0; i < destinationRegion.width; i++) {
                     //get the bit and assign to the data buffer of the raster
@@ -1149,6 +1150,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F*j/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         }
     }
@@ -1168,9 +1172,6 @@
             int j = isBottomUp ? (height -1) * width : 0;
 
             for (int i=0; i<height; i++) {
-                if (abortRequested()) {
-                    break;
-                }
                 iis.readFully(bdata, j, width);
                 iis.skipBytes(padding);
                 j += isBottomUp ? -width : width;
@@ -1178,6 +1179,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F * i/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         } else {
             byte[] buf = new byte[lineLength];
@@ -1200,9 +1204,6 @@
 
             for (int j = 0, y = sourceRegion.y;
                  j < destinationRegion.height; j++, y+=scaleY) {
-
-                if (abortRequested())
-                    break;
                 iis.read(buf, 0, lineLength);
                 for (int i = 0, m = sourceRegion.x;
                      i < destinationRegion.width; i++, m += scaleX) {
@@ -1216,6 +1217,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F*j/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         }
     }
@@ -1235,9 +1239,6 @@
             int j = isBottomUp ? (height -1) * width * 3 : 0;
 
             for (int i=0; i<height; i++) {
-                if (abortRequested()) {
-                    break;
-                }
                 iis.readFully(bdata, j, lineStride);
                 iis.skipBytes(padding);
                 j += isBottomUp ? -lineStride : lineStride;
@@ -1245,6 +1246,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F * i/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         } else {
             byte[] buf = new byte[lineLength];
@@ -1267,9 +1271,6 @@
 
             for (int j = 0, y = sourceRegion.y;
                  j < destinationRegion.height; j++, y+=scaleY) {
-
-                if (abortRequested())
-                    break;
                 iis.read(buf, 0, lineLength);
                 for (int i = 0, m = 3 * sourceRegion.x;
                      i < destinationRegion.width; i++, m += 3 * scaleX) {
@@ -1285,6 +1286,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F*j/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         }
     }
@@ -1302,10 +1306,6 @@
         if (noTransform) {
             int j = isBottomUp ? (height -1) * width : 0;
             for (int i=0; i<height; i++) {
-                if (abortRequested()) {
-                    break;
-                }
-
                 iis.readFully(sdata, j, width);
                 iis.skipBytes(padding);
 
@@ -1314,6 +1314,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F * i/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         } else {
             short[] buf = new short[lineLength];
@@ -1336,9 +1339,6 @@
 
             for (int j = 0, y = sourceRegion.y;
                  j < destinationRegion.height; j++, y+=scaleY) {
-
-                if (abortRequested())
-                    break;
                 iis.readFully(buf, 0, lineLength);
                 for (int i = 0, m = sourceRegion.x;
                      i < destinationRegion.width; i++, m += scaleX) {
@@ -1352,6 +1352,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F*j/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         }
     }
@@ -1361,15 +1364,15 @@
             int j = isBottomUp ? (height -1) * width : 0;
 
             for (int i=0; i<height; i++) {
-                if (abortRequested()) {
-                    break;
-                }
                 iis.readFully(idata, j, width);
                 j += isBottomUp ? -width : width;
                 processImageUpdate(bi, 0, i,
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F * i/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         } else {
             int[] buf = new int[width];
@@ -1392,9 +1395,6 @@
 
             for (int j = 0, y = sourceRegion.y;
                  j < destinationRegion.height; j++, y+=scaleY) {
-
-                if (abortRequested())
-                    break;
                 iis.readFully(buf, 0, width);
                 for (int i = 0, m = sourceRegion.x;
                      i < destinationRegion.width; i++, m += scaleX) {
@@ -1408,6 +1408,9 @@
                                    destinationRegion.width, 1, 1, 1,
                                    new int[]{0});
                 processImageProgress(100.0F*j/destinationRegion.height);
+                if (abortRequested()) {
+                    break;
+                }
             }
         }
     }
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -456,6 +456,9 @@
                 // Update IIOReadProgressListeners
                 ++rowsDone;
                 processImageProgress(100.0F*rowsDone/height);
+                if (abortRequested()) {
+                    return;
+                }
 
                 if (decodeThisRow) {
                     outputRow();
@@ -860,7 +863,6 @@
             throw new IndexOutOfBoundsException("imageIndex out of bounds!");
         }
 
-        clearAbortRequest();
         readMetadata();
 
         // A null ImageReadParam means we use the default
@@ -903,8 +905,13 @@
             (streamY - sourceRegion.y)/sourceYSubsampling;
         computeDecodeThisRow();
 
+        clearAbortRequest();
         // Inform IIOReadProgressListeners of start of image
         processImageStarted(imageIndex);
+        if (abortRequested()) {
+            processReadAborted();
+            return theImage;
+        }
         startPass(0);
 
         this.rowBuf = new byte[width];
@@ -947,7 +954,7 @@
             int codeSize = initCodeSize + 1;
             int codeMask = (1 << codeSize) - 1;
 
-            while (!abortRequested()) {
+            do {
                 code = getCode(codeSize, codeMask);
 
                 if (code == clearCode) {
@@ -1005,7 +1012,7 @@
 
                 outputPixels(string, len);
                 oldCode = code;
-            }
+            } while (!abortRequested());
 
             processReadAborted();
             return theImage;
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1327,28 +1327,32 @@
             System.out.println("callbackUpdates is " + callbackUpdates);
         }
 
-        // Finally, we are ready to read
-
+        /*
+         * All the Jpeg processing happens in native, we should clear
+         * abortFlag of imageIODataStruct in imageioJPEG.c. And we need to
+         * clear abortFlag because if in previous read() if we had called
+         * reader.abort() that will continue to be valid for present call also.
+         */
+        clearNativeReadAbortFlag(structPointer);
         processImageStarted(currentImage);
-
-        boolean aborted = false;
-
-        // Note that getData disables acceleration on buffer, but it is
-        // just a 1-line intermediate data transfer buffer that will not
-        // affect the acceleration of the resulting image.
-        aborted = readImage(structPointer,
-                            buffer.getData(),
-                            numRasterBands,
-                            srcBands,
-                            bandSizes,
-                            srcROI.x, srcROI.y,
-                            srcROI.width, srcROI.height,
-                            periodX, periodY,
-                            abbrevQTables,
-                            abbrevDCHuffmanTables,
-                            abbrevACHuffmanTables,
-                            minProgressivePass, maxProgressivePass,
-                            callbackUpdates);
+        /*
+         * Note that getData disables acceleration on buffer, but it is
+         * just a 1-line intermediate data transfer buffer that will not
+         * affect the acceleration of the resulting image.
+         */
+        boolean aborted = readImage(structPointer,
+                                    buffer.getData(),
+                                    numRasterBands,
+                                    srcBands,
+                                    bandSizes,
+                                    srcROI.x, srcROI.y,
+                                    srcROI.width, srcROI.height,
+                                    periodX, periodY,
+                                    abbrevQTables,
+                                    abbrevDCHuffmanTables,
+                                    abbrevACHuffmanTables,
+                                    minProgressivePass, maxProgressivePass,
+                                    callbackUpdates);
 
         if (aborted) {
             processReadAborted();
@@ -1513,6 +1517,12 @@
                                      int maxProgressivePass,
                                      boolean wantUpdates);
 
+    /*
+     * We should call clearNativeReadAbortFlag() before we start reading
+     * jpeg image as image processing happens at native side.
+     */
+    private native void clearNativeReadAbortFlag(long structPointer);
+
     public void abort() {
         setThreadLock();
         try {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -937,12 +937,6 @@
         for (int srcY = 0; srcY < passHeight; srcY++) {
             // Skip filter byte and the remaining row bytes
             pixelStream.skipBytes(1 + bytesPerRow);
-
-            // If read has been aborted, just return
-            // processReadAborted will be called later
-            if (abortRequested()) {
-                return;
-            }
         }
     }
 
@@ -996,6 +990,13 @@
             for (int srcY = 0; srcY < passHeight; srcY++) {
                 // Update count of pixels read
                 updateImageProgress(passWidth);
+                /*
+                 * If read has been aborted, just return
+                 * processReadAborted will be called later
+                 */
+                if (abortRequested()) {
+                    return;
+                }
                 // Skip filter byte and the remaining row bytes
                 pixelStream.skipBytes(1 + bytesPerRow);
             }
@@ -1105,7 +1106,13 @@
         for (int srcY = 0; srcY < passHeight; srcY++) {
             // Update count of pixels read
             updateImageProgress(passWidth);
-
+            /*
+             * If read has been aborted, just return
+             * processReadAborted will be called later
+             */
+            if (abortRequested()) {
+                return;
+            }
             // Read the filter type byte and a row of data
             int filter = pixelStream.read();
             try {
@@ -1195,12 +1202,6 @@
                                    updateWidth, 1,
                                    updateXStep, updateYStep,
                                    destinationBands);
-
-                // If read has been aborted, just return
-                // processReadAborted will be called later
-                if (abortRequested()) {
-                    return;
-                }
             }
         }
 
@@ -1215,8 +1216,6 @@
         this.pixelsDone = 0;
         this.totalPixels = width*height;
 
-        clearAbortRequest();
-
         if (metadata.IHDR_interlaceMethod == 0) {
             decodePass(0, 0, 0, 1, 1, width, height);
         } else {
@@ -1241,8 +1240,10 @@
                              (height + ybump)/YSubsampling);
                 }
 
-                // If read has been aborted, just return
-                // processReadAborted will be called later
+                /*
+                 * If read has been aborted, just return
+                 * processReadAborted will be called later
+                 */
                 if (abortRequested()) {
                     return;
                 }
@@ -1332,13 +1333,19 @@
                                        inputBandsForColorType[colorType],
                                       theImage.getSampleModel().getNumBands());
 
+            clearAbortRequest();
             processImageStarted(0);
-            decodeImage();
             if (abortRequested()) {
                 processReadAborted();
             } else {
-                processImageComplete();
+                decodeImage();
+                if (abortRequested()) {
+                    processReadAborted();
+                } else {
+                    processImageComplete();
+                }
             }
+
         } catch (IOException e) {
             throw new IIOException("Error reading PNG image data", e);
         } finally {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDeflateDecompressor.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDeflateDecompressor.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -101,13 +101,17 @@
 
         if (predictor ==
             BaselineTIFFTagSet.PREDICTOR_HORIZONTAL_DIFFERENCING) {
+            int step = planar || samplesPerPixel == 1 ? 1 : samplesPerPixel;
+            int samplesPerRow = step * srcWidth;
 
+            int off = bufOffset + step;
             for (int j = 0; j < srcHeight; j++) {
-                int count = bufOffset + samplesPerPixel * (j * srcWidth + 1);
-                for (int i=samplesPerPixel; i<srcWidth*samplesPerPixel; i++) {
-                    buf[count] += buf[count - samplesPerPixel];
+                int count = off;
+                for (int i = step; i < samplesPerRow; i++) {
+                    buf[count] += buf[count - step];
                     count++;
                 }
+                off += samplesPerRow;
             }
         }
 
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1131,8 +1131,12 @@
         pixelsToRead = destRegion.width * destRegion.height;
         pixelsRead = 0;
 
+        clearAbortRequest();
         processImageStarted(imageIndex);
-        processImageProgress(0.0f);
+        if (abortRequested()) {
+            processReadAborted();
+            return theImage;
+        }
 
         tilesAcross = (width + tileOrStripWidth - 1) / tileOrStripWidth;
         tilesDown = (height + tileOrStripHeight - 1) / tileOrStripHeight;
@@ -1286,6 +1290,10 @@
                     }
 
                     reportProgress();
+                    if (abortRequested()) {
+                        processReadAborted();
+                        return theImage;
+                    }
                 }
             }
         } else {
@@ -1294,16 +1302,14 @@
                     decodeTile(ti, tj, -1);
 
                     reportProgress();
+                    if (abortRequested()) {
+                        processReadAborted();
+                        return theImage;
+                    }
                 }
             }
         }
-
-        if (abortRequested()) {
-            processReadAborted();
-        } else {
-            processImageComplete();
-        }
-
+        processImageComplete();
         return theImage;
     }
 
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFLZWDecompressor.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFLZWDecompressor.java	Wed Jul 05 22:13:53 2017 +0200
@@ -162,16 +162,18 @@
 
         if (predictor ==
             BaselineTIFFTagSet.PREDICTOR_HORIZONTAL_DIFFERENCING) {
+            int step = planar || samplesPerPixel == 1 ? 1 : samplesPerPixel;
 
-            for (int j = 0; j < srcHeight; j++) {
+            int samplesPerRow = step * srcWidth;
 
-                int count = dstOffset + samplesPerPixel * (j * srcWidth + 1);
-
-                for (int i = samplesPerPixel; i < srcWidth * samplesPerPixel; i++) {
-
-                    dstData[count] += dstData[count - samplesPerPixel];
+            int off = dstOffset + step;
+            for (int j = 0; j < srcHeight; j++) {
+                int count = off;
+                for (int i = step; i < samplesPerRow; i++) {
+                    dstData[count] += dstData[count - step];
                     count++;
                 }
+                off += samplesPerRow;
             }
         }
 
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java	Wed Jul 05 22:13:53 2017 +0200
@@ -504,7 +504,7 @@
             public Object createValue(UIDefaults table) {
                 GTKStyleFactory factory = (GTKStyleFactory)getStyleFactory();
                 GTKStyle style = (GTKStyle)factory.getStyle(null, region);
-                return style.getFontForState(null);
+                return style.getDefaultFont();
             }
         }
 
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	Wed Jul 05 22:13:53 2017 +0200
@@ -282,7 +282,17 @@
         return getColorForState(context, type);
     }
 
+    Font getDefaultFont() {
+        return font;
+    }
+
     protected Font getFontForState(SynthContext context) {
+        Font propFont = UIManager
+                              .getFont(context.getRegion().getName() + ".font");
+        if (propFont != null) {
+            // if font property got a value then return it
+            return propFont;
+        }
         return font;
     }
 
--- a/jdk/src/java.desktop/share/classes/java/awt/Component.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/java/awt/Component.java	Wed Jul 05 22:13:53 2017 +0200
@@ -843,32 +843,7 @@
                 return new Rectangle(comp.x, comp.y, comp.width, comp.height);
             }
             public void setMixingCutoutShape(Component comp, Shape shape) {
-                Region region = shape == null ?  null :
-                    Region.getInstance(shape, null);
-
-                synchronized (comp.getTreeLock()) {
-                    boolean needShowing = false;
-                    boolean needHiding = false;
-
-                    if (!comp.isNonOpaqueForMixing()) {
-                        needHiding = true;
-                    }
-
-                    comp.mixingCutoutRegion = region;
-
-                    if (!comp.isNonOpaqueForMixing()) {
-                        needShowing = true;
-                    }
-
-                    if (comp.isMixingNeeded()) {
-                        if (needHiding) {
-                            comp.mixOnHiding(comp.isLightweight());
-                        }
-                        if (needShowing) {
-                            comp.mixOnShowing();
-                        }
-                    }
-                }
+                comp.setMixingCutoutShape(shape);
             }
 
             public void setGraphicsConfiguration(Component comp,
@@ -10238,6 +10213,71 @@
         return true;
     }
 
+    /**
+     * Sets a 'mixing-cutout' shape for the given component.
+     *
+     * By default a lightweight component is treated as an opaque rectangle for
+     * the purposes of the Heavyweight/Lightweight Components Mixing feature.
+     * This method enables developers to set an arbitrary shape to be cut out
+     * from heavyweight components positioned underneath the lightweight
+     * component in the z-order.
+     * <p>
+     * The {@code shape} argument may have the following values:
+     * <ul>
+     * <li>{@code null} - reverts the default cutout shape (the rectangle equal
+     * to the component's {@code getBounds()})
+     * <li><i>empty-shape</i> - does not cut out anything from heavyweight
+     * components. This makes the given lightweight component effectively
+     * transparent. Note that descendants of the lightweight component still
+     * affect the shapes of heavyweight components.  An example of an
+     * <i>empty-shape</i> is {@code new Rectangle()}.
+     * <li><i>non-empty-shape</i> - the given shape will be cut out from
+     * heavyweight components.
+     * </ul>
+     * <p>
+     * The most common example when the 'mixing-cutout' shape is needed is a
+     * 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
+     * changed manually after installing the glass pane to the root pane.
+     * <p>
+     * Note that the 'mixing-cutout' shape neither affects painting, nor the
+     * mouse events handling for the given component. It is used exclusively
+     * for the purposes of the Heavyweight/Lightweight Components Mixing
+     * feature.
+     *
+     * @param shape the new 'mixing-cutout' shape
+     * @since 9
+     */
+    void setMixingCutoutShape(Shape shape) {
+        Region region = shape == null ? null : Region.getInstance(shape, null);
+
+        synchronized (getTreeLock()) {
+            boolean needShowing = false;
+            boolean needHiding = false;
+
+            if (!isNonOpaqueForMixing()) {
+                needHiding = true;
+            }
+
+            mixingCutoutRegion = region;
+
+            if (!isNonOpaqueForMixing()) {
+                needShowing = true;
+            }
+
+            if (isMixingNeeded()) {
+                if (needHiding) {
+                    mixOnHiding(isLightweight());
+                }
+                if (needShowing) {
+                    mixOnShowing();
+                }
+            }
+        }
+    }
+
     // ****************** END OF MIXING CODE ********************************
 
     // Note that the method is overriden in the Window class,
--- a/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java	Wed Jul 05 22:13:53 2017 +0200
@@ -273,9 +273,7 @@
     }
 
     /**
-     * Requests user attention to the specified window until it is activated.
-     *
-     * On an already active window requesting attention does nothing.
+     * Requests user attention to the specified window.
      *
      * @param w window
      * @throws SecurityException if a security manager exists and it denies the
--- a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java	Wed Jul 05 22:13:53 2017 +0200
@@ -208,7 +208,7 @@
 
     /**
      * Returns whether dynamic layout of Containers on resize is currently
-     * enabled on the underlying operating system and/or window manager). If the
+     * enabled on the underlying operating system and/or window manager. If the
      * platform supports it, {@code setDynamicLayout(boolean)} may be used to
      * programmatically enable or disable platform dynamic layout. Regardless of
      * whether that toggling is supported, or whether {@code true} or {@code
--- a/jdk/src/java.desktop/share/classes/java/awt/peer/TaskbarPeer.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/java/awt/peer/TaskbarPeer.java	Wed Jul 05 22:13:53 2017 +0200
@@ -49,9 +49,7 @@
     default void requestUserAttention(boolean enabled, final boolean critical) {}
 
     /**
-     * Requests user attention to the specified window until it is activated.
-     *
-     * On an already active window requesting attention does nothing.
+     * Requests user attention to the specified window.
      *
      * @param w window
      */
--- a/jdk/src/java.desktop/share/classes/javax/swing/SortingFocusTraversalPolicy.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/swing/SortingFocusTraversalPolicy.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,15 +26,11 @@
 
 import java.awt.Component;
 import java.awt.Container;
-import java.awt.Window;
 import java.util.*;
 import java.awt.FocusTraversalPolicy;
 import sun.util.logging.PlatformLogger;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import sun.security.action.GetPropertyAction;
 import java.security.AccessController;
-import java.security.PrivilegedAction;
 
 /**
  * A FocusTraversalPolicy that determines traversal order by sorting the
@@ -100,27 +96,10 @@
      * See: JDK-8048887
      */
     private static final boolean legacySortingFTPEnabled;
-    private static final Method legacyMergeSortMethod;
 
     static {
         legacySortingFTPEnabled = "true".equals(AccessController.doPrivileged(
             new GetPropertyAction("swing.legacySortingFTPEnabled", "true")));
-        legacyMergeSortMethod = legacySortingFTPEnabled ?
-            AccessController.doPrivileged(new PrivilegedAction<Method>() {
-                public Method run() {
-                    try {
-                        Method m = java.util.Arrays.class.getDeclaredMethod("legacyMergeSort",
-                                                                            new Class<?>[]{Object[].class,
-                                                                                    Comparator.class});
-                        m.setAccessible(true);
-                        return m;
-                    } catch (NoSuchMethodException e) {
-                        // using default sorting algo
-                        return null;
-                    }
-                }
-            }) :
-            null;
     }
 
     /**
@@ -169,30 +148,25 @@
     private void enumerateAndSortCycle(Container focusCycleRoot, List<Component> cycle) {
         if (focusCycleRoot.isShowing()) {
             enumerateCycle(focusCycleRoot, cycle);
-            if (!legacySortingFTPEnabled ||
-                !legacySort(cycle, comparator))
-            {
-                Collections.sort(cycle, comparator);
+            if (legacySortingFTPEnabled) {
+                legacySort(cycle, comparator);
+            } else {
+                cycle.sort(comparator);
             }
         }
     }
 
-    private boolean legacySort(List<Component> l, Comparator<? super Component> c) {
-        if (legacyMergeSortMethod == null)
-            return false;
-
-        Object[] a = l.toArray();
-        try {
-            legacyMergeSortMethod.invoke(null, a, c);
-        } catch (IllegalAccessException | InvocationTargetException e) {
-            return false;
+    private void legacySort(List<Component> l,
+                                              Comparator<? super Component> c) {
+        if (c != null && l.size() > 1) {
+            Component[] a = l.toArray(new Component[l.size()]);
+            mergeSort(a.clone(), a, 0, a.length, 0, c);
+            ListIterator<Component> i = l.listIterator();
+            for (Component e : a) {
+                i.next();
+                i.set(e);
+            }
         }
-        ListIterator<Component> i = l.listIterator();
-        for (Object e : a) {
-            i.next();
-            i.set((Component)e);
-        }
-        return true;
     }
 
     @SuppressWarnings("deprecation")
@@ -665,6 +639,48 @@
     protected boolean accept(Component aComponent) {
         return fitnessTestPolicy.accept(aComponent);
     }
+
+    // merge sort implementation copied from java.utils.Arrays
+    private <T> void mergeSort(T[] src, T[] dest,
+                               int low, int high, int off,
+                               Comparator<? super T> c) {
+        int length = high - low;
+
+        // Insertion sort on smallest arrays
+        if (length < 7) {
+            for (int i=low; i<high; i++)
+                for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--) {
+                    T t = dest[j];
+                    dest[j] = dest[j-1];
+                    dest[j-1] = t;
+                }
+            return;
+        }
+
+        // Recursively sort halves of dest into src
+        int destLow  = low;
+        int destHigh = high;
+        low  += off;
+        high += off;
+        int mid = (low + high) >>> 1;
+        mergeSort(dest, src, low, mid, -off, c);
+        mergeSort(dest, src, mid, high, -off, c);
+
+        // If list is already sorted, just copy from src to dest.  This is an
+        // optimization that results in faster sorts for nearly ordered lists.
+        if (c.compare(src[mid-1], src[mid]) <= 0) {
+            System.arraycopy(src, low, dest, destLow, length);
+            return;
+        }
+
+        // Merge sorted halves (now in src) into dest
+        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
+            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
+                dest[i] = src[p++];
+            else
+                dest[i] = src[q++];
+        }
+    }
 }
 
 // Create our own subclass and change accept to public so that we can call
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1603,13 +1603,18 @@
                 blockIncrement = 1;
             }
 
+            int tickSpacing = getTickSpacing();
             if (slider.getSnapToTicks()) {
-                int tickSpacing = getTickSpacing();
 
                 if (blockIncrement < tickSpacing) {
                     blockIncrement = tickSpacing;
                 }
             }
+            else {
+                if (tickSpacing > 0) {
+                    blockIncrement = tickSpacing;
+                }
+            }
 
             int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
             slider.setValue(slider.getValue() + delta);
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthButtonUI.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthButtonUI.java	Wed Jul 05 22:13:53 2017 +0200
@@ -391,21 +391,8 @@
     }
 
     private Icon getRolloverIcon(AbstractButton b, Icon defaultIcon) {
-        ButtonModel model = b.getModel();
-        Icon icon = null;
-        if (model.isSelected()) {
-            icon = getIcon(b, b.getRolloverSelectedIcon(), null,
-                    SynthConstants.MOUSE_OVER | SynthConstants.SELECTED);
-            if (icon == null) {
-                icon = getIcon(b, b.getSelectedIcon(), null,
-                        SynthConstants.SELECTED);
-            }
-        }
-        if (icon == null) {
-            icon = getIcon(b, b.getRolloverIcon(), defaultIcon,
-                    SynthConstants.MOUSE_OVER);
-        }
-        return icon;
+        return getSpecificIcon(b, b.getRolloverSelectedIcon(), b.getRolloverIcon(),
+                               defaultIcon, SynthConstants.MOUSE_OVER);
     }
 
     private Icon getPressedIcon(AbstractButton b, Icon defaultIcon) {
@@ -414,21 +401,44 @@
     }
 
     private Icon getSynthDisabledIcon(AbstractButton b, Icon defaultIcon) {
-        ButtonModel model = b.getModel();
+        return getSpecificIcon(b, b.getDisabledSelectedIcon(), b.getDisabledIcon(),
+                               defaultIcon, SynthConstants.DISABLED);
+    }
+
+    private Icon getSpecificIcon(AbstractButton b, Icon specificSelectedIcon,
+                                 Icon specificIcon, Icon defaultIcon,
+                                 int state) {
+        boolean selected = b.getModel().isSelected();
         Icon icon = null;
-        if (model.isSelected()) {
-            icon = getIcon(b, b.getDisabledSelectedIcon(), null,
-                    SynthConstants.DISABLED | SynthConstants.SELECTED);
+
+        if (selected) {
+            icon = specificSelectedIcon;
             if (icon == null) {
-                icon = getIcon(b, b.getSelectedIcon(), null,
-                        SynthConstants.SELECTED);
+                icon = b.getSelectedIcon();
             }
         }
+
         if (icon == null) {
-            icon = getIcon(b, b.getDisabledIcon(), defaultIcon,
-                    SynthConstants.DISABLED);
+            icon = specificIcon;
+        }
+
+        if (icon != null) {
+            return icon;
         }
-        return icon;
+
+        if (defaultIcon == null || defaultIcon instanceof UIResource) {
+            if (selected) {
+                icon = getSynthIcon(b, state | SynthConstants.SELECTED);
+                if (icon == null) {
+                    icon = getSynthIcon(b, SynthConstants.SELECTED);
+                }
+            }
+            if (icon == null) {
+                icon = getSynthIcon(b, state);
+            }
+        }
+
+        return icon != null ? icon : defaultIcon;
     }
 
     /**
--- a/jdk/src/java.desktop/share/classes/sun/font/ExtendedTextSourceLabel.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/font/ExtendedTextSourceLabel.java	Wed Jul 05 22:13:53 2017 +0200
@@ -550,13 +550,16 @@
     return charinfo;
   }
 
+  private static final boolean DEBUG = FontUtilities.debugFonts();
 /*
 * This takes the glyph info record obtained from the glyph vector and converts it into a similar record
 * adjusted to represent character data instead.  For economy we don't use glyph info records in this processing.
 *
 * Here are some constraints:
 * - there can be more glyphs than characters (glyph insertion, perhaps based on normalization, has taken place)
-* - there can not be fewer glyphs than characters (0xffff glyphs are inserted for characters ligaturized away)
+* - there can be fewer glyphs than characters
+*   Some layout engines may insert 0xffff glyphs for characters ligaturized away, but
+*   not all do, and it cannot be relied upon.
 * - each glyph maps to a single character, when multiple glyphs exist for a character they all map to it, but
 *   no two characters map to the same glyph
 * - multiple glyphs mapping to the same character need not be in sequence (thai, tamil have split characters)
@@ -578,7 +581,8 @@
 *
 * The algorithm works in the following way:
 * 1) we scan the glyphs ltr or rtl based on the bidi run direction
-* 2) we can work in place, since we always consume a glyph for each char we write
+* 2) Since the may be fewer glyphs than chars we cannot work in place.
+*    A new array is allocated for output.
 *    a) if the line is ltr, we start writing at position 0 until we finish, there may be leftver space
 *    b) if the line is rtl and 1-1, we start writing at position numChars/glyphs - 1 until we finish at 0
 *    c) otherwise if we don't finish at 0, we have to copy the data down
@@ -594,7 +598,7 @@
 *       iii) the x advance is the distance to the maximum x + adv of all glyphs whose advance is not zero
 *       iv) the y advance is the baseline
 *       v) vis x,y,w,h tightly encloses the vis x,y,w,h of all the glyphs with nonzero w and h
-* 4) we can make some simple optimizations if we know some things:
+* 4) In the future, we can make some simple optimizations to avoid copying if we know some things:
 *    a) if the mapping is 1-1, unidirectional, and there are no zero-adv glyphs, we just return the glyphinfo
 *    b) if the mapping is 1-1, unidirectional, we just adjust the remaining glyphs to originate at right/left of the base
 *    c) if the mapping is 1-1, we compute the base position and advance as we go, then go back to adjust the remaining glyphs
@@ -625,23 +629,20 @@
         System.out.println(source);
     }
 
-    /*
-    if ((gv.getDescriptionFlags() & 0x7) == 0) {
-        return glyphinfo;
-    }
-    */
-
     int numGlyphs = gv.getNumGlyphs();
     if (numGlyphs == 0) {
         return glyphinfo;
     }
     int[] indices = gv.getGlyphCharIndices(0, numGlyphs, null);
+    float[] charInfo = new float[source.getLength() * numvals];
 
-    boolean DEBUG = false;
     if (DEBUG) {
       System.err.println("number of glyphs: " + numGlyphs);
+      System.err.println("glyphinfo.len: " + glyphinfo.length);
+      System.err.println("indices.len: " + indices.length);
       for (int i = 0; i < numGlyphs; ++i) {
         System.err.println("g: " + i +
+            "  v: " + gv.getGlyphCode(i) +
             ", x: " + glyphinfo[i*numvals+posx] +
             ", a: " + glyphinfo[i*numvals+advx] +
             ", n: " + indices[i]);
@@ -650,22 +651,19 @@
 
     int minIndex = indices[0];  // smallest index seen this cluster
     int maxIndex = minIndex;    // largest index seen this cluster
-    int nextMin = 0;            // expected smallest index for this cluster
     int cp = 0;                 // character position
-    int cx = 0;                 // character index (logical)
+    int cc = 0;
     int gp = 0;                 // glyph position
     int gx = 0;                 // glyph index (visual)
     int gxlimit = numGlyphs;    // limit of gx, when we reach this we're done
     int pdelta = numvals;       // delta for incrementing positions
     int xdelta = 1;             // delta for incrementing indices
 
-    boolean ltr = (source.getLayoutFlags() & 0x1) == 0;
-    if (!ltr) {
+    boolean rtl = (source.getLayoutFlags() & 0x1) == 1;
+    if (rtl) {
         minIndex = indices[numGlyphs - 1];
         maxIndex = minIndex;
-        nextMin  = 0; // still logical
-        cp = glyphinfo.length - numvals;
-        cx = 0; // still logical
+        cp = charInfo.length - numvals;
         gp = glyphinfo.length - numvals;
         gx = numGlyphs - 1;
         gxlimit = -1;
@@ -693,47 +691,36 @@
     float cposl = 0, cposr = 0, cvisl = 0, cvist = 0, cvisr = 0, cvisb = 0;
     float baseline = 0;
 
-    // record if we have to copy data even when no cluster
-    boolean mustCopy = false;
-
     while (gx != gxlimit) {
         // start of new cluster
-        boolean haveCopy = false;
         int clusterExtraGlyphs = 0;
 
         minIndex = indices[gx];
         maxIndex = minIndex;
 
+        cposl = glyphinfo[gp + posx];
+        cposr = cposl + glyphinfo[gp + advx];
+        cvisl = glyphinfo[gp + visx];
+        cvist = glyphinfo[gp + visy];
+        cvisr = cvisl + glyphinfo[gp + visw];
+        cvisb = cvist + glyphinfo[gp + vish];
+
         // advance to next glyph
         gx += xdelta;
         gp += pdelta;
 
- /*
-        while (gx != gxlimit && (glyphinfo[gp + advx] == 0 ||
-                           minIndex != nextMin || indices[gx] <= maxIndex)) {
-  */
         while (gx != gxlimit &&
                ((glyphinfo[gp + advx] == 0) ||
-               (minIndex != nextMin) ||
                (indices[gx] <= maxIndex) ||
                (maxIndex - minIndex > clusterExtraGlyphs))) {
-            // initialize base data first time through, using base glyph
-            if (!haveCopy) {
-                int gps = gp - pdelta;
 
-                cposl = glyphinfo[gps + posx];
-                cposr = cposl + glyphinfo[gps + advx];
-                cvisl = glyphinfo[gps + visx];
-                cvist = glyphinfo[gps + visy];
-                cvisr = cvisl + glyphinfo[gps + visw];
-                cvisb = cvist + glyphinfo[gps + vish];
-
-                haveCopy = true;
+            ++clusterExtraGlyphs; // have an extra glyph in this cluster
+            if (DEBUG) {
+                System.err.println("gp=" +gp +" adv=" + glyphinfo[gp + advx] +
+                                   " gx="+ gx+ " i[gx]="+indices[gx] +
+                                   " clusterExtraGlyphs="+clusterExtraGlyphs);
             }
 
-            // have an extra glyph in this cluster
-            ++clusterExtraGlyphs;
-
             // adjust advance only if new glyph has non-zero advance
             float radvx = glyphinfo[gp + advx];
             if (radvx != 0) {
@@ -764,110 +751,90 @@
         // done with cluster, gx and gp are set for next glyph
 
         if (DEBUG) {
-            System.out.println("minIndex = " + minIndex + ", maxIndex = " + maxIndex);
+            System.err.println("minIndex = " + minIndex + ", maxIndex = " + maxIndex);
         }
 
-        nextMin = maxIndex + 1;
-
-        // do common character adjustments
-        glyphinfo[cp + posy] = baseline;
-        glyphinfo[cp + advy] = 0;
+        // save adjustments to the base character and do common adjustments.
+        charInfo[cp + posx] = cposl;
+        charInfo[cp + posy] = baseline;
+        charInfo[cp + advx] = cposr - cposl;
+        charInfo[cp + advy] = 0;
+        charInfo[cp + visx] = cvisl;
+        charInfo[cp + visy] = cvist;
+        charInfo[cp + visw] = cvisr - cvisl;
+        charInfo[cp + vish] = cvisb - cvist;
+        cc++;
 
-        if (haveCopy) {
-            // save adjustments to the base character
-            glyphinfo[cp + posx] = cposl;
-            glyphinfo[cp + advx] = cposr - cposl;
-            glyphinfo[cp + visx] = cvisl;
-            glyphinfo[cp + visy] = cvist;
-            glyphinfo[cp + visw] = cvisr - cvisl;
-            glyphinfo[cp + vish] = cvisb - cvist;
+        /* We may have consumed multiple glyphs for this char position.
+         * Map those extra consumed glyphs to char positions that would follow
+         * up to the index prior to that which begins the next cluster.
+         * If we have reached the last glyph (reached gxlimit) then we need to
+         * map remaining unmapped chars to the same location as the last one.
+         */
+        int tgt;
+        if (gx == gxlimit) {
+           tgt = charInfo.length / numvals;
+        } else {
+           tgt = indices[gx]-1;
+        }
+        if (DEBUG) {
+           System.err.println("gx=" + gx + " gxlimit=" + gxlimit +
+                              " charInfo.len=" + charInfo.length +
+                              " tgt=" + tgt + " cc=" + cc + " cp=" + cp);
+        }
+        while (cc < tgt) {
+            if (rtl) {
+                // if rtl, characters to left of base, else to right.  reuse cposr.
+                cposr = cposl;
+            }
+            cvisr -= cvisl; // reuse, convert to deltas.
+            cvisb -= cvist;
 
-            // compare number of chars read with number of glyphs read.
-            // if more glyphs than chars, set mustCopy to true, as we'll always have
-            // to copy the data from here on out.
-            if (maxIndex - minIndex < clusterExtraGlyphs) {
-                mustCopy = true;
+            cp += pdelta;
+
+            if (cp < 0 || cp >= charInfo.length) {
+                if (DEBUG)  {
+                    System.err.println("Error : cp=" + cp +
+                                       " charInfo.length=" + charInfo.length);
+                }
+                break;
             }
 
-            // Fix the characters that follow the base character.
-            // New values are all the same.  Note we fix the number of characters
-            // we saw, not the number of glyphs we saw.
-            if (minIndex < maxIndex) {
-                if (!ltr) {
-                    // if rtl, characters to left of base, else to right.  reuse cposr.
-                    cposr = cposl;
-                }
-                cvisr -= cvisl; // reuse, convert to deltas.
-                cvisb -= cvist;
-
-                int iMinIndex = minIndex, icp = cp / 8;
-
-                while (minIndex < maxIndex) {
-                    ++minIndex;
-                    cx += xdelta;
-                    cp += pdelta;
-
-                    if (cp < 0 || cp >= glyphinfo.length) {
-                        if (DEBUG) System.out.println("minIndex = " + iMinIndex + ", maxIndex = " + maxIndex + ", cp = " + icp);
-                    }
-
-                    glyphinfo[cp + posx] = cposr;
-                    glyphinfo[cp + posy] = baseline;
-                    glyphinfo[cp + advx] = 0;
-                    glyphinfo[cp + advy] = 0;
-                    glyphinfo[cp + visx] = cvisl;
-                    glyphinfo[cp + visy] = cvist;
-                    glyphinfo[cp + visw] = cvisr;
-                    glyphinfo[cp + vish] = cvisb;
-                }
+            if (DEBUG) {
+                System.err.println("Insert charIndex " + cc + " at pos="+cp);
             }
-
-            // no longer using this copy
-            haveCopy = false;
-        } else if (mustCopy) {
-            // out of synch, so we have to copy all the time now
-            int gpr = gp - pdelta;
-
-            glyphinfo[cp + posx] = glyphinfo[gpr + posx];
-            glyphinfo[cp + advx] = glyphinfo[gpr + advx];
-            glyphinfo[cp + visx] = glyphinfo[gpr + visx];
-            glyphinfo[cp + visy] = glyphinfo[gpr + visy];
-            glyphinfo[cp + visw] = glyphinfo[gpr + visw];
-            glyphinfo[cp + vish] = glyphinfo[gpr + vish];
+            charInfo[cp + posx] = cposr;
+            charInfo[cp + posy] = baseline;
+            charInfo[cp + advx] = 0;
+            charInfo[cp + advy] = 0;
+            charInfo[cp + visx] = cvisl;
+            charInfo[cp + visy] = cvist;
+            charInfo[cp + visw] = cvisr;
+            charInfo[cp + vish] = cvisb;
+            cc++;
         }
-        // else glyphinfo is already at the correct character position, and is unchanged, so just leave it
-
-        // reset for new cluster
-        cp += pdelta;
-        cx += xdelta;
-    }
-
-    if (mustCopy && !ltr) {
-        // data written to wrong end of array, need to shift down
-
-        cp -= pdelta; // undo last increment, get start of valid character data in array
-        System.arraycopy(glyphinfo, cp, glyphinfo, 0, glyphinfo.length - cp);
+        cp += pdelta; // reset for new cluster
     }
 
     if (DEBUG) {
-      char[] chars = source.getChars();
-      int start = source.getStart();
-      int length = source.getLength();
-      System.out.println("char info for " + length + " characters");
-      for(int i = 0; i < length * numvals;) {
-        System.out.println(" ch: " + Integer.toHexString(chars[start + v2l(i / numvals)]) +
-                           " x: " + glyphinfo[i++] +
-                           " y: " + glyphinfo[i++] +
-                           " xa: " + glyphinfo[i++] +
-                           " ya: " + glyphinfo[i++] +
-                           " l: " + glyphinfo[i++] +
-                           " t: " + glyphinfo[i++] +
-                           " w: " + glyphinfo[i++] +
-                           " h: " + glyphinfo[i++]);
+        char[] chars = source.getChars();
+        int start = source.getStart();
+        int length = source.getLength();
+        System.err.println("char info for " + length + " characters");
+
+        for (int i = 0; i < length * numvals;) {
+            System.err.println(" ch: " + Integer.toHexString(chars[start + v2l(i / numvals)]) +
+                               " x: " + charInfo[i++] +
+                               " y: " + charInfo[i++] +
+                               " xa: " + charInfo[i++] +
+                               " ya: " + charInfo[i++] +
+                               " l: " + charInfo[i++] +
+                               " t: " + charInfo[i++] +
+                               " w: " + charInfo[i++] +
+                               " h: " + charInfo[i++]);
       }
     }
-
-    return glyphinfo;
+    return charInfo;
   }
 
   /**
--- a/jdk/src/java.desktop/share/classes/sun/print/DialogOwner.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/print/DialogOwner.java	Wed Jul 05 22:13:53 2017 +0200
@@ -25,9 +25,11 @@
 
 package sun.print;
 
+import java.awt.Dialog;
 import javax.print.attribute.Attribute;
 import javax.print.attribute.PrintRequestAttribute;
 import java.awt.Frame;
+import java.awt.Window;
 
 /**
  * Class DialogOwner is a printing attribute class that identifies
@@ -42,7 +44,7 @@
 public final class DialogOwner
     implements PrintRequestAttribute {
 
-    private Frame dlgOwner;
+    private Window dlgOwner;
 
     /**
      * Construct a new dialog owner attribute with the given frame.
@@ -53,11 +55,19 @@
         dlgOwner = frame;
     }
 
+    /**
+     * Construct a new dialog owner attribute with the given dialog.
+     *
+     * @param  dialog the dialog that owns the print dialog
+     */
+    public DialogOwner(Dialog dialog) {
+        dlgOwner = dialog;
+    }
 
     /**
      * Returns the string table for class DialogOwner.
      */
-    public Frame getOwner() {
+    public Window getOwner() {
         return dlgOwner;
     }
 
--- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,7 +30,6 @@
 import java.awt.Color;
 import java.awt.Dialog;
 import java.awt.Frame;
-import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.GraphicsConfiguration;
 import java.awt.GraphicsEnvironment;
@@ -39,7 +38,6 @@
 import java.awt.Rectangle;
 import java.awt.Shape;
 import java.awt.geom.AffineTransform;
-import java.awt.geom.Area;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
@@ -55,7 +53,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.Locale;
 import sun.awt.image.ByteInterleavedRaster;
 
@@ -74,7 +71,6 @@
 import javax.print.attribute.PrintRequestAttributeSet;
 import javax.print.attribute.ResolutionSyntax;
 import javax.print.attribute.Size2DSyntax;
-import javax.print.attribute.standard.Chromaticity;
 import javax.print.attribute.standard.Copies;
 import javax.print.attribute.standard.Destination;
 import javax.print.attribute.standard.DialogTypeSelection;
@@ -96,11 +92,6 @@
 import javax.print.attribute.standard.SheetCollate;
 import javax.print.attribute.standard.Sides;
 
-import sun.print.PageableDoc;
-import sun.print.ServiceDialog;
-import sun.print.SunPrinterJobService;
-import sun.print.SunPageSelection;
-
 /**
  * A class which rasterizes a printer job.
  *
@@ -836,9 +827,16 @@
         Rectangle gcBounds = gc.getBounds();
         int x = gcBounds.x+50;
         int y = gcBounds.y+50;
-        ServiceDialog pageDialog = new ServiceDialog(gc, x, y, service,
-                                       DocFlavor.SERVICE_FORMATTED.PAGEABLE,
-                                       attributes, (Frame)null);
+        ServiceDialog pageDialog;
+        if (w instanceof Frame) {
+            pageDialog = new ServiceDialog(gc, x, y, service,
+                                           DocFlavor.SERVICE_FORMATTED.PAGEABLE,
+                                           attributes,(Frame)w);
+        } else {
+            pageDialog = new ServiceDialog(gc, x, y, service,
+                                           DocFlavor.SERVICE_FORMATTED.PAGEABLE,
+                                           attributes, (Dialog)w);
+        }
         Rectangle dlgBounds = pageDialog.getBounds();
 
         // if portion of dialog is not within the gc boundary
@@ -944,6 +942,14 @@
         Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
         if (w != null) {
             grCfg = w.getGraphicsConfiguration();
+             /* Add DialogOwner attribute to set the owner of this print dialog
+              * only if it is not set already
+              * (it might be set in java.awt.PrintJob.printDialog)
+              */
+            if (attributes.get(DialogOwner.class) == null) {
+                attributes.add(w instanceof Frame ? new DialogOwner((Frame)w) :
+                                                    new DialogOwner((Dialog)w));
+            }
         } else {
             grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
                         getDefaultScreenDevice().getDefaultConfiguration();
@@ -1001,6 +1007,10 @@
         // temporarily add an attribute pointing back to this job.
         PrinterJobWrapper jobWrapper = new PrinterJobWrapper(this);
         attributes.add(jobWrapper);
+        PageRanges pgRng = (PageRanges)attributes.get(PageRanges.class);
+        if (pgRng == null && mDocument.getNumberOfPages() > 1) {
+            attributes.add(new PageRanges(1, mDocument.getNumberOfPages()));
+        }
         try {
             newService =
             ServiceUI.printDialog(gc, x, y,
@@ -1014,6 +1024,7 @@
                                   attributes);
         }
         attributes.remove(PrinterJobWrapper.class);
+        attributes.remove(DialogOwner.class);
 
         if (newService == null) {
             return false;
--- a/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java	Wed Jul 05 22:13:53 2017 +0200
@@ -107,13 +107,16 @@
         ImageCache cache = getCache(key);
         Image image = cache.getImage(key, config, w, h, args);
         int attempts = 0;
+        VolatileImage volatileImage = (image instanceof VolatileImage)
+                ? (VolatileImage) image
+                : null;
         do {
             boolean draw = false;
-            if (image instanceof VolatileImage) {
+            if (volatileImage != null) {
                 // See if we need to recreate the image
-                switch (((VolatileImage)image).validate(config)) {
+                switch (volatileImage.validate(config)) {
                 case VolatileImage.IMAGE_INCOMPATIBLE:
-                    ((VolatileImage)image).flush();
+                    volatileImage.flush();
                     image = null;
                     break;
                 case VolatileImage.IMAGE_RESTORED:
@@ -126,11 +129,14 @@
                 image = createImage(c, w, h, config, args);
                 cache.setImage(key, config, w, h, args, image);
                 draw = true;
+                volatileImage = (image instanceof VolatileImage)
+                        ? (VolatileImage) image
+                        : null;
             }
             if (draw) {
                 // Render to the Image
                 Graphics2D g2 = (Graphics2D) image.getGraphics();
-                if (w != baseWidth || h != baseHeight) {
+                if (volatileImage == null && (w != baseWidth || h != baseHeight)) {
                     g2.scale((double) w / baseWidth, (double) h / baseHeight);
                 }
                 paintToImage(c, image, g2, baseWidth, baseHeight, args);
@@ -140,8 +146,8 @@
             // If we did this 3 times and the contents are still lost
             // assume we're painting to a VolatileImage that is bogus and
             // give up.  Presumably we'll be called again to paint.
-        } while ((image instanceof VolatileImage) &&
-                 ((VolatileImage)image).contentsLost() && ++attempts < 3);
+        } while ((volatileImage != null) &&
+                 volatileImage.contentsLost() && ++attempts < 3);
 
         return image;
     }
--- a/jdk/src/java.desktop/share/native/libfontmanager/HBShaper.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/HBShaper.c	Wed Jul 05 22:13:53 2017 +0200
@@ -40,6 +40,7 @@
 static jfieldID gvdGlyphsFID = 0;
 static jfieldID gvdPositionsFID = 0;
 static jfieldID gvdIndicesFID = 0;
+static jmethodID gvdGrowMID = 0;
 static int jniInited = 0;
 
 static void getFloat(JNIEnv* env, jobject pt, jfloat *x, jfloat *y) {
@@ -63,73 +64,88 @@
     CHECK_NULL_RETURN(gvdGlyphsFID = (*env)->GetFieldID(env, gvdClass, "_glyphs", "[I"), 0);
     CHECK_NULL_RETURN(gvdPositionsFID = (*env)->GetFieldID(env, gvdClass, "_positions", "[F"), 0);
     CHECK_NULL_RETURN(gvdIndicesFID = (*env)->GetFieldID(env, gvdClass, "_indices", "[I"), 0);
+    CHECK_NULL_RETURN(gvdGrowMID = (*env)->GetMethodID(env, gvdClass, "grow", "()V"), 0);
     jniInited = 1;
     return jniInited;
 }
 
 // gmask is the composite font slot mask
 // baseindex is to be added to the character (code point) index.
-int storeGVData(JNIEnv* env,
-               jobject gvdata, jint slot, jint baseIndex, jobject startPt,
-               int glyphCount, hb_glyph_info_t *glyphInfo,
-               hb_glyph_position_t *glyphPos, hb_direction_t direction,
-               float devScale) {
+jboolean storeGVData(JNIEnv* env,
+                     jobject gvdata, jint slot,
+                     jint baseIndex, int offset, jobject startPt,
+                     int charCount, int glyphCount, hb_glyph_info_t *glyphInfo,
+                     hb_glyph_position_t *glyphPos, float devScale) {
 
-    int i;
+    int i, needToGrow;
     float x=0, y=0;
-    float startX, startY;
-    float scale = 1.0f/64.0f/devScale;
+    float startX, startY, advX, advY;
+    float scale = 1.0f / HBFloatToFixedScale / devScale;
     unsigned int* glyphs;
     float* positions;
-    int initialCount, glyphArrayLen, posArrayLen, maxGlyphs, storeadv;
+    int initialCount, glyphArrayLen, posArrayLen, maxGlyphs, storeadv, maxStore;
     unsigned int* indices;
     jarray glyphArray, posArray, inxArray;
 
     if (!init_JNI_IDs(env)) {
-        return 0;
+        return JNI_FALSE;
     }
 
     initialCount = (*env)->GetIntField(env, gvdata, gvdCountFID);
-    glyphArray =
-       (jarray)(*env)->GetObjectField(env, gvdata, gvdGlyphsFID);
-    posArray =
-        (jarray)(*env)->GetObjectField(env, gvdata, gvdPositionsFID);
-
-    if (glyphArray == NULL || posArray == NULL)
-    {
-        JNU_ThrowArrayIndexOutOfBoundsException(env, "");
-        return 0;
-    }
-
-    // The Java code catches the IIOBE and expands the storage
-    // and re-invokes layout. I suppose this is expected to be rare
-    // because at least in a single threaded case there should be
-    // re-use of the same container, but it is a little wasteful/distateful.
-    glyphArrayLen = (*env)->GetArrayLength(env, glyphArray);
-    posArrayLen = (*env)->GetArrayLength(env, posArray);
-    maxGlyphs = glyphCount + initialCount;
-    if ((maxGlyphs >  glyphArrayLen) ||
-        (maxGlyphs * 2 + 2 >  posArrayLen))
-    {
-        JNU_ThrowArrayIndexOutOfBoundsException(env, "");
-        return 0;
-    }
+    do {
+        glyphArray = (jarray)(*env)->GetObjectField(env, gvdata, gvdGlyphsFID);
+        posArray = (jarray)(*env)->GetObjectField(env, gvdata, gvdPositionsFID);
+        inxArray = (jarray)(*env)->GetObjectField(env, gvdata, gvdIndicesFID);
+        if (glyphArray == NULL || posArray == NULL || inxArray == NULL) {
+            JNU_ThrowArrayIndexOutOfBoundsException(env, "");
+            return JNI_FALSE;
+        }
+        glyphArrayLen = (*env)->GetArrayLength(env, glyphArray);
+        posArrayLen = (*env)->GetArrayLength(env, posArray);
+        maxGlyphs = (charCount > glyphCount) ? charCount : glyphCount;
+        maxStore = maxGlyphs + initialCount;
+        needToGrow = (maxStore > glyphArrayLen) ||
+                     (maxStore * 2 + 2 >  posArrayLen);
+        if (needToGrow) {
+            (*env)->CallVoidMethod(env, gvdata, gvdGrowMID);
+            if ((*env)->ExceptionCheck(env)) {
+                return JNI_FALSE;
+            }
+        }
+    } while (needToGrow);
 
     getFloat(env, startPt, &startX, &startY);
 
     glyphs =
         (unsigned int*)(*env)->GetPrimitiveArrayCritical(env, glyphArray, NULL);
+    if (glyphs == NULL) {
+        return JNI_FALSE;
+    }
     positions = (jfloat*)(*env)->GetPrimitiveArrayCritical(env, posArray, NULL);
+    if (positions == NULL) {
+        (*env)->ReleasePrimitiveArrayCritical(env, glyphArray, glyphs, 0);
+        return JNI_FALSE;
+    }
+    indices =
+        (unsigned int*)(*env)->GetPrimitiveArrayCritical(env, inxArray, NULL);
+    if (indices == NULL) {
+        (*env)->ReleasePrimitiveArrayCritical(env, glyphArray, glyphs, 0);
+        (*env)->ReleasePrimitiveArrayCritical(env, posArray, positions, 0);
+        return JNI_FALSE;
+    }
+
     for (i = 0; i < glyphCount; i++) {
         int storei = i + initialCount;
-        int index = glyphInfo[i].codepoint | slot;
-        if (i<glyphCount)glyphs[storei] = (unsigned int)index;
-        positions[(storei*2)] = startX + x + glyphPos[i].x_offset * scale;
-        positions[(storei*2)+1] = startY + y - glyphPos[i].y_offset * scale;
+        int cluster = glyphInfo[i].cluster - offset;
+        indices[storei] = baseIndex + cluster;
+        glyphs[storei] = (unsigned int)(glyphInfo[i].codepoint | slot);
+        positions[storei*2] = startX + x + glyphPos[i].x_offset * scale;
+        positions[(storei*2)+1] = startY + y + glyphPos[i].y_offset * scale;
         x += glyphPos[i].x_advance * scale;
         y += glyphPos[i].y_advance * scale;
+        storei++;
     }
-    storeadv = initialCount+glyphCount;
+    storeadv = initialCount + glyphCount;
     // The final slot in the positions array is important
     // because when the GlyphVector is created from this
     // data it determines the overall advance of the glyphvector
@@ -137,30 +153,17 @@
     // during rendering where text is broken into runs.
     // We also need to report it back into "pt", so layout can
     // pass it back down for that next run in this code.
-    positions[(storeadv*2)] = startX + x;
-    positions[(storeadv*2)+1] = startY + y;
+    advX = startX + x;
+    advY = startY + y;
+    positions[(storeadv*2)] = advX;
+    positions[(storeadv*2)+1] = advY;
     (*env)->ReleasePrimitiveArrayCritical(env, glyphArray, glyphs, 0);
     (*env)->ReleasePrimitiveArrayCritical(env, posArray, positions, 0);
-    putFloat(env, startPt,positions[(storeadv*2)],positions[(storeadv*2)+1] );
-    inxArray =
-        (jarray)(*env)->GetObjectField(env, gvdata, gvdIndicesFID);
-    indices =
-        (unsigned int*)(*env)->GetPrimitiveArrayCritical(env, inxArray, NULL);
-    for (i = 0; i < glyphCount; i++) {
-        int cluster = glyphInfo[i].cluster;
-        if (direction == HB_DIRECTION_LTR) {
-            // I need to understand what hb does when processing a substring
-            // I expected the cluster index to be from the start of the text
-            // to process.
-            // Instead it appears to be from the start of the whole thing.
-            indices[i+initialCount] = cluster;
-        } else {
-            indices[i+initialCount] = baseIndex + glyphCount -1 -i;
-        }
-    }
     (*env)->ReleasePrimitiveArrayCritical(env, inxArray, indices, 0);
-    (*env)->SetIntField(env, gvdata, gvdCountFID, initialCount+glyphCount);
-    return initialCount+glyphCount;
+    putFloat(env, startPt, advX, advY);
+    (*env)->SetIntField(env, gvdata, gvdCountFID, storeadv);
+
+    return JNI_TRUE;
 }
 
 static float euclidianDistance(float a, float b)
@@ -226,7 +229,9 @@
 }
 
 
-#define TYPO_RTL 0x80000000
+#define TYPO_KERN 0x00000001
+#define TYPO_LIGA 0x00000002
+#define TYPO_RTL  0x80000000
 
 JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape
     (JNIEnv *env, jclass cls,
@@ -255,10 +260,11 @@
      hb_glyph_info_t *glyphInfo;
      hb_glyph_position_t *glyphPos;
      hb_direction_t direction = HB_DIRECTION_LTR;
-     hb_feature_t *features =  NULL;
+     hb_feature_t *features = NULL;
      int featureCount = 0;
-
-     int i;
+     char* kern = (flags & TYPO_KERN) ? "kern" : "-kern";
+     char* liga = (flags & TYPO_LIGA) ? "liga" : "-liga";
+     jboolean ret;
      unsigned int buflen;
 
      JDKFontInfo *jdkFontInfo =
@@ -281,6 +287,8 @@
          direction = HB_DIRECTION_RTL;
      }
      hb_buffer_set_direction(buffer, direction);
+     hb_buffer_set_cluster_level(buffer,
+                                 HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS);
 
      chars = (*env)->GetCharArrayElements(env, text, NULL);
      if ((*env)->ExceptionCheck(env)) {
@@ -293,36 +301,26 @@
 
      hb_buffer_add_utf16(buffer, chars, len, offset, limit-offset);
 
+     features = calloc(2, sizeof(hb_feature_t));
+     if (features) {
+         hb_feature_from_string(kern, -1, &features[featureCount++]);
+         hb_feature_from_string(liga, -1, &features[featureCount++]);
+     }
+
      hb_shape_full(hbfont, buffer, features, featureCount, 0);
      glyphCount = hb_buffer_get_length(buffer);
      glyphInfo = hb_buffer_get_glyph_infos(buffer, 0);
      glyphPos = hb_buffer_get_glyph_positions(buffer, &buflen);
-     for (i = 0; i < glyphCount; i++) {
-         int index = glyphInfo[i].codepoint;
-         int xadv = (glyphPos[i].x_advance);
-         int yadv = (glyphPos[i].y_advance);
-     }
-     // On "input" HB assigns a cluster index to each character in UTF-16.
-     // On output where a sequence of characters have been mapped to
-     // a glyph they are all mapped to the cluster index of the first character.
-     // The next cluster index will be that of the first character in the
-     // next cluster. So cluster indexes may 'skip' on output.
-     // This can also happen if there are supplementary code-points
-     // such that two UTF-16 characters are needed to make one codepoint.
-     // In RTL text you need to count down.
-     // So the following code tries to build the reverse map as expected
-     // by calling code.
 
-     storeGVData(env, gvdata, slot, baseIndex, startPt,
-                 glyphCount, glyphInfo, glyphPos, direction,
-                 jdkFontInfo->devScale);
+     ret = storeGVData(env, gvdata, slot, baseIndex, offset, startPt,
+                       limit - offset, glyphCount, glyphInfo, glyphPos,
+                       jdkFontInfo->devScale);
 
      hb_buffer_destroy (buffer);
      hb_font_destroy(hbfont);
      free((void*)jdkFontInfo);
      if (features != NULL) free(features);
      (*env)->ReleaseCharArrayElements(env, text, chars, JNI_ABORT);
-
-     return JNI_TRUE;
+     return ret;
 }
 
--- a/jdk/src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/hb-jdk-font.cc	Wed Jul 05 22:13:53 2017 +0200
@@ -55,10 +55,6 @@
     return (*glyph != 0);
 }
 
-// This is also define in freetypescaler.c and similar macros are
-// in fontscalerdefs.h. Consider tidying this up.
-#define FloatToF26Dot6(x) ((unsigned int) ((x)*64))
-
 static hb_position_t
 hb_jdk_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
 			   void *font_data,
@@ -84,7 +80,7 @@
     fadv *= jdkFontInfo->devScale;
     env->DeleteLocalRef(pt);
 
-    return FloatToF26Dot6(fadv); // should this round ?
+    return HBFloatToFixed(fadv);
 }
 
 static hb_position_t
@@ -111,7 +107,7 @@
     fadv = env->GetFloatField(pt, sunFontIDs.yFID);
     env->DeleteLocalRef(pt);
 
-    return FloatToF26Dot6(fadv); // should this round ?
+    return HBFloatToFixed(fadv);
   
 }
 
@@ -205,8 +201,8 @@
         *x = 0; *y = 0;
         return true;
     }
-    *x = FloatToF26Dot6(env->GetFloatField(pt, sunFontIDs.xFID));
-    *y = FloatToF26Dot6(env->GetFloatField(pt, sunFontIDs.yFID));
+    *x = HBFloatToFixed(env->GetFloatField(pt, sunFontIDs.xFID));
+    *y = HBFloatToFixed(env->GetFloatField(pt, sunFontIDs.yFID));
     env->DeleteLocalRef(pt);
 
   return true;
@@ -325,8 +321,8 @@
                        _hb_jdk_get_font_funcs (),
                        jdkFontInfo, (hb_destroy_func_t) _do_nothing);
     hb_font_set_scale (font,
-                      FloatToF26Dot6(jdkFontInfo->ptSize*jdkFontInfo->devScale),
-                      FloatToF26Dot6(jdkFontInfo->ptSize*jdkFontInfo->devScale));
+                      HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale),
+                      HBFloatToFixed(jdkFontInfo->ptSize*jdkFontInfo->devScale));
   return font;
 }
 
@@ -343,8 +339,8 @@
     hb_face_destroy(face);
 
     hb_font_set_scale(font,
-                     FloatToF26Dot6(jdkFontInfo->ptSize),
-                     FloatToF26Dot6(jdkFontInfo->ptSize));
+                     HBFloatToFixed(jdkFontInfo->ptSize),
+                     HBFloatToFixed(jdkFontInfo->ptSize));
     return font;
 }
 #endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/hb-jdk.h	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/hb-jdk.h	Wed Jul 05 22:13:53 2017 +0200
@@ -48,6 +48,10 @@
 } JDKFontInfo;
 
 
+// Use 16.16 for better precision than 26.6
+#define HBFloatToFixedScale ((float)(1 << 16))
+#define HBFloatToFixed(f) ((unsigned int)((f) * HBFloatToFixedScale))
+
 /*
  * Note:
  *
--- a/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c	Wed Jul 05 22:13:53 2017 +0200
@@ -2162,6 +2162,25 @@
 }
 
 JNIEXPORT void JNICALL
+Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_clearNativeReadAbortFlag
+    (JNIEnv *env,
+    jobject this,
+    jlong ptr) {
+
+    imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr);
+
+    if (data == NULL) {
+        JNU_ThrowByName(env,
+            "java/lang/IllegalStateException",
+            "Attempting to use reader after dispose()");
+        return;
+    }
+
+    data->abortFlag = JNI_FALSE;
+
+}
+
+JNIEXPORT void JNICALL
 Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_abortRead
     (JNIEnv *env,
      jobject this,
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1570,6 +1570,10 @@
                                   Integer.valueOf(getMultiClickTime()));
             desktopProperties.put("awt.mouse.numButtons",
                                   Integer.valueOf(getNumberOfButtons()));
+            if(SunGraphicsEnvironment.isUIScaleEnabled()) {
+                addPropertyChangeListener("gnome.Xft/DPI", evt ->
+                                                     localEnv.displayChanged());
+            }
         }
     }
 
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11GraphicsDevice.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11GraphicsDevice.java	Wed Jul 05 22:13:53 2017 +0200
@@ -63,7 +63,7 @@
     private SunDisplayChanger topLevels = new SunDisplayChanger();
     private DisplayMode origDisplayMode;
     private boolean shutdownHookRegistered;
-    private final int scale;
+    private int scale;
 
     public X11GraphicsDevice(int screennum) {
         this.screen = screennum;
@@ -488,6 +488,7 @@
      * X11GraphicsEnvironment when the display mode has been changed.
      */
     public synchronized void displayChanged() {
+        scale = initScaleFactor();
         // On X11 the visuals do not change, and therefore we don't need
         // to reset the defaultConfig, config, doubleBufferVisuals,
         // neither do we need to reset the native data.
--- a/jdk/src/java.desktop/unix/native/common/awt/systemscale/systemScale.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/unix/native/common/awt/systemscale/systemScale.c	Wed Jul 05 22:13:53 2017 +0200
@@ -148,7 +148,7 @@
                         void *scale = fp_g_variant_get_child_value(entry, 1);
                         if (screen && scale) {
                             char *name = fp_g_variant_get_string(screen, NULL);
-                            if (name && strcmp(name, output_name)) {
+                            if (name && !strcmp(name, output_name)) {
                                 result = fp_g_variant_get_int32(scale) / 8.;
                             }
                             fp_g_variant_unref(screen);
--- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c	Wed Jul 05 22:13:53 2017 +0200
@@ -2181,7 +2181,8 @@
 JNIEXPORT jdouble JNICALL
 Java_sun_awt_X11GraphicsDevice_getNativeScaleFactor
     (JNIEnv *env, jobject this, jint screen) {
-    char *name = get_output_screen_name(env, screen);
+    // in case of Xinerama individual screen scales are not supported
+    char *name = get_output_screen_name(env, usingXinerama ? 0 : screen);
     double scale = getNativeScaleFactor(name);
     if (name) {
         free(name);
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/TranslucentWindowPainter.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/TranslucentWindowPainter.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -303,10 +303,10 @@
             if (bb instanceof DestSurfaceProvider) {
                 Surface s = ((DestSurfaceProvider)bb).getDestSurface();
                 if (s instanceof AccelSurface) {
-                    final int w = bb.getWidth(null);
-                    final int h = bb.getHeight(null);
                     final boolean arr[] = { false };
                     final AccelSurface as = (AccelSurface)s;
+                    final int w = as.getBounds().width;
+                    final int h = as.getBounds().height;
                     RenderQueue rq = as.getContext().getRenderQueue();
                     rq.lock();
                     try {
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java	Wed Jul 05 22:13:53 2017 +0200
@@ -478,9 +478,12 @@
         }
 
         DialogOwner dlgOwner = (DialogOwner)attributes.get(DialogOwner.class);
-        Frame ownerFrame = (dlgOwner != null) ? dlgOwner.getOwner() : null;
+        Window owner = (dlgOwner != null) ? dlgOwner.getOwner() : null;
 
-        WPrintDialog dialog = new WPrintDialog(ownerFrame, this);
+        WPrintDialog dialog =  (owner instanceof Frame) ?
+                new WPrintDialog((Frame)owner, this) :
+                new WPrintDialog((Dialog)owner, this);
+
         dialog.setRetVal(false);
         dialog.setVisible(true);
         boolean prv = dialog.getRetVal();
@@ -498,8 +501,9 @@
                 title = rb.getString("dialog.printtofile");
             } catch (MissingResourceException e) {
             }
-            FileDialog fileDialog = new FileDialog(ownerFrame, title,
-                                                   FileDialog.SAVE);
+            FileDialog fileDialog = (owner instanceof Frame) ?
+                    new FileDialog((Frame)owner, title, FileDialog.SAVE) :
+                    new FileDialog((Dialog)owner, title, FileDialog.SAVE);
 
             URI destURI = dest.getURI();
             // Old code destURI.getPath() would return null for "file:out.prn"
@@ -531,10 +535,17 @@
                    ((pFile != null) &&
                       (!pFile.exists() || (pFile.exists() && !pFile.canWrite())))) {
 
-                (new PrintToFileErrorDialog(ownerFrame,
+                if (owner instanceof Frame) {
+                    (new PrintToFileErrorDialog((Frame)owner,
                                 ServiceDialog.getMsg("dialog.owtitle"),
                                 ServiceDialog.getMsg("dialog.writeerror")+" "+fullName,
                                 ServiceDialog.getMsg("button.ok"))).setVisible(true);
+                } else {
+                    (new PrintToFileErrorDialog((Dialog)owner,
+                                ServiceDialog.getMsg("dialog.owtitle"),
+                                ServiceDialog.getMsg("dialog.writeerror")+" "+fullName,
+                                ServiceDialog.getMsg("button.ok"))).setVisible(true);
+                }
 
                 fileDialog.setVisible(true);
                 fileName = fileDialog.getFile();
--- a/jdk/src/java.desktop/windows/native/libawt/windows/ThemeReader.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/ThemeReader.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -753,10 +753,15 @@
 }
 
 void rescale(SIZE *size) {
-    HWND hWnd = ::GetDesktopWindow();
-    HDC hDC = ::GetDC(hWnd);
-    int dpiX = ::GetDeviceCaps(hDC, LOGPIXELSX);
-    int dpiY = ::GetDeviceCaps(hDC, LOGPIXELSY);
+    static int dpiX = -1;
+    static int dpiY = -1;
+    if (dpiX == -1 || dpiY == -1) {
+        HWND hWnd = ::GetDesktopWindow();
+        HDC hDC = ::GetDC(hWnd);
+        dpiX = ::GetDeviceCaps(hDC, LOGPIXELSX);
+        dpiY = ::GetDeviceCaps(hDC, LOGPIXELSY);
+        ::ReleaseDC(hWnd, hDC);
+    }
 
     if (dpiX !=0 && dpiX != 96) {
         float invScaleX = 96.0f / dpiX;
@@ -766,7 +771,6 @@
         float invScaleY = 96.0f / dpiY;
         size->cy = ROUND_TO_INT(size->cy * invScaleY);
     }
-    ::ReleaseDC(hWnd, hDC);
 }
 
 /*
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_DesktopProperties.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_DesktopProperties.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -88,11 +88,16 @@
 }
 
 void getInvScale(float &invScaleX, float &invScaleY) {
-    HWND hWnd = ::GetDesktopWindow();
-    HDC hDC = ::GetDC(hWnd);
-    int dpiX = ::GetDeviceCaps(hDC, LOGPIXELSX);
-    int dpiY = ::GetDeviceCaps(hDC, LOGPIXELSY);
-    ::ReleaseDC(hWnd, hDC);
+    static int dpiX = -1;
+    static int dpiY = -1;
+    if (dpiX == -1 || dpiY == -1) {
+        HWND hWnd = ::GetDesktopWindow();
+        HDC hDC = ::GetDC(hWnd);
+        dpiX = ::GetDeviceCaps(hDC, LOGPIXELSX);
+        dpiY = ::GetDeviceCaps(hDC, LOGPIXELSY);
+        ::ReleaseDC(hWnd, hDC);
+    }
+
     invScaleX = (dpiX == 0.0f) ? 1.0f : 96.0f / dpiX;
     invScaleY = (dpiY == 0.0f) ? 1.0f : 96.0f / dpiY;
 }
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Taskbar.cpp	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Taskbar.cpp	Wed Jul 05 22:13:53 2017 +0200
@@ -108,7 +108,7 @@
 JNIEXPORT void JNICALL Java_sun_awt_windows_WTaskbarPeer_flashWindow
   (JNIEnv *, jobject, jlong window)
 {
-    AwtWindow::FlashWindowEx((HWND) window, 3, 0, FLASHW_TIMERNOFG);
+    ::FlashWindow((HWND) window, TRUE);
 }
 
 /*
--- a/jdk/src/java.logging/share/classes/java/util/logging/Level.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.logging/share/classes/java/util/logging/Level.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,13 +24,22 @@
  */
 
 package java.util.logging;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Module;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Optional;
 import java.util.ResourceBundle;
+import java.util.function.Function;
+import jdk.internal.loader.ClassLoaderValue;
 
 /**
  * The Level class defines a set of standard logging levels that
@@ -177,6 +186,10 @@
      */
     public static final Level ALL = new Level("ALL", Integer.MIN_VALUE, defaultBundle);
 
+    private static final Level[] standardLevels = {
+        OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL
+    };
+
     /**
      * Create a named Level with a given integer value.
      * <p>
@@ -267,7 +280,8 @@
         // or its defining class loader, if it's unnamed module,
         // of this Level instance that can be a custom Level subclass;
         Module module = this.getClass().getModule();
-        ResourceBundle rb = ResourceBundle.getBundle(resourceBundleName, newLocale, module);
+        ResourceBundle rb = ResourceBundle.getBundle(resourceBundleName,
+                newLocale, module);
 
         final String localizedName = rb.getString(name);
         final boolean isDefaultBundle = defaultBundle.equals(resourceBundleName);
@@ -350,12 +364,12 @@
             throw new NullPointerException();
         }
 
-        KnownLevel level;
+        Optional<Level> level;
 
         // Look for a known Level with the given non-localized name.
-        level = KnownLevel.findByName(name);
-        if (level != null) {
-            return level.mirroredLevel;
+        level = KnownLevel.findByName(name, KnownLevel::mirrored);
+        if (level.isPresent()) {
+            return level.get();
         }
 
         // Now, check if the given name is an integer.  If so,
@@ -363,21 +377,24 @@
         // if necessary create one.
         try {
             int x = Integer.parseInt(name);
-            level = KnownLevel.findByValue(x);
-            if (level == null) {
+            level = KnownLevel.findByValue(x, KnownLevel::mirrored);
+            if (!level.isPresent()) {
                 // add new Level
                 Level levelObject = new Level(name, x);
-                level = KnownLevel.findByValue(x);
+                // There's no need to use a reachability fence here because
+                // KnownLevel keeps a strong reference on the level when
+                // level.getClass() == Level.class.
+                return KnownLevel.findByValue(x, KnownLevel::mirrored).get();
             }
-            return level.mirroredLevel;
         } catch (NumberFormatException ex) {
             // Not an integer.
             // Drop through.
         }
 
-        level = KnownLevel.findByLocalizedLevelName(name);
-        if (level != null) {
-            return level.mirroredLevel;
+        level = KnownLevel.findByLocalizedLevelName(name,
+                KnownLevel::mirrored);
+        if (level.isPresent()) {
+            return level.get();
         }
 
         return null;
@@ -408,15 +425,13 @@
     // Serialization magic to prevent "doppelgangers".
     // This is a performance optimization.
     private Object readResolve() {
-        KnownLevel o = KnownLevel.matches(this);
-        if (o != null) {
-            return o.levelObject;
+        Optional<Level> level = KnownLevel.matches(this);
+        if (level.isPresent()) {
+            return level.get();
         }
-
         // Woops.  Whoever sent us this object knows
         // about a new log level.  Add it to our list.
-        Level level = new Level(this.name, this.value, this.resourceBundleName);
-        return level;
+        return new Level(this.name, this.value, this.resourceBundleName);
     }
 
     /**
@@ -450,12 +465,12 @@
         // Check that name is not null.
         name.length();
 
-        KnownLevel level;
+        Optional<Level> level;
 
         // Look for a known Level with the given non-localized name.
-        level = KnownLevel.findByName(name);
-        if (level != null) {
-            return level.levelObject;
+        level = KnownLevel.findByName(name, KnownLevel::referent);
+        if (level.isPresent()) {
+            return level.get();
         }
 
         // Now, check if the given name is an integer.  If so,
@@ -463,13 +478,16 @@
         // if necessary create one.
         try {
             int x = Integer.parseInt(name);
-            level = KnownLevel.findByValue(x);
-            if (level == null) {
-                // add new Level
-                Level levelObject = new Level(name, x);
-                level = KnownLevel.findByValue(x);
+            level = KnownLevel.findByValue(x, KnownLevel::referent);
+            if (level.isPresent()) {
+                return level.get();
             }
-            return level.levelObject;
+            // add new Level.
+            Level levelObject = new Level(name, x);
+            // There's no need to use a reachability fence here because
+            // KnownLevel keeps a strong reference on the level when
+            // level.getClass() == Level.class.
+            return KnownLevel.findByValue(x, KnownLevel::referent).get();
         } catch (NumberFormatException ex) {
             // Not an integer.
             // Drop through.
@@ -478,9 +496,9 @@
         // Finally, look for a known level with the given localized name,
         // in the current default locale.
         // This is relatively expensive, but not excessively so.
-        level = KnownLevel.findByLocalizedLevelName(name);
-        if (level != null) {
-            return level.levelObject;
+        level = KnownLevel.findByLocalizedLevelName(name, KnownLevel::referent);
+        if (level .isPresent()) {
+            return level.get();
         }
 
         // OK, we've tried everything and failed
@@ -530,22 +548,67 @@
     // If Level.getName, Level.getLocalizedName, Level.getResourceBundleName methods
     // were final, the following KnownLevel implementation can be removed.
     // Future API change should take this into consideration.
-    static final class KnownLevel {
+    static final class KnownLevel extends WeakReference<Level> {
         private static Map<String, List<KnownLevel>> nameToLevels = new HashMap<>();
         private static Map<Integer, List<KnownLevel>> intToLevels = new HashMap<>();
-        final Level levelObject;     // instance of Level class or Level subclass
+        private static final ReferenceQueue<Level> QUEUE = new ReferenceQueue<>();
+
+        // CUSTOM_LEVEL_CLV is used to register custom level instances with
+        // their defining class loader, so that they are garbage collected
+        // if and only if their class loader is no longer strongly
+        // referenced.
+        private static final ClassLoaderValue<List<Level>> CUSTOM_LEVEL_CLV =
+                    new ClassLoaderValue<>();
+
         final Level mirroredLevel;   // mirror of the custom Level
         KnownLevel(Level l) {
-            this.levelObject = l;
+            super(l, QUEUE);
             if (l.getClass() == Level.class) {
                 this.mirroredLevel = l;
             } else {
                 // this mirrored level object is hidden
-                this.mirroredLevel = new Level(l.name, l.value, l.resourceBundleName, false);
+                this.mirroredLevel = new Level(l.name, l.value,
+                        l.resourceBundleName, false);
             }
         }
 
+        Optional<Level> mirrored() {
+            return Optional.of(mirroredLevel);
+        }
+
+        Optional<Level> referent() {
+            return Optional.ofNullable(get());
+        }
+
+        private void remove() {
+            Optional.ofNullable(nameToLevels.get(mirroredLevel.name))
+                    .ifPresent((x) -> x.remove(this));
+            Optional.ofNullable(intToLevels.get(mirroredLevel.value))
+                    .ifPresent((x) -> x.remove(this));
+        }
+
+        // Remove all stale KnownLevel instances
+        static synchronized void purge() {
+            Reference<? extends Level> ref;
+            while ((ref = QUEUE.poll()) != null) {
+                if (ref instanceof KnownLevel) {
+                    ((KnownLevel)ref).remove();
+                }
+            }
+        }
+
+        private static void registerWithClassLoader(Level customLevel) {
+            PrivilegedAction<ClassLoader> pa =
+                  () -> customLevel.getClass().getClassLoader();
+            PrivilegedAction<String> pn =  customLevel.getClass()::getName;
+            final String name = AccessController.doPrivileged(pn);
+            final ClassLoader cl = AccessController.doPrivileged(pa);
+            CUSTOM_LEVEL_CLV.computeIfAbsent(cl, (c, v) -> new ArrayList<>())
+                .add(customLevel);
+        }
+
         static synchronized void add(Level l) {
+            purge();
             // the mirroredLevel object is always added to the list
             // before the custom Level instance
             KnownLevel o = new KnownLevel(l);
@@ -562,24 +625,36 @@
                 intToLevels.put(l.value, list);
             }
             list.add(o);
+
+            // keep the custom level reachable from its class loader
+            // This will ensure that custom level values are not GC'ed
+            // until there class loader is GC'ed.
+            if (o.mirroredLevel != l) {
+                registerWithClassLoader(l);
+            }
+
         }
 
         // Returns a KnownLevel with the given non-localized name.
-        static synchronized KnownLevel findByName(String name) {
-            List<KnownLevel> list = nameToLevels.get(name);
-            if (list != null) {
-                return list.get(0);
-            }
-            return null;
+        static synchronized Optional<Level> findByName(String name,
+                Function<KnownLevel, Optional<Level>> selector) {
+            purge();
+            return nameToLevels.getOrDefault(name, Collections.emptyList())
+                        .stream()
+                        .map(selector)
+                        .flatMap(Optional::stream)
+                        .findFirst();
         }
 
         // Returns a KnownLevel with the given value.
-        static synchronized KnownLevel findByValue(int value) {
-            List<KnownLevel> list = intToLevels.get(value);
-            if (list != null) {
-                return list.get(0);
-            }
-            return null;
+        static synchronized Optional<Level> findByValue(int value,
+                Function<KnownLevel, Optional<Level>> selector) {
+            purge();
+            return intToLevels.getOrDefault(value, Collections.emptyList())
+                        .stream()
+                        .map(selector)
+                        .flatMap(Optional::stream)
+                        .findFirst();
         }
 
         // Returns a KnownLevel with the given localized name matching
@@ -587,32 +662,34 @@
         // from the resourceBundle associated with the Level object).
         // This method does not call Level.getLocalizedName() that may
         // be overridden in a subclass implementation
-        static synchronized KnownLevel findByLocalizedLevelName(String name) {
-            for (List<KnownLevel> levels : nameToLevels.values()) {
-                for (KnownLevel l : levels) {
-                    String lname = l.levelObject.getLocalizedLevelName();
-                    if (name.equals(lname)) {
-                        return l;
-                    }
-                }
-            }
-            return null;
+        static synchronized Optional<Level> findByLocalizedLevelName(String name,
+                Function<KnownLevel, Optional<Level>> selector) {
+            purge();
+            return nameToLevels.values().stream()
+                         .flatMap(List::stream)
+                         .map(selector)
+                         .flatMap(Optional::stream)
+                         .filter(l -> name.equals(l.getLocalizedLevelName()))
+                         .findFirst();
         }
 
-        static synchronized KnownLevel matches(Level l) {
+        static synchronized Optional<Level> matches(Level l) {
+            purge();
             List<KnownLevel> list = nameToLevels.get(l.name);
             if (list != null) {
-                for (KnownLevel level : list) {
-                    Level other = level.mirroredLevel;
+                for (KnownLevel ref : list) {
+                    Level levelObject = ref.get();
+                    if (levelObject == null) continue;
+                    Level other = ref.mirroredLevel;
                     if (l.value == other.value &&
                            (l.resourceBundleName == other.resourceBundleName ||
                                (l.resourceBundleName != null &&
                                 l.resourceBundleName.equals(other.resourceBundleName)))) {
-                        return level;
+                        return Optional.of(levelObject);
                     }
                 }
             }
-            return null;
+            return Optional.empty();
         }
     }
 
--- a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1707,25 +1707,6 @@
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
-    @SuppressWarnings("deprecation")
-    public ObjectInputStream deserialize(ObjectName name, byte[] data) throws InstanceNotFoundException,
-                                                                              OperationsException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @SuppressWarnings("deprecation")
-    public ObjectInputStream deserialize(String className, byte[] data) throws OperationsException,
-                                                                               ReflectionException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @SuppressWarnings("deprecation")
-    public ObjectInputStream deserialize(String className, ObjectName loaderName,
-            byte[] data) throws InstanceNotFoundException, OperationsException,
-                                ReflectionException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
     public ClassLoaderRepository getClassLoaderRepository() {
         throw new UnsupportedOperationException("Not supported yet.");
     }
--- a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/MBeanServerInterceptor.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/MBeanServerInterceptor.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -98,32 +98,6 @@
      * This method should never be called.
      * Usually throws UnsupportedOperationException.
      */
-    @Deprecated
-    public ObjectInputStream deserialize(ObjectName name, byte[] data)
-            throws InstanceNotFoundException, OperationsException;
-
-    /**
-     * This method should never be called.
-     * Usually throws UnsupportedOperationException.
-     */
-    @Deprecated
-    public ObjectInputStream deserialize(String className, byte[] data)
-            throws OperationsException, ReflectionException;
-
-    /**
-     * This method should never be called.
-     * Usually hrows UnsupportedOperationException.
-     */
-    @Deprecated
-    public ObjectInputStream deserialize(String className,
-            ObjectName loaderName, byte[] data)
-            throws InstanceNotFoundException, OperationsException,
-            ReflectionException;
-
-    /**
-     * This method should never be called.
-     * Usually throws UnsupportedOperationException.
-     */
     public ClassLoaderRepository getClassLoaderRepository();
 
 }
--- a/jdk/src/java.management/share/classes/javax/management/MBeanServer.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/java.management/share/classes/javax/management/MBeanServer.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -655,6 +655,8 @@
      * used for the de-serialization.
      * @param data The byte array to be de-sererialized.
      *
+     * @implSpec This method throws {@link UnsupportedOperationException} by default.
+     *
      * @return The de-serialized object stream.
      *
      * @exception InstanceNotFoundException The MBean specified is not
@@ -665,10 +667,11 @@
      * @deprecated Use {@link #getClassLoaderFor getClassLoaderFor} to
      * obtain the appropriate class loader for deserialization.
      */
-    @Deprecated
-    public ObjectInputStream deserialize(ObjectName name, byte[] data)
-            throws InstanceNotFoundException, OperationsException;
-
+    @Deprecated(since="1.5")
+    default public ObjectInputStream deserialize(ObjectName name, byte[] data)
+            throws InstanceNotFoundException, OperationsException {
+        throw new UnsupportedOperationException("Not supported.");
+    }
 
     /**
      * <p>De-serializes a byte array in the context of a given MBean
@@ -682,6 +685,8 @@
      * used for the de-serialization.
      * @param data The byte array to be de-sererialized.
      *
+     * @implSpec This method throws {@link UnsupportedOperationException} by default.
+     *
      * @return  The de-serialized object stream.
      *
      * @exception OperationsException Any of the usual Input/Output
@@ -692,9 +697,11 @@
      * @deprecated Use {@link #getClassLoaderRepository} to obtain the
      * class loader repository and use it to deserialize.
      */
-    @Deprecated
-    public ObjectInputStream deserialize(String className, byte[] data)
-            throws OperationsException, ReflectionException;
+    @Deprecated(since="1.5")
+    default public ObjectInputStream deserialize(String className, byte[] data)
+            throws OperationsException, ReflectionException {
+        throw new UnsupportedOperationException("Not supported.");
+    }
 
 
     /**
@@ -711,6 +718,8 @@
      * loading the specified class.  If null, the MBean Server's class
      * loader will be used.
      *
+     * @implSpec This method throws {@link UnsupportedOperationException} by default.
+     *
      * @return  The de-serialized object stream.
      *
      * @exception InstanceNotFoundException The specified class loader
@@ -723,12 +732,14 @@
      * @deprecated Use {@link #getClassLoader getClassLoader} to obtain
      * the class loader for deserialization.
      */
-    @Deprecated
-    public ObjectInputStream deserialize(String className,
+    @Deprecated(since="1.5")
+    default public ObjectInputStream deserialize(String className,
                                          ObjectName loaderName,
                                          byte[] data)
             throws InstanceNotFoundException, OperationsException,
-                   ReflectionException;
+                   ReflectionException {
+        throw new UnsupportedOperationException("Not supported.");
+    }
 
     /**
      * <p>Return the {@link java.lang.ClassLoader} that was used for
--- a/jdk/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java	Wed Jul 05 22:13:53 2017 +0200
@@ -308,10 +308,6 @@
 
     //-- native methods
 
-    static native boolean isLinuxThreads();
-
-    static native int getLinuxThreadsManager(int pid) throws IOException;
-
     static native void sendQuitToChildrenOf(int pid) throws IOException;
 
     static native void sendQuitTo(int pid) throws IOException;
--- a/jdk/src/jdk.attach/linux/native/libattach/VirtualMachineImpl.c	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.attach/linux/native/libattach/VirtualMachineImpl.c	Wed Jul 05 22:13:53 2017 +0200
@@ -195,113 +195,6 @@
 }
 
 /*
- * Class:     sun_tools_attach_VirtualMachineImpl
- * Method:    isLinuxThreads
- * Signature: ()V
- */
-JNIEXPORT jboolean JNICALL Java_sun_tools_attach_VirtualMachineImpl_isLinuxThreads
-  (JNIEnv *env, jclass cls)
-{
-# ifndef _CS_GNU_LIBPTHREAD_VERSION
-# define _CS_GNU_LIBPTHREAD_VERSION 3
-# endif
-    size_t n;
-    char* s;
-    jboolean res;
-
-    n = confstr(_CS_GNU_LIBPTHREAD_VERSION, NULL, 0);
-    if (n <= 0) {
-       /* glibc before 2.3.2 only has LinuxThreads */
-       return JNI_TRUE;
-    }
-
-    s = (char *)malloc(n);
-    if (s == NULL) {
-        JNU_ThrowOutOfMemoryError(env, "malloc failed");
-        return JNI_TRUE;
-    }
-    confstr(_CS_GNU_LIBPTHREAD_VERSION, s, n);
-
-    /*
-     * If the LIBPTHREAD version include "NPTL" then we know we
-     * have the new threads library and not LinuxThreads
-     */
-    res = (jboolean)(strstr(s, "NPTL") == NULL);
-    free(s);
-    return res;
-}
-
-/*
- * Structure and callback function used to count the children of
- * a given process, and record the pid of the "manager thread".
- */
-typedef struct {
-    pid_t ppid;
-    int count;
-    pid_t mpid;
-} ChildCountContext;
-
-static void ChildCountCallback(const pid_t pid, void* user_data) {
-    ChildCountContext* context = (ChildCountContext*)user_data;
-    if (getParent(pid) == context->ppid) {
-        context->count++;
-        /*
-         * Remember the pid of the first child. If the final count is
-         * one then this is the pid of the LinuxThreads manager.
-         */
-        if (context->count == 1) {
-            context->mpid = pid;
-        }
-    }
-}
-
-/*
- * Class:     sun_tools_attach_VirtualMachineImpl
- * Method:    getLinuxThreadsManager
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_sun_tools_attach_VirtualMachineImpl_getLinuxThreadsManager
-  (JNIEnv *env, jclass cls, jint pid)
-{
-    ChildCountContext context;
-
-    /*
-     * Iterate over all processes to find how many children 'pid' has
-     */
-    context.ppid = pid;
-    context.count = 0;
-    context.mpid = (pid_t)0;
-    forEachProcess(ChildCountCallback, (void*)&context);
-
-    /*
-     * If there's no children then this is likely the pid of the primordial
-     * created by the launcher - in that case the LinuxThreads manager is the
-     * parent of this process.
-     */
-    if (context.count == 0) {
-        pid_t parent = getParent(pid);
-        if ((int)parent > 0) {
-            return (jint)parent;
-        }
-    }
-
-    /*
-     * There's one child so this is likely the embedded VM case where the
-     * the primordial thread == LinuxThreads initial thread. The LinuxThreads
-     * manager in that case is the child.
-     */
-    if (context.count == 1) {
-        return (jint)context.mpid;
-    }
-
-    /*
-     * If we get here it's most likely we were given the wrong pid
-     */
-    JNU_ThrowIOException(env, "Unable to get pid of LinuxThreads manager thread");
-    return -1;
-}
-
-/*
  * Structure and callback function used to send a QUIT signal to all
  * children of a given process
  */
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java	Wed Jul 05 22:13:53 2017 +0200
@@ -993,32 +993,39 @@
         return minorVersion;
     }
 
-    private void getConstantPoolInfo() {
+    private byte[] getConstantPoolInfo() {
         JDWP.ReferenceType.ConstantPool jdwpCPool;
         if (!vm.canGetConstantPool()) {
             throw new UnsupportedOperationException();
         }
         if (constantPoolInfoGotten) {
-            return;
-        } else {
-            try {
-                jdwpCPool = JDWP.ReferenceType.ConstantPool.process(vm, this);
-            } catch (JDWPException exc) {
-                if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
-                    constanPoolCount = 0;
-                    constantPoolBytesRef = null;
-                    constantPoolInfoGotten = true;
-                    return;
-                } else {
-                    throw exc.toJDIException();
-                }
+            if (constantPoolBytesRef == null) {
+                return null;
+            }
+            byte[] cpbytes = constantPoolBytesRef.get();
+            if (cpbytes != null) {
+                return cpbytes;
             }
-            byte[] cpbytes;
-            constanPoolCount = jdwpCPool.count;
-            cpbytes = jdwpCPool.bytes;
-            constantPoolBytesRef = new SoftReference<byte[]>(cpbytes);
-            constantPoolInfoGotten = true;
         }
+
+        try {
+            jdwpCPool = JDWP.ReferenceType.ConstantPool.process(vm, this);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
+                constanPoolCount = 0;
+                constantPoolBytesRef = null;
+                constantPoolInfoGotten = true;
+                return null;
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+        byte[] cpbytes;
+        constanPoolCount = jdwpCPool.count;
+        cpbytes = jdwpCPool.bytes;
+        constantPoolBytesRef = new SoftReference<byte[]>(cpbytes);
+        constantPoolInfoGotten = true;
+        return cpbytes;
     }
 
     public int constantPoolCount() {
@@ -1031,13 +1038,13 @@
     }
 
     public byte[] constantPool() {
+        byte[] cpbytes;
         try {
-            getConstantPoolInfo();
+            cpbytes = getConstantPoolInfo();
         } catch (RuntimeException exc) {
             throw exc;
         }
-        if (constantPoolBytesRef != null) {
-            byte[] cpbytes = constantPoolBytesRef.get();
+        if (cpbytes != null) {
             /*
              * Arrays are always modifiable, so it is a little unsafe
              * to return the cached bytecodes directly; instead, we
--- a/jdk/src/jdk.jdi/share/classes/module-info.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.jdi/share/classes/module-info.java	Wed Jul 05 22:13:53 2017 +0200
@@ -25,6 +25,7 @@
 
 module jdk.jdi {
     requires jdk.attach;
+    requires jdk.jdwp.agent;
 
     exports com.sun.jdi;
     exports com.sun.jdi.connect;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Wed Jul 05 22:13:53 2017 +0200
@@ -55,6 +55,7 @@
 import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
+import java.util.stream.Collectors;
 import jdk.tools.jlink.internal.BasicImageWriter;
 import jdk.tools.jlink.internal.plugins.FileCopierPlugin.SymImageFile;
 import jdk.tools.jlink.internal.ExecutableImage;
@@ -159,7 +160,7 @@
             }
             i++;
         }
-        props.setProperty("MODULES", builder.toString());
+        props.setProperty("MODULES", quote(builder.toString()));
     }
 
     @Override
@@ -188,7 +189,8 @@
 
             storeFiles(modules, release);
 
-            if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
+            if (root.getFileSystem().supportedFileAttributeViews()
+                    .contains("posix")) {
                 // launchers in the bin directory need execute permission.
                 // On Windows, "bin" also subdirectories containing jvm.dll.
                 if (Files.isDirectory(bin)) {
@@ -217,19 +219,38 @@
         }
     }
 
+    // Parse version string and return a string that includes only version part
+    // leaving "pre", "build" information. See also: java.lang.Runtime.Version.
+    private static String parseVersion(String str) {
+        return Runtime.Version.parse(str).
+            version().
+            stream().
+            map(Object::toString).
+            collect(Collectors.joining("."));
+    }
+
+    private static String quote(String str) {
+        return "\"" + str + "\"";
+    }
+
     private Properties releaseProperties(ResourcePool pool) throws IOException {
         Properties props = new Properties();
         Optional<ResourcePoolModule> javaBase = pool.moduleView().findModule("java.base");
         javaBase.ifPresent(mod -> {
             // fill release information available from transformed "java.base" module!
             ModuleDescriptor desc = mod.descriptor();
-            desc.osName().ifPresent(s -> props.setProperty("OS_NAME", s));
-            desc.osVersion().ifPresent(s -> props.setProperty("OS_VERSION", s));
-            desc.osArch().ifPresent(s -> props.setProperty("OS_ARCH", s));
-            props.setProperty("JAVA_VERSION", System.getProperty("java.version"));
+            desc.osName().ifPresent(s -> {
+                props.setProperty("OS_NAME", quote(s));
+                this.targetOsName = s;
+            });
+            desc.osVersion().ifPresent(s -> props.setProperty("OS_VERSION", quote(s)));
+            desc.osArch().ifPresent(s -> props.setProperty("OS_ARCH", quote(s)));
+            desc.version().ifPresent(s -> props.setProperty("JAVA_VERSION",
+                    quote(parseVersion(s.toString()))));
+            desc.version().ifPresent(s -> props.setProperty("JAVA_FULL_VERSION",
+                    quote(s.toString())));
         });
 
-        this.targetOsName = props.getProperty("OS_NAME");
         if (this.targetOsName == null) {
             throw new PluginException("TargetPlatform attribute is missing for java.base module");
         }
@@ -282,8 +303,8 @@
                         StandardOpenOption.CREATE_NEW)) {
                     writer.write(sb.toString());
                 }
-                if (Files.getFileStore(root.resolve("bin"))
-                        .supportsFileAttributeView(PosixFileAttributeView.class)) {
+                if (root.resolve("bin").getFileSystem()
+                        .supportedFileAttributeViews().contains("posix")) {
                     setExecutable(cmd);
                 }
                 // generate .bat file for Windows
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/ext/CurrencyNames_be_BY.properties	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/ext/CurrencyNames_be_BY.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -35,4 +35,5 @@
 # This notice and attribution to Taligent may not be removed.
 # Taligent is a registered trademark of Taligent, Inc.
 
+BYN=\u0420\u0443\u0431
 BYR=\u0420\u0443\u0431
--- a/jdk/src/jdk.rmic/share/classes/sun/tools/javac/resources/javac.properties	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/src/jdk.rmic/share/classes/sun/tools/javac/resources/javac.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -265,8 +265,6 @@
 	No constructor matching {0} found in {1}.
 javac.err.wrong.number.args=\
 	Wrong number of arguments in {0}.
-javac.err.wrong.number.args=\
-	Wrong number of arguments in {0}.
 javac.err.forward.ref=\
 	Can''t make forward reference to {0} in {1}.
 javac.err.array.dim.missing=\
--- a/jdk/test/ProblemList.txt	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 22:13:53 2017 +0200
@@ -159,7 +159,6 @@
 
 # jdk_net
 
-
 java/net/MulticastSocket/NoLoopbackPackets.java                 7122846 macosx-all
 java/net/MulticastSocket/SetLoopbackMode.java                   7122846 macosx-all
 
@@ -217,66 +216,6 @@
 
 sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java      8026393 generic-all
 
-sun/security/pkcs11/Cipher/ReinitCipher.java                    8077138,8023434 windows-all
-sun/security/pkcs11/Cipher/TestPKCS5PaddingError.java           8077138,8023434 windows-all
-sun/security/pkcs11/Cipher/TestRSACipher.java                   8077138,8023434 windows-all
-sun/security/pkcs11/Cipher/TestRSACipherWrap.java               8077138,8023434 windows-all
-sun/security/pkcs11/Cipher/TestRawRSACipher.java                8077138,8023434 windows-all
-sun/security/pkcs11/Cipher/TestSymmCiphers.java                 8077138,8023434 windows-all
-sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java            8077138,8023434 windows-all
-sun/security/pkcs11/KeyAgreement/TestDH.java                    8077138,8023434 windows-all
-sun/security/pkcs11/KeyAgreement/TestInterop.java               8077138,8023434 windows-all
-sun/security/pkcs11/KeyAgreement/TestShort.java                 8077138,8023434 windows-all
-sun/security/pkcs11/KeyAgreement/SupportedDHKeys.java           8077138 windows-all
-sun/security/pkcs11/KeyAgreement/UnsupportedDHKeys.java         8077138 windows-all
-sun/security/pkcs11/KeyGenerator/DESParity.java                 8077138,8023434 windows-all
-sun/security/pkcs11/KeyGenerator/TestKeyGenerator.java          8077138,8023434 windows-all
-sun/security/pkcs11/KeyPairGenerator/TestDH2048.java            8077138,8023434 windows-all
-sun/security/pkcs11/KeyStore/SecretKeysBasic.sh                 8077138,8023434 windows-all
-sun/security/pkcs11/Mac/MacKAT.java                             8077138,8023434 windows-all
-sun/security/pkcs11/Mac/MacSameTest.java                        8077138,8023434 windows-all
-sun/security/pkcs11/Mac/ReinitMac.java                          8077138,8023434 windows-all
-sun/security/pkcs11/MessageDigest/ByteBuffers.java              8077138,8023434 windows-all
-sun/security/pkcs11/MessageDigest/DigestKAT.java                8077138,8023434 windows-all
-sun/security/pkcs11/MessageDigest/ReinitDigest.java             8077138,8023434 windows-all
-sun/security/pkcs11/MessageDigest/TestCloning.java              8077138,8023434 windows-all
-sun/security/pkcs11/Provider/ConfigQuotedString.sh              8077138,8023434 windows-all
-sun/security/pkcs11/Provider/Login.sh                           8077138,8023434 windows-all
-sun/security/pkcs11/SampleTest.java                             8077138,8023434 windows-all
-sun/security/pkcs11/Secmod/AddPrivateKey.java                   8077138,8023434 windows-all
-sun/security/pkcs11/Secmod/AddTrustedCert.java                  8077138,8023434 windows-all
-sun/security/pkcs11/Secmod/Crypto.java                          8077138,8023434 windows-all
-sun/security/pkcs11/Secmod/GetPrivateKey.java                   8077138,8023434 windows-all
-sun/security/pkcs11/Secmod/JksSetPrivateKey.java                8077138,8023434 windows-all
-sun/security/pkcs11/Secmod/LoadKeystore.java                    8077138,8023434 windows-all
-sun/security/pkcs11/SecureRandom/Basic.java                     8077138,8023434 windows-all
-sun/security/pkcs11/SecureRandom/TestDeserialization.java       8077138,8023434 windows-all
-sun/security/pkcs11/Serialize/SerializeProvider.java            8077138,8023434 windows-all
-sun/security/pkcs11/Signature/ByteBuffers.java                  8077138,8023434 windows-all
-sun/security/pkcs11/Signature/ReinitSignature.java              8077138,8023434 windows-all
-sun/security/pkcs11/Signature/TestDSA.java                      8077138,8023434 windows-all
-sun/security/pkcs11/Signature/TestDSAKeyLength.java             8077138,8023434 windows-all
-sun/security/pkcs11/Signature/TestRSAKeyLength.java             8077138,8023434 windows-all
-sun/security/pkcs11/ec/ReadCertificates.java                    8077138,8023434 windows-all
-sun/security/pkcs11/ec/ReadPKCS12.java                          8077138,8023434 windows-all
-sun/security/pkcs11/ec/TestCurves.java                          8077138,8023434 windows-all
-sun/security/pkcs11/ec/TestECDH.java                            8077138,8023434 windows-all
-sun/security/pkcs11/ec/TestECDH2.java                           8077138,8023434 windows-all
-sun/security/pkcs11/ec/TestECDSA.java                           8077138,8023434 windows-all
-sun/security/pkcs11/ec/TestECDSA2.java                          8077138,8023434 windows-all
-sun/security/pkcs11/ec/TestECGenSpec.java                       8077138,8023434 windows-all
-sun/security/pkcs11/rsa/KeyWrap.java                            8077138,8023434 windows-all
-sun/security/pkcs11/rsa/TestCACerts.java                        8077138,8023434 windows-all
-sun/security/pkcs11/rsa/TestKeyFactory.java                     8077138,8023434 windows-all
-sun/security/pkcs11/rsa/TestKeyPairGenerator.java               8077138,8023434 windows-all
-sun/security/pkcs11/rsa/TestSignatures.java                     8077138,8023434 windows-all
-sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java            8077138,8023434 windows-all
-sun/security/pkcs11/tls/TestKeyMaterial.java                    8077138,8023434 windows-all
-sun/security/pkcs11/tls/TestLeadingZeroesP11.java               8077138,8023434 windows-all
-sun/security/pkcs11/tls/TestMasterSecret.java                   8077138,8023434 windows-all
-sun/security/pkcs11/tls/TestPRF.java                            8077138,8023434 windows-all
-sun/security/pkcs11/tls/TestPremaster.java                      8077138,8023434 windows-all
-
 sun/security/krb5/auto/HttpNegotiateServer.java                 8038079 generic-all
 
 sun/security/ssl/SSLSocketImpl/AsyncSSLSocketClose.java         8161232 macosx-all
@@ -312,8 +251,6 @@
 
 tools/launcher/FXLauncherTest.java                              8068049 linux-all,macosx-all
 
-tools/pack200/Pack200Props.java                                 8155857 generic-all
-
 ############################################################################
 
 # jdk_jdi
@@ -328,9 +265,6 @@
 
 com/sun/jdi/sde/SourceDebugExtensionTest.java                   8158066 windows-all
 
-com/sun/jdi/ClassesByName2Test.java				8160833 generic-all
-com/sun/jdi/RedefineCrossEvent.java				8160833 generic-all
-
 ############################################################################
 
 # jdk_time
@@ -357,9 +291,11 @@
 
 sun/tools/jhsdb/BasicLauncherTest.java                          8160376 macosx-all
 
+sun/tools/jhsdb/HeapDumpTest.java                               8160376 macosx-all
+
 sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java              8160376 macosx-all
 
-sun/tools/jps/TestJpsJar.java                                   8160923 generic-all
+sun/tools/jps/TestJpsJar.java                                   8165500 generic-all
 
 sun/tools/jps/TestJpsJarRelative.java                           6456333 generic-all
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jdi/ConstantPoolInfoGC.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ *  @test
+ *  @bug 6822627
+ *  @summary Test that ReferenceType.constantPool does not produce an NPE
+ *
+ *  @author Egor Ushakov
+ *
+ *  @modules jdk.jdi/com.sun.tools.jdi
+ *  @run build TestScaffold VMConnection
+ *  @run compile -g ConstantPoolInfoGC.java
+ *  @run main/othervm ConstantPoolInfoGC
+ */
+
+import com.sun.jdi.ReferenceType;
+import com.sun.tools.jdi.ReferenceTypeImpl;
+
+import java.lang.ref.Reference;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+
+    /********** target program **********/
+
+class ConstantPoolGCTarg {
+    public static void main(String[] args){
+        System.out.println("Anything");
+    }
+}
+
+    /********** test program **********/
+
+public class ConstantPoolInfoGC extends TestScaffold {
+    ReferenceType targetClass;
+
+    ConstantPoolInfoGC(String args[]) {
+        super(args);
+    }
+
+    public static void main(String[] args)      throws Exception {
+        new ConstantPoolInfoGC(args).startTests();
+    }
+
+    /********** test core **********/
+
+    protected void runTests() throws Exception {
+        targetClass = startToMain("ConstantPoolGCTarg").location().declaringType();
+
+        if (vm().canGetConstantPool()) {
+            byte[] cpbytes = targetClass.constantPool();
+
+            // imitate SoftReference cleared
+            Field constantPoolBytesRef = ReferenceTypeImpl.class.getDeclaredField("constantPoolBytesRef");
+            constantPoolBytesRef.setAccessible(true);
+            Reference softRef = (Reference) constantPoolBytesRef.get(targetClass);
+            softRef.clear();
+
+            byte[] cpbytes2 = targetClass.constantPool();
+            if (!Arrays.equals(cpbytes, cpbytes2)) {
+                failure("Consequent constantPool results vary, first was : " + cpbytes + ", now: " + cpbytes2);
+            };
+
+        } else {
+            System.out.println("can get constant pool version not supported");
+        }
+
+
+        /*
+         * resume until end
+         */
+        listenUntilVMDisconnect();
+
+        /*
+         * deal with results of test
+         * if anything has called failure("foo") testFailed will be true
+         */
+        if (!testFailed) {
+            println("ConstantPoolInfoGC: passed");
+        } else {
+            throw new Exception("ConstantPoolInfoGC: failed");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/ModalDialogActivationTest/ModalDialogActivationTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/*
+  @test
+  @bug       8160570
+  @summary   Tests that a modal dialog receives WINDOW_ACTIVATED & WINDOW_GAINED_FOCUS on first show.
+*/
+public class ModalDialogActivationTest {
+    static final Object lock = new Object();
+    static volatile boolean activated;
+    static volatile boolean focused;
+
+    public static void main(String[] args) throws InterruptedException {
+        EventQueue.invokeLater(() -> runGUI());
+
+        long time = System.currentTimeMillis();
+        synchronized (lock) {
+            while (!activated || !focused) {
+                lock.wait(5000);
+                if (System.currentTimeMillis() - time >= 5000) break;
+            }
+        }
+        if (!activated || !focused) {
+            throw new RuntimeException("Test FAILED: activated: " + activated + ", focused: " + focused);
+        }
+        System.out.println("Test PASSED");
+    }
+
+    static void runGUI() {
+        JFrame f = new JFrame("frame");
+        final JDialog d = new MyModalDialog(f, "dialog");
+        d.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowActivated(WindowEvent e) {
+                synchronized (lock) {
+                    activated = true;
+                    lock.notifyAll();
+                }
+            }
+        });
+        d.addWindowFocusListener(new WindowAdapter() {
+            @Override
+            public void windowGainedFocus(WindowEvent e) {
+                synchronized (lock) {
+                    focused = true;
+                    lock.notifyAll();
+                }
+            }
+        });
+        f.setVisible(true);
+        d.setVisible(true);
+    }
+
+    static class MyModalDialog extends JDialog {
+        public MyModalDialog(Frame owner, String title)ª {
+            super(owner, title, true);
+        }
+
+        @Override
+        public boolean getFocusableWindowState() {
+            try {
+                // let Toolkit thread go ahead
+                Thread.sleep(100);
+            } catch (InterruptedException ignore) {
+            }
+            return super.getFocusableWindowState();
+        }
+    }
+}
--- a/jdk/test/java/awt/Focus/SortingFPT/JDK8048887.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/awt/Focus/SortingFPT/JDK8048887.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
   @test
-  @bug       8048887
+  @bug       8048887 8164937
   @summary   Tests SortingFTP for an exception caused by the tim-sort algo.
   @author    anton.tarasov: area=awt.focus
   @run       main JDK8048887
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Mouse/EnterExitEvents/ModalDialogEnterExitEventsTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @key headful
+ * @bug 8050478
+ * @summary Cursor not updating correctly after closing a modal dialog.
+ *    The root cause of the issue was the lack of a mouse exit event
+ *    during displaying of a modal dialog.
+ * @author Dmitry Markov
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main ModalDialogEnterExitEventsTest
+ */
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import test.java.awt.regtesthelpers.Util;
+
+public class ModalDialogEnterExitEventsTest {
+    private static volatile AtomicInteger mouseEnterCount = new AtomicInteger();
+    private static volatile AtomicInteger mouseExitCount = new AtomicInteger();
+
+    private static JFrame frame;
+    private static JButton openButton;
+    private static JButton closeButton;
+
+    public static void main(String[] args) {
+        Robot robot = Util.createRobot();
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+        Util.waitForIdle(robot);
+
+        Util.clickOnComp(frame, robot, 500);
+        Util.waitForIdle(robot);
+
+        mouseEnterCount.set(0);
+        mouseExitCount.set(0);
+
+        Util.clickOnComp(openButton, robot, 500);
+        Util.waitForIdle(robot);
+        if (mouseExitCount.get() != 1) {
+            throw new RuntimeException("Test FAILED. Wrong number of MouseExited events = " + mouseExitCount.get());
+        }
+
+        Util.clickOnComp(closeButton, robot, 500);
+        Util.waitForIdle(robot);
+        if (mouseEnterCount.get() != 1) {
+            throw new RuntimeException("Test FAILED. Wrong number of MouseEntered events = "+ mouseEnterCount.get());
+        }
+    }
+
+    private static void createAndShowGUI() {
+        frame = new JFrame("ModalDialogEnterExitEventsTest");
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setLayout(new FlowLayout());
+        frame.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseExited(MouseEvent e) {
+                mouseExitCount.getAndIncrement();
+            }
+
+            @Override
+            public void mouseEntered(MouseEvent e) {
+                mouseEnterCount.getAndIncrement();
+            }
+        });
+        openButton = new JButton("Open Dialog");
+        openButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JDialog dialog = new JDialog(frame, "Modal Dialog", true);
+                dialog.setLayout(new FlowLayout());
+                closeButton = new JButton("Close");
+                closeButton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        dialog.dispose();
+                    }
+                });
+                dialog.add(closeButton);
+                dialog.setSize(200, 200);
+                dialog.setLocationRelativeTo(null);
+                dialog.setVisible(true);
+            }
+        });
+        frame.add(openButton);
+        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
+        frame.setVisible(true);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/GlyphVector/GetGlyphCharIndexTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @summary Test getGlyphCharIndex() results from layout
+ * @bug 8152680
+ */
+
+import java.awt.Font;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+
+public class GetGlyphCharIndexTest {
+    public static void main(String[] args) {
+        Font font = new Font(Font.MONOSPACED, Font.PLAIN, 12);
+        FontRenderContext frc = new FontRenderContext(null, false, false);
+        GlyphVector gv = font.layoutGlyphVector(frc, "abc".toCharArray(), 1, 3,
+                                                Font.LAYOUT_LEFT_TO_RIGHT);
+        int idx0 = gv.getGlyphCharIndex(0);
+        if (idx0 != 0) {
+           throw new RuntimeException("Expected 0, got " + idx0);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/LineBreakMeasurer/TestLineBreakWithFontSub.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 4175418 8158924
+ * @author John Raley
+ * @summary This insures that bug 4175418: Font substitution in TextLayout /
+ * LineBreakMeasurer is inconsistent has been fixed.  The problem was
+ * that text was measured in one Font, but lines were produced
+ * in a different font.
+ */
+
+/*
+ * (C) Copyright IBM Corp. 1999, All Rights Reserved
+ */
+
+import java.text.AttributedString;
+import java.awt.font.LineBreakMeasurer;
+import java.awt.font.TextLayout;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextAttribute;
+
+/**
+ * This insures that bug 4175418: Font substitution in TextLayout /
+ * LineBreakMeasurer is inconsistent has been fixed.  The problem was
+ * that text was measured in one Font, but lines were produced
+ * in a different font.  One symptom of this problem is that lines are
+ * either too short or too long.  This test line-breaks a paragraph
+ * and checks the line lengths to make sure breaks were chosen well.
+ * This can be checked because the paragraph is so simple.
+ */
+public class TestLineBreakWithFontSub {
+
+    public static void main(String[] args) {
+
+        new TestLineBreakWithFontSub().test();
+        System.out.println("Line break / font substitution test PASSED");
+    }
+
+    private static final String WORD = "word";
+    private static final String SPACING = " ";
+    // The Hebrew character in this string can trigger font substitution
+    private static final String MIXED = "A\u05D0";
+
+    private static final int NUM_WORDS = 12;
+
+    private static final FontRenderContext DEFAULT_FRC =
+                            new FontRenderContext(null, false, false);
+
+    public void test() {
+
+        // construct a paragraph as follows: MIXED + [SPACING + WORD] + ...
+        StringBuffer text = new StringBuffer(MIXED);
+        for (int i=0; i < NUM_WORDS; i++) {
+            text.append(SPACING);
+            text.append(WORD);
+        }
+
+        AttributedString attrString = new AttributedString(text.toString());
+        attrString.addAttribute(TextAttribute.SIZE, new Float(24.0));
+
+        LineBreakMeasurer measurer = new LineBreakMeasurer(attrString.getIterator(),
+                                                           DEFAULT_FRC);
+
+        // get width of a space-word sequence, in context
+        int sequenceLength = WORD.length()+SPACING.length();
+        measurer.setPosition(text.length() - sequenceLength);
+
+        TextLayout layout = measurer.nextLayout(10000.0f);
+
+        if (layout.getCharacterCount() != sequenceLength) {
+            throw new Error("layout length is incorrect!");
+        }
+
+        final float sequenceAdvance = layout.getVisibleAdvance();
+
+        float wrappingWidth = sequenceAdvance * 2;
+
+        // now run test with a variety of widths
+        while (wrappingWidth < (sequenceAdvance*NUM_WORDS)) {
+            measurer.setPosition(0);
+            checkMeasurer(measurer,
+                          wrappingWidth,
+                          sequenceAdvance,
+                          text.length());
+            wrappingWidth += sequenceAdvance / 5;
+        }
+    }
+
+    /**
+     * Iterate through measurer and check that every line is
+     * not too long and not too short, but just right.
+     */
+    private void checkMeasurer(LineBreakMeasurer measurer,
+                               float wrappingWidth,
+                               float sequenceAdvance,
+                               int endPosition) {
+
+        do {
+            TextLayout layout = measurer.nextLayout(wrappingWidth);
+            float visAdvance = layout.getVisibleAdvance();
+
+            // Check that wrappingWidth-sequenceAdvance < visAdvance
+            // Also, if we're not at the end of the paragraph,
+            // check that visAdvance <= wrappingWidth
+
+            if (visAdvance > wrappingWidth) {
+                // line is too long for given wrapping width
+                throw new Error("layout is too long");
+            }
+
+            if (measurer.getPosition() < endPosition) {
+                if (visAdvance <= wrappingWidth - sequenceAdvance) {
+                    // line is too short for given wrapping width;
+                    // another word would have fit
+                    throw new Error("room for more words on line.  diff=" +
+                                    (wrappingWidth - sequenceAdvance - visAdvance));
+                }
+            }
+        } while (measurer.getPosition() != endPosition);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/TextLayout/LigatureCaretTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 4178145 8144015
+*/
+
+/*
+ * Copyright 1998 IBM Corp.  All Rights Reserved.
+ */
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.font.TextAttribute;
+import java.awt.font.TextLayout;
+import java.awt.font.TextHitInfo;
+import java.awt.font.FontRenderContext;
+import java.util.Hashtable;
+
+/**
+ * This test ensures that TextLayout will not place a caret within
+ * an Arabic lam-alef ligature, and will correctly caret through
+ * bidirectional text with numbers.
+ */
+
+public class LigatureCaretTest {
+
+    public static void main(String[] args) {
+
+        //testBidiWithNumbers();
+        testLamAlef();
+        System.out.println("LigatureCaretTest PASSED");
+    }
+
+    // These values are for TextLayout constructors
+    private static final Hashtable map = new Hashtable();
+    static {
+      map.put(TextAttribute.FONT, new Font("Lucida Sans", Font.PLAIN, 24));
+    }
+    private static final FontRenderContext frc =
+                                new FontRenderContext(null, false, false);
+
+    /**
+     * Caret through text mixed-direction text and check the results.
+     * If the test fails an Error is thrown.
+     * @exception an Error is thrown if the test fails
+     */
+    public static void testBidiWithNumbers() {
+
+        String bidiWithNumbers = "abc\u05D0\u05D1\u05D2123abc";
+        // visual order for the text:
+        // abc123<gimel><bet><aleph>abc
+
+        int[] carets = { 0, 1, 2, 3, 7, 8, 6, 5, 4, 9, 10, 11, 12 };
+        TextLayout layout = new TextLayout(bidiWithNumbers, map, frc);
+
+        // Caret through TextLayout in both directions and check results.
+        for (int i=0; i < carets.length-1; i++) {
+
+            TextHitInfo hit = layout.getNextRightHit(carets[i]);
+            if (hit.getInsertionIndex() != carets[i+1]) {
+                throw new Error("right hit failed within layout");
+            }
+        }
+
+        if (layout.getNextRightHit(carets[carets.length-1]) != null) {
+            throw new Error("right hit failed at end of layout");
+        }
+
+        for (int i=carets.length-1; i > 0; i--) {
+
+            TextHitInfo hit = layout.getNextLeftHit(carets[i]);
+            if (hit.getInsertionIndex() != carets[i-1]) {
+                throw new Error("left hit failed within layout");
+            }
+        }
+
+        if (layout.getNextLeftHit(carets[0]) != null) {
+            throw new Error("left hit failed at end of layout");
+        }
+    }
+
+    /**
+     * Ensure proper careting and hit-testing behavior with
+     * a lam-alef ligature.
+     * If the test fails, an Error is thrown.
+     * @exception an Error is thrown if the test fails
+     */
+    public static void testLamAlef() {
+
+        // lam-alef form a mandantory ligature.
+        final String lamAlef = "\u0644\u0627";
+        final String ltrText = "abcd";
+
+        // Create a TextLayout with just a lam-alef sequence.  There
+        // should only be two valid caret positions:  one at
+        // insertion offset 0 and the other at insertion offset 2.
+        TextLayout layout = new TextLayout(lamAlef, map, frc);
+
+        TextHitInfo hit;
+
+        hit = layout.getNextLeftHit(0);
+        if (hit.getInsertionIndex() != 2) {
+            throw new Error("Left hit failed.  Hit:" + hit);
+        }
+
+        hit = layout.getNextRightHit(2);
+        if (hit.getInsertionIndex() != 0) {
+            throw new Error("Right hit failed.  Hit:" + hit);
+        }
+
+        hit = layout.hitTestChar(layout.getAdvance()/2, 0);
+        if (hit.getInsertionIndex() != 0 && hit.getInsertionIndex() != 2) {
+            throw new Error("Hit-test allowed incorrect caret.  Hit:" + hit);
+        }
+
+
+        // Create a TextLayout with some left-to-right text
+        // before the lam-alef sequence.  There should not be
+        // a caret position between the lam and alef.
+        layout = new TextLayout(ltrText+lamAlef, map, frc);
+
+        final int ltrLen = ltrText.length();
+        final int layoutLen = layout.getCharacterCount();
+
+        for (int i=0; i < ltrLen; i++) {
+            hit = layout.getNextRightHit(i);
+            if (hit.getInsertionIndex() != i+1) {
+                throw new Error("Right hit failed in ltr text.");
+            }
+        }
+
+        hit = layout.getNextRightHit(ltrLen);
+        if (layoutLen != hit.getInsertionIndex()) {
+            throw new Error("Right hit failed at direction boundary.");
+        }
+
+        hit = layout.getNextLeftHit(layoutLen);
+        if (hit.getInsertionIndex() != ltrLen) {
+            throw new Error("Left hit failed at end of text.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/TextLayout/TestJustification.html	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,52 @@
+<!--
+ Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+ 
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+ 
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+--> 
+
+<html>
+<head>
+<title>Test Justification</title>
+</head>
+<body>
+<!--
+ @test
+ @bug 4211728 4178140 8145542
+ @summary Justify several lines of text and verify that the lines are the same
+ length and cursor positions are correct.
+Bug 4211728:  TextLayout.draw() draws characters at wrong position.
+Bug 4178140:  TextLayout does not justify
+ @run applet/manual=yesno TestJustification.html
+-->
+<h3>Test Justification</h1>
+<hr>
+<p>Five lines of text should appear, all justified to the same width,
+followed by a sixth line containing only roman characters and no spaces
+which is not justified, and instead is centered.
+Carets should appear between all characters. Pass the test if this is
+true.
+<p>
+<applet code=TestJustification.class width=500 height=500>
+alt="Your browser understands the &lt;APPLET&gt; tag but isn't running the applet, for some reason."
+Your browser is completely ignoring the &lt;APPLET&gt; tag!
+</applet>
+</body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/TextLayout/TestJustification.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,249 @@
+/*
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ *
+ * See TestJustification.html for main test.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+import java.text.*;
+
+public class TestJustification extends Applet {
+  JustificationPanel panel;
+
+  public void init() {
+    setLayout(new BorderLayout());
+    panel = new JustificationPanel("Bitstream Cyberbit");
+    add("Center", panel);
+  }
+
+  public void destroy() {
+    remove(panel);
+  }
+
+  // calls system.exit, not for use in tests.
+  public static void main(String args[]) {
+    TestJustification justificationTest = new TestJustification();
+    justificationTest.init();
+    justificationTest.start();
+
+    Frame f = new Frame("Test Justification");
+    f.addWindowListener(new WindowAdapter() {
+      public void windowClosing(WindowEvent e) {
+        System.exit(0);
+      }
+    });
+
+    f.add("Center", justificationTest);
+    f.setSize(500, 500);
+    f.show();
+  }
+
+  public String getAppletInfo() {
+    return "Test TextLayout.getJustifiedLayout()";
+  }
+
+  static class JustificationPanel extends Panel {
+    TextLayout[] layouts;
+    String fontname;
+    float height;
+    float oldfsize;
+
+    AttributedCharacterIterator lineText;
+    TextLayout[] lines;
+    int linecount;
+    float oldwidth;
+
+    JustificationPanel(String fontname) {
+      this.fontname = fontname;
+    }
+
+    private static final String[] texts = {
+      "This is an english Highlighting demo.", "Highlighting",
+      "This is an arabic \u0627\u0628\u062a\u062c \u062e\u0644\u0627\u062e demo.", "arabic \u0627\u0628\u062a\u062c",
+      "This is a hebrew \u05d0\u05d1\u05d2 \u05d3\u05d4\u05d5 demo.", "hebrew \u05d0\u05d1\u05d2",
+      "This is a cjk \u4e00\u4e01\u4e02\uac00\uac01\uc4fa\uf900\uf901\uf902 demo.", "cjk",
+      "NoSpaceCJK:\u4e00\u4e01\u4e02and\uac00\uac01\uc4faand\uf900\uf901\uf902", "No",
+      "NoSpaceRoman", "Space"
+    };
+
+    public void paint(Graphics g) {
+      Graphics2D g2d = (Graphics2D)g;
+
+      Dimension d = getSize();
+      Insets insets = getInsets();
+
+      float w = d.width - insets.left - insets.right;
+      float h = d.height - insets.top - insets.bottom;
+      int fsize = (int)w/25;
+
+      FontRenderContext frc = g2d.getFontRenderContext();
+
+      if (layouts == null || fsize != oldfsize) {
+        oldfsize = fsize;
+
+        Font f0 = new Font(fontname, Font.PLAIN, fsize);
+        Font f1 = new Font(fontname, Font.ITALIC, (int)(fsize * 1.5));
+
+        if (layouts == null) {
+          layouts = new TextLayout[texts.length / 2];
+        }
+
+        height = 0;
+        for (int i = 0; i < layouts.length; ++i) {
+          String text = texts[i*2];
+          String target = texts[i*2+1];
+
+          AttributedString astr = new AttributedString(text);
+          astr.addAttribute(TextAttribute.FONT, f0, 0, text.length());
+
+          int start = text.indexOf(target);
+          int limit = start + target.length();
+          astr.addAttribute(TextAttribute.FONT, f1, start, limit);
+
+          TextLayout layout = new TextLayout(astr.getIterator(), frc);
+
+          layout = layout.getJustifiedLayout(w - 20);
+
+          layouts[i] = layout;
+
+          height += layout.getAscent() + layout.getDescent() + layout.getLeading();
+        }
+      }
+
+      g2d.setColor(Color.white);
+      g2d.fill(new Rectangle.Float(insets.left, insets.top, w, h));
+
+      float basey = 20;
+
+      for (int i = 0; i < layouts.length; ++i) {
+        TextLayout layout = layouts[i];
+
+        float la = layout.getAscent();
+        float ld = layout.getDescent();
+        float ll = layout.getLeading();
+        float lw = layout.getAdvance();
+        float lh = la + ld + ll;
+        float lx = (w - lw) / 2f;
+        float ly = basey + layout.getAscent();
+
+        g2d.setColor(Color.black);
+        g2d.translate(insets.left + lx, insets.top + ly);
+
+        Rectangle2D bounds = new Rectangle2D.Float(0, -la, lw, lh);
+        g2d.draw(bounds);
+
+        layout.draw(g2d, 0, 0);
+
+        g2d.setColor(Color.red);
+        for (int j = 0, e = layout.getCharacterCount(); j <= e; ++j) {
+          Shape[] carets = layout.getCaretShapes(j, bounds);
+          g2d.draw(carets[0]);
+        }
+
+        g2d.translate(-insets.left - lx, -insets.top - ly);
+        basey += layout.getAscent() + layout.getDescent() + layout.getLeading();
+      }
+
+      // add LineBreakMeasurer-generated layouts
+
+      if (lineText == null) {
+        String text = "This is a long line of text that should be broken across multiple "
+          + "lines and then justified to fit the break width.  This test should pass if "
+          + "these lines are justified to the same width, and fail otherwise.  It should "
+          + "also format the hebrew (\u05d0\u05d1\u05d2 \u05d3\u05d4\u05d5) and arabic "
+          + "(\u0627\u0628\u062a\u062c \u062e\u0644\u0627\u062e) and CJK "
+          + "(\u4e00\u4e01\u4e02\uac00\uac01\uc4fa\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7"
+          + "\u67b8\u67b9) text correctly.";
+
+        Float regular = new Float(16.0);
+        Float big = new Float(24.0);
+        AttributedString astr = new AttributedString(text);
+        astr.addAttribute(TextAttribute.SIZE, regular, 0, text.length());
+        astr.addAttribute(TextAttribute.FAMILY, fontname, 0, text.length());
+
+        int ix = text.indexOf("broken");
+        astr.addAttribute(TextAttribute.SIZE, big, ix, ix + 6);
+        ix = text.indexOf("hebrew");
+        astr.addAttribute(TextAttribute.SIZE, big, ix, ix + 6);
+        ix = text.indexOf("arabic");
+        astr.addAttribute(TextAttribute.SIZE, big, ix, ix + 6);
+        ix = text.indexOf("CJK");
+        astr.addAttribute(TextAttribute.SIZE, big, ix, ix + 3);
+
+        lineText = astr.getIterator();
+      }
+
+      float width = w - 20;
+      if (lines == null || width != oldwidth) {
+        oldwidth = width;
+
+        lines = new TextLayout[10];
+        linecount = 0;
+
+        LineBreakMeasurer measurer = new LineBreakMeasurer(lineText, frc);
+
+        for (;;) {
+          TextLayout layout = measurer.nextLayout(width);
+          if (layout == null) {
+            break;
+          }
+
+          // justify all but last line
+          if (linecount > 0) {
+            lines[linecount - 1] = lines[linecount - 1].getJustifiedLayout(width);
+          }
+
+          if (linecount == lines.length) {
+            TextLayout[] nlines = new TextLayout[lines.length * 2];
+            System.arraycopy(lines, 0, nlines, 0, lines.length);
+            lines = nlines;
+          }
+
+          lines[linecount++] = layout;
+        }
+      }
+
+      float basex = insets.left + 10;
+      basey += 10;
+      g2d.setColor(Color.black);
+
+      for (int i = 0; i < linecount; ++i) {
+        TextLayout layout = lines[i];
+
+        basey += layout.getAscent();
+        float adv = layout.getAdvance();
+        float dx = layout.isLeftToRight() ? 0 : width - adv;
+
+        layout.draw(g2d, basex + dx, basey);
+
+        basey += layout.getDescent() + layout.getLeading();
+      }
+    }
+  }
+}
--- a/jdk/test/java/awt/font/TextLayout/VisibleAdvance.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/awt/font/TextLayout/VisibleAdvance.java	Wed Jul 05 22:13:53 2017 +0200
@@ -29,7 +29,7 @@
 
 /* @test
  * @summary verify TextLine advance
- * @bug 6582460
+ * @bug 6582460 8164818
  */
 
 /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/PrintDlgPageable.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 4885375
+ * @summary  Verifies if PageRanges To Field is populated based on Pageable
+ *           for COMMON print dialog
+ * @run main/manual PrintDlgPageable
+ */
+import java.awt.BorderLayout;
+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.Pageable;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.standard.DialogTypeSelection;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class PrintDlgPageable implements Printable {
+
+    private static Thread mainThread;
+    private static boolean testPassed;
+    private static boolean testGeneratedInterrupt;
+
+    public static void main(String[] args)  throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            doTest(PrintDlgPageable::printTest);
+        });
+        mainThread = Thread.currentThread();
+        try {
+            Thread.sleep(30000);
+        } catch (InterruptedException e) {
+            if (!testPassed && testGeneratedInterrupt) {
+                throw new RuntimeException("Print Dialog does not " +
+                          "`reflect Copies or Page Ranges");
+            }
+        }
+        if (!testGeneratedInterrupt) {
+            throw new RuntimeException("user has not executed the test");
+        }
+    }
+
+    private static void printTest() {
+        PrinterJob pj = PrinterJob.getPrinterJob();
+        PageableHandler handler = new PageableHandler();
+        pj.setPageable(handler);
+
+        PrintRequestAttributeSet pSet =  new HashPrintRequestAttributeSet();
+        pSet.add(DialogTypeSelection.COMMON);
+        pj.printDialog(pSet);
+    }
+
+
+    public static synchronized void pass() {
+        testPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    public static synchronized void fail() {
+        testPassed = false;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    private static void doTest(Runnable action) {
+        String description
+                = " Visual inspection of print dialog is required.\n"
+                + " A print dialog will be shown.\n "
+                + " Please verify Page Range is populated \n"
+                + " with \"From\" 1 and \"To\" 5.\n"
+                + " If ok, press PASS else press FAIL";
+
+        final JDialog dialog = new JDialog();
+        dialog.setTitle("printSelectionTest");
+        JTextArea textArea = new JTextArea(description);
+        textArea.setEditable(false);
+        final JButton testButton = new JButton("Start Test");
+        final JButton passButton = new JButton("PASS");
+        passButton.setEnabled(false);
+        passButton.addActionListener((e) -> {
+            dialog.dispose();
+            pass();
+        });
+        final JButton failButton = new JButton("FAIL");
+        failButton.setEnabled(false);
+        failButton.addActionListener((e) -> {
+            dialog.dispose();
+            fail();
+        });
+        testButton.addActionListener((e) -> {
+            testButton.setEnabled(false);
+            action.run();
+            passButton.setEnabled(true);
+            failButton.setEnabled(true);
+        });
+        JPanel mainPanel = new JPanel(new BorderLayout());
+        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);
+        dialog.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent e) {
+                System.out.println("main dialog closing");
+                testGeneratedInterrupt = false;
+                mainThread.interrupt();
+            }
+        });
+    }
+
+    @Override
+    public int print(Graphics g, PageFormat pf, int pi) throws PrinterException {
+        return NO_SUCH_PAGE;
+    }
+}
+
+class PageableHandler implements Pageable {
+
+    PageFormat pf = new PageFormat();
+
+    @Override
+    public int getNumberOfPages() {
+        return 5;
+    }
+
+    @Override
+    public Printable getPrintable(int pageIndex) {
+        return new PrintDlgPageable();
+    }
+
+    @Override
+    public PageFormat getPageFormat(int pageIndex) {
+        return pf;
+    }
+}
--- a/jdk/test/java/awt/print/PrinterJob/TestMediaTraySelection.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/TestMediaTraySelection.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,8 +21,7 @@
  * questions.
  */
 /*
- * @test
- * @bug 6357887
+ * @bug 6357887 8165146
  * @summary  Verifies if selected printertray is used
  * @requires (os.family == "linux" | os.family == "solaris")
  * @run main/manual TestMediaTraySelection
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/TestPageDlgFrameAssociation.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 7064425 6948907
+ * @summary  Verifies if owner Frame is associated with page dialog of PrinterJob
+ * @run main/manual TestPageDlgFrameAssociation
+ */
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.print.PageFormat;
+import java.awt.print.PrinterJob;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class TestPageDlgFrameAssociation {
+    private static Thread mainThread;
+    private static boolean testPassed;
+    private static boolean testGeneratedInterrupt;
+    private static Button print;
+    private static Frame frame;
+    private static boolean start;
+    private static Thread t;
+
+    public static void main(String args[]) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            doTest(TestPageDlgFrameAssociation::frameTest);
+        });
+        mainThread = Thread.currentThread();
+        try {
+            Thread.sleep(60000);
+        } catch (InterruptedException e) {
+            if (!testPassed && testGeneratedInterrupt) {
+                throw new RuntimeException("Page dialog not disposed."
+                        + " Page dialog is not associated with owner Frame`");
+            }
+        }
+        if (!testGeneratedInterrupt) {
+            throw new RuntimeException("user has not executed the test");
+        }
+    }
+
+    private static void frameTest() {
+        Panel panel =new Panel();
+
+        print = new Button("PageDialog");
+        print.setActionCommand("PageDialog");
+        print.addActionListener((e) -> {
+            PrinterJob job = PrinterJob.getPrinterJob();
+                PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+                t.start();
+                start = true;
+                PageFormat pf = job.pageDialog(aset);
+        });
+
+        panel.add(print);
+
+        frame = new Frame("Test Frame");
+        frame.setLayout (new BorderLayout ());
+        frame.add(panel,"South");
+        frame.pack();
+        frame.setVisible(true);
+
+        t = new Thread (() -> {
+            if (start) {
+                try {
+                    Thread.sleep(5000);
+                } catch (InterruptedException ex) {}
+                frame.dispose();
+            }
+        });
+    }
+
+    public static synchronized void pass() {
+        testPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    public static synchronized void fail() {
+        testPassed = false;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    private static void doTest(Runnable action) {
+        String description
+                = " A Frame with PageDialog Button is shown. Press PageDialog.\n"
+                + " A page dialog will be shown. Do not press any button.\n"
+                + " After 5 secs the frame along with this page dialog will be disposed.\n"
+                + " If the page dialog is not disposed, press FAIL else press PASS";
+
+        final JDialog dialog = new JDialog();
+        dialog.setTitle("printSelectionTest");
+        JTextArea textArea = new JTextArea(description);
+        textArea.setEditable(false);
+        final JButton testButton = new JButton("Start Test");
+        final JButton passButton = new JButton("PASS");
+        passButton.setEnabled(false);
+        passButton.addActionListener((e) -> {
+            dialog.dispose();
+            pass();
+        });
+        final JButton failButton = new JButton("FAIL");
+        failButton.setEnabled(false);
+        failButton.addActionListener((e) -> {
+            dialog.dispose();
+            fail();
+        });
+        testButton.addActionListener((e) -> {
+            testButton.setEnabled(false);
+            action.run();
+            passButton.setEnabled(true);
+            failButton.setEnabled(true);
+        });
+        JPanel mainPanel = new JPanel(new BorderLayout());
+        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);
+        dialog.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent e) {
+                System.out.println("main dialog closing");
+                testGeneratedInterrupt = false;
+                mainThread.interrupt();
+            }
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/TestPrintDlgFrameAssociation.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 7064425 6948907
+ * @summary  Verifies if owner Frame is associated with print dialog of PrinterJob
+ * @run main/manual TestPrintDlgFrameAssociation
+ */
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.print.PrinterJob;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class TestPrintDlgFrameAssociation {
+    private static Thread mainThread;
+    private static boolean testPassed;
+    private static boolean testGeneratedInterrupt;
+    private static Button print;
+    private static Frame frame;
+    private static boolean start;
+    private static Thread t;
+
+    public static void main(String args[]) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            doTest(TestPrintDlgFrameAssociation::frameTest);
+        });
+        mainThread = Thread.currentThread();
+        try {
+            Thread.sleep(60000);
+        } catch (InterruptedException e) {
+            if (!testPassed && testGeneratedInterrupt) {
+                throw new RuntimeException("Print dialog not disposed."
+                        + " Print dialog is not associated with owner Frame`");
+            }
+        }
+        if (!testGeneratedInterrupt) {
+            throw new RuntimeException("user has not executed the test");
+        }
+    }
+
+    private static void frameTest() {
+        Panel panel =new Panel();
+
+        print = new Button("PrintDialog");
+        print.setActionCommand("PrintDialog");
+        print.addActionListener((e) -> {
+            PrinterJob job = PrinterJob.getPrinterJob();
+            PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+            t.start();
+            start = true;
+            job.printDialog(aset);
+        });
+
+        panel.add(print);
+
+        frame = new Frame("Test Frame");
+        frame.setLayout (new BorderLayout ());
+        frame.add(panel,"South");
+        frame.pack();
+        frame.setVisible(true);
+
+        t = new Thread (() -> {
+            if (start) {
+                try {
+                    Thread.sleep(5000);
+                } catch (InterruptedException ex) {}
+                frame.dispose();
+            }
+        });
+    }
+
+    public static synchronized void pass() {
+        testPassed = true;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    public static synchronized void fail() {
+        testPassed = false;
+        testGeneratedInterrupt = true;
+        mainThread.interrupt();
+    }
+
+    private static void doTest(Runnable action) {
+        String description
+                = " A Frame with PrintDialog Button is shown. Press PrintDialog.\n"
+                + " A print dialog will be shown. Do not press any button.\n"
+                + " After 5 secs the frame along with this print dialog will be disposed.\n"
+                + " If the print dialog is not disposed, press FAIL else press PASS";
+
+        final JDialog dialog = new JDialog();
+        dialog.setTitle("printSelectionTest");
+        JTextArea textArea = new JTextArea(description);
+        textArea.setEditable(false);
+        final JButton testButton = new JButton("Start Test");
+        final JButton passButton = new JButton("PASS");
+        passButton.setEnabled(false);
+        passButton.addActionListener((e) -> {
+            dialog.dispose();
+            pass();
+        });
+        final JButton failButton = new JButton("FAIL");
+        failButton.setEnabled(false);
+        failButton.addActionListener((e) -> {
+            dialog.dispose();
+            fail();
+        });
+        testButton.addActionListener((e) -> {
+            testButton.setEnabled(false);
+            action.run();
+            passButton.setEnabled(true);
+            failButton.setEnabled(true);
+        });
+        JPanel mainPanel = new JPanel(new BorderLayout());
+        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);
+        dialog.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent e) {
+                System.out.println("main dialog closing");
+                testGeneratedInterrupt = false;
+                mainThread.interrupt();
+            }
+        });
+    }
+}
--- a/jdk/test/java/lang/Class/GetModuleTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/lang/Class/GetModuleTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -101,11 +101,8 @@
         return new Object[][] {
 
             { GetModuleTest.class,      null },
-            { GetModuleTest[].class,    null },
             { Object.class,             null },
-            { Object[].class,           null },
             { Component.class,          null },
-            { Component[].class,        null },
 
         };
     }
@@ -117,7 +114,7 @@
     public void testGetModuleOnVMAnonymousClass(Class<?> hostClass, String ignore) {
 
         // choose a class name in the same package as the host class
-        String prefix = packageName(hostClass);
+        String prefix = hostClass.getPackageName();
         if (prefix.length() > 0)
             prefix = prefix.replace('.', '/') + "/";
         String className = prefix + "Anon";
@@ -136,17 +133,6 @@
         assertTrue(anonClass.getModule() == hostClass.getModule());
     }
 
-    private static String packageName(Class<?> c) {
-        if (c.isArray()) {
-            return packageName(c.getComponentType());
-        } else {
-            String name = c.getName();
-            int dot = name.lastIndexOf('.');
-            if (dot == -1) return "";
-            return name.substring(0, dot);
-        }
-    }
-
     private static int constantPoolSize(byte[] classFile) {
         return ((classFile[8] & 0xFF) << 8) | (classFile[9] & 0xFF);
     }
--- a/jdk/test/java/lang/invoke/VMAnonymousClass.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/lang/invoke/VMAnonymousClass.java	Wed Jul 05 22:13:53 2017 +0200
@@ -57,9 +57,9 @@
     @Test public void testJavaLangInvoke()  throws Throwable { test("java/lang/invoke");  }
     @Test public void testProhibitedJavaPkg() throws Throwable {
        try {
-          test("java/prohibited");
-       } catch (SecurityException e) {
-         return;
+           test("java/prohibited");
+       } catch (IllegalArgumentException e) {
+           return;
        }
        throw new RuntimeException("Expected SecurityException");
      }
@@ -72,10 +72,17 @@
         if (pkg.equals("java/prohibited")) {
             VMAnonymousClass sampleclass = new VMAnonymousClass();
             host_class = (Class)sampleclass.getClass();
+        } else if (pkg.equals("java/lang")) {
+          host_class = Object.class;
+        } else if (pkg.equals("java/util")) {
+            host_class = java.util.ArrayList.class;
+        } else if (pkg.equals("jdk/internal/misc")) {
+            host_class = jdk.internal.misc.Signal.class;
+        } else if (pkg.equals("java/lang/invoke")) {
+            host_class = java.lang.invoke.CallSite.class;
         } else {
-            host_class = Object.class;
+            throw new RuntimeException("Unexpected pkg: " + pkg);
         }
-
         // Define VM anonymous class
         Class anonClass = unsafe.defineAnonymousClass(host_class, bytes, null);
 
--- a/jdk/test/java/lang/management/ThreadMXBean/Locks.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/lang/management/ThreadMXBean/Locks.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,27 +26,28 @@
  * @bug     4530538
  * @summary Basic unit test of ThreadInfo.getLockName()
  *          and ThreadInfo.getLockOwnerName()
+ * @library /lib/testlibrary
  * @author  Mandy Chung
  * @author  Jaroslav Bachorik
  *
- * @library /lib/testlibrary
  * @modules java.management
  * @build jdk.testlibrary.*
  * @run main/othervm Locks
  */
-
 import java.lang.management.*;
+import java.util.Arrays;
+import java.util.Optional;
 import java.util.concurrent.Phaser;
+import java.util.function.Predicate;
 import jdk.testlibrary.LockFreeLogManager;
 
 public class Locks {
-    private static final Object objA = new Object();
-    private static final Object objB = new Object();
-    private static final Object objC = new Object();
-    private static final ThreadMXBean tm = ManagementFactory.getThreadMXBean();
-    private static final LockFreeLogManager logger = new LockFreeLogManager();
 
-    private static boolean testFailed = false;
+    private static final Object OBJA = new Object();
+    private static final Object OBJB = new Object();
+    private static final EnhancedWaiter OBJC = new EnhancedWaiter();
+    private static final ThreadMXBean TM = ManagementFactory.getThreadMXBean();
+    private static final LockFreeLogManager LOGGER = new LockFreeLogManager();
 
     private static String getLockName(Object lock) {
         if (lock == null) return null;
@@ -56,67 +57,103 @@
     }
 
     private static void assertNoLock(Thread t) {
-        long tid = t.getId();
-        ThreadInfo info = tm.getThreadInfo(tid);
-        String result = info.getLockName();
+        if (t == null) {
+            return;
+        }
+        Optional<ThreadInfo> result = Arrays.asList(
+                TM.getThreadInfo(TM.getAllThreadIds(), true, true)).
+                stream().
+                filter(tInfo -> (tInfo != null && tInfo.getLockOwnerName() != null)
+                        ? tInfo.getLockOwnerName().equals(t.getName()) : false).
+                findAny();
+        if (result.isPresent()) {
+            throw new RuntimeException("Thread " + t.getName() + " is not "
+                    + "supposed to be hold any lock. Currently owning lock : "
+                    + result.get().getLockName());
+        }
+    }
 
-        if (result != null) {
-            throw new RuntimeException("Thread " + t.getName() + " is not supposed to hold any lock. " +
-                                       "Currently owning lock: " + result);
+   /*
+    * Handy debug function to check if error condition is because of test code or not.
+    */
+    private static void printStackTrace(Thread thread) {
+        if (thread == null) {
+            return;
+        }
+        StackTraceElement[] stackTrace = thread.getStackTrace();
+        log("Stack dump : Thread -> " + thread.getName());
+        for (StackTraceElement stackTraceEl : stackTrace) {
+            log("\t" + stackTraceEl.toString());
         }
     }
 
-    private static void checkBlockedObject(Thread t, Object lock, Thread owner,
-                                           Thread.State expectedState) {
+    private static void assertThreadState(Thread t, Thread.State expectedState) {
         long tid = t.getId();
-        ThreadInfo info = tm.getThreadInfo(tid);
-        String result = info.getLockName();
-        String expectedLock = (lock != null ? getLockName(lock) : null);
-        String expectedOwner = (owner != null ? owner.getName() : null);
+        if (expectedState == Thread.State.BLOCKED
+                && TM.getThreadInfo(tid).getThreadState() != Thread.State.BLOCKED) {
+            int retryCount = 0;
+            printStackTrace(t);
+            while (TM.getThreadInfo(tid).getThreadState() != Thread.State.BLOCKED) {
+                if (retryCount++ > 500) {
+                    printStackTrace(t);
+                    throw new RuntimeException("Thread " + t.getName() + " is at "
+                            + TM.getThreadInfo(tid).getThreadState() + " state but is expected to "
+                            + "be in Thread.State = " + expectedState);
+                }
+                goSleep(100);
+            }
+        }
+        if (!TM.getThreadInfo(tid).getThreadState().equals(expectedState)) {
+            printStackTrace(t);
+            throw new RuntimeException("Thread " + t.getName() + " is at "
+                    + TM.getThreadInfo(tid).getThreadState() + " state but is expected to "
+                    + "be in Thread.State = " + expectedState);
+        }
+    }
 
-        if (lock != null) {
-            if (expectedState == Thread.State.BLOCKED) {
-                int retryCount=0;
-                while(info.getThreadState() != Thread.State.BLOCKED) {
-                    if (retryCount++ > 500) {
-                        throw new RuntimeException("Thread " + t.getName() +
-                                " is expected to block on " + expectedLock +
-                                " but got " + result +
-                                " Thread.State = " + info.getThreadState());
-                    }
-                    goSleep(100);
-                    info = tm.getThreadInfo(tid);
-                    result = info.getLockName();
+   /*
+    * Do slow check if thread is blocked on a lock. It is possible that last thread
+    * to come out of Phaser might still be in Phaser call stack (Unsafe.park) and
+    * hence might eventually acquire expected lock.
+    */
+    private static void checkBlockedObject(Thread t, Object lock, Thread owner) {
+        long tid = t.getId();
+        String result = TM.getThreadInfo(tid).getLockName();
+        final String expectedLock = (lock != null ? getLockName(lock) : null);
+        Predicate<String> p = (res) -> ((res != null && !res.equals(expectedLock))
+                || (res == null && expectedLock != null));
+
+        if (p.test(result)) {
+            printStackTrace(t);
+            int retryCount = 0;
+            while (p.test(result)) {
+                if (retryCount++ > 500) {
+                    printStackTrace(t);
+                    throw new RuntimeException("Thread " + t.getName() + " is blocked on "
+                            + expectedLock + " but got " + result);
                 }
-            }
-            if (expectedState == Thread.State.WAITING &&
-                    info.getThreadState() != Thread.State.WAITING) {
-                throw new RuntimeException("Thread " + t.getName() +
-                        " is expected to wait on " + expectedLock +
-                        " but got " + result +
-                        " Thread.State = " + info.getThreadState());
+                goSleep(100);
+                result = TM.getThreadInfo(tid).getLockName();
             }
         }
 
-        if ((result != null && !result.equals(expectedLock)) ||
-                (result == null && expectedLock != null)) {
-            throw new RuntimeException("Thread " + t.getName() + " is blocked on " +
-                    expectedLock + " but got " + result);
-        }
-        result = info.getLockOwnerName();
-        if ((result != null && !result.equals(expectedOwner)) ||
-                (result == null && expectedOwner != null)) {
-            throw new RuntimeException("Owner of " + lock + " should be " +
-                    expectedOwner + " but got " + result);
+        result = TM.getThreadInfo(tid).getLockOwnerName();
+        final String expectedOwner = (owner != null ? owner.getName() : null);
+
+        p = (res) -> ((res != null && !res.equals(expectedOwner))
+                || (res == null && expectedOwner != null));
+        if (p.test(result)) {
+            printStackTrace(t);
+            throw new RuntimeException("Owner of " + lock + " should be "
+                    + expectedOwner + " but got " + result);
         }
     }
 
-    private static void goSleep(long ms) {
+    private static void goSleep(long ms){
         try {
             Thread.sleep(ms);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            testFailed = true;
+        } catch (InterruptedException ex) {
+            throw new RuntimeException(ex);
         }
     }
 
@@ -128,14 +165,15 @@
             super("LockAThread");
             this.p = p;
         }
+        @Override
         public void run() {
-            synchronized(objA) {
-                // stop here  for LockBThread to hold objB
-                log("LockAThread about to block on objB");
+            synchronized(OBJA) {
+                // block here while LockBThread holds OBJB
+                log("LockAThread about to block on OBJB");
                 p.arriveAndAwaitAdvance(); // Phase 1 (blocking)
-                synchronized(objB) {
+                synchronized(OBJB) {
                     dummyCounter++;
-                };
+                }
             }
             p.arriveAndAwaitAdvance(); // Phase 2 (blocking)
             log("LockAThread about to exit");
@@ -150,14 +188,15 @@
             super("LockBThread");
             this.p = p;
         }
+        @Override
         public void run() {
-            synchronized(objB) {
-                log("LockBThread about to block on objC");
+            synchronized(OBJB) {
+                log("LockBThread about to block on OBJC");
                 p.arriveAndAwaitAdvance(); // Phase 1 (blocking)
-                // Signal main thread about to block on objC
-                synchronized(objC) {
+                // Signal main thread about to block on OBJC
+                synchronized(OBJC) {
                     dummyCounter++;
-                };
+                }
             }
             p.arriveAndAwaitAdvance(); // Phase 2 (blocking)
             log("LockBThread about to exit");
@@ -166,9 +205,30 @@
         }
     }
 
+   /*
+    * Must be invoked from within a synchronized context
+    */
+    private static class EnhancedWaiter {
+
+        boolean isNotified = false;
+
+        public void doWait() throws InterruptedException {
+            while (!isNotified) {
+                wait();
+            }
+            isNotified = false;
+        }
+
+        public void doNotify() {
+            isNotified = true;
+            notify();
+        }
+    }
+
     private static WaitingThread waiter;
     private static final Object ready = new Object();
     private static CheckerThread checker;
+
     static class WaitingThread extends Thread {
         private final Phaser p;
 
@@ -180,17 +240,16 @@
         }
         @Override
         public void run() {
-            synchronized(objC) {
-                log("WaitingThread about to wait on objC");
+            synchronized(OBJC) {
+                log("WaitingThread about to wait on OBJC");
                 try {
-                    // Signal checker thread, about to wait on objC.
+                    // Signal checker thread, about to wait on OBJC.
                     waiting = false;
                     p.arriveAndAwaitAdvance(); // Phase 1 (waiting)
                     waiting = true;
-                    objC.wait();
+                    OBJC.doWait();
                 } catch (InterruptedException e) {
-                    e.printStackTrace();
-                    testFailed = true;
+                    throw new RuntimeException(e); // Do not continue test
                 }
 
                 // block until CheckerThread finishes checking
@@ -202,19 +261,18 @@
                     dummyCounter++;
                 }
             }
-            synchronized(objC) {
+            synchronized(OBJC) {
                 try {
-                    // signal checker thread, about to wait on objC
+                    // signal checker thread, about to wait on OBJC
                     waiting = false;
                     p.arriveAndAwaitAdvance(); // Phase 3 (waiting)
                     waiting = true;
-                    objC.wait();
+                    OBJC.doWait();
                 } catch (InterruptedException e) {
-                    e.printStackTrace();
-                    testFailed = true;
+                    throw new RuntimeException(e);
                 }
             }
-            log("WaitingThread about to exit waiting on objC 2");
+            log("WaitingThread about to exit waiting on OBJC 2");
         }
 
         public void waitForWaiting() {
@@ -241,85 +299,87 @@
             super("CheckerThread");
         }
 
+        @Override
         public void run() {
-            synchronized (ready) {
-                // wait until WaitingThread about to wait for objC
+            synchronized(ready) {
+                // wait until WaitingThread about to wait for OBJC
                 waiter.waitForWaiting(); // Phase 1 (waiting)
-                checkBlockedObject(waiter, objC, null, Thread.State.WAITING);
+                assertThreadState(waiter, Thread.State.WAITING);
+                checkBlockedObject(waiter, OBJC, null);
 
-                synchronized (objC) {
-                    objC.notify();
+                synchronized(OBJC) {
+                    OBJC.doNotify();
                 }
-
                 // wait for waiter thread to about to enter
                 // synchronized object ready.
                 waiter.waitForBlocked(); // Phase 2 (waiting)
-                checkBlockedObject(waiter, ready, this, Thread.State.BLOCKED);
+                assertThreadState(waiter, Thread.State.BLOCKED);
+                checkBlockedObject(waiter, ready, this);
             }
 
             // wait for signal from waiting thread that it is about
-            // wait for objC.
+            // wait for OBJC.
             waiter.waitForWaiting(); // Phase 3 (waiting)
-            synchronized(objC) {
-                checkBlockedObject(waiter, objC, Thread.currentThread(), Thread.State.WAITING);
-                objC.notify();
+            synchronized(OBJC) {
+                assertThreadState(waiter, Thread.State.WAITING);
+                checkBlockedObject(waiter, OBJC, Thread.currentThread());
+                OBJC.doNotify();
             }
-
         }
     }
 
     public static void main(String args[]) throws Exception {
-        Thread mainThread = Thread.currentThread();
+        try {
+            Thread mainThread = Thread.currentThread();
 
-        // Test uncontested case
-        LockAThread t1;
-        LockBThread t2;
-
-        Phaser p = new Phaser(3);
-        synchronized(objC) {
-            // Make sure the main thread is not holding any lock
-            assertNoLock(mainThread);
+            // Test uncontested case
+            LockAThread t1;
+            LockBThread t2;
 
-            // Test deadlock case
-            // t1 holds lockA and attempts to lock B
-            // t2 holds lockB and attempts to lock C
-
-            t1 = new LockAThread(p);
-            t1.start();
+            Phaser p = new Phaser(3);
+            synchronized(OBJC) {
+                // Make sure the main thread is not holding any lock
+                assertNoLock(mainThread);
 
-            t2 = new LockBThread(p);
-            t2.start();
+                // Test deadlock case
+                // t1 holds lockA and attempts to lock B
+                // t2 holds lockB and attempts to lock C
+                t1 = new LockAThread(p);
+                t1.start();
 
-            p.arriveAndAwaitAdvance(); // Phase 1 (blocking)
-            checkBlockedObject(t2, objC, mainThread, Thread.State.BLOCKED);
-            checkBlockedObject(t1, objB, t2, Thread.State.BLOCKED);
+                t2 = new LockBThread(p);
+                t2.start();
 
-            long[] expectedThreads = new long[3];
-            expectedThreads[0] = t1.getId(); // blocked on lockB
-            expectedThreads[1] = t2.getId(); // owner of lockB blocking on lockC
-            expectedThreads[2] = mainThread.getId(); // owner of lockC
-            findThreadsBlockedOn(objB, expectedThreads);
-        }
-        p.arriveAndAwaitAdvance(); // Phase 2 (blocking)
+                p.arriveAndAwaitAdvance(); // Phase 1 (blocking)
+                assertThreadState(t2, Thread.State.BLOCKED);
+                checkBlockedObject(t2, OBJC, mainThread);
+                assertThreadState(t1, Thread.State.BLOCKED);
+                checkBlockedObject(t1, OBJB, t2);
 
-        p = new Phaser(2);
-        // Test Object.wait() case
-        waiter = new WaitingThread(p);
-        waiter.start();
+                long[] expectedThreads = new long[3];
+                expectedThreads[0] = t1.getId(); // blocked on lockB
+                expectedThreads[1] = t2.getId(); // owner of lockB blocking on lockC
+                expectedThreads[2] = mainThread.getId(); // owner of lockC
+                findThreadsBlockedOn(OBJB, expectedThreads);
+            }
+            p.arriveAndAwaitAdvance(); // Phase 2 (blocking)
 
-        checker = new CheckerThread();
-        checker.start();
+            p = new Phaser(2);
+            // Test Object.wait() case
+            waiter = new WaitingThread(p);
+            waiter.start();
+
+            checker = new CheckerThread();
+            checker.start();
 
-        try {
-            waiter.join();
-            checker.join();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            testFailed = true;
-        }
-
-        if (testFailed) {
-            throw new RuntimeException("TEST FAILED.");
+            try {
+                waiter.join();
+                checker.join();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        } finally { // log all the messages to STDOUT
+            System.out.println(LOGGER.toString());
         }
         System.out.println("Test passed.");
     }
@@ -335,9 +395,9 @@
                     throw new RuntimeException("TEST FAILED: " +
                             lock + " expected to have owner");
                 }
-                for (int j = 0; j < infos.length; j++) {
-                    if (infos[j].getThreadId() == threadId) {
-                        ownerInfo = infos[j];
+                for (ThreadInfo info1 : infos) {
+                    if (info1.getThreadId() == threadId) {
+                        ownerInfo = info1;
                         break;
                     }
                 }
@@ -349,11 +409,11 @@
             throws Exception {
         String lock = getLockName(o);
         // Check with ThreadInfo with no stack trace (i.e. no safepoint)
-        ThreadInfo[] infos = tm.getThreadInfo(tm.getAllThreadIds());
+        ThreadInfo[] infos = TM.getThreadInfo(TM.getAllThreadIds());
         doCheck(infos, lock, expectedThreads);
 
         // Check with ThreadInfo with stack trace
-        infos = tm.getThreadInfo(tm.getAllThreadIds(), 1);
+        infos = TM.getThreadInfo(TM.getAllThreadIds(), 1);
         doCheck(infos, lock, expectedThreads);
     }
 
@@ -376,7 +436,7 @@
         long[] threads = new long[10];
         int count = 0;
         threads[count++] = ownerInfo.getThreadId();
-        while (ownerInfo != null && ownerInfo.getThreadState() == Thread.State.BLOCKED) {
+        while (ownerInfo.getThreadState() == Thread.State.BLOCKED) {
             ownerInfo = findOwnerInfo(infos, lock);
             threads[count++] = ownerInfo.getThreadId();
             log(" Owner = %s  id = %d",
@@ -407,6 +467,6 @@
     }
 
     private static void log(String format, Object ... args) {
-        logger.log(format + "%n", args);
+        LOGGER.log(format + "%n", args);
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathValidator/trustAnchor/ValWithAnchorByName.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8132926
+ * @summary PKIXParameters built with public key form of TrustAnchor causes
+ *          NPE during cert path building/validation
+ * @run main ValWithAnchorByName
+ */
+
+import java.io.ByteArrayInputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.CertPath;
+import java.security.cert.CertPathValidator;
+import java.security.cert.PKIXParameters;
+import java.security.cert.PKIXRevocationChecker;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+// To get certpath debugging, add -Djava.security.debug=certpath
+
+public class ValWithAnchorByName {
+
+    // The following certificates and OCSP responses were captured from
+    // a test run that used certificates and responses generated by
+    // sun.security.testlibrary.CertificateBuilder and
+    // sun.security.testlibrary.SimpleOCSPServer.
+
+    // Subject: CN=SSLCertificate, O=SomeCompany
+    // Issuer: CN=Intermediate CA Cert, O=SomeCompany
+    // Validity: Tue Aug 30 14:37:19 PDT 2016 to Wed Aug 30 14:37:19 PDT 2017
+    private static final String EE_CERT =
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIIDnTCCAoWgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwNTEUMBIGA1UEChMLU29t\n" +
+        "ZUNvbXBhbnkxHTAbBgNVBAMTFEludGVybWVkaWF0ZSBDQSBDZXJ0MB4XDTE2MDgz\n" +
+        "MDIxMzcxOVoXDTE3MDgzMDIxMzcxOVowLzEUMBIGA1UEChMLU29tZUNvbXBhbnkx\n" +
+        "FzAVBgNVBAMTDlNTTENlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+        "MIIBCgKCAQEAjgv8KKE4CO0rbCjRLA1hXjRiSq30jeusCJ8frbRG+QOBgQ3j6jgc\n" +
+        "vk5wG1aTu7R4AFn0/HRDMzP9ZbRlZVIbJUTd8YiaNyZeyWapPnxHWrPCd5e1xopk\n" +
+        "ElieDdEH5FiLGtIrWy56CGA1hfQb1vUVYegyeY+TTtMFVHt0PrmMk4ZRgj/GtVNp\n" +
+        "BQQYIzaYAcrcWMeCn30ZrhaGAL1hsdgmEVV1wsTD4JeNMSwLwMYem7fg8ondGZIR\n" +
+        "kZuGtuSdOHu4Xz+mgDNXTeX/Bp/dQFucxCG+FOOM9Hoz72RY2W8YqgL38RlnwYWp\n" +
+        "nUNxhXWFH6vyINRQVEu3IgahR6HXjxM7LwIDAQABo4G8MIG5MBQGA1UdEQQNMAuC\n" +
+        "CWxvY2FsaG9zdDAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9s\n" +
+        "b2NhbGhvc3Q6NDIzMzMwHwYDVR0jBBgwFoAUYT525lwHCI4CmuWs8a7poaeKRJ4w\n" +
+        "HQYDVR0OBBYEFCaQnOX4L1ovqyfeKuoay+kI+lXgMA4GA1UdDwEB/wQEAwIFoDAd\n" +
+        "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEB\n" +
+        "AD8dqQIqFasJcL8lm4mPTsBl0JgNiN8tQcXM7VCvcH+yDvEyh9vudDjuhpSORqPq\n" +
+        "f1o/EvJ+gfs269mBnYQujYRvmSd6EAcBntv5zn6amOh03o6PqTY9KaUC/mL9hB84\n" +
+        "Y5/LYioP16sME7egKnlrGUgKh0ZvGzm7c3SYx3Z5YoeFBOkZajc7Jm+cBw/uBQkF\n" +
+        "a9mLEczIvOgkq1wto8vr2ptH1gEuvFRcorN3muvq34bk40G08+AHlP3fCLFpI3FA\n" +
+        "IStJLJZRcO+Ib4sOcKuaBGnuMo/QVOCEMDUs6RgiWtSd93OZKFIUOASVp6YIkcSs\n" +
+        "5/rmc06sICqBjLfPEB68Jjw=\n" +
+        "-----END CERTIFICATE-----";
+
+    // Subject: CN=Intermediate CA Cert, O=SomeCompany
+    // Issuer: CN=Root CA Cert, O=SomeCompany
+    // Validity: Sun Aug 07 14:37:19 PDT 2016 to Tue Aug 07 14:37:19 PDT 2018
+    private static final String INT_CA_CERT =
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIIDdjCCAl6gAwIBAgIBZDANBgkqhkiG9w0BAQsFADAtMRQwEgYDVQQKEwtTb21l\n" +
+        "Q29tcGFueTEVMBMGA1UEAxMMUm9vdCBDQSBDZXJ0MB4XDTE2MDgwNzIxMzcxOVoX\n" +
+        "DTE4MDgwNzIxMzcxOVowNTEUMBIGA1UEChMLU29tZUNvbXBhbnkxHTAbBgNVBAMT\n" +
+        "FEludGVybWVkaWF0ZSBDQSBDZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n" +
+        "CgKCAQEAnJR5CnE7GKlQjigExSJ6hHu302mc0PcA6TDgsIitPYD/r8RBbBuE51OQ\n" +
+        "7IP7AXmfPUV3/+pO/uxx6mgY5O6XeUl7KadhVPtPcL0BVVevCSOdTMVa3iV4zRpa\n" +
+        "C6Uy2ouUFnafKnDtlbieggyETUoNgVNJYA9L0XNhtSnENoLHC4Pq0v8OsNtsOWFR\n" +
+        "NiMTOA49NNDBw85WgPyFAxjqO4z0J0zxdWq3W4rSMB8xrkulv2Rvj3GcfYJK/ab8\n" +
+        "V1IJ6PMWCpujASY3BzvYPnN7BKuBjbWJPgZdPYfX1cxeG80u0tOuMfWWiNONSMSA\n" +
+        "7m9y304QA0gKqlrFFn9U4hU89kv1IwIDAQABo4GYMIGVMA8GA1UdEwEB/wQFMAMB\n" +
+        "Af8wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzABhhZodHRwOi8vbG9jYWxob3N0\n" +
+        "OjM5MTM0MB8GA1UdIwQYMBaAFJNMsejEyJUB9tiWycVczvpiMVQZMB0GA1UdDgQW\n" +
+        "BBRhPnbmXAcIjgKa5azxrumhp4pEnjAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcN\n" +
+        "AQELBQADggEBAE4nOFdW9OirPnRvxihQXYL9CXLuGQz5tr0XgN8wSY6Un9b6CRiK\n" +
+        "7obgIGimVdhvUC1qdRcwJqgOfJ2/jR5/5Qo0TVp+ww4dHNdUoj73tagJ7jTu0ZMz\n" +
+        "5Zdp0uwd4RD/syvTeVcbPc3m4awtgEvRgzpDMcSeKPZWInlo7fbnowKSAUAfO8de\n" +
+        "0cDkxEBkzPIzGNu256cdLZOqOK9wLJ9mQ0zKgi/2NsldNc2pl/6jkGpA6uL5lJsm\n" +
+        "fo9sDusWNHV1YggqjDQ19hrf40VuuC9GFl/qAW3marMuEzY/NiKVUxty1q1s48SO\n" +
+        "g5LoEPDDkbygOt7ICL3HYG1VufhC1Q2YY9c=\n" +
+        "-----END CERTIFICATE-----";
+
+    // Subject: CN=Root CA Cert, O=SomeCompany
+    // Issuer: CN=Root CA Cert, O=SomeCompany
+    // Validity: Fri Jul 08 14:37:18 PDT 2016 to Fri Jun 28 14:37:18 PDT 2019
+    private static final String ROOT_CA_CERT =
+        "-----BEGIN CERTIFICATE-----\n" +
+        "MIIDODCCAiCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAtMRQwEgYDVQQKEwtTb21l\n" +
+        "Q29tcGFueTEVMBMGA1UEAxMMUm9vdCBDQSBDZXJ0MB4XDTE2MDcwODIxMzcxOFoX\n" +
+        "DTE5MDYyODIxMzcxOFowLTEUMBIGA1UEChMLU29tZUNvbXBhbnkxFTATBgNVBAMT\n" +
+        "DFJvb3QgQ0EgQ2VydDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIlN\n" +
+        "M3WYEqkU2elXEZrV9QSDbDKwyaLEHafLFciH8Edoag3q/7jEzFJxI7JZ831tdbWQ\n" +
+        "Bm6Hgo+8pvetOFW1BckL8eIjyOONP2CKfFaeMaozsWi1cgxa+rjpU/Rekc+zBqvv\n" +
+        "y4Sr97TwT6nQiLlgjC1nCfR1SVpO51qoDChS7n785rsKEZxw/p+kkVWSZffU7zN9\n" +
+        "c645cPg//L/kjiyeKMkaquGQOYS68gQgy8YZXQv1E3l/8e8Ci1s1DYA5wpCbaBqg\n" +
+        "Tw84Rr4zlUEQBgXzQlRt+mPzeaDpdG1EeGkXrcdkZ+0EMELoOVXOEn6VNsz6vT3I\n" +
+        "KrnvQBSnN06xq/iWwC0CAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME\n" +
+        "GDAWgBSTTLHoxMiVAfbYlsnFXM76YjFUGTAdBgNVHQ4EFgQUk0yx6MTIlQH22JbJ\n" +
+        "xVzO+mIxVBkwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IBAQAAi+Nl\n" +
+        "sxP9t2IhiZIHRJGSBZuQlXIjwYIwbq3ZWc/ApZ+0oxtl7DYQi5uRNt8/opcGNCHc\n" +
+        "IY0fG93SbkDubXbxPYBW6D/RUjbz59ZryaP5ym55p1MjHTOqy+AM8g41xNTJikc3\n" +
+        "UUFXXnckeFbawijCsb7vf71owzKuxgBXi9n1rmXXtncKoA/LrUVXoUlKefdgDnsU\n" +
+        "sl3Q29eibE3HSqziMMoAOLm0jjekFGWIgLeTtyRYR1d0dNaUwsHTrQpPjxxUTn1x\n" +
+        "sAPpXKfzPnsYAZeeiaaE75GwbWlHzrNinvxdZQd0zctpfBJfVqD/+lWANlw+rOaK\n" +
+        "J2GyCaJINsyaI/I2\n" +
+        "-----END CERTIFICATE-----";
+
+    // OCSP Response Status: successful (0x0)
+    // Response Type: Basic OCSP Response
+    // Version: 1 (0x0)
+    // Responder Id: CN=Intermediate CA Cert, O=SomeCompany
+    // Produced At: Sep  6 21:37:20 2016 GMT
+    // Responses:
+    // Certificate ID:
+    //    Hash Algorithm: sha1
+    //    Issuer Name Hash: 7ED23D4396152EAB7D0C4AD8C1CA1418AA05DD54
+    //    Issuer Key Hash: 613E76E65C07088E029AE5ACF1AEE9A1A78A449E
+    //    Serial Number: 1000
+    // Cert Status: good
+    // This Update: Sep  6 21:37:20 2016 GMT
+    // Next Update: Sep  6 22:37:19 2016 GMT
+    private static final String EE_OCSP_RESP =
+        "MIIFbAoBAKCCBWUwggVhBgkrBgEFBQcwAQEEggVSMIIFTjCBtaE3MDUxFDASBgNV\n" +
+        "BAoTC1NvbWVDb21wYW55MR0wGwYDVQQDExRJbnRlcm1lZGlhdGUgQ0EgQ2VydBgP\n" +
+        "MjAxNjA5MDYyMTM3MjBaMGUwYzA7MAkGBSsOAwIaBQAEFH7SPUOWFS6rfQxK2MHK\n" +
+        "FBiqBd1UBBRhPnbmXAcIjgKa5azxrumhp4pEngICEACAABgPMjAxNjA5MDYyMTM3\n" +
+        "MjBaoBEYDzIwMTYwOTA2MjIzNzE5WqECMAAwDQYJKoZIhvcNAQELBQADggEBAF13\n" +
+        "cLwxDG8UYPIbzID86vZGOWUuv5c35VnvebMk/ajAUdpItDYshIQVi90Z8BB2TEi/\n" +
+        "wtx1aNkIv7db0uQ0NnRfvME8vG2PWbty36CNAYr/M5UVzUmELH2sGTyf2fKfNIUK\n" +
+        "Iya/NRxCqxLAc34NYH0YyGJ9VcDjbEMNSBAHIqDdBNqKUPnjn454yoivU2oEs294\n" +
+        "cGePMx3QLyPepMwUss8nW74yIF7vxfJ+KFDBGWNuZDRfXScsGIoeM0Vt9B+4fmnV\n" +
+        "nP4Dw6l3IwmQH4ppjg08qTKvyrXcF2dPDWa98Xw6bA5G085Z/b/6/6GpkvKx/q6i\n" +
+        "UqKwF7q5hkDcB+N4/5SgggN+MIIDejCCA3YwggJeoAMCAQICAWQwDQYJKoZIhvcN\n" +
+        "AQELBQAwLTEUMBIGA1UEChMLU29tZUNvbXBhbnkxFTATBgNVBAMTDFJvb3QgQ0Eg\n" +
+        "Q2VydDAeFw0xNjA4MDcyMTM3MTlaFw0xODA4MDcyMTM3MTlaMDUxFDASBgNVBAoT\n" +
+        "C1NvbWVDb21wYW55MR0wGwYDVQQDExRJbnRlcm1lZGlhdGUgQ0EgQ2VydDCCASIw\n" +
+        "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJyUeQpxOxipUI4oBMUieoR7t9Np\n" +
+        "nND3AOkw4LCIrT2A/6/EQWwbhOdTkOyD+wF5nz1Fd//qTv7scepoGOTul3lJeymn\n" +
+        "YVT7T3C9AVVXrwkjnUzFWt4leM0aWgulMtqLlBZ2nypw7ZW4noIMhE1KDYFTSWAP\n" +
+        "S9FzYbUpxDaCxwuD6tL/DrDbbDlhUTYjEzgOPTTQwcPOVoD8hQMY6juM9CdM8XVq\n" +
+        "t1uK0jAfMa5Lpb9kb49xnH2CSv2m/FdSCejzFgqbowEmNwc72D5zewSrgY21iT4G\n" +
+        "XT2H19XMXhvNLtLTrjH1lojTjUjEgO5vct9OEANICqpaxRZ/VOIVPPZL9SMCAwEA\n" +
+        "AaOBmDCBlTAPBgNVHRMBAf8EBTADAQH/MDIGCCsGAQUFBwEBBCYwJDAiBggrBgEF\n" +
+        "BQcwAYYWaHR0cDovL2xvY2FsaG9zdDozOTEzNDAfBgNVHSMEGDAWgBSTTLHoxMiV\n" +
+        "AfbYlsnFXM76YjFUGTAdBgNVHQ4EFgQUYT525lwHCI4CmuWs8a7poaeKRJ4wDgYD\n" +
+        "VR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IBAQBOJzhXVvToqz50b8YoUF2C\n" +
+        "/Qly7hkM+ba9F4DfMEmOlJ/W+gkYiu6G4CBoplXYb1AtanUXMCaoDnydv40ef+UK\n" +
+        "NE1afsMOHRzXVKI+97WoCe407tGTM+WXadLsHeEQ/7Mr03lXGz3N5uGsLYBL0YM6\n" +
+        "QzHEnij2ViJ5aO3256MCkgFAHzvHXtHA5MRAZMzyMxjbtuenHS2TqjivcCyfZkNM\n" +
+        "yoIv9jbJXTXNqZf+o5BqQOri+ZSbJn6PbA7rFjR1dWIIKow0NfYa3+NFbrgvRhZf\n" +
+        "6gFt5mqzLhM2PzYilVMbctatbOPEjoOS6BDww5G8oDreyAi9x2BtVbn4QtUNmGPX";
+
+    // OCSP Response Status: successful (0x0)
+    // Response Type: Basic OCSP Response
+    // Version: 1 (0x0)
+    // Responder Id: O = SomeCompany, CN = Root CA Cert
+    // Produced At: Sep  6 21:37:20 2016 GMT
+    // Responses:
+    // Certificate ID:
+    //   Hash Algorithm: sha1
+    //   Issuer Name Hash: C8ED9F4E9AC0052A978257C569E6A7C9C45F5CB5
+    //   Issuer Key Hash: 934CB1E8C4C89501F6D896C9C55CCEFA62315419
+    //   Serial Number: 64
+    // Cert Status: good
+    // This Update: Sep  6 21:37:20 2016 GMT
+    // Next Update: Sep  6 22:37:19 2016 GMT
+    private static final String INT_CA_OCSP_RESP =
+        "MIIFJQoBAKCCBR4wggUaBgkrBgEFBQcwAQEEggULMIIFBzCBrKEvMC0xFDASBgNV\n" +
+        "BAoTC1NvbWVDb21wYW55MRUwEwYDVQQDEwxSb290IENBIENlcnQYDzIwMTYwOTA2\n" +
+        "MjEzNzIwWjBkMGIwOjAJBgUrDgMCGgUABBTI7Z9OmsAFKpeCV8Vp5qfJxF9ctQQU\n" +
+        "k0yx6MTIlQH22JbJxVzO+mIxVBkCAWSAABgPMjAxNjA5MDYyMTM3MjBaoBEYDzIw\n" +
+        "MTYwOTA2MjIzNzE5WqECMAAwDQYJKoZIhvcNAQELBQADggEBAAgs8jpuEejPD8qO\n" +
+        "+xckvqMz/5pItOHaSB0xyPNpIapqjcDkLktJdBVq5XJWernO9DU+P7yr7TDbvo6h\n" +
+        "P5jBZklLz16Z1aRlEyow2jhelVjNl6nxoiij/6LOGK4tLHa8fK7hTB4Ykw22Bxzt\n" +
+        "LcbrU5jgUDhdZkTrs+rWM8nw7mVWIQYQfwzCMDZ5a02MxzhdwggJGRzqMrbhY/Q7\n" +
+        "RRUK3ohSgzHmLjVkvA0KeM/Px7EefzbEbww08fSsLybmBoIEbcckWSHkkXx4cuIR\n" +
+        "T9FiTz4Ms4r8qzPCo61qeklE2I5lfnfieROADV6sfwbul/0U1HqKhHVaxJ8yYw+T\n" +
+        "/FMxrUKgggNAMIIDPDCCAzgwggIgoAMCAQICAQEwDQYJKoZIhvcNAQELBQAwLTEU\n" +
+        "MBIGA1UEChMLU29tZUNvbXBhbnkxFTATBgNVBAMTDFJvb3QgQ0EgQ2VydDAeFw0x\n" +
+        "NjA3MDgyMTM3MThaFw0xOTA2MjgyMTM3MThaMC0xFDASBgNVBAoTC1NvbWVDb21w\n" +
+        "YW55MRUwEwYDVQQDEwxSb290IENBIENlcnQwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n" +
+        "DwAwggEKAoIBAQCJTTN1mBKpFNnpVxGa1fUEg2wysMmixB2nyxXIh/BHaGoN6v+4\n" +
+        "xMxScSOyWfN9bXW1kAZuh4KPvKb3rThVtQXJC/HiI8jjjT9ginxWnjGqM7FotXIM\n" +
+        "Wvq46VP0XpHPswar78uEq/e08E+p0Ii5YIwtZwn0dUlaTudaqAwoUu5+/Oa7ChGc\n" +
+        "cP6fpJFVkmX31O8zfXOuOXD4P/y/5I4snijJGqrhkDmEuvIEIMvGGV0L9RN5f/Hv\n" +
+        "AotbNQ2AOcKQm2gaoE8POEa+M5VBEAYF80JUbfpj83mg6XRtRHhpF63HZGftBDBC\n" +
+        "6DlVzhJ+lTbM+r09yCq570AUpzdOsav4lsAtAgMBAAGjYzBhMA8GA1UdEwEB/wQF\n" +
+        "MAMBAf8wHwYDVR0jBBgwFoAUk0yx6MTIlQH22JbJxVzO+mIxVBkwHQYDVR0OBBYE\n" +
+        "FJNMsejEyJUB9tiWycVczvpiMVQZMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0B\n" +
+        "AQsFAAOCAQEAAIvjZbMT/bdiIYmSB0SRkgWbkJVyI8GCMG6t2VnPwKWftKMbZew2\n" +
+        "EIubkTbfP6KXBjQh3CGNHxvd0m5A7m128T2AVug/0VI28+fWa8mj+cpueadTIx0z\n" +
+        "qsvgDPIONcTUyYpHN1FBV153JHhW2sIowrG+73+9aMMyrsYAV4vZ9a5l17Z3CqAP\n" +
+        "y61FV6FJSnn3YA57FLJd0NvXomxNx0qs4jDKADi5tI43pBRliIC3k7ckWEdXdHTW\n" +
+        "lMLB060KT48cVE59cbAD6Vyn8z57GAGXnommhO+RsG1pR86zYp78XWUHdM3LaXwS\n" +
+        "X1ag//pVgDZcPqzmiidhsgmiSDbMmiPyNg==";
+
+    // Do path validation as if it is always Tue, 06 Sep 2016 22:12:21 GMT
+    // This value is within the lifetimes of all certificates and both OCSP
+    // responses.
+    private static final Date EVAL_DATE = new Date(1473199941000L);
+
+    private static final Base64.Decoder DECODER = Base64.getMimeDecoder();
+
+    public static void main(String[] args) throws Exception {
+        TrustAnchor anchor;
+        CertificateFactory cf = CertificateFactory.getInstance("X.509");
+        X509Certificate rootCert = generateCertificate(cf, ROOT_CA_CERT);
+        X509Certificate eeCert = generateCertificate(cf, EE_CERT);
+        X509Certificate intCaCert = generateCertificate(cf, INT_CA_CERT);
+        List<X509Certificate> certList = new ArrayList<X509Certificate>() {{
+            add(eeCert);
+            add(intCaCert);
+        }};
+
+        System.out.println("==== Certificate Path =====");
+        for (X509Certificate c : certList) {
+            System.out.println(c + "\n");
+        }
+        System.out.println("===========================");
+
+        System.out.println("===== Test 1: TA(X509Certificate) =====");
+        anchor = new TrustAnchor(rootCert, null);
+        runTest(cf, certList, anchor);
+
+        System.out.println("===== Test 2: TA(X500Principal, PublicKey =====");
+        anchor = new TrustAnchor(rootCert.getSubjectX500Principal(),
+                rootCert.getPublicKey(), null);
+        runTest(cf, certList, anchor);
+
+        System.out.println("===== Test 3: TA(String, PublicKey =====");
+        anchor = new TrustAnchor(rootCert.getSubjectX500Principal().getName(),
+                rootCert.getPublicKey(), null);
+        runTest(cf, certList, anchor);
+    }
+
+    private static void runTest(CertificateFactory cf,
+            List<X509Certificate> certList, TrustAnchor anchor)
+            throws Exception {
+        CertPath path = cf.generateCertPath(certList);
+        CertPathValidator validator = CertPathValidator.getInstance("PKIX");
+
+        System.out.println(anchor);
+
+        // Attach the OCSP responses to a PKIXParameters object
+        PKIXRevocationChecker pkrev =
+                (PKIXRevocationChecker)validator.getRevocationChecker();
+        Map<X509Certificate, byte[]> responseMap = new HashMap<>();
+        responseMap.put(certList.get(0), DECODER.decode(EE_OCSP_RESP));
+        responseMap.put(certList.get(1), DECODER.decode(INT_CA_OCSP_RESP));
+        pkrev.setOcspResponses(responseMap);
+        PKIXParameters params =
+                new PKIXParameters(Collections.singleton(anchor));
+        params.addCertPathChecker(pkrev);
+        params.setDate(EVAL_DATE);
+
+        validator.validate(path, params);
+    }
+
+    private static X509Certificate generateCertificate(CertificateFactory cf,
+            String encoded) throws CertificateException {
+        ByteArrayInputStream is = new ByteArrayInputStream(encoded.getBytes());
+        return (X509Certificate)cf.generateCertificate(is);
+    }
+}
--- a/jdk/test/java/sql/testng/TEST.properties	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/sql/testng/TEST.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -1,3 +1,4 @@
 # JDBC unit tests uses TestNG
 TestNG.dirs = .
+othervm.dirs = test/sql/othervm
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/othervm/DriverManagerInitTests.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.sql.othervm;
+
+import java.io.BufferedReader;
+import java.io.CharArrayReader;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.util.Enumeration;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+
+public class DriverManagerInitTests {
+
+    /**
+     * Validate that when DriverManager loads the initial JDBC drivers, that the
+     * output from DriverManager.println is available by verifying that the
+     * String "JDBC DriverManager initialized" is found
+     */
+    @Test
+    public void test() {
+
+        CharArrayWriter cw = new CharArrayWriter();
+        PrintWriter pw = new PrintWriter(cw);
+        DriverManager.setLogWriter(pw);
+        Enumeration<Driver> drivers = DriverManager.getDrivers();
+
+        try (BufferedReader reader = new BufferedReader(new CharArrayReader(cw.toCharArray()))) {
+            boolean result
+                    = reader.lines().anyMatch(
+                            line -> line.matches(".*JDBC DriverManager initialized.*"));
+            assertTrue(result);
+
+        } catch (IOException ex) {
+            Logger.getLogger(DriverManagerInitTests.class.getName()).log(Level.SEVERE, null, ex);
+            fail();
+        }
+
+        // Check to verify that we are not initializing a 2nd time
+        cw = new CharArrayWriter();
+        pw = new PrintWriter(cw);
+        DriverManager.setLogWriter(pw);
+        drivers = DriverManager.getDrivers();
+
+        try (BufferedReader reader = new BufferedReader(new CharArrayReader(cw.toCharArray()))) {
+            boolean result
+                    = reader.lines().noneMatch(
+                            line -> line.matches(".*JDBC DriverManager initialized.*"));
+            assertTrue(result);
+
+        } catch (IOException ex) {
+            Logger.getLogger(DriverManagerInitTests.class.getName()).log(Level.SEVERE, null, ex);
+            fail();
+        }
+
+    }
+
+}
--- a/jdk/test/java/text/Format/DateFormat/Bug4322313.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug4322313.java	Wed Jul 05 22:13:53 2017 +0200
@@ -50,110 +50,110 @@
 
         Object[][] valids = {
           /* given ID      offset                format('z'), ('Z')    index */
-            {"GMT+03:04",  new Long(-184 * mpm), "GMT+03:04", "+0304", new Integer(9)},
-            {"GMT+13:42",  new Long(-822 * mpm), "GMT+13:42", "+1342", new Integer(9)},
-            {"GMT+00:00",  new Long(0),          "GMT+00:00", "+0000", new Integer(9)},
-            {"GMT+1:11",   new Long(-71 * mpm),  "GMT+01:11", "+0111", new Integer(8)},
-            {"GMT +13:42", new Long(0),          "GMT",       "+0000", new Integer(3)},
-            {" GMT",       new Long(0),          "GMT",       "+0000", new Integer(4)},
-            {"+0304",      new Long(-184 * mpm), "GMT+03:04", "+0304", new Integer(5)},
-            {"+1342",      new Long(-822 * mpm), "GMT+13:42", "+1342", new Integer(5)},
-            {"+0000",      new Long(0),          "GMT+00:00", "+0000", new Integer(5)},
-            {" +1342",     new Long(-822 * mpm), "GMT+13:42", "+1342", new Integer(6)},
+            {"GMT+03:04",  -184L * mpm, "GMT+03:04", "+0304", 9},
+            {"GMT+13:42",  -822L * mpm, "GMT+13:42", "+1342", 9},
+            {"GMT+00:00",   0L,         "GMT+00:00", "+0000", 9},
+            {"GMT+1:11",   -71L * mpm,  "GMT+01:11", "+0111", 8},
+            {"GMT +13:42",  0L,         "GMT",       "+0000", 3},
+            {" GMT",        0L,         "GMT",       "+0000", 4},
+            {"+0304",      -184L * mpm, "GMT+03:04", "+0304", 5},
+            {"+1342",      -822L * mpm, "GMT+13:42", "+1342", 5},
+            {"+0000",       0L,         "GMT+00:00", "+0000", 5},
+            {" +1342",     -822L * mpm, "GMT+13:42", "+1342", 6},
             /* ISO-LATIN-1 digits */
-            {"GMT+\u0030\u0031:\u0032\u0033", new Long(-83 * mpm), "GMT+01:23", "+0123", new Integer(9)},
+            {"GMT+\u0030\u0031:\u0032\u0033", -83L * mpm, "GMT+01:23", "+0123", 9},
 
            /* In fact, this test case is skipped because TimeZone class can't
             * recognize TimeZone IDs like "+00234" or "-00234".
             */
-            {"+00234",     new Long(-23 * mpm), "GMT+00:23", "+0023", new Integer(5)},
+            {"+00234",     -23L * mpm, "GMT+00:23", "+0023", 5},
 
-            {"GMT-03:04",  new Long(184 * mpm), "GMT-03:04", "-0304", new Integer(9)},
-            {"GMT-13:42",  new Long(822 * mpm), "GMT-13:42", "-1342", new Integer(9)},
-            {"GMT-00:00",  new Long(0),         "GMT+00:00", "+0000", new Integer(9)},
-            {"GMT-1:11",   new Long(71 * mpm),  "GMT-01:11", "-0111", new Integer(8)},
-            {"GMT -13:42", new Long(0),         "GMT",       "+0000", new Integer(3)},
-            {"-0304",      new Long(184 * mpm), "GMT-03:04", "-0304", new Integer(5)},
-            {"-1342",      new Long(822 * mpm), "GMT-13:42", "-1342", new Integer(5)},
-            {" -1342",     new Long(822 * mpm), "GMT-13:42", "-1342", new Integer(6)},
+            {"GMT-03:04",  184L * mpm, "GMT-03:04", "-0304", 9},
+            {"GMT-13:42",  822L * mpm, "GMT-13:42", "-1342", 9},
+            {"GMT-00:00",  0L,         "GMT+00:00", "+0000", 9},
+            {"GMT-1:11",   71L * mpm,  "GMT-01:11", "-0111", 8},
+            {"GMT -13:42", 0L,         "GMT",       "+0000", 3},
+            {"-0304",      184L * mpm, "GMT-03:04", "-0304", 5},
+            {"-1342",      822L * mpm, "GMT-13:42", "-1342", 5},
+            {" -1342",     822L * mpm, "GMT-13:42", "-1342", 6},
             /* ISO-LATIN-1 digits */
-            {"GMT-\u0030\u0031:\u0032\u0033", new Long(83 * mpm), "GMT-01:23", "-0123", new Integer(9)},
+            {"GMT-\u0030\u0031:\u0032\u0033", 83L * mpm, "GMT-01:23", "-0123", 9},
            /* In fact, this test case is skipped because TimeZone class can't
             * recognize TimeZone IDs like "+00234" or "-00234".
             */
-            {"-00234",     new Long(23 * mpm),  "GMT+00:23", "-0023", new Integer(5)},
+            {"-00234",     23L * mpm,  "GMT+00:23", "-0023", 5},
         };
 
         Object[][] invalids = {
           /* given ID       error index   */
-            {"GMT+8",       new Integer(5)},
-            {"GMT+18",      new Integer(6)},
-            {"GMT+208",     new Integer(6)},
-            {"GMT+0304",    new Integer(6)},
-            {"GMT+42195",   new Integer(5)},
-            {"GMT+5:8",     new Integer(7)},
-            {"GMT+23:60",   new Integer(8)},
-            {"GMT+11:1",    new Integer(8)},
-            {"GMT+24:13",   new Integer(5)},
-            {"GMT+421:950", new Integer(5)},
-            {"GMT+0a:0A",   new Integer(5)},
-            {"GMT+ 13:42",  new Integer(4)},
-            {"GMT+13 :42",  new Integer(6)},
-            {"GMT+13: 42",  new Integer(7)},
-            {"GMT+-13:42",  new Integer(4)},
-            {"G M T",       new Integer(0)},
-            {"+8",          new Integer(2)},
-            {"+18",         new Integer(3)},
-            {"+208",        new Integer(4)},
-            {"+2360",       new Integer(4)},
-            {"+2413",       new Integer(2)},
-            {"+42195",      new Integer(2)},
-            {"+0AbC",       new Integer(2)},
-            {"+ 1342",      new Integer(1)},
-            {"+-1342",      new Integer(1)},
-            {"1342",        new Integer(0)},
+            {"GMT+8",       5},
+            {"GMT+18",      6},
+            {"GMT+208",     6},
+            {"GMT+0304",    6},
+            {"GMT+42195",   5},
+            {"GMT+5:8",     7},
+            {"GMT+23:60",   8},
+            {"GMT+11:1",    8},
+            {"GMT+24:13",   5},
+            {"GMT+421:950", 5},
+            {"GMT+0a:0A",   5},
+            {"GMT+ 13:42",  4},
+            {"GMT+13 :42",  6},
+            {"GMT+13: 42",  7},
+            {"GMT+-13:42",  4},
+            {"G M T",       0},
+            {"+8",          2},
+            {"+18",         3},
+            {"+208",        4},
+            {"+2360",       4},
+            {"+2413",       2},
+            {"+42195",      2},
+            {"+0AbC",       2},
+            {"+ 1342",      1},
+            {"+-1342",      1},
+            {"1342",        0},
           /* Arabic-Indic digits */
-            {"GMT+\u0660\u0661:\u0662\u0663", new Integer(4)},
+            {"GMT+\u0660\u0661:\u0662\u0663", 4},
           /* Extended Arabic-Indic digits */
-            {"GMT+\u06f0\u06f1:\u06f2\u06f3", new Integer(4)},
+            {"GMT+\u06f0\u06f1:\u06f2\u06f3", 4},
           /* Devanagari digits */
-            {"GMT+\u0966\u0967:\u0968\u0969", new Integer(4)},
+            {"GMT+\u0966\u0967:\u0968\u0969", 4},
           /* Fullwidth digits */
-            {"GMT+\uFF10\uFF11:\uFF12\uFF13", new Integer(4)},
+            {"GMT+\uFF10\uFF11:\uFF12\uFF13", 4},
 
-            {"GMT-8",       new Integer(5)},
-            {"GMT-18",      new Integer(6)},
-            {"GMT-208",     new Integer(6)},
-            {"GMT-0304",    new Integer(6)},
-            {"GMT-42195",   new Integer(5)},
-            {"GMT-5:8",     new Integer(7)},
-            {"GMT-23:60",   new Integer(8)},
-            {"GMT-11:1",    new Integer(8)},
-            {"GMT-24:13",   new Integer(5)},
-            {"GMT-421:950", new Integer(5)},
-            {"GMT-0a:0A",   new Integer(5)},
-            {"GMT- 13:42",  new Integer(4)},
-            {"GMT-13 :42",  new Integer(6)},
-            {"GMT-13: 42",  new Integer(7)},
-            {"GMT-+13:42",  new Integer(4)},
-            {"-8",          new Integer(2)},
-            {"-18",         new Integer(3)},
-            {"-208",        new Integer(4)},
-            {"-2360",       new Integer(4)},
-            {"-2413",       new Integer(2)},
-            {"-42195",      new Integer(2)},
-            {"-0AbC",       new Integer(2)},
-            {"- 1342",      new Integer(1)},
-            {"--1342",      new Integer(1)},
-            {"-802",        new Integer(2)},
+            {"GMT-8",       5},
+            {"GMT-18",      6},
+            {"GMT-208",     6},
+            {"GMT-0304",    6},
+            {"GMT-42195",   5},
+            {"GMT-5:8",     7},
+            {"GMT-23:60",   8},
+            {"GMT-11:1",    8},
+            {"GMT-24:13",   5},
+            {"GMT-421:950", 5},
+            {"GMT-0a:0A",   5},
+            {"GMT- 13:42",  4},
+            {"GMT-13 :42",  6},
+            {"GMT-13: 42",  7},
+            {"GMT-+13:42",  4},
+            {"-8",          2},
+            {"-18",         3},
+            {"-208",        4},
+            {"-2360",       4},
+            {"-2413",       2},
+            {"-42195",      2},
+            {"-0AbC",       2},
+            {"- 1342",      1},
+            {"--1342",      1},
+            {"-802",        2},
           /* Arabic-Indic digits */
-            {"GMT-\u0660\u0661:\u0662\u0663", new Integer(4)},
+            {"GMT-\u0660\u0661:\u0662\u0663", 4},
           /* Extended Arabic-Indic digits */
-            {"GMT-\u06f0\u06f1:\u06f2\u06f3", new Integer(4)},
+            {"GMT-\u06f0\u06f1:\u06f2\u06f3", 4},
           /* Devanagari digits */
-            {"GMT-\u0966\u0967:\u0968\u0969", new Integer(4)},
+            {"GMT-\u0966\u0967:\u0968\u0969", 4},
           /* Fullwidth digits */
-            {"GMT-\uFF10\uFF11:\uFF12\uFF13", new Integer(4)},
+            {"GMT-\uFF10\uFF11:\uFF12\uFF13", 4},
         };
 
         try {
--- a/jdk/test/java/text/Format/DateFormat/Bug4736959.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug4736959.java	Wed Jul 05 22:13:53 2017 +0200
@@ -30,6 +30,7 @@
 import java.text.*;
 import java.util.*;
 
+@SuppressWarnings("deprecation")
 public class Bug4736959 {
     /**
      * 4736959: JSpinner won't work for AM/PM field
--- a/jdk/test/java/text/Format/DateFormat/Bug4823811.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug4823811.java	Wed Jul 05 22:13:53 2017 +0200
@@ -685,8 +685,8 @@
         testNumberFormatFormatting(nfEG, -456, "456-", "ar_EG");
 
         System.out.println("*** DecimalFormat.parse test in ar_EG");
-        testNumberFormatParsing(nfEG, "123-", new Long(-123), "ar_EG");
-        testNumberFormatParsing(nfEG, "123--", new Long(-123), "ar_EG");
+        testNumberFormatParsing(nfEG, "123-", -123L, "ar_EG");
+        testNumberFormatParsing(nfEG, "123--",-123L, "ar_EG");
         testNumberFormatParsingCheckException(nfEG, "-123", 0, "ar_EG");
 
         System.out.println("*** DecimalFormat.format test in en_US");
@@ -694,8 +694,8 @@
         testNumberFormatFormatting(nfUS, -456, "-456", "en_US");
 
         System.out.println("*** DecimalFormat.parse test in en_US");
-        testNumberFormatParsing(nfUS, "123-", new Long(123), "en_US");
-        testNumberFormatParsing(nfUS, "-123", new Long(-123), "en_US");
+        testNumberFormatParsing(nfUS, "123-", 123L, "en_US");
+        testNumberFormatParsing(nfUS, "-123",-123L, "en_US");
         testNumberFormatParsingCheckException(nfUS, "--123", 0, "en_US");
     }
 
--- a/jdk/test/java/text/Format/DateFormat/Bug4845901.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug4845901.java	Wed Jul 05 22:13:53 2017 +0200
@@ -55,6 +55,7 @@
         }
     }
 
+    @SuppressWarnings("deprecation")
     static void testParse(SimpleDateFormat sdf, String str, int expectedHour) {
         try {
             Date parsedDate = sdf.parse(str);
--- a/jdk/test/java/text/Format/DateFormat/Bug6609750.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug6609750.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -37,6 +37,7 @@
         Locale defaultLocale = Locale.getDefault();
         Locale.setDefault(Locale.US);
 
+        @SuppressWarnings("deprecation")
         Date[] dates = {
             new Date(9-1900,     Calendar.JUNE, 12),
             new Date(99-1900,    Calendar.JUNE, 12),
--- a/jdk/test/java/text/Format/DateFormat/Bug6683975.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug6683975.java	Wed Jul 05 22:13:53 2017 +0200
@@ -66,6 +66,7 @@
             System.err.println("\tth_TH: " + str_th_TH);
         }
 
+        @SuppressWarnings("deprecation")
         Date date = new Date(2008-1900, Calendar.SEPTEMBER, 30, 8, 0, 0);
         str_th = df_th.format(date);
         if (!expected_th[style].equals(str_th)) {
--- a/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/DateFormatRegression.java	Wed Jul 05 22:13:53 2017 +0200
@@ -41,7 +41,7 @@
     }
 
     public void Test4029195() {
-
+        @SuppressWarnings("deprecation")
         Date today = new Date();
 
         logln("today: " + today);
@@ -74,19 +74,20 @@
     public void Test4052408() {
         DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT,
                                                         DateFormat.SHORT, Locale.US);
+        @SuppressWarnings("deprecation")
         Date date = new Date(97, Calendar.MAY, 3, 8, 55);
         String str;
         logln(str = fmt.format(date));
 
         if (!str.equals("5/3/97 8:55 AM"))
             errln("Fail: Test broken; Want 5/3/97 8:55 AM Got " + str);
-        Hashtable expected = new Hashtable();
-        expected.put(new Integer(DateFormat.MONTH_FIELD), "5");
-        expected.put(new Integer(DateFormat.DATE_FIELD), "3");
-        expected.put(new Integer(DateFormat.YEAR_FIELD), "97");
-        expected.put(new Integer(DateFormat.HOUR1_FIELD), "8");
-        expected.put(new Integer(DateFormat.MINUTE_FIELD), "55");
-        expected.put(new Integer(DateFormat.AM_PM_FIELD), "AM");
+        Map<Integer,String> expected = new HashMap<>();
+        expected.put(DateFormat.MONTH_FIELD, "5");
+        expected.put(DateFormat.DATE_FIELD, "3");
+        expected.put(DateFormat.YEAR_FIELD, "97");
+        expected.put(DateFormat.HOUR1_FIELD, "8");
+        expected.put(DateFormat.MINUTE_FIELD, "55");
+        expected.put(DateFormat.AM_PM_FIELD, "AM");
 
         StringBuffer buf = new StringBuffer();
         String fieldNames[] = {
@@ -120,7 +121,7 @@
                              ", \"" + str + "\", " +
                              pos.getBeginIndex() + ", " +
                              pos.getEndIndex());
-            String exp = (String) expected.get(new Integer(i));
+            String exp = expected.get(i);
             if ((exp == null && str.length() == 0) ||
                 str.equals(exp))
                 logln(" ok");
@@ -135,6 +136,7 @@
     /**
      * Verify the function of the [s|g]et2DigitYearStart() API.
      */
+    @SuppressWarnings("deprecation")
     public void Test4056591() {
         try {
             SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd", Locale.US);
@@ -255,6 +257,7 @@
         if (!ok) errln("Fail: Lenient not working");
     }
 
+    @SuppressWarnings("deprecation")
     public void Test4065240() {
         Date curDate;
         DateFormat shortdate, fulldate;
@@ -297,6 +300,7 @@
 
       Currently this bug breaks MessageFormat.toPattern
       */
+    @SuppressWarnings("deprecation")
     public void Test4071441() {
         DateFormat fmtA = DateFormat.getInstance();
         DateFormat fmtB = DateFormat.getInstance();
@@ -488,6 +492,7 @@
     public void Test4101483() {
         SimpleDateFormat sdf = new SimpleDateFormat("z", Locale.US);
         FieldPosition fp = new FieldPosition(DateFormat.TIMEZONE_FIELD);
+        @SuppressWarnings("deprecation")
         Date d= new Date(9234567890L);
         StringBuffer buf = new StringBuffer("");
         logln(sdf.format(d, buf, fp).toString());
@@ -508,6 +513,7 @@
     public void Test4103340() {
         // choose a date that is the FIRST of some month
         // and some arbitrary time
+        @SuppressWarnings("deprecation")
         Date d=new Date(97, 3, 1, 1, 1, 1);
         SimpleDateFormat df=new SimpleDateFormat("MMMM", Locale.US);
 
@@ -538,6 +544,7 @@
         sdf.applyPattern(pattern);
         logln("pattern: \"" + pattern + "\"");
 
+        @SuppressWarnings("deprecation")
         Object[] DATA = {
             "time 10:30", new ParsePosition(10), new Date(70, Calendar.JANUARY, 1, 10, 30),
             "time 10:x", new ParsePosition(0), null,
@@ -698,6 +705,7 @@
         String pattern = "'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YYYY HH:MI:SS'')'";
         logln("pattern=" + pattern);
         SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
+        @SuppressWarnings("deprecation")
         String result = format.format(new Date(1998-1900, Calendar.JUNE, 30, 13, 30, 0));
         if (!result.equals("TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')")) {
             errln("Fail: result=" + result);
@@ -711,6 +719,7 @@
      * 'z' at end of date format throws index exception in SimpleDateFormat
      * CANNOT REPRODUCE THIS BUG ON 1.2FCS
      */
+    @SuppressWarnings("deprecation")
     public void Test4151706() {
         SimpleDateFormat fmt =
             new SimpleDateFormat("EEEE, dd-MMM-yy HH:mm:ss z", Locale.US);
@@ -755,6 +764,7 @@
      * Confirm that "EST"(GMT-5:00) and "CST"(GMT-6:00) are used in US
      * as "EST" or "CST", not Australian "EST" and "CST".
      */
+    @SuppressWarnings("deprecation")
     public void Test4406615() {
       Locale savedLocale = Locale.getDefault();
       TimeZone savedTimeZone = TimeZone.getDefault();
@@ -823,6 +833,7 @@
          * greater than "99", are treated as literal years.  So "1/2/3456"
          * becomes 3456 AD.  Likewise, "1/2/-3" becomes -3 AD == 2 BC.
          */
+        @SuppressWarnings("deprecation")
         Object[] DATA = {
             "02/29/00",   new Date(2000-1900, Calendar.FEBRUARY, 29),
             "01/23/01",   new Date(2001-1900, Calendar.JANUARY,  23),
@@ -878,6 +889,7 @@
         DateFormat fmt = new SimpleDateFormat(pattern,
                                               DateFormatSymbols.getInstance(Locale.US));
         fmt.getCalendar().setLenient(false);
+        @SuppressWarnings("deprecation")
         Date d = new Date(2000-1900, Calendar.FEBRUARY, 29);
         String s = fmt.format(d);
         logln(d + " x " + pattern + " => " + s);
@@ -957,6 +969,7 @@
         }
     }
 
+    @SuppressWarnings("deprecation")
     public void Test4253490() throws ParseException {
         SimpleDateFormat fmt = new SimpleDateFormat("S", Locale.US);
 
@@ -1026,6 +1039,7 @@
     public void Test4250359() {
         DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT,
                                                    Locale.US);
+        @SuppressWarnings("deprecation")
         Date d = new Date(1999-1900, Calendar.DECEMBER, 25,
                           1, 2, 3);
         String s = df.format(d);
@@ -1052,6 +1066,7 @@
         // pick up another time zone when L10N is done to that file.
         TimeZone.setDefault(TimeZone.getTimeZone("PST"));
         SimpleDateFormat fmt = new SimpleDateFormat("yy/MM/dd hh:ss zzz", Locale.JAPAN);
+        @SuppressWarnings("deprecation")
         String result = fmt.format(new Date(1999, 0, 1));
         logln("format()=>" + result);
         if (!result.endsWith("PST")) {
--- a/jdk/test/java/text/Format/DateFormat/DateFormatRoundTripTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/DateFormatRoundTripTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -104,7 +104,7 @@
         String pat = null;
         Date date = null;
 
-        Vector newArgs = new Vector();
+        List<String> newArgs = new ArrayList<>();
         for (int i=0; i<args.length; ++i) {
             if (args[i].equals("-locale")
                 && (i+1) < args.length) {
@@ -131,13 +131,13 @@
                 seed = Long.parseLong(args[i+1]);
                 ++i;
             } else {
-                newArgs.addElement(args[i]);
+                newArgs.add(args[i]);
             }
         }
 
         if (newArgs.size() != args.length) {
             args = new String[newArgs.size()];
-            newArgs.copyInto(args);
+            newArgs.addAll(Arrays.asList(args));
         }
 
         new DateFormatRoundTripTest(random, seed, infinite, date, pat, loc).run(args);
@@ -193,6 +193,7 @@
          * Return the Date of this test case; must be called with the default
          * zone set to this TestCase's zone.
          */
+        @SuppressWarnings("deprecation")
         Date getDate() {
             if (_date == null) {
                 // Date constructor will work right iff we are in the target zone
--- a/jdk/test/java/text/Format/DateFormat/DateFormatSymbolsCloneTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/DateFormatSymbolsCloneTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -29,6 +29,7 @@
  */
 import java.text.DateFormatSymbols;
 
+@SuppressWarnings("serial")
 public class DateFormatSymbolsCloneTest extends DateFormatSymbols {
     private int value;
 
--- a/jdk/test/java/text/Format/DateFormat/NonGregorianFormatTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/NonGregorianFormatTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -36,6 +36,7 @@
 public class NonGregorianFormatTest {
     static int errors;
 
+    @SuppressWarnings("deprecation")
     static final Object[][] JAPANESE_EN = {
         { "GGGG yyyy MMMM d", "Showa 1 December 31", new Date(1926-1900, DECEMBER, 31) },
         { "GGGG yyyy MMMM d", "Showa 64 January 6", new Date(1989-1900, JANUARY, 6) },
@@ -58,6 +59,7 @@
         { "Gyy.MM.dd", "H01.01.01" },
     };
 
+    @SuppressWarnings("deprecation")
     static final Object[][] BUDDHIST_EN = {
         { "GGGG yyyy MMMM d", "B.E. 2469 December 31", new Date(1926-1900, DECEMBER, 31) },
         { "GGGG yyyy MMMM d", "B.E. 2532 January 6", new Date(1989-1900, JANUARY, 6) },
@@ -71,6 +73,7 @@
 
     static final String FULL_DATE_FORMAT_JA = "GGGGyyyy'\u5e74'M'\u6708'd'\u65e5'";
 
+    @SuppressWarnings("deprecation")
     static final Object[][] JAPANESE_JA = {
         { FULL_DATE_FORMAT_JA, "\u662d\u548c\u5143\u5e7412\u670831\u65e5", new Date(1926-1900, DECEMBER, 31) },
         { FULL_DATE_FORMAT_JA, "\u662d\u548c64\u5e741\u67086\u65e5", new Date(1989-1900, JANUARY, 6) },
@@ -93,6 +96,7 @@
         { "Gyy.MM.dd", "H01.01.01" },
     };
 
+    @SuppressWarnings("deprecation")
     static final Object[][] BUDDHIST_JA = {
         { FULL_DATE_FORMAT_JA, "\u4ecf\u66a62469\u5e7412\u670831\u65e5", new Date(1926-1900, DECEMBER, 31) },
         { FULL_DATE_FORMAT_JA, "\u4ecf\u66a62532\u5e741\u67086\u65e5", new Date(1989-1900, JANUARY, 6) },
@@ -137,6 +141,7 @@
                             locale == Locale.ENGLISH ? BUDDHIST_EN : BUDDHIST_JA);
     }
 
+    @SuppressWarnings("deprecation")
     private static void testRoundTrip(Locale calendarLocale) {
         DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,
                                                        DateFormat.FULL,
--- a/jdk/test/java/text/Format/DateFormat/bug4358730.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/DateFormat/bug4358730.java	Wed Jul 05 22:13:53 2017 +0200
@@ -60,6 +60,7 @@
             SimpleDateFormat sdf = new SimpleDateFormat();
 
             for (int i = 0; i < datasize; i++) {
+                @SuppressWarnings("deprecation")
                 Date d = new Date(year[i]-1900, 10, 15);
                 for (int j = 0; j < nPatterns; j++) {
                     sdf.applyPattern(patterns[j]);
--- a/jdk/test/java/text/Format/MessageFormat/Bug4185816Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/MessageFormat/Bug4185816Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -98,7 +98,7 @@
             final InputStream is = HexDumpReader.getStreamFromHexDump(fileName + ".txt");
             final ObjectInputStream in = new ObjectInputStream(is);
             final MessageFormat form = (MessageFormat)in.readObject();
-            final Object[] testArgs = {new Long(12373), "MyDisk"};
+            final Object[] testArgs = {12373L, "MyDisk"};
             final String result = form.format(testArgs);
             in.close();
         } catch (Exception e) {
--- a/jdk/test/java/text/Format/MessageFormat/LargeMessageFormat.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/MessageFormat/LargeMessageFormat.java	Wed Jul 05 22:13:53 2017 +0200
@@ -56,18 +56,19 @@
 
     private static void testFormat() {
         // construct large argument array
+        @SuppressWarnings("deprecation")
         Object[] sample = {
-                new Integer(0), // replace with running count below
+                 0, // replace with running count below
                 "hello",
                 new Date(89, 10, 9),
-                new Integer(567890),
-                new Double(1234.50)
+                567890,
+                1234.50
         };
         int samples = sample.length;
         Object[] arguments = new Object[REPEATS * (samples + 1)];
         for (int i = 0; i < REPEATS; i++) {
             System.arraycopy(sample, 0, arguments, i * samples, samples);
-            arguments[i * samples] = new Integer(i);
+            arguments[i * samples] = i;
         }
 
         // construct large template
--- a/jdk/test/java/text/Format/MessageFormat/MessageRegression.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/MessageFormat/MessageRegression.java	Wed Jul 05 22:13:53 2017 +0200
@@ -136,7 +136,7 @@
         try {
             logln("Apply with pattern : " + pattern1);
             messageFormatter.applyPattern(pattern1);
-            Object[] params = {new Integer(7)};
+            Object[] params = {7};
             String tempBuffer = messageFormatter.format(params);
             if (!tempBuffer.equals("Impossible {1} has occurred -- status code is 7 and message is {2}."))
                 errln("Tests arguments < substitution failed. Formatted text=" +
@@ -455,7 +455,7 @@
             errln("argument0: \"" + objs[0] + "\"");
         mf.setLocale(Locale.US);
         mf.applyPattern("{0,number,#.##}, {0,number,#.#}");
-        Object[] oldobjs = {new Double(3.1415)};
+        Object[] oldobjs = {3.1415};
         String result = mf.format( oldobjs );
         logln("pattern: \"" + mf.toPattern() + "\"");
         logln("text for parsing: \"" + result + "\"");
@@ -481,7 +481,7 @@
         ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
         form1.setFormat(1, fileform);
         form2.setFormat(0, fileform);
-        Object[] testArgs = {new Long(12373), "MyDisk"};
+        Object[] testArgs = {12373L, "MyDisk"};
         logln(form1.format(testArgs));
         logln(form2.format(testArgs));
     }
@@ -531,7 +531,7 @@
         };
 
         for (int i=0; i<3; i++) {
-            String out = mf.format(new Object[]{new Integer(i)});
+            String out = mf.format(new Object[]{i});
             if (SUFFIX[i] == null) {
                 if (!out.equals(PREFIX[i]))
                     errln("" + i + ": Got \"" + out + "\"; Want \"" + PREFIX[i] + "\"");
@@ -607,8 +607,7 @@
      */
     public void Test4169959() {
         // This works
-        logln(MessageFormat.format( "This will {0}",
-                                    new String[]{"work"} ) );
+        logln(MessageFormat.format( "This will {0}", "work"));
 
         // This fails
         logln(MessageFormat.format( "This will {0}",
--- a/jdk/test/java/text/Format/MessageFormat/MessageTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/MessageFormat/MessageTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -52,7 +52,7 @@
 
    public void TestMSGPatternTest() {
         Object[] testArgs = {
-            new Double (1), new Double(3456),
+             1D, 3456D,
             "Disk", new Date(10000000000L)};
 
         String[] testCases = {
--- a/jdk/test/java/text/Format/NumberFormat/BigDecimalCompatibilityTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/BigDecimalCompatibilityTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -118,7 +118,7 @@
            bd = bd.divide(new BigDecimal(multiplier));
         }
         catch (ArithmeticException e) {
-           bd = bd.divide(new BigDecimal(multiplier), BigDecimal.ROUND_HALF_EVEN);
+           bd = bd.divide(new BigDecimal(multiplier), RoundingMode.HALF_EVEN);
         }
         check(num, bd, multiplier);
     }
--- a/jdk/test/java/text/Format/NumberFormat/BigDecimalFormat.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/BigDecimalFormat.java	Wed Jul 05 22:13:53 2017 +0200
@@ -793,7 +793,7 @@
         formatted.setLength(0);
         from = "123456789";
         to   = sep_zero.substring(0, 399) + ",123,456,789";
-        nf.format(new Long(from), formatted, new FieldPosition(0));
+        nf.format(123456789L, formatted, new FieldPosition(0));
         checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier());
 
         /* ------------------------------------------------------------------ */
@@ -810,7 +810,7 @@
         from = "123456789";
         to   = "-" + nonsep_zero.substring(0, 300) + "123456789." +
                nonsep_zero.substring(0, 340);
-        nf.format(new Long(from), formatted, new FieldPosition(0));
+        nf.format(123456789L, formatted, new FieldPosition(0));
         checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier());
 
         /* ------------------------------------------------------------------ */
@@ -827,7 +827,7 @@
         from = Long.toString(Long.MAX_VALUE);
         to   = sep_zero.substring(0, 373) +
                "19,807,040,619,342,712,359,383,728,129";
-        nf.format(new Long(from), formatted, new FieldPosition(0));
+        nf.format(Long.MAX_VALUE, formatted, new FieldPosition(0));
         checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier());
 
         /* ------------------------------------------------------------------ */
@@ -844,7 +844,7 @@
         from = Long.toString(Long.MAX_VALUE);
         to   = "-1.9807040628566084396238503936" +
                nonsep_zero.substring(0, 312) + "E28";
-        nf.format(new Long(from), formatted, new FieldPosition(0));
+        nf.format(Long.MAX_VALUE, formatted, new FieldPosition(0));
         checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier());
 
         /* ------------------------------------------------------------------ */
@@ -862,7 +862,7 @@
         to   = "-19807040619342712361531211776" +
                nonsep_zero.substring(0, 280) + "." +
                nonsep_zero.substring(0, 340) + "E-280";
-        nf.format(new Long(from), formatted, new FieldPosition(0));
+        nf.format(Long.MIN_VALUE, formatted, new FieldPosition(0));
         checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier());
 
         /* ------------------------------------------------------------------ */
@@ -880,7 +880,7 @@
         to   = sep_zero.substring(0, 373) +
                "19,807,040,628,566,084,398,385,987,584." +
                nonsep_zero.substring(0, 340);
-        nf.format(new Long(from), formatted, new FieldPosition(0));
+        nf.format(Long.MIN_VALUE, formatted, new FieldPosition(0));
         checkFormat(from, formatted, to, ((DecimalFormat)nf).getMultiplier());
     }
 
--- a/jdk/test/java/text/Format/NumberFormat/BigDecimalParse.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/BigDecimalParse.java	Wed Jul 05 22:13:53 2017 +0200
@@ -199,15 +199,15 @@
 
         // From: 1000.000
         // To:   Double.POSITIVE_INFINITY
-        check("1000.000", new Double(Double.POSITIVE_INFINITY));
+        check("1000.000", Double.POSITIVE_INFINITY);
 
         // From: -1000
         // To:   Double.NEGATIVE_INFINITY
-        check("-1000", new Double(Double.NEGATIVE_INFINITY));
+        check("-1000", Double.NEGATIVE_INFINITY);
 
         // From: -0.00
         // To:   Double.NaN
-        check("-0.00", new Double(Double.NaN));
+        check("-0.00", Double.NaN);
     }
 
     /**
@@ -220,31 +220,31 @@
 
         // From: 1000.000
         // To:   Double.POSITIVE_INFINITY
-        check("1000.000", new Double(Double.POSITIVE_INFINITY));
+        check("1000.000", Double.POSITIVE_INFINITY);
 
         // From: -1000.000
         // To:   Double.NEGATIVE_INFINITY
-        check("-1000.000", new Double(Double.NEGATIVE_INFINITY));
+        check("-1000.000", Double.NEGATIVE_INFINITY);
 
         // From: 0.0
         // To:   Double.NaN
-        check("0.0", new Double(Double.NaN));
+        check("0.0", Double.NaN);
 
         // From: -0.0 (Double)
         // To:   Double.NaN
-        check("-0.0", new Double(Double.NaN));
+        check("-0.0", Double.NaN);
 
         // From: Double.NaN
         // To:   Double.NaN
-        check("\ufffd", new Double(Double.NaN));
+        check("\ufffd", Double.NaN);
 
         // From: Double.POSITIVE_INFINITY
         // To:   Double.NaN
-        check("\u221e", new Double(Double.POSITIVE_INFINITY));
+        check("\u221e", Double.POSITIVE_INFINITY);
 
         // From: Double.NEGATIVE_INFINITY
         // To:   Double.NaN
-        check("-\u221e", new Double(Double.NEGATIVE_INFINITY));
+        check("-\u221e", Double.NEGATIVE_INFINITY);
     }
 
     /**
@@ -257,15 +257,15 @@
 
         // From: 1000
         // To:   Double.POSITIVE_INFINITY
-        check("1000", new Double(Double.POSITIVE_INFINITY));
+        check("1000", Double.POSITIVE_INFINITY);
 
         // From: -1000
         // To:   Double.NEGATIVE_INFINITY
-        check("-1000", new Double(Double.NEGATIVE_INFINITY));
+        check("-1000", Double.NEGATIVE_INFINITY);
 
         // From: -000 (Long)
         // To:   Double.NaN
-        check("-000", new Double(Double.NaN));
+        check("-000", Double.NaN);
     }
 
     /**
@@ -350,20 +350,20 @@
             {
                 new BigDecimal("0"), new BigDecimal("0.0"), new BigDecimal("5"),
                 new BigDecimal("5.0"), new BigDecimal("5.1"),
-                new Double(Double.POSITIVE_INFINITY), new Double(Double.NaN),
+                Double.POSITIVE_INFINITY, Double.NaN,
                 new BigDecimal("0"), new BigDecimal("0.0"),
                 new BigDecimal("-5"), new BigDecimal("-5.0"),
                 new BigDecimal("-5.1"),
-                new Double(Double.NEGATIVE_INFINITY), new Double(Double.NaN),
+                Double.NEGATIVE_INFINITY, Double.NaN,
             },
             {
                 new BigDecimal("0"), new BigDecimal("0.0"),
                 new BigDecimal("-5"), new BigDecimal("-5.0"),
                 new BigDecimal("-5.1"),
-                new Double(Double.NEGATIVE_INFINITY), new Double(Double.NaN),
+                Double.NEGATIVE_INFINITY, Double.NaN,
                 new BigDecimal("0"), new BigDecimal("0.0"), new BigDecimal("5"),
                 new BigDecimal("5.0"), new BigDecimal("5.1"),
-                new Double(Double.POSITIVE_INFINITY),
+                Double.POSITIVE_INFINITY,
             },
         };
 
--- a/jdk/test/java/text/Format/NumberFormat/Bug4208135.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/Bug4208135.java	Wed Jul 05 22:13:53 2017 +0200
@@ -47,12 +47,12 @@
         df.applyPattern("0.#E0");
 
         df.setDecimalSeparatorAlwaysShown(true);
-        checkFormat(new Double(0.0), "0.E0");
-        checkFormat(new Double(10.0), "1.E1");
-        checkFormat(new Double(1000.0), "1.E3");
-        checkFormat(new Long(0), "0.E0");
-        checkFormat(new Long(10), "1.E1");
-        checkFormat(new Long(1000), "1.E3");
+        checkFormat(0.0, "0.E0");
+        checkFormat(10.0, "1.E1");
+        checkFormat(1000.0, "1.E3");
+        checkFormat(0L, "0.E0");
+        checkFormat(10L, "1.E1");
+        checkFormat(1000L, "1.E3");
         checkFormat(new BigDecimal("0.0"), "0.E0");
         checkFormat(new BigDecimal("10.0"), "1.E1");
         checkFormat(new BigDecimal("1000.0"), "1.E3");
@@ -61,12 +61,12 @@
         checkFormat(new BigInteger("1000"), "1.E3");
 
         df.setDecimalSeparatorAlwaysShown(false);
-        checkFormat(new Double(0.0), "0E0");
-        checkFormat(new Double(10.0), "1E1");
-        checkFormat(new Double(1000.0), "1E3");
-        checkFormat(new Long(0), "0E0");
-        checkFormat(new Long(10), "1E1");
-        checkFormat(new Long(1000), "1E3");
+        checkFormat(0.0, "0E0");
+        checkFormat(10.0, "1E1");
+        checkFormat(1000.0, "1E3");
+        checkFormat(0L, "0E0");
+        checkFormat(10L, "1E1");
+        checkFormat(1000L, "1E3");
         checkFormat(new BigDecimal("0.0"), "0E0");
         checkFormat(new BigDecimal("10.0"), "1E1");
         checkFormat(new BigDecimal("1000.0"), "1E3");
@@ -77,12 +77,12 @@
         df.applyPattern("0.###");
 
         df.setDecimalSeparatorAlwaysShown(true);
-        checkFormat(new Double(0.0), "0.");
-        checkFormat(new Double(10.0), "10.");
-        checkFormat(new Double(1000.0), "1000.");
-        checkFormat(new Long(0), "0.");
-        checkFormat(new Long(10), "10.");
-        checkFormat(new Long(1000), "1000.");
+        checkFormat(0.0, "0.");
+        checkFormat(10.0, "10.");
+        checkFormat(1000.0, "1000.");
+        checkFormat(0L, "0.");
+        checkFormat(10L, "10.");
+        checkFormat(1000L, "1000.");
         checkFormat(new BigDecimal("0.0"), "0.");
         checkFormat(new BigDecimal("10.0"), "10.");
         checkFormat(new BigDecimal("1000.0"), "1000.");
@@ -91,12 +91,12 @@
         checkFormat(new BigInteger("1000"), "1000.");
 
         df.setDecimalSeparatorAlwaysShown(false);
-        checkFormat(new Double(0.0), "0");
-        checkFormat(new Double(10.0), "10");
-        checkFormat(new Double(1000.0), "1000");
-        checkFormat(new Long(0), "0");
-        checkFormat(new Long(10), "10");
-        checkFormat(new Long(1000), "1000");
+        checkFormat(0.0, "0");
+        checkFormat(10.0, "10");
+        checkFormat(1000.0, "1000");
+        checkFormat(0L, "0");
+        checkFormat(10L, "10");
+        checkFormat(1000L, "1000");
         checkFormat(new BigDecimal("0.0"), "0");
         checkFormat(new BigDecimal("10.0"), "10");
         checkFormat(new BigDecimal("1000.0"), "1000");
--- a/jdk/test/java/text/Format/NumberFormat/Bug4833877.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/Bug4833877.java	Wed Jul 05 22:13:53 2017 +0200
@@ -51,20 +51,20 @@
         /*
          * Test for double/Double
          */
-        checkFormat(new Double(252.5252525252525), "1,010.10101010101");
-        checkParse("-1,010.10101010101", new Double(-252.5252525252525));
+        checkFormat(252.5252525252525, "1,010.10101010101");
+        checkParse("-1,010.10101010101", -252.5252525252525);
 
-        checkFormat(new Double(-2222.2222), "-8,888.8888");
-        checkParse("8888.8888", new Double(2222.2222));
+        checkFormat(-2222.2222, "-8,888.8888");
+        checkParse("8888.8888", 2222.2222);
 
         /*
          * Test for long/Long
          */
-        checkFormat(new Long(1000), "4,000");
-        checkParse("-4,000", new Long(-1000));
+        checkFormat(1000L, "4,000");
+        checkParse("-4,000", -1000L);
 
-        checkFormat(new Long(-250), "-1,000");
-        checkParse("1000", new Long(250));
+        checkFormat(-250L, "-1,000");
+        checkParse("1000", 250L);
 
         /* ---------------------------------------------------------------- */
 
@@ -104,20 +104,20 @@
         /*
          * Test for double/Double
          */
-        checkFormat(new Double(252.5252525252525), "-1,010.10101010101");
-        checkParse("-1,010.10101010101", new Double(252.5252525252525));
+        checkFormat(252.5252525252525, "-1,010.10101010101");
+        checkParse("-1,010.10101010101", 252.5252525252525);
 
-        checkFormat(new Double(-2222.2222), "8,888.8888");
-        checkParse("8888.8888", new Double(-2222.2222));
+        checkFormat(-2222.2222, "8,888.8888");
+        checkParse("8888.8888", -2222.2222);
 
         /*
          * Test for long/Long
          */
-        checkFormat(new Long(1000), "-4,000");
-        checkParse("-4,000", new Long(1000));
+        checkFormat(1000L, "-4,000");
+        checkParse("-4,000", 1000L);
 
-        checkFormat(new Long(-250), "1,000");
-        checkParse("1000", new Long(-250));
+        checkFormat(-250L, "1,000");
+        checkParse("1000", -250L);
 
         /* ---------------------------------------------------------------- */
 
@@ -157,30 +157,30 @@
         /*
          * Test for double/Double
          */
-        checkFormat(new Double(3333.3333333), "-9,999.9999999");
-        checkParse("-10,000.00000000000", new Double(3333.3333333333335));// rounding error
+        checkFormat(3333.3333333, "-9,999.9999999");
+        checkParse("-10,000.00000000000", 3333.3333333333335);// rounding error
 
         df.setParseIntegerOnly(true);
-        checkFormat(new Double(-3333.3333333), "9,999.9999999");
-        checkParse("10,000.00000000000", new Long(-3333));
+        checkFormat(-3333.3333333, "9,999.9999999");
+        checkParse("10,000.00000000000", -3333L);
         df.setParseIntegerOnly(false);
-        checkFormat(new Double(-3333.3333333), "9,999.9999999");
-        checkParse("10,000.00000000000", new Double(-3333.3333333333335));// rounding error
+        checkFormat(-3333.3333333, "9,999.9999999");
+        checkParse("10,000.00000000000", -3333.3333333333335);// rounding error
 
         /*
          * Test for long/Long
          */
-        checkFormat(new Long(3333), "-9,999");
+        checkFormat(3333L, "-9,999");
         df.setParseIntegerOnly(true);
-        checkParse("-10,000", new Long(3333));
+        checkParse("-10,000", 3333L);
         df.setParseIntegerOnly(false);
-        checkParse("-10000", new Double(3333.3333333333335));// rounding error
+        checkParse("-10000", 3333.3333333333335);// rounding error
 
-        checkFormat(new Long(-3333), "9,999");
+        checkFormat(-3333L, "9,999");
         df.setParseIntegerOnly(true);
-        checkParse("10,000", new Long(-3333));
+        checkParse("10,000", -3333L);
         df.setParseIntegerOnly(false);
-        checkParse("10000", new Double(-3333.3333333333335));// rounding error
+        checkParse("10000", -3333.3333333333335);// rounding error
 
         /* ---------------------------------------------------------------- */
 
@@ -225,20 +225,20 @@
         /*
          * Test for double/Double
          */
-        checkFormat(new Double(252.5252525252525), "1.01010101010101E3");
-        checkParse("-1.01010101010101E3", new Double(-2.525252525252525E2));
+        checkFormat(252.5252525252525, "1.01010101010101E3");
+        checkParse("-1.01010101010101E3", -2.525252525252525E2);
 
-        checkFormat(new Double(-2222.2222), "-8.8888888E3");
-        checkParse("8888.8888", new Double(2.2222222E3));
+        checkFormat(-2222.2222, "-8.8888888E3");
+        checkParse("8888.8888", 2.2222222E3);
 
         /*
          * Test for long/Long
          */
-        checkFormat(new Long(1000), "4E3");
-        checkParse("-4E3", new Long(-1000));
+        checkFormat(1000L, "4E3");
+        checkParse("-4E3", -1000L);
 
-        checkFormat(new Long(-250), "-1E3");
-        checkParse("1000", new Long(250));
+        checkFormat(-250L, "-1E3");
+        checkParse("1000", 250L);
 
         /* ---------------------------------------------------------------- */
 
@@ -279,20 +279,20 @@
         /*
          * Test for double/Double
          */
-        checkFormat(new Double(252.5252525252525), "-1.01010101010101E3");
-        checkParse("-1.01010101010101E3", new Double(2.525252525252525E2));
+        checkFormat(252.5252525252525, "-1.01010101010101E3");
+        checkParse("-1.01010101010101E3", 2.525252525252525E2);
 
-        checkFormat(new Double(-2222.2222), "8.8888888E3");
-        checkParse("8888.8888", new Double(-2.2222222E3));
+        checkFormat(-2222.2222, "8.8888888E3");
+        checkParse("8888.8888", -2.2222222E3);
 
         /*
          * Test for long/Long
          */
-        checkFormat(new Long(1000), "-4E3");
-        checkParse("-4E3", new Long(1000));
+        checkFormat(1000L, "-4E3");
+        checkParse("-4E3", 1000L);
 
-        checkFormat(new Long(-250), "1E3");
-        checkParse("1000", new Long(-250));
+        checkFormat(-250L, "1E3");
+        checkParse("1000", -250L);
 
         /* ---------------------------------------------------------------- */
 
@@ -333,30 +333,30 @@
         /*
          * Test for double/Double
          */
-        checkFormat(new Double(3333.3333333), "-9.9999999999E3");
-        checkParse("-1.00000000000000E3", new Double(3.33333333333333333E2));
+        checkFormat(3333.3333333, "-9.9999999999E3");
+        checkParse("-1.00000000000000E3", 3.33333333333333333E2);
 
         df.setParseIntegerOnly(true);
-        checkFormat(new Double(-3333.3333333), "9.9999999999E3");
-        checkParse("10.00000000000000E3", new Long(-3));
+        checkFormat(-3333.3333333, "9.9999999999E3");
+        checkParse("10.00000000000000E3",-3L);
         df.setParseIntegerOnly(false);
-        checkFormat(new Double(-3333.3333333), "9.9999999999E3");
-        checkParse("10.00000000000000E3", new Double(-3.33333333333333333E3));
+        checkFormat(-3333.3333333, "9.9999999999E3");
+        checkParse("10.00000000000000E3", -3.33333333333333333E3);
 
         /*
          * Test for long/Long
          */
-        checkFormat(new Long(3333), "-9.999E3");
+        checkFormat(3333L, "-9.999E3");
         df.setParseIntegerOnly(true);
-        checkParse("-1.0E4", new Long(0));
+        checkParse("-1.0E4", 0L);
         df.setParseIntegerOnly(false);
-        checkParse("-1.0E4", new Double(3333.3333333333335));
+        checkParse("-1.0E4", 3333.3333333333335);
 
-        checkFormat(new Long(-3333), "9.999E3");
+        checkFormat(-3333L, "9.999E3");
         df.setParseIntegerOnly(true);
-        checkParse("10.0E4", new Long(-3));
+        checkParse("10.0E4", -3L);
         df.setParseIntegerOnly(false);
-        checkParse("10.0E4", new Double(-33333.3333333333336));
+        checkParse("10.0E4", -33333.3333333333336);
 
         /* ---------------------------------------------------------------- */
 
--- a/jdk/test/java/text/Format/NumberFormat/Bug4838107.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/Bug4838107.java	Wed Jul 05 22:13:53 2017 +0200
@@ -71,47 +71,47 @@
         dfs = df.getDecimalFormatSymbols();
 
         /* Test with default pattern */
-        test(new Double(1234),    "1,234");
-        test(new Double(0.1234),  "0.123");     // rounded
-        test(new Double(-1234),   "-1,234");
-        test(new Double(-0.1234), "-0.123");    // rounded
+        test(1234D,    "1,234");
+        test(0.1234,  "0.123");     // rounded
+        test(-1234D,   "-1,234");
+        test(-0.1234, "-0.123");    // rounded
 
-        test(new Double(Double.POSITIVE_INFINITY), "\u221e");
-        test(new Double(Double.NEGATIVE_INFINITY), "-\u221e");
-        test(new Double(Double.NaN), "\ufffd"); // without prefix and suffix
-        test(new Double(0.0),  "0");
-        test(new Double(-0.0), "-0");   // with the minus sign
+        test(Double.POSITIVE_INFINITY, "\u221e");
+        test(Double.NEGATIVE_INFINITY, "-\u221e");
+        test(Double.NaN, "\ufffd"); // without prefix and suffix
+        test(0.0,  "0");
+        test(-0.0, "-0");   // with the minus sign
 
         /* Specify a pattern and the minus sign. */
         prepareFormatter("<P>#.###E00<S>", 'm');
-        test(new Double(1234),    "<P>1.234E03<S>");
-        test(new Double(0.1234),  "<P>1.234Em01<S>");
-        test(new Double(-1234),   "m<P>1.234E03<S>");
-        test(new Double(-0.1234), "m<P>1.234Em01<S>");
+        test(1234D,    "<P>1.234E03<S>");
+        test(0.1234,  "<P>1.234Em01<S>");
+        test(-1234D,   "m<P>1.234E03<S>");
+        test(-0.1234, "m<P>1.234Em01<S>");
 
         prepareFormatter("<P>#.###E00<S>;#.###E00", 'm');
-        test(new Double(1234),    "<P>1.234E03<S>");
-        test(new Double(0.1234),  "<P>1.234Em01<S>");
-        test(new Double(-1234),   "1.234E03");
-        test(new Double(-0.1234), "1.234Em01");
+        test(1234D,    "<P>1.234E03<S>");
+        test(0.1234,  "<P>1.234Em01<S>");
+        test(-1234D,   "1.234E03");
+        test(-0.1234, "1.234Em01");
 
         prepareFormatter("#.###E00;<P>#.###E00<S>", 'm');
-        test(new Double(1234),    "1.234E03");
-        test(new Double(0.1234),  "1.234Em01");
-        test(new Double(-1234),   "<P>1.234E03<S>");
-        test(new Double(-0.1234), "<P>1.234Em01<S>");
+        test(1234D,    "1.234E03");
+        test(0.1234,  "1.234Em01");
+        test(-1234D,   "<P>1.234E03<S>");
+        test(-0.1234, "<P>1.234Em01<S>");
 
         prepareFormatter("<P>#.###E00<S>;<p>-#.###E00<s>", 'm');
-        test(new Double(1234),    "<P>1.234E03<S>");
-        test(new Double(0.1234),  "<P>1.234Em01<S>");
-        test(new Double(-1234),   "<p>m1.234E03<s>");
-        test(new Double(-0.1234), "<p>m1.234Em01<s>");
+        test(1234D,    "<P>1.234E03<S>");
+        test(0.1234,  "<P>1.234Em01<S>");
+        test(-1234D,   "<p>m1.234E03<s>");
+        test(-0.1234, "<p>m1.234Em01<s>");
 
-        test(new Double(Double.POSITIVE_INFINITY), "<P>\u221e<S>");
-        test(new Double(Double.NEGATIVE_INFINITY), "<p>m\u221e<s>");
-        test(new Double(Double.NaN), "\ufffd"); // without prefix and suffix
-        test(new Double(0.0),  "<P>0E00<S>");
-        test(new Double(-0.0), "<p>m0E00<s>");  // with the minus sign
+        test(Double.POSITIVE_INFINITY, "<P>\u221e<S>");
+        test(Double.NEGATIVE_INFINITY, "<p>m\u221e<s>");
+        test(Double.NaN, "\ufffd"); // without prefix and suffix
+        test(0.0,  "<P>0E00<S>");
+        test(-0.0, "<p>m0E00<s>");  // with the minus sign
     }
 
     static void test_BigDecimal() {
@@ -151,19 +151,19 @@
         dfs = df.getDecimalFormatSymbols();
 
         /* Test with default pattern */
-        test(new Long(123456789),  "123,456,789");
-        test(new Long(-123456789), "-123,456,789");
+        test(123456789L,  "123,456,789");
+        test(-123456789L, "-123,456,789");
 
-        test(new Long(0), "0");
-        test(new Long(-0), "0");
+        test(0L, "0");
+        test(-0L, "0");
 
         /* Specify a pattern and the minus sign. */
         prepareFormatter("<P>#,###<S>;<p>-#,###<s>", 'm');
-        test(new Long(123456789),  "<P>123,456,789<S>");
-        test(new Long(-123456789), "<p>m123,456,789<s>");
+        test(123456789L,  "<P>123,456,789<S>");
+        test(-123456789L, "<p>m123,456,789<s>");
 
-        test(new Long(0), "<P>0<S>");
-        test(new Long(-0), "<P>0<S>");
+        test(0L, "<P>0<S>");
+        test(-0L, "<P>0<S>");
     }
 
     static void test_BigInteger() {
--- a/jdk/test/java/text/Format/NumberFormat/Bug4944439.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/Bug4944439.java	Wed Jul 05 22:13:53 2017 +0200
@@ -84,7 +84,7 @@
         }
 
         int index = s.indexOf('.');
-        Long l = new Long(s.substring(0, index));
+        Long l = Long.valueOf(s.substring(0, index));
         if (!l.equals(number)) {
             err = true;
             System.err.println("Failed: DecimalFormat.parse(" + s +
@@ -101,7 +101,7 @@
                 number.getClass().getName());
         }
 
-        Double d = new Double(s);
+        Double d = Double.valueOf(s);
         if (!d.equals(number)) {
             err = true;
             System.err.println("Failed: DecimalFormat.parse(" + s +
--- a/jdk/test/java/text/Format/NumberFormat/Bug4990596.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/Bug4990596.java	Wed Jul 05 22:13:53 2017 +0200
@@ -35,6 +35,7 @@
         new DecimalFormat().format(new MutableInteger(0));
     }
 
+    @SuppressWarnings("serial")
     public static class MutableInteger extends Number {
         public int value;
 
--- a/jdk/test/java/text/Format/NumberFormat/Bug6278616.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/Bug6278616.java	Wed Jul 05 22:13:53 2017 +0200
@@ -47,7 +47,7 @@
         NumberFormat nf = NumberFormat.getInstance();
 
         for (int j = 0; j < ints.length; j++) {
-            String s_i = nf.format(new Integer(ints[j]));
+            String s_i = nf.format(ints[j]);
             String s_ai = nf.format(new AtomicInteger(ints[j]));
             if (!s_i.equals(s_ai)) {
                 throw new RuntimeException("format(AtomicInteger " + s_ai +
@@ -57,7 +57,7 @@
         }
 
         for (int j = 0; j < longs.length; j++) {
-            String s_l = nf.format(new Long(longs[j]));
+            String s_l = nf.format(longs[j]);
             String s_al = nf.format(new AtomicLong(longs[j]));
             if (!s_l.equals(s_al)) {
                 throw new RuntimeException("format(AtomicLong " + s_al +
--- a/jdk/test/java/text/Format/NumberFormat/NumberRegression.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/NumberRegression.java	Wed Jul 05 22:13:53 2017 +0200
@@ -289,7 +289,7 @@
         DecimalFormat df = new DecimalFormat();
         Double d = (Double)df.parse("123.55456", pos=new ParsePosition(0));
         if (!d.toString().equals("123.55456")) {
-            errln("Result -> " + d.doubleValue());
+            errln("Result -> " + d);
         }
         Locale.setDefault(savedLocale);
     }
@@ -395,11 +395,11 @@
         Locale.setDefault(Locale.US);
         DecimalFormat df = new DecimalFormat();
         String str = "0.1234";
-        Double d1 = new Double(str);
+        Double d1 = 0.1234;
         Double d2 = (Double) df.parse(str, new ParsePosition(0));
         logln(d1.toString());
         if (d2.doubleValue() != d1.doubleValue())
-            errln("Bug 4095713 test failed, new double value : " + d2.doubleValue());
+            errln("Bug 4095713 test failed, new double value : " + d2);
         Locale.setDefault(savedLocale);
     }
 
@@ -870,7 +870,7 @@
         DecimalFormat fmt = new DecimalFormat("#,##0.00");
         StringBuffer formatted = new StringBuffer();
         FieldPosition field = new FieldPosition(0);
-        Double num = new Double(1234.5);
+        Double num = 1234.5;
         fmt.format(num, formatted, field);
         if (field.getBeginIndex() != 0 && field.getEndIndex() != 5)
             errln("Format 1234.5 failed. Begin index: " + field.getBeginIndex() + " End index: " + field.getEndIndex());
@@ -1416,7 +1416,7 @@
         DecimalFormat fmt = new DecimalFormat("#",
                 DecimalFormatSymbols.getInstance(Locale.US));
         for (int i=0; i<DATA.length; i+=3) {
-            double in = Double.valueOf(DATA[i]).doubleValue();
+            double in = Double.valueOf(DATA[i]);
             String pat = DATA[i+1];
             String exp = DATA[i+2];
             fmt.applyPattern(pat);
@@ -1622,7 +1622,7 @@
             String str = Long.toString(DATA[i]);
             for (int m = 1; m <= 100; m++) {
                 fmt.setMultiplier(m);
-                long n = ((Number) fmt.parse(str)).longValue();
+                long n = fmt.parse(str).longValue();
                 if (n > 0 != DATA[i] > 0) {
                     errln("\"" + str + "\" parse(x " + fmt.getMultiplier() +
                           ") => " + n);
@@ -1637,15 +1637,15 @@
      */
     public void Test4217661() {
         Object[] DATA = {
-            new Double(0.001), "0",
-            new Double(1.001), "1",
-            new Double(0.006), "0.01",
-            new Double(1.006), "1.01",
+            0.001, "0",
+            1.001, "1",
+            0.006, "0.01",
+            1.006, "1.01",
         };
         NumberFormat fmt = NumberFormat.getInstance(Locale.US);
         fmt.setMaximumFractionDigits(2);
         for (int i=0; i<DATA.length; i+=2) {
-            String s = fmt.format(((Double) DATA[i]).doubleValue());
+            String s = fmt.format((Double) DATA[i]);
             if (!s.equals(DATA[i+1])) {
                 errln("FAIL: Got " + s + ", exp " + DATA[i+1]);
             }
@@ -1804,6 +1804,7 @@
     }
 }
 
+@SuppressWarnings("serial")
 class myformat implements Serializable
 {
     DateFormat _dateFormat = DateFormat.getDateInstance();
@@ -1817,6 +1818,7 @@
     }
 }
 
+@SuppressWarnings("serial")
 class MyNumberFormatTest extends NumberFormat {
     public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
         return new StringBuffer("");
@@ -1825,6 +1827,6 @@
         return new StringBuffer("");
     }
     public Number parse(String text, ParsePosition parsePosition) {
-        return new Integer(0);
+        return 0;
     }
 }
--- a/jdk/test/java/text/Format/NumberFormat/NumberRoundTrip.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/NumberRoundTrip.java	Wed Jul 05 22:13:53 2017 +0200
@@ -130,11 +130,11 @@
     }
 
     public void doTest(NumberFormat fmt, double value) {
-        doTest(fmt, new Double(value));
+        doTest(fmt, Double.valueOf(value));
     }
 
     public void doTest(NumberFormat fmt, long value) {
-        doTest(fmt, new Long(value));
+        doTest(fmt, Long.valueOf(value));
     }
 
     static double proportionalError(Number a, Number b) {
--- a/jdk/test/java/text/Format/NumberFormat/NumberTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/NumberTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -403,7 +403,7 @@
         float[] parseExpected = { 0, 0, 12345, -12345 };
 
         for (int i = 0; i < parseInput.length; i++) {
-            float result = ((Number) format.parse(parseInput[i])).floatValue();
+            float result = format.parse(parseInput[i]).floatValue();
             if (result != parseExpected[i]) {
                 errln("FAIL: Expected " + parseExpected[i] + ", got " + result);
             }
--- a/jdk/test/java/text/Format/NumberFormat/SerializationLoadTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/SerializationLoadTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -62,6 +62,7 @@
     }
 }
 
+@SuppressWarnings("serial")
 class CheckDecimalFormat implements Serializable
 {
     DecimalFormat _decFormat = (DecimalFormat)NumberFormat.getInstance();
@@ -73,6 +74,7 @@
     }
 }
 
+@SuppressWarnings("serial")
 class CheckDecimalFormatSymbols implements Serializable
 {
     DecimalFormatSymbols _decFormatSymbols = new DecimalFormatSymbols();
--- a/jdk/test/java/text/Format/NumberFormat/SerializationSaveTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/NumberFormat/SerializationSaveTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -57,6 +57,7 @@
     }
 }
 
+@SuppressWarnings("serial")
 class CheckDecimalFormat implements Serializable
 {
     DecimalFormat _decFormat = (DecimalFormat)NumberFormat.getInstance();
@@ -68,6 +69,7 @@
     }
 }
 
+@SuppressWarnings("serial")
 class CheckDecimalFormatSymbols implements Serializable
 {
     DecimalFormatSymbols _decFormatSymbols = new DecimalFormatSymbols();
--- a/jdk/test/java/text/Format/common/FormatIteratorTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/common/FormatIteratorTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -37,6 +37,7 @@
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
+import java.text.AttributedCharacterIterator.Attribute;
 
 /**
  * FormatTester creates Formats, and tests the resulting FieldPositions
@@ -94,7 +95,6 @@
  * Any lines starting with {@code '#'} are comment lines and ignored.
  */
 public class FormatIteratorTest extends IntlTest {
-    private static HashMap attrs;
     private Format format;
     private Object value;
     private String text;
@@ -143,30 +143,31 @@
                        "dateFormat.props"));
     }
 
+    @SuppressWarnings("unchecked")
     private void _test(File file) {
         try {
-            attrs = new HashMap();
             logln("testing: " + file);
             PParser parser = new PParser();
-            Hashtable contents = parser.parse(new BufferedReader(
+            Map<String,Object> contents = parser.parse(new BufferedReader(
                 new FileReader(file)));
-            Vector test = (Vector)contents.get("tests");
+            List<Object> test = (List)contents.get("tests");
 
             for (int counter = 0; counter < test.size(); counter++) {
                 logln("creating: " + (counter / 2));
 
                 AttributedCharacterIterator iterator =
-                    create((Hashtable)test.get(counter));
+                    create((Map)test.get(counter));
 
                 logln("verifying: " + (counter / 2));
-                verify(iterator, (Hashtable)test.get(++counter));
+                verify(iterator, (Map)test.get(++counter));
             }
         } catch (IOException ioe) {
             errln("Error reading: " + ioe);
         }
     }
 
-    public void verify(AttributedCharacterIterator iterator,Hashtable table) {
+    @SuppressWarnings("unchecked")
+    public void verify(AttributedCharacterIterator iterator,Map<String,Object> table) {
         int length = Integer.parseInt((String)table.get("length"));
 
         // Verify the text
@@ -185,10 +186,10 @@
         for (int counter = 0; counter < length; counter++) {
             iterator.setIndex(counter);
             if (!verifyAttributes(iterator.getAttributes().keySet(),
-                    makeAttributes((Vector)table.get(Integer.
+                    makeAttributes((List)table.get(Integer.
                                                       toString(counter))))) {
                 errln("Attributes don't match at " + counter + " expecting " +
-                      makeAttributes((Vector)table.get(Integer.toString
+                      makeAttributes((List)table.get(Integer.toString
                                                        (counter))) + " got " +
                       iterator.getAttributes().keySet());
             }
@@ -196,10 +197,10 @@
         for (int counter = length - 1; counter >= 0; counter--) {
             iterator.setIndex(counter);
             if (!verifyAttributes(iterator.getAttributes().keySet(),
-                    makeAttributes((Vector)table.get(Integer.
+                    makeAttributes((List)table.get(Integer.
                                                       toString(counter))))) {
                 errln("Attributes don't match at " + counter + " expecting " +
-                      makeAttributes((Vector)table.get(Integer.toString
+                      makeAttributes((List)table.get(Integer.toString
                                                        (counter))) + " got " +
                       iterator.getAttributes().keySet());
             }
@@ -207,31 +208,33 @@
         verifyLimits(iterator, table);
 
         text = escapeIfNecessary((String)table.get("text"));
-        Vector fps = (Vector)table.get("fieldPositions");
+        List<Object> fps = (List)table.get("fieldPositions");
 
         if (fps != null) {
             for (int counter = 0; counter < fps.size(); counter++) {
-                verifyFieldPosition(counter, (Hashtable)fps.get(counter));
+                verifyFieldPosition(counter,(Map)fps.get(counter));
             }
         }
     }
 
+    @SuppressWarnings("unchecked")
     private void verifyLimits(AttributedCharacterIterator iterator,
-                              Hashtable table) {
-        Vector limits = (Vector)table.get("limits");
+                              Map<String,Object> table) {
+        List<Object> limits = (List)table.get("limits");
 
         if (limits != null) {
             for (int counter = 0; counter < limits.size(); counter++) {
-                verifyLimit(iterator, (Hashtable)limits.get(counter));
+                verifyLimit(iterator, (Map)limits.get(counter));
             }
         }
     }
 
     private void verifyLimit(AttributedCharacterIterator iterator,
-                             Hashtable table) {
+                             Map<String,Object> table) {
         int begin = Integer.parseInt((String)table.get("begin"));
         int end = Integer.parseInt((String)table.get("end"));
-        Set attrs = makeAttributes((Vector)table.get("attributes"));
+        @SuppressWarnings("unchecked")
+        Set<Attribute> attrs = makeAttributes((List)table.get("attributes"));
         String begin2S = (String)table.get("begin2");
         int begin2 = (begin2S != null) ? Integer.parseInt(begin2S) : begin;
         String end2S = (String)table.get("end2");
@@ -262,9 +265,9 @@
         }
     }
 
-    private boolean verifyAttributes(Set a, Set b) {
-        boolean aEmpty = (a.size() == 0);
-        boolean bEmpty = (b.size() == 0);
+    private boolean verifyAttributes(Set<Attribute> a, Set<Attribute> b) {
+        boolean aEmpty = a.isEmpty();
+        boolean bEmpty = b.isEmpty();
 
         if (aEmpty && bEmpty) {
             return true;
@@ -284,14 +287,14 @@
         return buffer.toString();
     }
 
-    private void verifyFieldPosition(int index, Hashtable table) {
+    private void verifyFieldPosition(int index, Map<String,Object> table) {
         Object o = table.get("field");
         int begin = Integer.parseInt((String)table.get("begin"));
         int end = Integer.parseInt((String)table.get("end"));
 
         if (o != null) {
             FieldPosition fp = new FieldPosition(((Integer)
-                                          lookupField((String)o)).intValue());
+                                          lookupField((String)o)));
 
             verifyFieldPosition(fp, begin, end, index);
         }
@@ -322,11 +325,11 @@
         }
     }
 
-    public AttributedCharacterIterator create(Hashtable table) {
+    public AttributedCharacterIterator create(Map<String,Object> table) {
         format = (Format)createInstance((String)table.get("class"),
-                                        ((Vector)table.get("args")).toArray());
+                                        ((List)table.get("args")).toArray());
         value = createInstance((String)table.get("valueClass"),
-                               ((Vector)table.get("valueArgs")).toArray());
+                               ((List)table.get("valueArgs")).toArray());
 
         logln("Created format: " + format + " value " + value);
         AttributedCharacterIterator aci = format.
@@ -343,11 +346,12 @@
     private Object createInstance(String className, Object[] args) {
         if (className.equals("java.lang.reflect.Array")) {
             for (int counter = 0; counter < args.length; counter++) {
-                if (args[counter] instanceof Vector) {
-                    Vector v = (Vector)args[counter];
+                if (args[counter] instanceof List) {
+                    @SuppressWarnings("unchecked")
+                    List<Object> v = (List<Object>)args[counter];
 
                     args[counter] = createInstance((String)v.get(0),
-                                               ((Vector)v.get(1)).toArray());
+                                               ((List)v.get(1)).toArray());
                 }
             }
             return args;
@@ -361,9 +365,9 @@
             } else if (className.equals("java.util.concurrent.atomic.AtomicLong")) {
                 return new AtomicLong(Long.valueOf((String)args[0]));
             } else {
-                Class klass = lookupClass(className);
-                Constructor cons = klass.getConstructor(
-                    new Class[] { String.class });
+                Class<?> klass = lookupClass(className);
+                Constructor<?> cons = klass.getConstructor(
+                    new Class<?>[] { String.class });
                 Object value = cons.newInstance(args);
 
                 return value;
@@ -374,20 +378,20 @@
         }
     }
 
-    private Class lookupClass(String name) throws ClassNotFoundException {
+    private  Class<?> lookupClass(String name) throws ClassNotFoundException {
         try {
-            Class klass = Class.forName(name);
+            Class<?> klass = Class.forName(name);
 
             return klass;
         } catch (ClassNotFoundException e1) {}
 
         try {
-            Class klass = Class.forName("java.lang." + name);
+            Class<?> klass = Class.forName("java.lang." + name);
 
             return klass;
         } catch (ClassNotFoundException e1) {}
 
-        Class klass = Class.forName("java.text." + name);
+        Class<?> klass = Class.forName("java.text." + name);
 
         return klass;
     }
@@ -397,7 +401,7 @@
 
         try {
             int dotIndex = name.indexOf('.');
-            Class klass = lookupClass(name.substring(0, dotIndex));
+            Class<?> klass = lookupClass(name.substring(0, dotIndex));
             String fieldName = name.substring(dotIndex + 1);
             Field[] fields = klass.getFields();
 
@@ -429,8 +433,8 @@
         return string;
     }
 
-    public Set makeAttributes(Vector names) {
-        HashSet set = new HashSet(Math.max(1, names.size()));
+    public Set<Attribute> makeAttributes(List<Object> names) {
+        Set<Attribute> set = new HashSet<>(Math.max(1, names.size()));
 
         for (int counter = 0; counter < names.size(); counter++) {
             set.add(makeAttribute((String)names.get(counter)));
--- a/jdk/test/java/text/Format/common/PParser.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/text/Format/common/PParser.java	Wed Jul 05 22:13:53 2017 +0200
@@ -58,7 +58,7 @@
     public PParser() {
     }
 
-    public Hashtable parse(Reader r) throws IOException {
+    public Map<String,Object> parse(Reader r) throws IOException {
         this.reader = r;
         bufferedToken = false;
         lineNumber = 0;
@@ -91,23 +91,23 @@
     }
 
     protected Object parseArray() throws IOException {
-        Vector       array = new Vector();
-        int          token;
+        List<Object> array = new ArrayList<>();
+        int token;
 
         while ((token = getToken()) != CLOSE_ARRAY) {
             if (token == MORE) {
                 token = getToken();
             }
             if (token != CLOSE_ARRAY) {
-                array.addElement(parseValue(token));
+                array.add(parseValue(token));
             }
         }
         return array;
     }
 
-    protected Hashtable parsePair() throws IOException {
-        Hashtable           ht = new Hashtable(11);
-        int                 token;
+    protected Map<String,Object> parsePair() throws IOException {
+        Map<String,Object> ht = new HashMap<>(11);
+        int token;
 
         while ((token = getToken()) != CLOSE_PAIR) {
             if (token != STRING) {
@@ -133,11 +133,12 @@
     }
 
     protected int getToken() throws IOException {
-        int            token = getToken(false, false);
+        int token = getToken(false, false);
 
         return token;
     }
 
+    @SuppressWarnings("fallthrough")
     protected int getToken(boolean wantsWS, boolean inString)
         throws IOException {
         if (bufferedToken) {
@@ -225,31 +226,26 @@
         throw new RuntimeException(errorString + " at line " + lineNumber + " column " + column);
     }
 
+    @SuppressWarnings("unchecked")
     public static void dump(Object o) {
         if (o instanceof String) {
             System.out.print(o);
-        } else if(o instanceof Vector) {
-            Enumeration     e = ((Vector)o).elements();
-
+        } else if(o instanceof List) {
             dump(" (");
-            while (e.hasMoreElements()) {
-                dump(e.nextElement());
+            ((List)o).forEach((l) -> {
+                dump(l);
                 dump(" -- ");
-            }
+            });
             dump(" )");
         } else {
-            Hashtable       ht = (Hashtable)o;
-            Enumeration     e = ht.keys();
-
+            Map<String,Object> ht = (Map<String,Object>)o;
             dump(" {");
-            while (e.hasMoreElements()) {
-                Object       key = e.nextElement();
-
-                dump(key);
+            ht.keySet().forEach(l -> {
+                dump(l);
                 dump(" = ");
-                dump(ht.get(key));
+                dump(ht.get(l));
                 dump(";");
-            }
+            });
             dump(" }");
         }
     }
@@ -259,9 +255,9 @@
             System.out.println("need filename");
         } else {
             try {
-                FileReader          fr = new FileReader(args[0]);
-                PParser             parser = new PParser();
-                Hashtable           ht = parser.parse(fr);
+                FileReader fr = new FileReader(args[0]);
+                PParser parser = new PParser();
+                Map<String,Object> ht = parser.parse(fr);
 
                 dump(ht);
                 System.out.println();
--- a/jdk/test/java/util/Currency/ValidateISO4217.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/util/Currency/ValidateISO4217.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,7 +23,7 @@
 /*
  * @test
  * @bug 4691089 4819436 4942982 5104960 6544471 6627549 7066203 7195759
- *     8039317 8074350 8074351
+ *      8039317 8074350 8074351 8145952
  * @summary Validate ISO 4217 data for Currency class.
  */
 
@@ -93,7 +93,7 @@
 
     /* Codes that are obsolete, do not have related country */
     static final String otherCodes =
-        "ADP-AFA-ATS-AYM-AZM-BEF-BGL-BOV-BYB-CHE-CHW-CLF-COU-CUC-CYP-DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-IEP-ITL-LUF-MGF-MTL-MXV-MZM-NLG-PTE-ROL-RUR-SDD-SIT-SKK-SRG-TMM-TPE-TRL-VEF-UYI-USN-USS-VEB-XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-YUM-ZMK-ZWD-ZWN-ZWR";
+        "ADP-AFA-ATS-AYM-AZM-BEF-BGL-BOV-BYB-BYR-CHE-CHW-CLF-COU-CUC-CYP-DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-IEP-ITL-LUF-MGF-MTL-MXV-MZM-NLG-PTE-ROL-RUR-SDD-SIT-SKK-SRG-TMM-TPE-TRL-VEF-UYI-USN-USS-VEB-XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-YUM-ZMK-ZWD-ZWN-ZWR";
 
     static boolean err = false;
 
--- a/jdk/test/java/util/Currency/tablea1.txt	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/util/Currency/tablea1.txt	Wed Jul 05 22:13:53 2017 +0200
@@ -1,12 +1,12 @@
 #
 #
-# Amendments up until ISO 4217 AMENDMENT NUMBER 160
-#   (As of 19 June 2015)
+# Amendments up until ISO 4217 AMENDMENT NUMBER 162
+#   (As of 30 Auguest 2016)
 #
 
 # Version
 FILEVERSION=3
-DATAVERSION=160
+DATAVERSION=162
 
 # ISO 4217 currency data
 AF	AFN	971	2
@@ -28,7 +28,7 @@
 BH	BHD	48	3
 BD	BDT	50	2
 BB	BBD	52	2
-BY	BYR	974	0
+BY	BYN	933	2
 BE	EUR	978	2
 BZ	BZD	84	2
 BJ	XOF	952	0
--- a/jdk/test/java/util/logging/Level/CustomLevel.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/java/util/logging/Level/CustomLevel.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,12 +22,20 @@
  */
 
 import java.io.*;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.*;
 import java.util.logging.*;
 
 /*
  * @test
- * @bug 8026027
+ * @bug 8026027 6543126
  * @summary Test Level.parse to look up custom levels by name and its
  *          localized name
  *
@@ -41,23 +49,168 @@
 
     private static final List<Level> levels = new ArrayList<>();
     private static final String RB_NAME = "myresource";
+    private static final String OTHERRB_NAME = "myresource2";
+
+    private static class CustomLevelReference extends WeakReference<Level> {
+        final String name;
+        final int value;
+        final String resourceBundleName;
+        public CustomLevelReference(Level level, ReferenceQueue<Level> queue) {
+            super(level, queue);
+            name = level.getName();
+            value = level.intValue();
+            resourceBundleName = level.getResourceBundleName();
+        }
+
+        @Override
+        public String toString() {
+            return "CustomLevelReference(\"" + name + "\", " + value + ", \""
+                    + resourceBundleName + "\")";
+        }
+
+    }
+
     public static void main(String[] args) throws Exception {
         setupCustomLevels();
+        setUpCustomLevelsOtherLoader();
 
         // Level.parse will return the custom Level instance
-        ResourceBundle rb = ResourceBundle.getBundle(RB_NAME);
         for (Level level : levels) {
+            final ResourceBundle rb = getResourceBundle(level);
             String name = level.getName();
-            if (!name.equals("WARNING") && !name.equals("INFO")) {
+            Level l = Level.parse(name);
+            if (!name.equals("WARNING") && !name.equals("INFO")
+                 && !name.equals("SEVERE")) {
                 // custom level whose name doesn't conflict with any standard one
-                checkCustomLevel(Level.parse(name), level);
+                checkCustomLevel(l, level);
+            } else if (l != Level.WARNING && l != Level.INFO && l != Level.SEVERE
+                    || !name.equals(l.getName())) {
+                throw new RuntimeException("Unexpected level " + formatLevel(l));
             }
+            System.out.println("Level.parse found expected level: "
+                            + formatLevel(l));
             String localizedName = rb.getString(level.getName());
-            Level l = Level.parse(localizedName);
+            l = Level.parse(localizedName);
             if (l != level) {
-                throw new RuntimeException("Unexpected level " + l + " " + l.getClass());
+                throw new RuntimeException("Unexpected level " + l + " "
+                    + l.getClass() + " for " + localizedName
+                    + " in " + rb.getBaseBundleName());
+            }
+        }
+
+        final long otherLevelCount = levels.stream()
+            .filter(CustomLevel::isCustomLoader)
+            .count();
+
+        // Now verify that custom level instances are correctly
+        // garbage collected when no longer referenced
+        ReferenceQueue<Level> queue = new ReferenceQueue<>();
+        List<CustomLevelReference> refs = new ArrayList<>();
+        List<CustomLevelReference> customRefs = new ArrayList<>();
+        int otherLevels = 0;
+        while (!levels.isEmpty()) {
+            Level l = levels.stream().findAny().get();
+            boolean isCustomLoader = isCustomLoader(l);
+            if (isCustomLoader) otherLevels++;
+
+            CustomLevelReference ref = new CustomLevelReference(l, queue);
+            if (isCustomLoader) {
+                customRefs.add(ref);
+            } else {
+                refs.add(ref);
+            }
+
+            // remove strong references to l
+            levels.remove(l);
+            l = null;
+
+            // Run gc and wait for garbage collection
+            if (otherLevels == otherLevelCount) {
+                if (customRefs.size() != otherLevelCount) {
+                    throw new RuntimeException("Test bug: customRefs.size() != "
+                             + otherLevelCount);
+                }
+                waitForGC(customRefs, queue);
             }
         }
+        if (otherLevelCount != otherLevels || otherLevelCount == 0) {
+            throw new RuntimeException("Test bug: "
+                + "no or wrong count of levels loaded from custom loader");
+        }
+        if (!customRefs.isEmpty()) {
+            throw new RuntimeException(
+                "Test bug: customRefs.size() should be empty!");
+        }
+        while (!refs.isEmpty()) {
+            final Reference<?> ref = refs.remove(0);
+            if (ref.get() == null) {
+                throw new RuntimeException("Unexpected garbage collection for "
+                           + ref);
+            }
+        }
+    }
+
+    private static void waitForGC(List<CustomLevelReference> customRefs,
+                                  ReferenceQueue<Level> queue)
+         throws InterruptedException
+    {
+        while (!customRefs.isEmpty()) {
+            Reference<? extends Level> ref2;
+            do {
+                System.gc();
+                Thread.sleep(100);
+            } while ((ref2 = queue.poll()) == null);
+
+            // Check garbage collected reference
+            if (!customRefs.contains(ref2)) {
+               throw new RuntimeException("Unexpected reference: " + ref2);
+            }
+            CustomLevelReference ref = customRefs.remove(customRefs.indexOf(ref2));
+            System.out.println(ref2 + " garbage collected");
+            final String name = ref.name;
+            Level l;
+            try {
+                l = Level.parse(name);
+                if (!name.equals("SEVERE")
+                    && !name.equals("INFO")
+                    || !name.equals(l.getName())) {
+                    throw new RuntimeException("Unexpected level "
+                            + formatLevel(l));
+                } else {
+                    if (l == Level.WARNING || l == Level.INFO
+                            || l == Level.SEVERE) {
+                        System.out.println("Level.parse found expected level: "
+                                + formatLevel(l));
+                    } else {
+                        throw new RuntimeException("Unexpected level "
+                            + formatLevel(l));
+                    }
+                }
+            } catch (IllegalArgumentException iae) {
+                if (!name.equals("WARNING")
+                    && !name.equals("INFO")
+                    && !name.equals("SEVERE")) {
+                    System.out.println("Level.parse fired expected exception: "
+                        + iae);
+                } else {
+                    throw iae;
+                }
+            }
+        }
+    }
+
+    private static boolean isCustomLoader(Level level) {
+        final ClassLoader cl = level.getClass().getClassLoader();
+        return cl != null
+             && cl != ClassLoader.getPlatformClassLoader()
+             && cl != ClassLoader.getSystemClassLoader();
+    }
+
+    static ResourceBundle getResourceBundle(Level level) {
+        return isCustomLoader(level)
+            ? ResourceBundle.getBundle(OTHERRB_NAME, Locale.getDefault(),
+                                       level.getClass().getClassLoader())
+            : ResourceBundle.getBundle(RB_NAME);
     }
 
     private static void setupCustomLevels() throws IOException {
@@ -67,22 +220,53 @@
         levels.add(new CustomLevel("WARNING", 1010, RB_NAME));
         levels.add(new CustomLevel("INFO", 1000, RB_NAME));
     }
+
+    static void setUpCustomLevelsOtherLoader()
+         throws MalformedURLException,
+               ClassNotFoundException, NoSuchMethodException,
+               IllegalAccessException, InvocationTargetException
+    {
+        final String classes = System.getProperty("test.classes",
+                                                  "build/classes");
+        final String sources = System.getProperty("test.src",
+                                                  "src");
+        final URL curl = new File(classes).toURI().toURL();
+        final URL surl = new File(sources).toURI().toURL();
+        URLClassLoader loader = new URLClassLoader(new URL[] {curl, surl},
+                                     ClassLoader.getPlatformClassLoader());
+        Class<?> customLevelClass = Class.forName("CustomLevel", false, loader);
+        Method m = customLevelClass.getMethod("setUpCustomLevelsOtherLoader",
+                                              List.class);
+        m.invoke(null, levels);
+    }
+
+    public static void setUpCustomLevelsOtherLoader(List<Level> levels) {
+        levels.add(new CustomLevel("OTHEREMERGENCY", 1091, OTHERRB_NAME));
+        levels.add(new CustomLevel("OTHERALERT", 1061, OTHERRB_NAME));
+        levels.add(new CustomLevel("OTHERCRITICAL", 1031, OTHERRB_NAME));
+        levels.add(new CustomLevel("SEVERE", 1011, OTHERRB_NAME));
+        levels.add(new CustomLevel("INFO", 1000, OTHERRB_NAME));
+    }
+
     static void checkCustomLevel(Level level, Level expected) {
         // Level value must be the same
         if (!level.equals(expected)) {
-            throw new RuntimeException(formatLevel(level) + " != " + formatLevel(expected));
+            throw new RuntimeException(formatLevel(level) + " != "
+                 + formatLevel(expected));
         }
 
         if (!level.getName().equals(expected.getName())) {
-            throw new RuntimeException(formatLevel(level) + " != " + formatLevel(expected));
+            throw new RuntimeException(formatLevel(level) + " != "
+                 + formatLevel(expected));
         }
 
         // Level.parse is expected to return the custom Level
         if (level != expected) {
-            throw new RuntimeException(formatLevel(level) + " != " + formatLevel(expected));
+            throw new RuntimeException(formatLevel(level) + " != "
+                 + formatLevel(expected));
         }
 
-        ResourceBundle rb = ResourceBundle.getBundle(RB_NAME);
+        final ResourceBundle rb = getResourceBundle(level);
         String name = rb.getString(level.getName());
         if (!level.getLocalizedName().equals(name)) {
             // must have the same localized name
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/Level/myresource2.properties	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,5 @@
+OTHEREMERGENCY=localized.otheremergency
+OTHERALERT=localized.otheralert
+OTHERCRITICAL=localized.othercritical
+SEVERE=localized.severe
+INFO=localized.info.2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/imageio/ReadAbortTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ * @test
+ * @bug     4924727
+ * @summary Test verifies that if we call ImageReader.abort() in
+ *          IIOReadProgressListener.imageStarted() or
+ *          IIOReadProgressListener.imageProgress() are we
+ *          calling IIOReadProgressListener.readAborted() for all readers.
+ * @run     main ReadAbortTest
+ */
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.util.Iterator;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.event.IIOReadProgressListener;
+import javax.imageio.stream.ImageInputStream;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.nio.file.Files;
+
+public class ReadAbortTest implements IIOReadProgressListener {
+
+    ImageReader reader = null;
+    ImageInputStream iis = null;
+    BufferedImage bimg = null;
+    File file;
+    boolean startAbort = false;
+    boolean startAborted = false;
+    boolean progressAbort = false;
+    boolean progressAborted = false;
+    Color srccolor = Color.red;
+    int width = 100;
+    int heght = 100;
+
+    public ReadAbortTest(String format) throws Exception {
+        try {
+            System.out.println("Test for format " + format);
+            bimg = new BufferedImage(width, heght,
+                    BufferedImage.TYPE_INT_RGB);
+
+            Graphics2D g = bimg.createGraphics();
+            g.setColor(srccolor);
+            g.fillRect(0, 0, width, heght);
+            g.dispose();
+
+            file = File.createTempFile("src_", "." + format, new File("."));
+            ImageIO.write(bimg, format, file);
+            ImageInputStream iis = ImageIO.createImageInputStream(file);
+
+            Iterator iter = ImageIO.getImageReaders(iis);
+            while (iter.hasNext()) {
+                reader = (ImageReader) iter.next();
+                break;
+            }
+            reader.setInput(iis);
+            reader.addIIOReadProgressListener(this);
+
+            // Abort reading in IIOReadProgressListener.imageStarted().
+            startAbort = true;
+            bimg = reader.read(0);
+            startAbort = false;
+
+            // Abort reading in IIOReadProgressListener.imageProgress().
+            progressAbort = true;
+            bimg = reader.read(0);
+            progressAbort = false;
+
+            iis.close();
+            /*
+             * All abort requests from imageStarted,imageProgress and
+             * imageComplete from IIOReadProgressListener should be reached
+             * otherwise throw RuntimeException.
+             */
+            if (!(startAborted
+                    && progressAborted)) {
+                throw new RuntimeException("All IIOReadProgressListener abort"
+                        + " requests are not processed for format "
+                        + format);
+            }
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            Files.delete(file.toPath());
+        }
+    }
+
+    /*
+     * Abstract methods that we need to implement from
+     * IIOReadProgressListener, and relevant for this test case.
+     */
+    @Override
+    public void imageStarted(ImageReader source, int imageIndex) {
+        System.out.println("imageStarted called");
+        if (startAbort) {
+            source.abort();
+        }
+    }
+
+    @Override
+    public void imageProgress(ImageReader source, float percentageDone) {
+        System.out.println("imageProgress called");
+        if (progressAbort) {
+            source.abort();
+        }
+    }
+
+    @Override
+    public void readAborted(ImageReader source) {
+        System.out.println("readAborted called");
+        // Verify IIOReadProgressListener.imageStarted() abort request.
+        if (startAbort) {
+            System.out.println("imageStarted aborted ");
+            startAborted = true;
+        }
+
+        // Verify IIOReadProgressListener.imageProgress() abort request.
+        if (progressAbort) {
+            System.out.println("imageProgress aborted ");
+            progressAborted = true;
+        }
+    }
+
+    public static void main(String args[]) throws Exception {
+        final String[] formats = {"bmp", "png", "gif", "jpg", "tif"};
+        for (String format : formats) {
+            new ReadAbortTest(format);
+        }
+    }
+
+    /*
+     * Remaining abstract methods that we need to implement from
+     * IIOReadProgressListener, but not relevant for this test case.
+     */
+    @Override
+    public void imageComplete(ImageReader source) {
+    }
+
+    @Override
+    public void sequenceStarted(ImageReader reader, int i) {
+    }
+
+    @Override
+    public void sequenceComplete(ImageReader reader) {
+    }
+
+    @Override
+    public void thumbnailStarted(ImageReader reader, int i, int i1) {
+    }
+
+    @Override
+    public void thumbnailProgress(ImageReader reader, float f) {
+    }
+
+    @Override
+    public void thumbnailComplete(ImageReader reader) {
+    }
+}
+
--- a/jdk/test/javax/net/ssl/DTLS/CipherSuite.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/CipherSuite.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,7 @@
  * @key intermittent
  * @summary Datagram Transport Layer Security (DTLS)
  * @modules java.base/sun.security.util
+ *          jdk.crypto.ec
  * @build DTLSOverDatagram
  * @run main/othervm CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA
  * @run main/othervm CipherSuite TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
--- a/jdk/test/javax/net/ssl/DTLS/DTLSBufferOverflowUnderflowTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSBufferOverflowUnderflowTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS buffer overflow and underflow status when dealing with
  *          application data.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.base/sun.security.util
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSBufferOverflowUnderflowTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSDataExchangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSDataExchangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS application data exchange using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSEnginesClosureTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSEnginesClosureTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines closing using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines handshake using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeWithReplicatedPacketsTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeWithReplicatedPacketsTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines handshake using each of the supported
  *          cipher suites with replicated packets check.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSHandshakeWithReplicatedPacketsTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSIncorrectAppDataTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSIncorrectAppDataTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS incorrect app data packages unwrapping.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSIncorrectAppDataTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSMFLNTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSMFLNTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with different maximum fragment length. Testing of
  *          MFLN extension.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSNotEnabledRC4Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSNotEnabledRC4Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,13 @@
  * @bug 8043758
  * @summary Testing DTLS engines do not enable RC4 ciphers by default.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS DTLSNotEnabledRC4Test
  */
 
--- a/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines re-handshaking using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithCipherChangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,13 @@
  *          is taken randomly from the supporetd ciphers list.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      DTLSRehandshakeWithCipherChangeTest
  */
--- a/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithDataExTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithDataExTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with application data exchange before and after
  *          re-handshake and closing of the engines.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSSequenceNumberTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSSequenceNumberTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          data exchange.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS
  *      -Dtest.mode=norm DTLSSequenceNumberTest
  * @run main/othervm -Dtest.security.protocol=DTLS
--- a/jdk/test/javax/net/ssl/DTLS/DTLSUnsupportedCiphersTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSUnsupportedCiphersTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @summary Testing that try to enable unsupported ciphers
  *          causes IllegalArgumentException.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLS DTLSUnsupportedCiphersTest
  */
 
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10BufferOverflowUnderflowTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10BufferOverflowUnderflowTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS buffer overflow and underflow status when dealing with
  *          application data.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10BufferOverflowUnderflowTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10DataExchangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10DataExchangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS application data exchange using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10DataExchangeTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10EnginesClosureTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10EnginesClosureTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines closing using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10EnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines handshake using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10HandshakeTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeWithReplicatedPacketsTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeWithReplicatedPacketsTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines handshake using each of the supported
  *          cipher suites with replicated packets check.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10HandshakeWithReplicatedPacketsTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10IncorrectAppDataTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10IncorrectAppDataTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS incorrect app data packages unwrapping.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSIncorrectAppDataTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10MFLNTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10MFLNTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with different maximum fragment length. Testing of
  *          MFLN extension.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10MFLNTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10NotEnabledRC4Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10NotEnabledRC4Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,13 @@
  * @bug 8043758
  * @summary Testing DTLS engines do not enable RC4 ciphers by default.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0 DTLSv10NotEnabledRC4Test
  */
 
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing DTLS engines re-handshaking using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10RehandshakeTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithCipherChangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithCipherChangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,13 @@
  *          is taken randomly from the supporetd ciphers list.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      DTLSv10RehandshakeWithCipherChangeTest
  */
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithDataExTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithDataExTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with application data exchange before and after
  *          re-handshake and closing of the engines.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10RehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10SequenceNumberTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10SequenceNumberTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          data exchange.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      -Dtest.mode=norm DTLSv10SequenceNumberTest
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
--- a/jdk/test/javax/net/ssl/DTLSv10/DTLSv10UnsupportedCiphersTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10UnsupportedCiphersTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @summary Testing that try to enable unsupported ciphers
  *          causes IllegalArgumentException.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=DTLSv1.0
  *      DTLSv10UnsupportedCiphersTest
  */
--- a/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,18 +21,19 @@
  * questions.
  */
 
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.List;
-import javax.net.ssl.SSLContext;
-
 /*
  * @test
  * @bug 8049432 8069038
  * @summary New tests for TLS property jdk.tls.client.protocols
  * @summary javax/net/ssl/TLS/TLSClientPropertyTest.java needs to be
  *     updated for JDK-8061210
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm TLSClientPropertyTest NoProperty
  * @run main/othervm TLSClientPropertyTest SSLv3
  * @run main/othervm TLSClientPropertyTest TLSv1
@@ -41,6 +42,12 @@
  * @run main/othervm TLSClientPropertyTest WrongProperty
  */
 
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.List;
+import javax.net.ssl.SSLContext;
+
 /**
  * Sets the property jdk.tls.client.protocols to one of this protocols:
  * SSLv3,TLSv1,TLSv1.1,TLSv1.2 and TLSV(invalid) or removes this
--- a/jdk/test/javax/net/ssl/TLS/TLSDataExchangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSDataExchangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS application data exchange using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSDataExchangeTest
--- a/jdk/test/javax/net/ssl/TLS/TLSEnginesClosureTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSEnginesClosureTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines closing using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSEnginesClosureTest
--- a/jdk/test/javax/net/ssl/TLS/TLSHandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSHandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines handshake using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSHandshakeTest
--- a/jdk/test/javax/net/ssl/TLS/TLSMFLNTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSMFLNTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with different maximum fragment length. Testing of
  *          MFLN extension.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSMFLNTest
--- a/jdk/test/javax/net/ssl/TLS/TLSNotEnabledRC4Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSNotEnabledRC4Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,13 @@
  * @bug 8085979
  * @summary Testing TLS engines do not enable RC4 ciphers by default.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS TLSNotEnabledRC4Test
  */
 
--- a/jdk/test/javax/net/ssl/TLS/TLSRehandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines re-handshaking using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSRehandshakeTest
--- a/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithCipherChangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,13 @@
  *          is taken randomly from the supporetd ciphers list.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS TLSRehandshakeWithCipherChangeTest
  */
 
--- a/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithDataExTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithDataExTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with application data exchange before and after
  *          re-handshake and closing of the engines.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSRehandshakeWithDataExTest
--- a/jdk/test/javax/net/ssl/TLS/TLSUnsupportedCiphersTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSUnsupportedCiphersTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @summary Testing that try to enable unsupported ciphers
  *          causes IllegalArgumentException.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLS TLSUnsupportedCiphersTest
  */
 
--- a/jdk/test/javax/net/ssl/TLSv1/TLSDataExchangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSDataExchangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS application data exchange using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSDataExchangeTest
--- a/jdk/test/javax/net/ssl/TLSv1/TLSEnginesClosureTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSEnginesClosureTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines closing using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSEnginesClosureTest
--- a/jdk/test/javax/net/ssl/TLSv1/TLSHandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSHandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines handshake using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSHandshakeTest
--- a/jdk/test/javax/net/ssl/TLSv1/TLSMFLNTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSMFLNTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with different maximum fragment length. Testing of
  *          MFLN extension.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSMFLNTest
--- a/jdk/test/javax/net/ssl/TLSv1/TLSNotEnabledRC4Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSNotEnabledRC4Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,13 @@
  * @bug 8085979
  * @summary Testing TLS engines do not enable RC4 ciphers by default.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 TLSNotEnabledRC4Test
  */
 
--- a/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines re-handshaking using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSRehandshakeTest
--- a/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithCipherChangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,13 @@
  *          is taken randomly from the supporetd ciphers list.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 TLSRehandshakeWithCipherChangeTest
  */
 
--- a/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithDataExTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithDataExTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with application data exchange before and after
  *          re-handshake and closing of the engines.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSRehandshakeWithDataExTest
--- a/jdk/test/javax/net/ssl/TLSv1/TLSUnsupportedCiphersTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSUnsupportedCiphersTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @summary Testing that try to enable unsupported ciphers
  *          causes IllegalArgumentException.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1 TLSUnsupportedCiphersTest
  */
 
--- a/jdk/test/javax/net/ssl/TLSv11/EmptyCertificateAuthorities.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/EmptyCertificateAuthorities.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -33,14 +33,33 @@
  * @bug 4873188
  * @summary Support TLS 1.1
  * @run main/othervm EmptyCertificateAuthorities
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @author Xuelei Fan
  */
 
-import java.io.*;
-import java.net.*;
-import java.security.*;
-import java.security.cert.*;
-import javax.net.ssl.*;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.KeyStore;
+import java.security.Security;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
 
 public class EmptyCertificateAuthorities {
 
--- a/jdk/test/javax/net/ssl/TLSv11/ExportableBlockCipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/ExportableBlockCipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -33,12 +33,25 @@
  * @bug 4873188
  * @summary Support TLS 1.1
  * @run main/othervm ExportableBlockCipher
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @author Xuelei Fan
  */
 
-import java.io.*;
-import java.net.*;
-import javax.net.ssl.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLHandshakeException;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
 
 public class ExportableBlockCipher {
 
--- a/jdk/test/javax/net/ssl/TLSv11/ExportableStreamCipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/ExportableStreamCipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,13 +32,26 @@
  * @test
  * @bug 4873188
  * @summary Support TLS 1.1
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm ExportableStreamCipher
  * @author Xuelei Fan
  */
 
-import java.io.*;
-import java.net.*;
-import javax.net.ssl.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLHandshakeException;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
 
 public class ExportableStreamCipher {
 
--- a/jdk/test/javax/net/ssl/TLSv11/GenericBlockCipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/GenericBlockCipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @test
  * @bug 4873188
  * @summary Support TLS 1.1
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm GenericBlockCipher
  *
  *     SunJSSE does not support dynamic system properties, no way to re-use
@@ -35,9 +42,12 @@
  * @author Xuelei Fan
  */
 
-import java.io.*;
-import java.net.*;
-import javax.net.ssl.*;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
 
 public class GenericBlockCipher {
 
--- a/jdk/test/javax/net/ssl/TLSv11/GenericStreamCipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/GenericStreamCipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @test
  * @bug 4873188
  * @summary Support TLS 1.1
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm GenericStreamCipher
  *
  *     SunJSSE does not support dynamic system properties, no way to re-use
@@ -35,9 +42,13 @@
  * @author Xuelei Fan
  */
 
-import java.io.*;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.security.Security;
-import javax.net.ssl.*;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
 
 public class GenericStreamCipher {
 
--- a/jdk/test/javax/net/ssl/TLSv11/TLSDataExchangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSDataExchangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS application data exchange using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSDataExchangeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSDataExchangeTest
--- a/jdk/test/javax/net/ssl/TLSv11/TLSEnginesClosureTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSEnginesClosureTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines closing using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSEnginesClosureTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSEnginesClosureTest
--- a/jdk/test/javax/net/ssl/TLSv11/TLSHandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSHandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines handshake using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSHandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSHandshakeTest
--- a/jdk/test/javax/net/ssl/TLSv11/TLSMFLNTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSMFLNTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with different maximum fragment length. Testing of
  *          MFLN extension.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSMFLNTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSMFLNTest
--- a/jdk/test/javax/net/ssl/TLSv11/TLSNotEnabledRC4Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSNotEnabledRC4Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,13 @@
  * @bug 8085979
  * @summary Testing TLS engines do not enable RC4 ciphers by default.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSNotEnabledRC4Test
  */
 
--- a/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,14 @@
  * @summary Testing TLS engines re-handshaking using each of the supported
  *          cipher suites.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSRehandshakeTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSRehandshakeTest
--- a/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithCipherChangeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,13 @@
  *          is taken randomly from the supporetd ciphers list.
  * @key randomness
  * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSRehandshakeWithCipherChangeTest
  */
 
--- a/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithDataExTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithDataExTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,14 @@
  *          cipher suites with application data exchange before and after
  *          re-handshake and closing of the engines.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          jdk.security.auth
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSRehandshakeWithDataExTest
--- a/jdk/test/javax/net/ssl/TLSv11/TLSUnsupportedCiphersTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSUnsupportedCiphersTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,13 @@
  * @summary Testing that try to enable unsupported ciphers
  *          causes IllegalArgumentException.
  * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @modules java.security.jgss
+ *          java.security.jgss/sun.security.krb5
+ *          java.security.jgss/sun.security.krb5.internal.crypto
+ *          java.security.jgss/sun.security.krb5.internal.ccache
+ *          java.security.jgss/sun.security.krb5.internal
+ *          java.security.jgss/sun.security.krb5.internal.ktab
+ *          java.base/sun.security.util
  * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSUnsupportedCiphersTest
  */
 
--- a/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,6 +21,15 @@
  * questions.
  */
 
+/*
+ * @test
+ * @bug 8076221
+ * @summary Check if weak cipher suites are disabled
+ * @modules jdk.crypto.ec
+ * @run main/othervm DisabledAlgorithms default
+ * @run main/othervm DisabledAlgorithms empty
+ */
+
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
@@ -36,13 +45,6 @@
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
 
-/**
- * @test
- * @bug 8076221
- * @summary Check if weak cipher suites are disabled
- * @run main/othervm DisabledAlgorithms default
- * @run main/othervm DisabledAlgorithms empty
- */
 public class DisabledAlgorithms {
 
     private static final String pathToStores = "../etc";
--- a/jdk/test/javax/net/ssl/ciphersuites/ECCurvesconstraints.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/net/ssl/ciphersuites/ECCurvesconstraints.java	Wed Jul 05 22:13:53 2017 +0200
@@ -32,24 +32,29 @@
  * @test
  * @bug 8148516
  * @summary Improve the default strength of EC in JDK
+ * @modules jdk.crypyo.ec
  * @run main/othervm ECCurvesconstraints PKIX
  * @run main/othervm ECCurvesconstraints SunX509
  */
 
-import java.net.*;
-import java.util.*;
-import java.io.*;
-import javax.net.ssl.*;
-import java.security.Security;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.security.KeyStore;
 import java.security.KeyFactory;
 import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
 import java.security.cert.CertificateFactory;
-import java.security.spec.*;
-import java.security.interfaces.*;
+import java.security.interfaces.ECPrivateKey;
+import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.Base64;
-
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLHandshakeException;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
 
 public class ECCurvesconstraints {
 
--- a/jdk/test/javax/script/ExceptionTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/ExceptionTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,14 @@
  * @bug 6474943 6705893
  * @summary Test that script engine exception messages are
  * available from ScriptException.
+ * @modules jdk.scripting.nashorn
  */
 
-import java.io.*;
-import javax.script.*;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
 
 public class ExceptionTest {
     private static final String ERROR_MSG = "error from JavaScript";
--- a/jdk/test/javax/script/JavaScriptScopeTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/JavaScriptScopeTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,9 +28,13 @@
  * get affected by default scope assignments. Also, verify
  * that script globals can be created and accessed from Java
  * as well as JavaScript.
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
+import javax.script.Bindings;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+
 
 public class JavaScriptScopeTest {
 
--- a/jdk/test/javax/script/NullUndefinedVarTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/NullUndefinedVarTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,9 +26,11 @@
  * @bug 6346732 6705893
  * @summary should be able to assign null and undefined
  * value to JavaScript global variables.
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class NullUndefinedVarTest {
 
--- a/jdk/test/javax/script/PluggableContextTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/PluggableContextTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,9 +26,12 @@
  * @bug 6398614 6705893
  * @summary Create a user defined ScriptContext and check
  * that script can access variables from non-standard scopes
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class PluggableContextTest {
     public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test1.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test1.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,13 @@
  * @bug 6249843 6705893
  * @summary Create JavaScript engine and execute a simple script.
  * Tests script engine discovery mechanism.
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
-import java.io.*;
+import java.io.File;
+import java.io.FileReader;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class Test1  {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test2.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test2.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,13 @@
  * @test
  * @bug 6249843
  * @summary Test exposing a Java object to script
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
-import java.io.*;
+import java.io.File;
+import java.io.FileReader;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class Test2 {
         public static class Testobj {
--- a/jdk/test/javax/script/Test3.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test3.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,11 +25,17 @@
  * @test
  * @bug 6249843 6705893
  * @summary Test engine and global scopes
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
-import java.io.*;
-import java.util.*;
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.SimpleBindings;
 
 public class Test3 {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test4.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test4.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,14 @@
  * @test
  * @bug 6249843 6705893
  * @summary Test script functions implementing Java interface
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
-import java.io.*;
+import java.io.File;
+import java.io.FileReader;
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class Test4 {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test5.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test5.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,18 @@
  * @test
  * @bug 6249843 6705893
  * @summary Tests engine, global scopes and scope hiding.
+ * @modules jdk.scripting.nashorn
  */
 
-import java.io.*;
-import javax.script.*;
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.SimpleBindings;
+import javax.script.SimpleScriptContext;
 
 public class Test5 {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test6.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test6.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,16 @@
  * @bug 6249843 6705893
  * @summary Test basic script compilation. Value eval'ed from
  * compiled and interpreted scripts should be same.
+ * @modules jdk.scripting.nashorn
  */
 
-import java.io.*;
-import javax.script.*;
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class Test6 {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test7.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test7.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,14 @@
  * @test
  * @bug 6249843 6705893
  * @summary Tests importPackage and java access in script
+ * @modules jdk.scripting.nashorn
  */
 
-import java.io.*;
-import javax.script.*;
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class Test7 {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/script/Test8.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/script/Test8.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,14 @@
  * @test
  * @bug 6249843 6705893
  * @summary Test invoking script function or method from Java
+ * @modules jdk.scripting.nashorn
  */
 
-import javax.script.*;
-import java.io.*;
+import java.io.File;
+import java.io.FileReader;
+import javax.script.Invocable;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 
 public class Test8 {
         public static void main(String[] args) throws Exception {
--- a/jdk/test/javax/swing/JColorChooser/Test7194184.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/swing/JColorChooser/Test7194184.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,19 +25,15 @@
  * Portions Copyright (c) 2012 IBM Corporation
  */
 
-/*
- * @test
- * @key headful
- * @bug 7194184
+/* @test
+   @key headful
+ * @bug 7194184 8163274
  * @summary Tests JColorChooser Swatch keyboard accessibility.
- * @author Sean Chou
  * @library ../regtesthelpers
  * @build Util
- * @run main Test7194184
+ * @run main/timeout=500 Test7194184
  */
-
 import java.awt.Component;
-import java.awt.AWTException;
 import java.awt.Color;
 import java.awt.Robot;
 import java.awt.event.KeyEvent;
@@ -46,66 +42,81 @@
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
 
-import java.util.concurrent.Callable;
+public class Test7194184 {
 
-public class Test7194184 implements Runnable {
     private static JFrame frame;
     private static JColorChooser colorChooser;
-    private static Color selectedColor;
+    private static Color testColor;
+    private static Color newColor;
+
+    private static Robot robot;
 
     public static void main(String[] args) throws Exception {
-        testKeyBoardAccess();
+        robot = new Robot();
+        robot.setAutoWaitForIdle(true);
+        createUI();
+        accessRecentSwatch();
+        runRobot();
+        testColorChooser();
+        cleanUpUI();
     }
 
-    private static void testKeyBoardAccess() throws Exception {
-        Robot robot = new Robot();
-
-        SwingUtilities.invokeLater(new Test7194184());
-        robot.waitForIdle();
-
+    private static void createUI() throws Exception {
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
-                selectedColor = colorChooser.getColor();
+                String title = getClass().getName();
+                frame = new JFrame(title);
+                colorChooser = new JColorChooser();
+                frame.add(colorChooser);
+                frame.pack();
+                frame.setVisible(true);
+            }
+        });
+    }
 
+    private static void accessRecentSwatch() throws Exception {
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
                 Component recentSwatchPanel = Util.findSubComponent(colorChooser, "RecentSwatchPanel");
                 if (recentSwatchPanel == null) {
                     throw new RuntimeException("RecentSwatchPanel not found");
                 }
                 recentSwatchPanel.requestFocusInWindow();
+                testColor = colorChooser.getColor();
+
             }
         });
+    }
 
-        robot.waitForIdle();
-
+    private static void runRobot() {
         // Tab to move the focus to MainSwatch
         Util.hitKeys(robot, KeyEvent.VK_SHIFT, KeyEvent.VK_TAB);
-
         // Select the color on right
         Util.hitKeys(robot, KeyEvent.VK_RIGHT);
         Util.hitKeys(robot, KeyEvent.VK_RIGHT);
         Util.hitKeys(robot, KeyEvent.VK_SPACE);
-        robot.waitForIdle();
+    }
 
+    private static void testColorChooser() throws Exception {
         SwingUtilities.invokeAndWait(new Runnable() {
             @Override
             public void run() {
-                frame.dispose();
-                if (selectedColor == colorChooser.getColor()) {
+                newColor = colorChooser.getColor();
+                if (newColor == testColor) {
                     throw new RuntimeException("JColorChooser misses keyboard accessibility");
                 }
             }
         });
     }
 
-    public void run() {
-        String title = getClass().getName();
-        frame = new JFrame(title);
-        colorChooser = new JColorChooser();
-
-        frame.add(colorChooser);
-        frame.pack();
-        frame.setVisible(true);
+    private static void cleanUpUI() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                frame.dispose();
+            }
+        });
     }
-
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSlider/SliderTick/SliderTickTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ * @test
+ * @bug 8009477
+ * @summary Verify PageUp/PageDown key moves slider to Next/Previous minor tick.
+ * @run main/manual SliderTickTest
+ */
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.util.concurrent.CountDownLatch;
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JSlider;
+
+public class SliderTickTest {
+
+    public static void main(String args[]) throws Exception {
+        final CountDownLatch latch = new CountDownLatch(1);
+        TestUI test = new TestUI(latch);
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    test.createUI();
+                } catch (Exception ex) {
+                    throw new RuntimeException("Exception while creating UI");
+                }
+            }
+        });
+
+        boolean status = latch.await(5, TimeUnit.MINUTES);
+
+        if (!status) {
+            System.out.println("Test timed out.");
+        }
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    test.disposeUI();
+                } catch (Exception ex) {
+                    throw new RuntimeException("Exception while disposing UI");
+                }
+            }
+        });
+
+        if (test.testResult == false) {
+            throw new RuntimeException("Test Failed.");
+        }
+    }
+}
+
+class TestUI {
+
+    private static JFrame mainFrame;
+    private static JPanel mainControlPanel;
+
+    private static JTextArea instructionTextArea;
+
+    private static JPanel resultButtonPanel;
+    private static JButton passButton;
+    private static JButton failButton;
+
+    private static GridBagLayout layout;
+    private final CountDownLatch latch;
+    public boolean testResult = false;
+
+    public TestUI(CountDownLatch latch) throws Exception {
+        this.latch = latch;
+    }
+
+    public final void createUI() throws Exception {
+
+        mainFrame = new JFrame("SliderTickTest");
+
+        layout = new GridBagLayout();
+        mainControlPanel = new JPanel(layout);
+        resultButtonPanel = new JPanel(layout);
+
+        GridBagConstraints gbc = new GridBagConstraints();
+
+        // Create Test instructions
+        String instructions
+                = "INSTRUCTIONS:"
+                + "\n Click PageUp/PageDown key. If the slider indicator"
+                + "\n moves to Next/Previous immediate minor tick, then "
+                + "\n test passes else failed.";
+
+        instructionTextArea = new JTextArea();
+        instructionTextArea.setText(instructions);
+        instructionTextArea.setEnabled(false);
+        instructionTextArea.setDisabledTextColor(Color.black);
+        instructionTextArea.setBackground(Color.white);
+
+        gbc.gridx = 0;
+        gbc.gridy = 0;
+        gbc.fill = GridBagConstraints.HORIZONTAL;
+        mainControlPanel.add(instructionTextArea, gbc);
+
+        JSlider slider = new JSlider(0, 50);
+        slider.setMajorTickSpacing(10);
+        slider.setMinorTickSpacing(2);
+        slider.setPaintTicks(true);
+        slider.setPaintLabels(true);
+        slider.setValue(30);
+        slider.setBorder(BorderFactory.createTitledBorder("Ticks"));
+        gbc.gridx = 0;
+        gbc.gridy = 1;
+        mainControlPanel.add(slider, gbc);
+
+        passButton = new JButton("Pass");
+        passButton.setActionCommand("Pass");
+        passButton.addActionListener((ActionEvent e) -> {
+            testResult = true;
+            mainFrame.dispose();
+            latch.countDown();
+
+        });
+        failButton = new JButton("Fail");
+        failButton.setActionCommand("Fail");
+        failButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                testResult = false;
+                mainFrame.dispose();
+                latch.countDown();
+            }
+        });
+        gbc.gridx = 0;
+        gbc.gridy = 0;
+        resultButtonPanel.add(passButton, gbc);
+        gbc.gridx = 1;
+        gbc.gridy = 0;
+        resultButtonPanel.add(failButton, gbc);
+
+        gbc.gridx = 0;
+        gbc.gridy = 2;
+        mainControlPanel.add(resultButtonPanel, gbc);
+
+        mainFrame.add(mainControlPanel);
+        mainFrame.pack();
+        mainFrame.setVisible(true);
+    }
+
+    public void disposeUI() {
+        mainFrame.setVisible(false);
+        mainFrame.dispose();
+    }
+}
--- a/jdk/test/javax/swing/JWindow/ShapedAndTranslucentWindows/TranslucentPerPixelTranslucentGradient.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/javax/swing/JWindow/ShapedAndTranslucentWindows/TranslucentPerPixelTranslucentGradient.java	Wed Jul 05 22:13:53 2017 +0200
@@ -25,6 +25,7 @@
 
 /*
  * @test
+ * @bug 8144735
  * @key headful
  * @summary Check if a per-pixel translucent and translucent window is dragged
  *          and resized by mouse correctly
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.image.BufferedImage;
+import java.util.List;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+/*
+ * @test
+ * @bug 8163193
+ * @key headful
+ * @summary Metal L&F gradient is lighter on HiDPI display
+ * @run main/othervm -Dsun.java2d.uiScale=2 ButtonGradientTest
+ */
+public class ButtonGradientTest {
+
+    private static JFrame frame;
+    private static JButton button;
+
+    public static void main(String[] args) throws Exception {
+        try {
+            testGradient();
+        } finally {
+            SwingUtilities.invokeAndWait(() -> {
+                if (frame != null) {
+                    frame.dispose();
+                }
+            });
+        }
+    }
+
+    private static void testGradient() throws Exception {
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(ButtonGradientTest::createAndShowGUI);
+        robot.waitForIdle();
+
+        Rectangle rect = getButtonBounds();
+        List<?> gradient = (List) UIManager.get("Button.gradient");
+        float ratio = ((Number) gradient.get(0)).floatValue();
+        Color c1 = (Color) gradient.get(2);
+        Color c2 = (Color) gradient.get(3);
+        int mid = (int) (ratio * rect.height);
+
+        Color gradientColor = getGradientColor(rect.width, mid, c1, c2);
+        int x = rect.x + rect.width / 2;
+        int y = rect.y + mid / 2;
+        Color buttonColor = robot.getPixelColor(x, y);
+
+        if (!similarColors(buttonColor, gradientColor)) {
+            throw new RuntimeException("Button gradient is changed!");
+        }
+    }
+
+    private static void createAndShowGUI() {
+
+        try {
+            UIManager.setLookAndFeel(new MetalLookAndFeel());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        frame = new JFrame();
+        frame.setSize(300, 300);
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        JPanel panel = new JPanel(new BorderLayout());
+        button = new JButton("");
+        panel.add(button);
+        frame.getContentPane().add(panel);
+        frame.setVisible(true);
+    }
+
+    private static Rectangle getButtonBounds() throws Exception {
+        Rectangle[] rectangles = new Rectangle[1];
+        SwingUtilities.invokeAndWait(() -> {
+            rectangles[0] = button.getBounds();
+            rectangles[0].setLocation(button.getLocationOnScreen());
+        });
+        return rectangles[0];
+    }
+
+    private static Color getGradientColor(int w, int h, Color c1, Color c2) {
+        GradientPaint gradient = new GradientPaint(0, 0, c1, 0, h, c2, true);
+        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        g.setPaint(gradient);
+        g.fillRect(0, 0, w, h);
+        g.dispose();
+        return new Color(img.getRGB(w / 2, h / 2));
+    }
+
+    private static boolean similarColors(Color c1, Color c2) {
+        return similar(c1.getRed(), c2.getRed())
+                && similar(c1.getGreen(), c2.getGreen())
+                && similar(c1.getBlue(), c2.getBlue());
+    }
+
+    private static boolean similar(int i1, int i2) {
+        return Math.abs(i2 - i1) < 7;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/DevanagariEditor.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8151725
+ * @summary Tests no exception creating a JEditorPane with Devanagari
+ */
+
+import javax.swing.JEditorPane;
+
+public class DevanagariEditor {
+    public static void main(String[] args) {
+        new JEditorPane().setText("\u0930\u093E\u0915\u094D\u0937\u0938");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/GlyphPainter2/6427244/bug6427244.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 6427244 8144240
+   @summary Test that pressing HOME correctly moves caret in I18N document.
+   @author Sergey Groznyh
+   @library ../../../regtesthelpers
+   @build JRobot Util TestCase
+   @run main bug6427244
+*/
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Shape;
+import java.awt.event.KeyEvent;
+import javax.swing.JFrame;
+import javax.swing.JTextPane;
+import javax.swing.SwingUtilities;
+import javax.swing.text.Position;
+
+public class bug6427244 extends TestCase {
+    private static final JRobot ROBOT = JRobot.getRobot();
+
+    final static int TP_SIZE = 200;
+    final static String[] SPACES = new String[] {
+        "\u0020", // ASCII space
+        "\u2002", // EN space
+        "\u2003", // EM space
+        "\u2004", // THREE-PER-EM space
+        "\u2005", // ... etc.
+        "\u2006",
+        //"\u2007",
+        "\u2008",
+        "\u2009",
+        "\u200a",
+        "\u200b",
+        "\u205f",
+        "\u3000",
+    };
+    final static String[] WORDS = new String[] {
+        "It", "is", "a", "long", "paragraph", "for", "testing", "GlyphPainter2\n\n",
+    };
+
+    public static void main(String[] args) {
+        bug6427244 t = new bug6427244();
+        for (String space: SPACES) {
+            t.init(space);
+            t.runAllTests();
+        }
+
+        System.out.println("OK");
+    }
+
+    void init(final String space) {
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    String text = null;
+                    for (String word: WORDS) {
+                        if (text == null) {
+                            text = "";
+                        } else {
+                            text += space;
+                        }
+                        text += word;
+                    }
+                    tp = new JTextPane();
+                    tp.setText(text +
+                            "Some arabic: \u062a\u0641\u0627\u062d and some not.");
+                    if (jf == null) {
+                        jf = new JFrame();
+                        jf.setTitle("bug6427244");
+                        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                        jf.setSize(TP_SIZE, TP_SIZE);
+                        jf.setVisible(true);
+                    }
+                    Container c = jf.getContentPane();
+                    c.removeAll();
+                    c.add(tp);
+                    c.invalidate();
+                    c.validate();
+                    dim = c.getSize();
+                }
+            });
+            Util.blockTillDisplayed(tp);
+            ROBOT.waitForIdle();
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void testCaretPosition() {
+        Point p = tp.getLocationOnScreen();
+        // the right-top corner position
+        p.x += (dim.width - 5);
+        p.y += 5;
+        ROBOT.mouseMove(p.x, p.y);
+        ROBOT.clickMouse();
+        ROBOT.hitKey(KeyEvent.VK_HOME);
+        ROBOT.waitForIdle();
+        // this will fail if caret moves out of the 1st line.
+        assertEquals(0, getCaretOrdinate());
+    }
+
+    int getCaretOrdinate() {
+        final int[] y = new int[1];
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    Shape s;
+                    try {
+                        s = tp.getUI().getRootView(tp).modelToView(
+                                        tp.getCaretPosition(), tp.getBounds(),
+                                        Position.Bias.Forward);
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                    y[0] = s.getBounds().y;
+                }
+            });
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return y[0];
+    }
+
+    JFrame jf;
+    JTextPane tp;
+    Dimension dim;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/internal/misc/Unsafe/TestBadHostClass.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8058575
+ * @summary Test that bad host classes cause exceptions to get thrown.
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ *          java.base/jdk.internal.org.objectweb.asm
+ * @run main TestBadHostClass
+ */
+
+
+import java.lang.*;
+import java.lang.reflect.Field;
+import jdk.internal.misc.Unsafe;
+import jdk.test.lib.unsafe.UnsafeHelper;
+import jdk.internal.org.objectweb.asm.ClassWriter;
+import static jdk.internal.org.objectweb.asm.Opcodes.*;
+
+// Test that bad host classes cause exceptions.
+public class TestBadHostClass {
+
+    private static final Unsafe unsafe = Unsafe.getUnsafe();
+
+    private static String packageName(Class<?> c) {
+        if (c.isArray()) {
+            return packageName(c.getComponentType());
+        } else {
+            String name = c.getName();
+            int dot = name.lastIndexOf('.');
+            if (dot == -1) return "";
+            return name.substring(0, dot);
+        }
+    }
+
+    private static int constantPoolSize(byte[] classFile) {
+        return ((classFile[8] & 0xFF) << 8) | (classFile[9] & 0xFF);
+    }
+
+    static public void badHostClass(Class<?> hostClass) {
+        // choose a class name in the same package as the host class
+        String className;
+        if (hostClass != null) {
+            String prefix = packageName(hostClass);
+            if (prefix.length() > 0)
+                prefix = prefix.replace('.', '/') + "/";
+            className = prefix + "Anon";
+        } else {
+           className = "Anon";
+        }
+
+        // create the class
+        String superName = "java/lang/Object";
+        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS
+                                         + ClassWriter.COMPUTE_FRAMES);
+        cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER,
+                 className, null, superName, null);
+        byte[] classBytes = cw.toByteArray();
+        int cpPoolSize = constantPoolSize(classBytes);
+        Class<?> anonClass
+            = unsafe.defineAnonymousClass(hostClass, classBytes, new Object[cpPoolSize]);
+    }
+
+    public static void main(String args[]) throws Exception {
+        // host class is an array of java.lang.Objects.
+        try {
+            badHostClass(Object[].class);
+        } catch (IllegalArgumentException ex) {
+        }
+
+        // host class is an array of objects of this class.
+        try {
+            badHostClass(TestBadHostClass[].class);
+        } catch (IllegalArgumentException ex) {
+        }
+
+        // host class is null.
+        try {
+            badHostClass(null);
+        } catch (NullPointerException ex) {
+        }
+
+        // host class is a primitive array class.
+        try {
+            badHostClass(int[].class);
+        } catch (IllegalArgumentException ex) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/jdk/internal/util/jar/TestVersionedStream.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8163798
+ * @summary basic tests for multi-release jar versioned streams
+ * @modules jdk.jartool/sun.tools.jar java.base/jdk.internal.util.jar
+ * @run testng TestVersionedStream
+ */
+
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.net.URI;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.zip.ZipFile;
+
+public class TestVersionedStream {
+    private String userdir;
+
+    @BeforeClass
+    public void initialize() {
+        userdir = System.getProperty("user.dir", ".");
+
+        // These are not real class files even though they end with .class.
+        // They are resource files so jar tool validation won't reject them.
+        // But they are what we want to test, especially q/Bar.class that
+        // could be in a concealed package if this was a modular multi-release
+        // jar.
+        createFiles(
+                "base/p/Foo.class",
+                "base/p/Main.class",
+                "v9/p/Foo.class",
+                "v10/p/Foo.class",
+                "v10/q/Bar.class",
+                "v11/p/Foo.class"
+        );
+
+        jar("cf mmr.jar -C base . --release 9 -C v9 . --release 10 -C v10 . --release 11 -C v11 .");
+
+        System.out.println("Contents of mmr.jar\n=======");
+        jar("tf mmr.jar");
+        System.out.println("=======");
+    }
+
+    @AfterClass
+    public void close() throws IOException {
+        Path root = Paths.get(userdir);
+        Files.walkFileTree(root, new SimpleFileVisitor<>() {
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                Files.delete(file);
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                if (!dir.equals(root)) {
+                    Files.delete(dir);
+                }
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    @DataProvider
+    public Object[][] data() {
+        List<String> p = List.of(
+                "META-INF/",
+                "META-INF/MANIFEST.MF",
+                "p/",
+                "p/Foo.class",
+                "p/Main.class"
+        );
+        List<String> q = List.of(
+                "META-INF/",
+                "META-INF/MANIFEST.MF",
+                "p/",
+                "p/Foo.class",
+                "p/Main.class",
+                "q/",
+                "q/Bar.class"
+        );
+        Runtime.Version rt = JarFile.runtimeVersion();
+        return new Object[][] {
+                {Runtime.Version.parse("8"), p},
+                {Runtime.Version.parse("9"), p},
+                {Runtime.Version.parse("10"), q},
+                {Runtime.Version.parse("11"), q},
+                {JarFile.baseVersion(), p},
+                {rt, rt.major() > 9 ? q : p}
+        };
+    }
+
+    @Test(dataProvider="data")
+    public void test(Runtime.Version version, List<String> names) throws Exception {
+        try (JarFile jf = new JarFile(new File("mmr.jar"), false, ZipFile.OPEN_READ, version);
+            Stream<JarEntry> jes = jdk.internal.util.jar.VersionedStream.stream(jf))
+        {
+            Assert.assertNotNull(jes);
+
+            List<JarEntry> entries = jes.collect(Collectors.toList());
+
+            // verify the correct order
+            List<String> enames = entries.stream()
+                    .map(je -> je.getName())
+                    .collect(Collectors.toList());
+            Assert.assertEquals(enames, names);
+
+            // verify the contents
+            Map<String,String> contents = new HashMap<>();
+            contents.put("p/Main.class", "base/p/Main.class\n");
+            if (version.major() > 9) {
+                contents.put("q/Bar.class", "v10/q/Bar.class\n");
+            }
+            switch (version.major()) {
+                case 8:
+                    contents.put("p/Foo.class", "base/p/Foo.class\n");
+                    break;
+                case 9:
+                    contents.put("p/Foo.class", "v9/p/Foo.class\n");
+                    break;
+                case 10:
+                    contents.put("p/Foo.class", "v10/p/Foo.class\n");
+                    break;
+                case 11:
+                    contents.put("p/Foo.class", "v11/p/Foo.class\n");
+                    break;
+                default:
+                    Assert.fail("Test out of date, please add more cases");
+            }
+
+            contents.entrySet().stream().forEach(e -> {
+                String name = e.getKey();
+                int i = enames.indexOf(name);
+                Assert.assertTrue(i != -1, name + " not in enames");
+                JarEntry je = entries.get(i);
+                try (InputStream is = jf.getInputStream(je)) {
+                    String s = new String(is.readAllBytes());
+                    Assert.assertTrue(s.endsWith(e.getValue()), s);
+                } catch (IOException x) {
+                    throw new UncheckedIOException(x);
+                }
+            });
+        }
+    }
+
+    private void createFiles(String... files) {
+        ArrayList<String> list = new ArrayList();
+        Arrays.stream(files)
+                .map(f -> "file:///" + userdir + "/" + f)
+                .map(f -> URI.create(f))
+                .filter(u -> u != null)
+                .map(u -> Paths.get(u))
+                .forEach(p -> {
+                    try {
+                        Files.createDirectories(p.getParent());
+                        Files.createFile(p);
+                        list.clear();
+                        list.add(p.toString());
+                        Files.write(p, list);
+                    } catch (IOException x) {
+                        throw new UncheckedIOException(x);
+                    }});
+    }
+
+    private void jar(String args) {
+        new sun.tools.jar.Main(System.out, System.err, "jar")
+                .run(args.split(" +"));
+    }
+
+}
--- a/jdk/test/jdk/nio/zipfs/jarfs/JFSTester.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/jdk/nio/zipfs/jarfs/JFSTester.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @bug 8164389
  * @summary walk entries in a jdk.nio.zipfs.JarFileSystem
  * @modules jdk.jartool/sun.tools.jar
+ *          jdk.zipfs
  * @run testng JFSTester
  */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/net/www/protocol/jar/JarURLConnectionUseCaches.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6947916
+ * @summary  JarURLConnection does not handle useCaches correctly
+ * @run main/othervm JarURLConnectionUseCaches
+ */
+
+import java.io.*;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.jar.*;
+
+public class JarURLConnectionUseCaches {
+    public static void main( String[] args ) throws IOException {
+        JarOutputStream out = new JarOutputStream(
+                new FileOutputStream("usecache.jar"));
+        out.putNextEntry(new JarEntry("test.txt"));
+        out.write("Test txt file".getBytes());
+        out.closeEntry();
+        out.close();
+
+        URL url = new URL("jar:"
+            + new File(".").toURI().toString()
+            + "/usecache.jar!/test.txt");
+
+        JarURLConnection c1 = (JarURLConnection)url.openConnection();
+        c1.setDefaultUseCaches( false );
+        c1.setUseCaches( true );
+        c1.connect();
+
+        JarURLConnection c2 = (JarURLConnection)url.openConnection();
+        c2.setDefaultUseCaches( false );
+        c2.setUseCaches( true );
+        c2.connect();
+
+        c1.getInputStream().close();
+        c2.getInputStream().read();
+        c2.getInputStream().close();
+    }
+}
--- a/jdk/test/sun/security/ec/NSASuiteB/TestSHAwithECDSASignatureOids.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/ec/NSASuiteB/TestSHAwithECDSASignatureOids.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@
  *          OID and algorithm transformation string should match.
  *          Both could be able to be used to generate the algorithm instance.
  * @compile ../../TestSignatureOidHelper.java
+ * @modules jdk.crypto.ec
  * @run main TestSHAwithECDSASignatureOids
  */
 public class TestSHAwithECDSASignatureOids {
--- a/jdk/test/sun/security/krb5/IPv6.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/krb5/IPv6.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,11 +25,16 @@
  * @test
  * @bug 6877357 6885166
  * @run main/othervm IPv6
+ * @modules jdk.security.auth
  * @summary IPv6 address does not work
  */
 
 import com.sun.security.auth.module.Krb5LoginModule;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.io.StringReader;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Matcher;
--- a/jdk/test/sun/security/krb5/auto/MaxRetries.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/krb5/auto/MaxRetries.java	Wed Jul 05 22:13:53 2017 +0200
@@ -24,7 +24,6 @@
 /*
  * @test
  * @bug 6844193
- * @key intermittent
  * @compile -XDignore.symbol.file MaxRetries.java
  * @run main/othervm/timeout=300 MaxRetries
  * @summary support max_retries in krb5.conf
--- a/jdk/test/sun/security/krb5/auto/Unreachable.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/krb5/auto/Unreachable.java	Wed Jul 05 22:13:53 2017 +0200
@@ -24,7 +24,6 @@
 /*
  * @test
  * @bug 7162687 8015595
- * @key intermittent
  * @summary enhance KDC server availability detection
  * @compile -XDignore.symbol.file Unreachable.java
  * @run main/othervm Unreachable
--- a/jdk/test/sun/security/pkcs11/Cipher/ReinitCipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/ReinitCipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ReinitCipher
  * @run main/othervm ReinitCipher sm
  */
--- a/jdk/test/sun/security/pkcs11/Cipher/TestPKCS5PaddingError.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestPKCS5PaddingError.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6687725
  * @summary Test internal PKCS5Padding impl with various error conditions.
  * @author Valerie Peng
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestPKCS5PaddingError
  * @run main/othervm TestPKCS5PaddingError sm
  */
--- a/jdk/test/sun/security/pkcs11/Cipher/TestRSACipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRSACipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4898468 6994008
  * @summary basic test for RSA cipher
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestRSACipher
  * @run main/othervm TestRSACipher sm
  */
--- a/jdk/test/sun/security/pkcs11/Cipher/TestRSACipherWrap.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRSACipherWrap.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6572331 6994008
  * @summary basic test for RSA cipher key wrapping functionality
  * @author Valerie Peng
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestRSACipherWrap
  * @run main/othervm TestRSACipherWrap sm
  */
--- a/jdk/test/sun/security/pkcs11/Cipher/TestRawRSACipher.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestRawRSACipher.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6994008
  * @summary basic test for RSA/ECB/NoPadding cipher
  * @author Valerie Peng
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestRawRSACipher
  * @run main/othervm TestRawRSACipher sm
  */
--- a/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphers.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4898461 6604496
  * @summary basic test for symmetric ciphers with padding
  * @author Valerie Peng
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestSymmCiphers
  * @run main/othervm TestSymmCiphers sm
  */
--- a/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4898484 6604496 8001284
  * @summary basic test for symmetric ciphers with no padding
  * @author Valerie Peng
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestSymmCiphersNoPad
  * @run main/othervm TestSymmCiphersNoPad sm
  */
--- a/jdk/test/sun/security/pkcs11/KeyAgreement/SupportedDHKeys.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyAgreement/SupportedDHKeys.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,21 +21,23 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 8072452
  * @summary Support DHE sizes up to 8192-bits and DSA sizes up to 3072-bits
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm SupportedDHKeys
  * @run main/othervm SupportedDHKeys sm
  */
 
 import java.math.BigInteger;
-
-import java.security.*;
-import javax.crypto.*;
-import javax.crypto.interfaces.*;
-import javax.crypto.spec.*;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.Provider;
+import javax.crypto.interfaces.DHPrivateKey;
+import javax.crypto.interfaces.DHPublicKey;
+import javax.crypto.spec.DHParameterSpec;
 
 public class SupportedDHKeys extends PKCS11Test {
 
--- a/jdk/test/sun/security/pkcs11/KeyAgreement/TestDH.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyAgreement/TestDH.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4921804 6324825
  * @summary Verify that DH works properly
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestDH
  * @run main/othervm TestDH sm
  */
--- a/jdk/test/sun/security/pkcs11/KeyAgreement/TestInterop.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyAgreement/TestInterop.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,11 +21,12 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 7146728
  * @summary Interop test for DH with secret that has a leading 0x00 byte
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestInterop
  * @run main/othervm TestInterop sm
  */
--- a/jdk/test/sun/security/pkcs11/KeyAgreement/TestShort.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyAgreement/TestShort.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4942494 7146728
  * @summary KAT test for DH (normal and with secret that has leading a 0x00 byte)
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestShort
  * @run main/othervm TestShort sm
  */
--- a/jdk/test/sun/security/pkcs11/KeyAgreement/UnsupportedDHKeys.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyAgreement/UnsupportedDHKeys.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,21 +21,19 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 8072452
  * @summary Support DHE sizes up to 8192-bits and DSA sizes up to 3072-bits
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm UnsupportedDHKeys
  * @run main/othervm UnsupportedDHKeys sm
  */
 
-import java.math.BigInteger;
-
-import java.security.*;
-import javax.crypto.*;
-import javax.crypto.interfaces.*;
-import javax.crypto.spec.*;
+import java.security.InvalidParameterException;
+import java.security.KeyPairGenerator;
+import java.security.Provider;
 
 public class UnsupportedDHKeys extends PKCS11Test {
 
--- a/jdk/test/sun/security/pkcs11/KeyGenerator/DESParity.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyGenerator/DESParity.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4898479
  * @summary Verify that the parity bits are set correctly
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm DESParity
  * @run main/othervm DESParity sm
  */
--- a/jdk/test/sun/security/pkcs11/KeyGenerator/TestKeyGenerator.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyGenerator/TestKeyGenerator.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4917233 6461727 6490213 6720456
  * @summary test the KeyGenerator
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestKeyGenerator
  * @run main/othervm TestKeyGenerator sm
  */
--- a/jdk/test/sun/security/pkcs11/KeyPairGenerator/TestDH2048.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/KeyPairGenerator/TestDH2048.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 7196382 8072452
  * @summary Ensure that DH key pairs can be generated for 512 - 8192 bits
  * @author Valerie Peng
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestDH2048
  * @run main/othervm TestDH2048 sm
  */
--- a/jdk/test/sun/security/pkcs11/Mac/MacKAT.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Mac/MacKAT.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,6 +21,17 @@
  * questions.
  */
 
+/*
+ * @test
+ * @bug 4846410 6313661 4963723
+ * @summary Basic known-answer-test for Hmac algorithms
+ * @author Andreas Sterbenz
+ * @library ..
+ * @modules jdk.crypto.pkcs11
+ * @run main/othervm MacKAT
+ * @run main/othervm MacKAT sm
+ */
+
 import java.io.UnsupportedEncodingException;
 import java.security.Provider;
 import java.util.Arrays;
@@ -30,15 +41,6 @@
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
-/**
- * @test
- * @bug 4846410 6313661 4963723
- * @summary Basic known-answer-test for Hmac algorithms
- * @author Andreas Sterbenz
- * @library ..
- * @run main/othervm MacKAT
- * @run main/othervm MacKAT sm
- */
 public class MacKAT extends PKCS11Test {
 
     private final static byte[] ALONG, BLONG, BKEY, BKEY_20, DDDATA_50,
--- a/jdk/test/sun/security/pkcs11/Mac/MacSameTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Mac/MacSameTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,6 +21,18 @@
  * questions.
  */
 
+/*
+ * @test
+ * @bug 8048603
+ * @summary Check if doFinal and update operation result in same Mac
+ * @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
+ * @library ..
+ * @modules jdk.crypto.pkcs11
+ * @run main/othervm MacSameTest
+ * @run main/othervm MacSameTest sm
+ * @key randomness
+ */
+
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
@@ -30,16 +42,6 @@
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 
-/**
- * @test
- * @bug 8048603
- * @summary Check if doFinal and update operation result in same Mac
- * @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
- * @library ..
- * @run main/othervm MacSameTest
- * @run main/othervm MacSameTest sm
- * @key randomness
- */
 public class MacSameTest extends PKCS11Test {
 
     private static final int MESSAGE_SIZE = 25;
--- a/jdk/test/sun/security/pkcs11/Mac/ReinitMac.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Mac/ReinitMac.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ReinitMac
  * @run main/othervm ReinitMac sm
  */
--- a/jdk/test/sun/security/pkcs11/MessageDigest/ByteBuffers.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/MessageDigest/ByteBuffers.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Test the MessageDigest.update(ByteBuffer) method
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ByteBuffers
  * @run main/othervm ByteBuffers sm
  */
--- a/jdk/test/sun/security/pkcs11/MessageDigest/DigestKAT.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/MessageDigest/DigestKAT.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Basic known-answer-test for all our MessageDigest algorithms
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm DigestKAT
  * @run main/othervm DigestKAT sm
  */
--- a/jdk/test/sun/security/pkcs11/MessageDigest/ReinitDigest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/MessageDigest/ReinitDigest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ReinitDigest
  * @run main/othervm ReinitDigest sm
  */
--- a/jdk/test/sun/security/pkcs11/MessageDigest/TestCloning.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/MessageDigest/TestCloning.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6414899
  * @summary Ensure the cloning functionality works.
  * @author Valerie Peng
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestCloning
  * @run main/othervm TestCloning sm
  */
--- a/jdk/test/sun/security/pkcs11/PKCS11Test.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/PKCS11Test.java	Wed Jul 05 22:13:53 2017 +0200
@@ -82,8 +82,6 @@
         System.setProperty("closed.base", CLOSED_BASE);
     }
 
-    static String NSPR_PREFIX = "";
-
     // NSS version info
     public static enum ECCState { None, Basic, Extended };
     static double nss_version = -1;
@@ -294,7 +292,6 @@
         String osName = props.getProperty("os.name");
         if (osName.startsWith("Win")) {
             osName = "Windows";
-            NSPR_PREFIX = "lib";
         } else if (osName.equals("Mac OS X")) {
             osName = "MacOSX";
         }
@@ -342,9 +339,9 @@
 
     static boolean loadNSPR(String libdir) throws Exception {
         // load NSS softoken dependencies in advance to avoid resolver issues
-        safeReload(libdir + System.mapLibraryName(NSPR_PREFIX + "nspr4"));
-        safeReload(libdir + System.mapLibraryName(NSPR_PREFIX + "plc4"));
-        safeReload(libdir + System.mapLibraryName(NSPR_PREFIX + "plds4"));
+        safeReload(libdir + System.mapLibraryName("nspr4"));
+        safeReload(libdir + System.mapLibraryName("plc4"));
+        safeReload(libdir + System.mapLibraryName("plds4"));
         safeReload(libdir + System.mapLibraryName("sqlite3"));
         safeReload(libdir + System.mapLibraryName("nssutil3"));
         return true;
--- a/jdk/test/sun/security/pkcs11/Provider/Absolute.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Provider/Absolute.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -20,13 +20,16 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-/**
+/*
  * @test
  * @bug 7003952 7191662
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @summary load DLLs and launch executables using fully qualified path
  */
-import java.security.*;
+
+import java.security.InvalidParameterException;
+import java.security.Provider;
 
 public class Absolute {
 
--- a/jdk/test/sun/security/pkcs11/SampleTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/SampleTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,20 +21,16 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4000000
  * @summary XXX todo
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  */
 
-import java.io.*;
-import java.util.*;
-
-import java.security.*;
-
-import javax.crypto.*;
+import java.security.Provider;
 
 public class SampleTest extends PKCS11Test {
 
--- a/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6414980
  * @summary Test that the PKCS#11 KeyStore handles RSA, DSA, and EC keys
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm AddPrivateKey
  * @run main/othervm AddPrivateKey sm policy
  */
--- a/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6298106
  * @summary make sure we can add a trusted cert to the NSS KeyStore module
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm AddTrustedCert
  * @run main/othervm AddTrustedCert sm policy
  */
--- a/jdk/test/sun/security/pkcs11/Secmod/Crypto.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/Crypto.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6329006
  * @summary verify that NSS no-db mode works correctly
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm Crypto
  * @run main/othervm Crypto sm policy
  */
--- a/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6273877 6322208 6275523
  * @summary make sure we can access the NSS softtoken KeyStore
  *          and use a private key
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm GetPrivateKey
  * @run main/othervm GetPrivateKey sm policy
  */
--- a/jdk/test/sun/security/pkcs11/Secmod/JksSetPrivateKey.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/JksSetPrivateKey.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6269847
  * @summary store a NSS PKCS11 PrivateKeyEntry to JKS KeyStore throws confusing NPE
  * @author Wang Weijun
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm JksSetPrivateKey
  * @run main/othervm JksSetPrivateKey sm policy
  */
--- a/jdk/test/sun/security/pkcs11/Secmod/LoadKeystore.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/LoadKeystore.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,6 +21,16 @@
  * questions.
  */
 
+/*
+ * @test
+ * @bug 8048622 8134232
+ * @summary Checks that PKCS#11 keystore can't be loaded with wrong password
+ * @library ../
+ * @modules jdk.crypto.pkcs11
+ * @run main/othervm LoadKeystore
+ * @run main/othervm LoadKeystore sm policy
+ */
+
 import java.io.File;
 import java.io.IOException;
 import java.security.KeyStore;
@@ -30,14 +40,6 @@
 import java.security.UnrecoverableKeyException;
 import java.util.Collections;
 
-/*
- * @test
- * @bug 8048622 8134232
- * @summary Checks that PKCS#11 keystore can't be loaded with wrong password
- * @library ../
- * @run main/othervm LoadKeystore
- * @run main/othervm LoadKeystore sm policy
- */
 public class LoadKeystore extends SecmodTest {
 
     public static void main(String[] args) throws Exception {
--- a/jdk/test/sun/security/pkcs11/Secmod/TrustAnchors.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Secmod/TrustAnchors.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6298106 6275523 6420252 8059627
  * @summary make sure we can access the NSS trust anchor module
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TrustAnchors
  * @run main/othervm TrustAnchors sm policy
  */
--- a/jdk/test/sun/security/pkcs11/SecureRandom/Basic.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/SecureRandom/Basic.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6246411
  * @summary basic test for PKCS#11 SecureRandom
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm Basic
  * @run main/othervm Basic sm
  */
--- a/jdk/test/sun/security/pkcs11/SecureRandom/TestDeserialization.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/SecureRandom/TestDeserialization.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -21,15 +21,22 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6837847
  * @summary Ensure a deserialized PKCS#11 SecureRandom is functional.
  * @library ..
+ * @modules jdk.crypto.pkcs11
  */
 
-import java.security.*;
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.SecureRandom;
+import java.security.Security;
 
 public class TestDeserialization extends PKCS11Test {
 
--- a/jdk/test/sun/security/pkcs11/Serialize/SerializeProvider.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Serialize/SerializeProvider.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,18 +21,22 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4921802
  * @summary Test that the SunPKCS11 provider can be serialized
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  */
 
-import java.io.*;
-import java.util.*;
-
-import java.security.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.security.Provider;
+import java.security.Security;
 
 public class SerializeProvider extends PKCS11Test {
 
--- a/jdk/test/sun/security/pkcs11/Signature/ByteBuffers.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Signature/ByteBuffers.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Test the Signature.update(ByteBuffer) method
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ByteBuffers
  * @run main/othervm ByteBuffers sm
  */
--- a/jdk/test/sun/security/pkcs11/Signature/ReinitSignature.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Signature/ReinitSignature.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary test that reinitializing Signatures works correctly
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main ReinitSignature
  * @run main ReinitSignature
  * @run main ReinitSignature
@@ -330,9 +331,13 @@
  * @run main ReinitSignature
  */
 
-import java.util.*;
-
-import java.security.*;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.util.Random;
 
 public class ReinitSignature extends PKCS11Test {
 
--- a/jdk/test/sun/security/pkcs11/Signature/TestDSA.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Signature/TestDSA.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary basic test of SHA1withDSA and RawDSA signing/verifying
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestDSA
  * @run main/othervm TestDSA sm
  */
--- a/jdk/test/sun/security/pkcs11/Signature/TestDSAKeyLength.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Signature/TestDSAKeyLength.java	Wed Jul 05 22:13:53 2017 +0200
@@ -28,6 +28,7 @@
  * with unsupported key sizes
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestDSAKeyLength
  * @run main/othervm TestDSAKeyLength sm
  */
--- a/jdk/test/sun/security/pkcs11/Signature/TestRSAKeyLength.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/Signature/TestRSAKeyLength.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test %W% %E%
  * @bug 6695485
  * @summary Make sure initSign/initVerify() check RSA key lengths
  * @author Yu-Ching Valerie Peng
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestRSAKeyLength
  * @run main/othervm TestRSAKeyLength sm
  */
--- a/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536 6414980 8051972
  * @summary Make sure that we can parse certificates using various named curves
@@ -29,6 +29,7 @@
  * @author Andreas Sterbenz
  * @library ..
  * @library ../../../../java/security/testlibrary
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ReadCertificates
  * @run main/othervm ReadCertificates sm policy
  */
--- a/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536
  * @summary Verify that we can parse ECPrivateKeys from PKCS#12 and use them
@@ -29,6 +29,7 @@
  * @library ..
  * @library ../../../../java/security/testlibrary
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm ReadPKCS12
  * @run main/othervm ReadPKCS12 sm policy
  */
--- a/jdk/test/sun/security/pkcs11/ec/TestECDH.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDH.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536
  * @summary Basic known answer test for ECDH
  * @author Andreas Sterbenz
  * @library ..
  * @library ../../../../java/security/testlibrary
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestECDH
  * @run main/othervm TestECDH sm policy
  */
--- a/jdk/test/sun/security/pkcs11/ec/TestECDH2.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDH2.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536
  * @summary basic test of ECDSA signatures for P-256 and P-384 from the
@@ -29,6 +29,7 @@
  * @library ..
  * @library ../../../../java/security/testlibrary
  * @modules java.base/sun.security.util
+ *          jdk.crypto.pkcs11
  * @compile -XDignore.symbol.file TestECDH2.java
  * @run main/othervm TestECDH2
  * @run main/othervm TestECDH2 sm
--- a/jdk/test/sun/security/pkcs11/ec/TestECDSA.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDSA.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536 8042967
  * @summary basic test of SHA1withECDSA and NONEwithECDSA signing/verifying
@@ -29,6 +29,7 @@
  * @library ..
  * @library ../../../../java/security/testlibrary
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestECDSA
  * @run main/othervm TestECDSA sm policy
  */
--- a/jdk/test/sun/security/pkcs11/ec/TestECDSA2.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDSA2.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536
  * @summary basic test of ECDSA signatures for P-256 and P-384 from the
@@ -29,6 +29,7 @@
  * @library ..
  * @library ../../../../java/security/testlibrary
  * @modules java.base/sun.security.util
+ *          jdk.crypto.pkcs11
  * @compile -XDignore.symbol.file TestECDSA2.java
  * @run main/othervm TestECDSA2
  * @run main/othervm TestECDSA2 sm
--- a/jdk/test/sun/security/pkcs11/ec/TestECGenSpec.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestECGenSpec.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536
  * @summary Verify that we can use ECGenParameterSpec
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestECGenSpec
  * @run main/othervm TestECGenSpec sm
  */
--- a/jdk/test/sun/security/pkcs11/ec/TestKeyFactory.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/ec/TestKeyFactory.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6405536
  * @summary Test the P11ECKeyFactory
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestKeyFactory
  * @run main/othervm TestKeyFactory sm
  */
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nspr4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nspr4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssckbi.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/plc4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/plc4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/plds4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/plds4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/sqlite3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nspr4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nspr4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssckbi.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/plc4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/plc4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/plds4.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/plds4.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.chk has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/sqlite3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.dll has changed
Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.lib has changed
Binary file jdk/test/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/nss/src/nss-3.16-with-nspr-4.10.4.tar.gz.sha256	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,1 @@
+9d23633683ab3cea14519a22a997bc7f5d8d9664b6342df492c194966184ce0d  nss-3.16-with-nspr-4.10.4.tar.gz
Binary file jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz has changed
--- a/jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256	Thu Sep 15 17:15:55 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-d2374795528f9cf36de07bf7c77d8c8414bb5b4da12ee7c78a57ec90d68e3706  nss-3.16_nspr-4.10_src.tar.gz
--- a/jdk/test/sun/security/pkcs11/rsa/KeyWrap.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/rsa/KeyWrap.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6231216
  * @summary Verify key wrapping (of extractable keys) works for RSA/PKCS1
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm KeyWrap
  * @run main/othervm KeyWrap sm
  */
--- a/jdk/test/sun/security/pkcs11/rsa/TestCACerts.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/rsa/TestCACerts.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Test the new RSA provider can verify all the RSA certs in the cacerts file
  * @author Andreas Sterbenz
  * @library ..
  * @library ../../../../java/security/testlibrary
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestCACerts
  * @run main/othervm TestCACerts sm TestCACerts.policy
  */
--- a/jdk/test/sun/security/pkcs11/rsa/TestKeyFactory.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/rsa/TestKeyFactory.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,12 +21,13 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Test KeyFactory of the new RSA provider
  * @author Andreas Sterbenz
  * @library ..
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestKeyFactory
  * @run main/othervm TestKeyFactory sm rsakeys.ks.policy
  */
--- a/jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Verify that the RSA KeyPairGenerator works (use -Dseed=X to set PRNG seed)
@@ -29,6 +29,7 @@
  * @library ..
  * @library /lib/testlibrary
  * @build jdk.testlibrary.*
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm -Djava.security.debug=sunpkcs11 TestKeyPairGenerator
  * @run main/othervm -Djava.security.debug=sunpkcs11 TestKeyPairGenerator
  *                                                   sm TestKeyPairGenerator.policy
--- a/jdk/test/sun/security/pkcs11/rsa/TestSignatures.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/rsa/TestSignatures.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 4856966
  * @summary Test signing/verifying using all the signature algorithms
  * @author Andreas Sterbenz
  * @library ..
  * @key randomness
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestSignatures
  * @run main/othervm TestSignatures sm rsakeys.ks.policy
  */
--- a/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java	Wed Jul 05 22:13:53 2017 +0200
@@ -33,6 +33,7 @@
  * @author Andreas Sterbenz
  * @library ..
  * @library ../../../../java/security/testlibrary
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm -Djdk.tls.namedGroups="secp256r1,sect193r1"
  *      ClientJSSEServerJSSE
  * @run main/othervm -Djdk.tls.namedGroups="secp256r1,sect193r1"
--- a/jdk/test/sun/security/pkcs11/tls/TestKeyMaterial.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/tls/TestKeyMaterial.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6316539
  * @summary Known-answer-test for TlsKeyMaterial generator
  * @author Andreas Sterbenz
  * @library ..
  * @modules java.base/sun.security.internal.spec
+ *          jdk.crypto.pkcs11
  * @run main/othervm TestKeyMaterial
  * @run main/othervm TestKeyMaterial sm policy
  */
--- a/jdk/test/sun/security/pkcs11/tls/TestLeadingZeroesP11.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/tls/TestLeadingZeroesP11.java	Wed Jul 05 22:13:53 2017 +0200
@@ -27,6 +27,7 @@
  * @summary Need to strip leading zeros in TlsPremasterSecret of DHKeyAgreement
  * @library ..
  * @author Pasi Eronen
+ * @modules jdk.crypto.pkcs11
  * @run main/othervm TestLeadingZeroesP11
  * @run main/othervm TestLeadingZeroesP11 sm
  */
--- a/jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/tls/TestMasterSecret.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6316539
  * @summary Known-answer-test for TlsMasterSecret generator
@@ -29,6 +29,7 @@
  * @library ..
  * @modules java.base/sun.security.internal.interfaces
  *          java.base/sun.security.internal.spec
+ *          jdk.crypto.pkcs11
  * @run main/othervm TestMasterSecret
  * @run main/othervm TestMasterSecret sm TestMasterSecret.policy
  */
--- a/jdk/test/sun/security/pkcs11/tls/TestPRF.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/tls/TestPRF.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6316539 6345251
  * @summary Basic known-answer-test for TlsPrf
  * @author Andreas Sterbenz
  * @library ..
  * @modules java.base/sun.security.internal.spec
+ *          jdk.crypto.pkcs11
  * @run main/othervm TestPRF
  * @run main/othervm TestPRF sm policy
  */
--- a/jdk/test/sun/security/pkcs11/tls/TestPremaster.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/pkcs11/tls/TestPremaster.java	Wed Jul 05 22:13:53 2017 +0200
@@ -21,13 +21,14 @@
  * questions.
  */
 
-/**
+/*
  * @test
  * @bug 6316539
  * @summary Basic tests for TlsRsaPremasterSecret generator
  * @author Andreas Sterbenz
  * @library ..
  * @modules java.base/sun.security.internal.spec
+ *          jdk.crypto.pkcs11
  * @run main/othervm TestPremaster
  * @run main/othervm TestPremaster sm policy
  */
--- a/jdk/test/sun/security/provider/FileInputStreamPool/FileInputStreamPoolTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/provider/FileInputStreamPool/FileInputStreamPoolTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -69,7 +69,7 @@
         // make JVM process References
         System.gc();
         // help ReferenceHandler thread enqueue References
-        while (TestProxy.Reference_tryHandlePending(false)) {}
+        while (TestProxy.Reference_waitForReferenceProcessing()) { }
         // help run Finalizers
         System.runFinalization();
     }
@@ -103,11 +103,11 @@
     /**
      * A proxy for (package)private static methods:
      *   sun.security.provider.FileInputStreamPool.getInputStream
-     *   java.lang.ref.Reference.tryHandlePending
+     *   java.lang.ref.Reference.waitForReferenceProcessing
      */
     static class TestProxy {
         private static final Method getInputStreamMethod;
-        private static final Method tryHandlePendingMethod;
+        private static final Method waitForReferenceProcessingMethod;
 
         static {
             try {
@@ -118,9 +118,9 @@
                         "getInputStream", File.class);
                 getInputStreamMethod.setAccessible(true);
 
-                tryHandlePendingMethod = Reference.class.getDeclaredMethod(
-                    "tryHandlePending", boolean.class);
-                tryHandlePendingMethod.setAccessible(true);
+                waitForReferenceProcessingMethod =
+                    Reference.class.getDeclaredMethod("waitForReferenceProcessing");
+                waitForReferenceProcessingMethod.setAccessible(true);
             } catch (Exception e) {
                 throw new Error(e);
             }
@@ -146,13 +146,14 @@
             }
         }
 
-        static boolean Reference_tryHandlePending(boolean waitForNotify) {
+        static boolean Reference_waitForReferenceProcessing() {
             try {
-                return (boolean) tryHandlePendingMethod
-                    .invoke(null, waitForNotify);
+                return (boolean) waitForReferenceProcessingMethod.invoke(null);
             } catch (InvocationTargetException e) {
                 Throwable te = e.getTargetException();
-                if (te instanceof RuntimeException) {
+                if (te instanceof InterruptedException) {
+                    return true;
+                } else if (te instanceof RuntimeException) {
                     throw (RuntimeException) te;
                 } else if (te instanceof Error) {
                     throw (Error) te;
--- a/jdk/test/sun/security/ssl/SSLEngineImpl/SSLEngineBadBufferArrayAccess.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/ssl/SSLEngineImpl/SSLEngineBadBufferArrayAccess.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -83,6 +83,8 @@
 import java.net.*;
 import java.security.*;
 import java.nio.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 public class SSLEngineBadBufferArrayAccess {
 
@@ -103,9 +105,6 @@
     private static boolean debug = false;
     private SSLContext sslc;
     private SSLEngine serverEngine;     // server-side SSLEngine
-    private SSLSocket sslSocket;        // client-side socket
-    private ServerSocket serverSocket;  // server-side Socket, generates the...
-    private Socket socket;              // server-side socket that will read
 
     private final byte[] serverMsg = "Hi there Client, I'm a Server".getBytes();
     private final byte[] clientMsg = "Hello Server, I'm a Client".getBytes();
@@ -137,6 +136,21 @@
             + "/" + trustStoreFile;
 
     /*
+     * Is the server ready to serve?
+     */
+    private static final CountDownLatch serverCondition = new CountDownLatch(1);
+
+    /*
+     * Is the client ready to handshake?
+     */
+    private static final CountDownLatch clientCondition = new CountDownLatch(1);
+
+    /*
+     * What's the server port?  Use any free port by default
+     */
+    private volatile int serverPort = 0;
+
+    /*
      * Main entry point for this test.
      */
     public static void main(String args[]) throws Exception {
@@ -171,8 +185,13 @@
 
         char[] passphrase = "passphrase".toCharArray();
 
-        ks.load(new FileInputStream(keyFilename), passphrase);
-        ts.load(new FileInputStream(trustFilename), passphrase);
+        try (FileInputStream fis = new FileInputStream(keyFilename)) {
+            ks.load(fis, passphrase);
+        }
+
+        try (FileInputStream fis = new FileInputStream(trustFilename)) {
+            ts.load(fis, passphrase);
+        }
 
         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
         kmf.init(ks, passphrase);
@@ -207,127 +226,177 @@
     private void runTest(boolean direct) throws Exception {
         boolean serverClose = direct;
 
-        serverSocket = new ServerSocket(0);
-        int port = serverSocket.getLocalPort();
-        Thread thread = createClientThread(port, serverClose);
+        ServerSocket serverSocket = new ServerSocket(0);
+        serverPort = serverSocket.getLocalPort();
+
+        // Signal the client, the server is ready to accept connection.
+        serverCondition.countDown();
+
+        Thread clientThread = runClient(serverClose);
+
+        // Try to accept a connection in 30 seconds.
+        Socket socket;
+        try {
+            serverSocket.setSoTimeout(30000);
+            socket = (Socket) serverSocket.accept();
+        } catch (SocketTimeoutException ste) {
+            serverSocket.close();
+
+            // Ignore the test case if no connection within 30 seconds.
+            System.out.println(
+                "No incoming client connection in 30 seconds. " +
+                "Ignore in server side.");
+            return;
+        }
+
+        // handle the connection
+        try {
+            // Is it the expected client connection?
+            //
+            // Naughty test cases or third party routines may try to
+            // connection to this server port unintentionally.  In
+            // order to mitigate the impact of unexpected client
+            // connections and avoid intermittent failure, it should
+            // be checked that the accepted connection is really linked
+            // to the expected client.
+            boolean clientIsReady =
+                    clientCondition.await(30L, TimeUnit.SECONDS);
 
-        socket = serverSocket.accept();
+            if (clientIsReady) {
+                // Run the application in server side.
+                runServerApplication(socket, direct, serverClose);
+            } else {    // Otherwise, ignore
+                // We don't actually care about plain socket connections
+                // for TLS communication testing generally.  Just ignore
+                // the test if the accepted connection is not linked to
+                // the expected client or the client connection timeout
+                // in 30 seconds.
+                System.out.println(
+                        "The client is not the expected one or timeout. " +
+                        "Ignore in server side.");
+            }
+        } catch (Exception e) {
+            System.out.println("Server died ...");
+            e.printStackTrace(System.out);
+            serverException = e;
+        } finally {
+            socket.close();
+            serverSocket.close();
+        }
+
+        clientThread.join();
+
+        if (clientException != null || serverException != null) {
+            throw new RuntimeException("Test failed");
+        }
+    }
+
+    /*
+     * Define the server side application of the test for the specified socket.
+     */
+    void runServerApplication(Socket socket, boolean direct,
+            boolean serverClose) throws Exception {
+
         socket.setSoTimeout(500);
-        serverSocket.close();
 
         createSSLEngine();
         createBuffers(direct);
 
-        try {
-            boolean closed = false;
+        boolean closed = false;
+
+        InputStream is = socket.getInputStream();
+        OutputStream os = socket.getOutputStream();
+
+        SSLEngineResult serverResult;   // results from last operation
+
+        /*
+         * Examining the SSLEngineResults could be much more involved,
+         * and may alter the overall flow of the application.
+         *
+         * For example, if we received a BUFFER_OVERFLOW when trying
+         * to write to the output pipe, we could reallocate a larger
+         * pipe, but instead we wait for the peer to drain it.
+         */
+        byte[] inbound = new byte[8192];
+        byte[] outbound = new byte[8192];
 
-            InputStream is = socket.getInputStream();
-            OutputStream os = socket.getOutputStream();
+        while (!isEngineClosed(serverEngine)) {
+            int len = 0;
+
+            // Inbound data
+            log("================");
 
-            SSLEngineResult serverResult;   // results from last operation
+            // Read from the Client side.
+            try {
+                len = is.read(inbound);
+                if (len == -1) {
+                    throw new Exception("Unexpected EOF");
+                }
+                cTOs.put(inbound, 0, len);
+            } catch (SocketTimeoutException ste) {
+                // swallow.  Nothing yet, probably waiting on us.
+                System.out.println("Warning: " + ste);
+            }
+
+            cTOs.flip();
 
-            /*
-             * Examining the SSLEngineResults could be much more involved,
-             * and may alter the overall flow of the application.
-             *
-             * For example, if we received a BUFFER_OVERFLOW when trying
-             * to write to the output pipe, we could reallocate a larger
-             * pipe, but instead we wait for the peer to drain it.
-             */
-            byte[] inbound = new byte[8192];
-            byte[] outbound = new byte[8192];
+            serverResult = serverEngine.unwrap(cTOs, serverIn);
+            log("server unwrap: ", serverResult);
+            runDelegatedTasks(serverResult, serverEngine);
+            cTOs.compact();
+
+            // Outbound data
+            log("----");
+
+            serverResult = serverEngine.wrap(serverOut, sTOc);
+            log("server wrap: ", serverResult);
+            runDelegatedTasks(serverResult, serverEngine);
+
+            sTOc.flip();
+
+            if ((len = sTOc.remaining()) != 0) {
+                sTOc.get(outbound, 0, len);
+                os.write(outbound, 0, len);
+                // Give the other side a chance to process
+            }
+
+            sTOc.compact();
 
-            while (!isEngineClosed(serverEngine)) {
-                int len = 0;
-
-                // Inbound data
-                log("================");
+            if (!closed && (serverOut.remaining() == 0)) {
+                closed = true;
 
-                // Read from the Client side.
-                try {
-                    len = is.read(inbound);
-                    if (len == -1) {
-                        throw new Exception("Unexpected EOF");
-                    }
-                    cTOs.put(inbound, 0, len);
-                } catch (SocketTimeoutException ste) {
-                    // swallow.  Nothing yet, probably waiting on us.
+                /*
+                 * We'll alternate initiatating the shutdown.
+                 * When the server initiates, it will take one more
+                 * loop, but tests the orderly shutdown.
+                 */
+                if (serverClose) {
+                    serverEngine.closeOutbound();
+                }
+            }
+
+            if (closed && isEngineClosed(serverEngine)) {
+                serverIn.flip();
+
+                /*
+                 * A sanity check to ensure we got what was sent.
+                 */
+                if (serverIn.remaining() != clientMsg.length) {
+                    throw new Exception("Client: Data length error -" +
+                        " IF THIS FAILS, PLEASE REPORT THIS TO THE" +
+                        " SECURITY TEAM.  WE HAVE BEEN UNABLE TO" +
+                        " RELIABLY DUPLICATE.");
                 }
 
-                cTOs.flip();
-
-                serverResult = serverEngine.unwrap(cTOs, serverIn);
-                log("server unwrap: ", serverResult);
-                runDelegatedTasks(serverResult, serverEngine);
-                cTOs.compact();
-
-                // Outbound data
-                log("----");
-
-                serverResult = serverEngine.wrap(serverOut, sTOc);
-                log("server wrap: ", serverResult);
-                runDelegatedTasks(serverResult, serverEngine);
-
-                sTOc.flip();
-
-                if ((len = sTOc.remaining()) != 0) {
-                    sTOc.get(outbound, 0, len);
-                    os.write(outbound, 0, len);
-                    // Give the other side a chance to process
-                }
-
-                sTOc.compact();
-
-                if (!closed && (serverOut.remaining() == 0)) {
-                    closed = true;
-
-                    /*
-                     * We'll alternate initiatating the shutdown.
-                     * When the server initiates, it will take one more
-                     * loop, but tests the orderly shutdown.
-                     */
-                    if (serverClose) {
-                        serverEngine.closeOutbound();
+                for (int i = 0; i < clientMsg.length; i++) {
+                    if (clientMsg[i] != serverIn.get()) {
+                        throw new Exception("Client: Data content error -" +
+                        " IF THIS FAILS, PLEASE REPORT THIS TO THE" +
+                        " SECURITY TEAM.  WE HAVE BEEN UNABLE TO" +
+                        " RELIABLY DUPLICATE.");
                     }
                 }
-
-                if (closed && isEngineClosed(serverEngine)) {
-                    serverIn.flip();
-
-                    /*
-                     * A sanity check to ensure we got what was sent.
-                     */
-                    if (serverIn.remaining() != clientMsg.length) {
-                        throw new Exception("Client: Data length error -" +
-                            " IF THIS FAILS, PLEASE REPORT THIS TO THE" +
-                            " SECURITY TEAM.  WE HAVE BEEN UNABLE TO" +
-                            " RELIABLY DUPLICATE.");
-                    }
-
-                    for (int i = 0; i < clientMsg.length; i++) {
-                        if (clientMsg[i] != serverIn.get()) {
-                            throw new Exception("Client: Data content error -" +
-                            " IF THIS FAILS, PLEASE REPORT THIS TO THE" +
-                            " SECURITY TEAM.  WE HAVE BEEN UNABLE TO" +
-                            " RELIABLY DUPLICATE.");
-                        }
-                    }
-                    serverIn.compact();
-                }
-            }
-            return;
-        } catch (Exception e) {
-            serverException = e;
-        } finally {
-            socket.close();
-
-            // Wait for the client to join up with us.
-            thread.join();
-            if (serverException != null) {
-                throw serverException;
-            }
-            if (clientException != null) {
-                throw clientException;
+                serverIn.compact();
             }
         }
     }
@@ -336,57 +405,114 @@
      * Create a client thread which does simple SSLSocket operations.
      * We'll write and read one data packet.
      */
-    private Thread createClientThread(final int port,
-            final boolean serverClose) throws Exception {
+    private Thread runClient(final boolean serverClose)
+            throws Exception {
 
         Thread t = new Thread("ClientThread") {
 
             @Override
             public void run() {
                 try {
-                    Thread.sleep(1000);  // Give server time to finish setup.
-
-                    sslSocket = (SSLSocket) sslc.getSocketFactory().
-                            createSocket("localhost", port);
-                    OutputStream os = sslSocket.getOutputStream();
-                    InputStream is = sslSocket.getInputStream();
-
-                    // write(byte[]) goes in one shot.
-                    os.write(clientMsg);
-
-                    byte[] inbound = new byte[2048];
-                    int pos = 0;
-
-                    int len;
-done:
-                    while ((len = is.read(inbound, pos, 2048 - pos)) != -1) {
-                        pos += len;
-                        // Let the client do the closing.
-                        if ((pos == serverMsg.length) && !serverClose) {
-                            sslSocket.close();
-                            break done;
-                        }
-                    }
-
-                    if (pos != serverMsg.length) {
-                        throw new Exception("Client:  Data length error");
-                    }
-
-                    for (int i = 0; i < serverMsg.length; i++) {
-                        if (inbound[i] != serverMsg[i]) {
-                            throw new Exception("Client:  Data content error");
-                        }
-                    }
+                    doClientSide(serverClose);
                 } catch (Exception e) {
+                    System.out.println("Client died ...");
+                    e.printStackTrace(System.out);
                     clientException = e;
                 }
             }
         };
+
         t.start();
         return t;
     }
 
     /*
+     * Define the client side of the test.
+     */
+    void doClientSide(boolean serverClose) throws Exception {
+        // Wait for server to get started.
+        //
+        // The server side takes care of the issue if the server cannot
+        // get started in 90 seconds.  The client side would just ignore
+        // the test case if the serer is not ready.
+        boolean serverIsReady =
+                serverCondition.await(90L, TimeUnit.SECONDS);
+        if (!serverIsReady) {
+            System.out.println(
+                    "The server is not ready yet in 90 seconds. " +
+                    "Ignore in client side.");
+            return;
+        }
+
+        SSLSocketFactory sslsf = sslc.getSocketFactory();
+        try (SSLSocket sslSocket = (SSLSocket)sslsf.createSocket()) {
+            try {
+                sslSocket.connect(
+                        new InetSocketAddress("localhost", serverPort), 15000);
+            } catch (IOException ioe) {
+                // The server side may be impacted by naughty test cases or
+                // third party routines, and cannot accept connections.
+                //
+                // Just ignore the test if the connection cannot be
+                // established.
+                System.out.println(
+                        "Cannot make a connection in 15 seconds. " +
+                        "Ignore in client side.");
+                return;
+            }
+
+            // OK, here the client and server get connected.
+
+            // Signal the server, the client is ready to communicate.
+            clientCondition.countDown();
+
+            // There is still a chance in theory that the server thread may
+            // wait client-ready timeout and then quit.  The chance should
+            // be really rare so we don't consider it until it becomes a
+            // real problem.
+
+            // Run the application in client side.
+            runClientApplication(sslSocket, serverClose);
+        }
+    }
+
+    /*
+     * Define the server side application of the test for the specified socket.
+     */
+    void runClientApplication(SSLSocket sslSocket, boolean serverClose)
+            throws Exception {
+
+        OutputStream os = sslSocket.getOutputStream();
+        InputStream is = sslSocket.getInputStream();
+
+        // write(byte[]) goes in one shot.
+        os.write(clientMsg);
+
+        byte[] inbound = new byte[2048];
+        int pos = 0;
+
+        int len;
+        while ((len = is.read(inbound, pos, 2048 - pos)) != -1) {
+            pos += len;
+            // Let the client do the closing.
+            if ((pos == serverMsg.length) && !serverClose) {
+                sslSocket.close();
+                break;
+            }
+        }
+
+        if (pos != serverMsg.length) {
+            throw new Exception("Client:  Data length error");
+        }
+
+        for (int i = 0; i < serverMsg.length; i++) {
+            if (inbound[i] != serverMsg[i]) {
+                throw new Exception("Client:  Data content error");
+            }
+        }
+    }
+
+    /*
      * Using the SSLContext created during object creation,
      * create/configure the SSLEngines we'll use for this test.
      */
--- a/jdk/test/sun/security/tools/keytool/DefaultSignatureAlgorithm.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/tools/keytool/DefaultSignatureAlgorithm.java	Wed Jul 05 22:13:53 2017 +0200
@@ -26,6 +26,7 @@
  * @bug 8138766
  * @summary New default -sigalg for keytool
  * @modules java.base/sun.security.tools.keytool
+ * @modules jdk.crypto.ec
  * @run main/othervm DefaultSignatureAlgorithm RSA 1024 SHA256withRSA
  * @run main/othervm DefaultSignatureAlgorithm RSA 3072 SHA256withRSA
  * @run main/othervm DefaultSignatureAlgorithm RSA 3073 SHA384withRSA
--- a/jdk/test/sun/security/x509/URICertStore/ExtensionsWithLDAP.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/x509/URICertStore/ExtensionsWithLDAP.java	Wed Jul 05 22:13:53 2017 +0200
@@ -23,6 +23,15 @@
  * questions.
  */
 
+/*
+ * @test
+ * @bug 8134708
+ * @summary Check if LDAP resources from CRLDP and AIA extensions can be loaded
+ * @run main/othervm ExtensionsWithLDAP CRLDP ldap.host.for.crldp
+ * @modules jdk.security.auth
+ * @run main/othervm ExtensionsWithLDAP AIA ldap.host.for.aia
+ */
+
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
@@ -45,13 +54,6 @@
 import java.util.Set;
 import java.util.function.Consumer;
 
-/*
- * @test
- * @bug 8134708
- * @summary Check if LDAP resources from CRLDP and AIA extensions can be loaded
- * @run main/othervm ExtensionsWithLDAP CRLDP ldap.host.for.crldp
- * @run main/othervm ExtensionsWithLDAP AIA ldap.host.for.aia
- */
 public class ExtensionsWithLDAP {
 
     /*
--- a/jdk/test/sun/security/x509/X509CertImpl/V3Certificate.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/security/x509/X509CertImpl/V3Certificate.java	Wed Jul 05 22:13:53 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,6 +21,17 @@
  * questions.
  */
 
+/*
+ * @test
+ * @bug 8049237
+ * @modules java.base/sun.security.x509
+ *          java.base/sun.security.util
+ *          jdk.crypto.ec
+ * @summary This test generates V3 certificate with all the supported
+ * extensions. Writes back the generated certificate in to a file and checks for
+ * equality with the original certificate.
+ */
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -28,7 +39,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
-import static java.lang.System.out;
 import java.security.InvalidKeyException;
 import java.security.KeyPair;
 import java.security.KeyPairGenerator;
@@ -50,15 +60,8 @@
 import sun.security.util.ObjectIdentifier;
 import sun.security.x509.*;
 
-/**
- * @test
- * @bug 8049237
- * @modules java.base/sun.security.x509
- *          java.base/sun.security.util
- * @summary This test generates V3 certificate with all the supported
- * extensions. Writes back the generated certificate in to a file and checks for
- * equality with the original certificate.
- */
+import static java.lang.System.out;
+
 public class V3Certificate {
 
     public static final String V3_FILE = "certV3";
--- a/jdk/test/sun/text/resources/LocaleData	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/text/resources/LocaleData	Wed Jul 05 22:13:53 2017 +0200
@@ -6403,8 +6403,8 @@
 CurrencyNames//bif=Burundian Franc
 CurrencyNames//bob=Bolivian Boliviano
 CurrencyNames//btn=Bhutanese Ngultrum
-CurrencyNames//byb=Belarusian New Ruble (1994-1999)
-CurrencyNames//byr=Belarusian Ruble
+CurrencyNames//byb=Belarusian Ruble (1994-1999)
+CurrencyNames//byr=Belarusian Ruble (2000-2016)
 CurrencyNames//cdf=Congolese Franc
 CurrencyNames//clf=Chilean Unit of Account (UF)
 CurrencyNames//cny=Chinese Yuan
@@ -6436,7 +6436,6 @@
 CurrencyNames//mro=Mauritanian Ouguiya
 CurrencyNames//mur=Mauritian Rupee
 CurrencyNames//mvr=Maldivian Rufiyaa
-CurrencyNames//mwk=Malawian Kwacha
 CurrencyNames//mxv=Mexican Investment Unit
 CurrencyNames//mzm=Mozambican Metical (1980-2006)
 CurrencyNames//mzn=Mozambican Metical
@@ -6444,7 +6443,6 @@
 CurrencyNames//nio=Nicaraguan C\u00f3rdoba
 CurrencyNames//nlg=Dutch Guilder
 CurrencyNames//omr=Omani Rial
-CurrencyNames//pen=Peruvian Nuevo Sol
 CurrencyNames//pgk=Papua New Guinean Kina
 CurrencyNames//pkr=Pakistani Rupee
 CurrencyNames//pyg=Paraguayan Guarani
@@ -8287,3 +8285,11 @@
 
 # bug #8129361
 CurrencyNames//hrk=Kuna
+
+# bug #8164784
+CurrencyNames//mwk=Malawian Malawi Kwacha
+CurrencyNames//pen=Peruvian Sol
+
+# bug #8145952
+CurrencyNames//byn=Belarusian Ruble
+CurrencyNames/be_BY/BYN=\u0420\u0443\u0431
--- a/jdk/test/sun/text/resources/LocaleDataTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -37,7 +37,7 @@
  *      7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509
  *      7114053 7074882 7040556 8008577 8013836 8021121 6192407 6931564 8027695
  *      8017142 8037343 8055222 8042126 8074791 8075173 8080774 8129361 8134916
- *      8145136
+ *      8145136 8145952 8164784
  * @summary Verify locale data
  * @modules java.base/sun.util.resources
  * @modules jdk.localedata
--- a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -31,12 +31,10 @@
  * @run main BasicLauncherTest
  */
 
-import static jdk.testlibrary.Asserts.assertTrue;
-
 import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.io.InputStreamReader;
-import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Arrays;
@@ -84,15 +82,56 @@
             ProcessBuilder processBuilder = new ProcessBuilder(launcher.getCommand());
             processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
             Process toolProcess = processBuilder.start();
-            toolProcess.getOutputStream().write("quit\n".getBytes());
-            toolProcess.getOutputStream().close();
+
+            try (OutputStream out = toolProcess.getOutputStream()) {
+                out.write("universe\n".getBytes());
+                out.write("printmdo -a\n".getBytes());
+                out.write("quit\n".getBytes());
+            }
 
             // By default child process output stream redirected to pipe, so we are reading it in foreground.
-            BufferedReader reader = new BufferedReader(new InputStreamReader(toolProcess.getInputStream()));
+            Exception unexpected = null;
+            try (BufferedReader reader =
+                 new BufferedReader(new InputStreamReader(toolProcess.getInputStream()))) {
+                String line;
+                String unexpectedMsg =
+                   "One or more of 'VirtualCallData', 'CounterData', " +
+                   "'ReceiverTypeData', 'bci', 'MethodData' "  +
+                   "or 'java/lang/Object' not found";
+                boolean knownClassFound = false;
+                boolean knownProfileDataTypeFound = false;
+                boolean knownTokensFound = false;
+
+                while ((line = reader.readLine()) != null) {
+                    line = line.trim();
+                    System.out.println(line);
 
-            String line;
-            while ((line = reader.readLine()) != null) {
-                System.out.println(line.trim());
+                    if (line.contains("unknown subtype of CollectedHeap")) {
+                        unexpected = new RuntimeException("CollectedHeap type should be known.");
+                        break;
+                    }
+                    else if (line.contains("missing reason for ")) {
+                        unexpected = new RuntimeException("missing reason for ");
+                        break;
+                    }
+                    if (line.contains("VirtualCallData")  ||
+                        line.contains("CounterData")      ||
+                        line.contains("ReceiverTypeData")) {
+                        knownProfileDataTypeFound = true;
+                    }
+                    if (line.contains("bci") ||
+                        line.contains("MethodData")) {
+                        knownTokensFound = true;
+                    }
+                    if (line.contains("java/lang/Object")) {
+                        knownClassFound = true;
+                    }
+                }
+                if ((knownClassFound           == false)  ||
+                    (knownTokensFound          == false)  ||
+                    (knownProfileDataTypeFound == false)) {
+                    unexpected = new RuntimeException(unexpectedMsg);
+                }
             }
 
             toolProcess.waitFor();
@@ -100,6 +139,14 @@
             if (toolProcess.exitValue() != 0) {
                 throw new RuntimeException("FAILED CLHSDB terminated with non-zero exit code " + toolProcess.exitValue());
             }
+
+            if (unexpected != null) {
+                throw unexpected;
+            }
+
+            if (unexpected != null) {
+                throw unexpected;
+            }
         } catch (Exception ex) {
             throw new RuntimeException("Test ERROR " + ex, ex);
         } finally {
@@ -183,21 +230,6 @@
                                                        Arrays.asList(toolArgs));
     }
 
-    public static void testHeapDump() throws IOException {
-        File dump = new File("jhsdb.jmap.dump." +
-                             System.currentTimeMillis() + ".hprof");
-        if (dump.exists()) {
-            dump.delete();
-        }
-        dump.deleteOnExit();
-
-        launch("heap written to", null, "jmap",
-               "--binaryheap", "--dumpfile=" + dump.getAbsolutePath());
-
-        assertTrue(dump.exists() && dump.isFile(),
-                   "Could not create dump file " + dump.getAbsolutePath());
-    }
-
     public static void main(String[] args)
         throws IOException {
 
@@ -216,8 +248,6 @@
                "System Properties info not available", "jinfo");
         launch("java.threads", null, "jsnap");
 
-        testHeapDump();
-
         // The test throws RuntimeException on error.
         // IOException is thrown if LingeredApp can't start because of some bad
         // environment condition
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/tools/jhsdb/HeapDumpTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8163346
+ * @summary Test hashing of extended characters in Serviceability Agent.
+ * @library /test/lib
+ * @library /lib/testlibrary
+ * @compile -encoding utf8 HeapDumpTest.java
+ * @run main/timeout=240 HeapDumpTest
+ */
+
+import static jdk.testlibrary.Asserts.assertTrue;
+
+import java.io.IOException;
+import java.io.File;
+import java.util.List;
+import java.util.Arrays;
+import jdk.testlibrary.JDKToolLauncher;
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
+import jdk.test.lib.apps.LingeredApp;
+import jdk.testlibrary.Platform;
+
+public class HeapDumpTest {
+
+    private static LingeredAppWithExtendedChars theApp = null;
+
+    /**
+     *
+     * @param vmArgs  - tool arguments to launch jhsdb
+     * @return exit code of tool
+     */
+    public static void launch(String expectedMessage, List<String> toolArgs)
+        throws IOException {
+
+        System.out.println("Starting LingeredApp");
+        try {
+            theApp = new LingeredAppWithExtendedChars();
+            LingeredApp.startApp(Arrays.asList("-Xmx256m"), theApp);
+
+            System.out.println(theApp.\u00CB);
+            System.out.println("Starting " + toolArgs.get(0) + " against " + theApp.getPid());
+            JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
+
+            for (String cmd : toolArgs) {
+                launcher.addToolArg(cmd);
+            }
+
+            launcher.addToolArg("--pid=" + Long.toString(theApp.getPid()));
+
+            ProcessBuilder processBuilder = new ProcessBuilder(launcher.getCommand());
+            processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
+            OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
+            System.out.println("stdout:");
+            System.out.println(output.getStdout());
+            System.out.println("stderr:");
+            System.out.println(output.getStderr());
+            output.shouldContain(expectedMessage);
+            output.shouldHaveExitValue(0);
+
+        } catch (Exception ex) {
+            throw new RuntimeException("Test ERROR " + ex, ex);
+        } finally {
+            LingeredApp.stopApp(theApp);
+        }
+    }
+
+    public static void launch(String expectedMessage, String... toolArgs)
+        throws IOException {
+
+        launch(expectedMessage, Arrays.asList(toolArgs));
+    }
+
+    public static void testHeapDump() throws IOException {
+        File dump = new File("jhsdb.jmap.heap." +
+                             System.currentTimeMillis() + ".hprof");
+        if (dump.exists()) {
+            dump.delete();
+        }
+
+        launch("heap written to", "jmap",
+               "--binaryheap", "--dumpfile=" + dump.getAbsolutePath());
+
+        assertTrue(dump.exists() && dump.isFile(),
+                   "Could not create dump file " + dump.getAbsolutePath());
+
+        dump.delete();
+    }
+
+    public static void main(String[] args)
+        throws IOException {
+
+        if (!Platform.shouldSAAttach()) {
+            // Silently skip the test if we don't have enough permissions to attach
+            System.err.println("Error! Insufficient permissions to attach - test skipped.");
+            return;
+        }
+
+
+        testHeapDump();
+
+        // The test throws RuntimeException on error.
+        // IOException is thrown if LingeredApp can't start because of some bad
+        // environment condition
+        System.out.println("Test PASSED");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/tools/jhsdb/LingeredAppWithExtendedChars.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import jdk.test.lib.apps.LingeredApp;
+
+public class LingeredAppWithExtendedChars extends LingeredApp {
+
+    public static int \u00CB = 1;
+
+    public static void main(String args[]) {
+        LingeredApp.main(args);
+    }
+ }
--- a/jdk/test/sun/tools/jps/TestJpsJar.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/sun/tools/jps/TestJpsJar.java	Wed Jul 05 22:13:53 2017 +0200
@@ -38,7 +38,7 @@
  * @library /lib/testlibrary
  * @modules jdk.jartool/sun.tools.jar
  *          java.management
- * @build jdk.testlibrary.* JpsHelper JpsBase
+ * @build JpsHelper JpsBase
  * @run main/othervm TestJpsJar
  */
 public class TestJpsJar {
--- a/jdk/test/tools/jlink/IntegrationTest.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/jdk/test/tools/jlink/IntegrationTest.java	Wed Jul 05 22:13:53 2017 +0200
@@ -210,25 +210,29 @@
             props.load(reader);
         }
 
-        if (props.getProperty("JAVA_VERSION") == null) {
-            throw new AssertionError("release file does not contain JAVA_VERSION");
-        }
-
-        if (props.getProperty("OS_NAME") == null) {
-            throw new AssertionError("release file does not contain OS_NAME");
-        }
-
-        if (props.getProperty("OS_ARCH") == null) {
-            throw new AssertionError("release file does not contain OS_ARCH");
-        }
-
-        if (props.getProperty("OS_VERSION") == null) {
-            throw new AssertionError("release file does not contain OS_VERSION");
-        }
+        checkReleaseProperty(props, "JAVA_VERSION");
+        checkReleaseProperty(props, "JAVA_FULL_VERSION");
+        checkReleaseProperty(props, "OS_NAME");
+        checkReleaseProperty(props, "OS_ARCH");
+        checkReleaseProperty(props, "OS_VERSION");
 
         if (!Files.exists(output.resolve("toto.txt"))) {
             throw new AssertionError("Post processing not called");
         }
 
     }
+
+    static void checkReleaseProperty(Properties props, String name) {
+        if (! props.containsKey(name)) {
+            throw new AssertionError("release file does not contain property : " + name);
+        }
+
+        // property value is of min. length 3 and double quoted at the ends.
+        String value = props.getProperty(name);
+        if (value.length() < 3 ||
+            value.charAt(0) != '"' ||
+            value.charAt(value.length() - 1) != '"') {
+            throw new AssertionError("release property " + name + " is not quoted property");
+        }
+    }
 }
--- a/make/Images.gmk	Thu Sep 15 17:15:55 2016 +0000
+++ b/make/Images.gmk	Wed Jul 05 22:13:53 2017 +0200
@@ -75,11 +75,6 @@
 
 # Param 1 - The file containing the MODULES list
 define create-info-file
-  $(call info-file-item, "JAVA_VERSION", "$(VERSION_NUMBER)")
-  $(call info-file-item, "JAVA_FULL_VERSION", "$(VERSION_STRING)")
-  $(call info-file-item, "OS_NAME", "$(REQUIRED_OS_NAME)")
-  $(call info-file-item, "OS_VERSION", "$(REQUIRED_OS_VERSION)")
-  $(call info-file-item, "OS_ARCH", "$(OPENJDK_TARGET_CPU_LEGACY)")
   $(if $(JDK_ARCH_ABI_PROP_NAME), \
     $(call info-file-item, "SUN_ARCH_ABI", "$(JDK_ARCH_ABI_PROP_NAME)"))
   $(call info-file-item, "SOURCE", "$(strip $(ALL_SOURCE_TIPS))")
--- a/test/lib/jdk/test/lib/Utils.java	Thu Sep 15 17:15:55 2016 +0000
+++ b/test/lib/jdk/test/lib/Utils.java	Wed Jul 05 22:13:53 2017 +0200
@@ -25,7 +25,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.Field;
 import java.net.InetAddress;
 import java.net.MalformedURLException;
 import java.net.ServerSocket;
@@ -51,7 +50,6 @@
 import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import jdk.internal.misc.Unsafe;
 
 import static jdk.test.lib.Asserts.assertTrue;
 import jdk.test.lib.process.ProcessTools;
@@ -87,9 +85,16 @@
      */
     public static final String TEST_SRC = System.getProperty("test.src", "").trim();
 
-    private static Unsafe unsafe = null;
+    /*
+     * Returns the value of 'test.jdk' system property
+     */
+    public static final String TEST_JDK = System.getProperty("test.jdk");
 
     /**
+     * Returns the value of 'test.classes' system property
+     */
+    public static final String TEST_CLASSES = System.getProperty("test.classes", ".");
+    /**
      * Defines property name for seed value.
      */
     public static final String SEED_PROPERTY_NAME = "jdk.test.lib.random.seed";
@@ -373,21 +378,6 @@
         return new String(Files.readAllBytes(filePath));
     }
 
-    /**
-     * @return Unsafe instance.
-     */
-    public static synchronized Unsafe getUnsafe() {
-        if (unsafe == null) {
-            try {
-                Field f = Unsafe.class.getDeclaredField("theUnsafe");
-                f.setAccessible(true);
-                unsafe = (Unsafe) f.get(null);
-            } catch (NoSuchFieldException | IllegalAccessException e) {
-                throw new RuntimeException("Unable to get Unsafe instance.", e);
-            }
-        }
-        return unsafe;
-    }
     private static final char[] hexArray = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/unsafe/UnsafeHelper.java	Wed Jul 05 22:13:53 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.test.lib.unsafe;
+
+import jdk.internal.misc.Unsafe;
+import java.lang.reflect.Field;
+
+
+/**
+ * Helper class for accessing the jdk.internal.misc.Unsafe functionality
+ */
+public final class UnsafeHelper {
+    private static Unsafe unsafe = null;
+
+    /**
+     * @return Unsafe instance.
+     */
+    public static synchronized Unsafe getUnsafe() {
+        if (unsafe == null) {
+            try {
+                Field f = Unsafe.class.getDeclaredField("theUnsafe");
+                f.setAccessible(true);
+                unsafe = (Unsafe) f.get(null);
+            } catch (NoSuchFieldException | IllegalAccessException e) {
+                throw new RuntimeException("Unable to get Unsafe instance.", e);
+            }
+        }
+        return unsafe;
+    }
+}
+