Merge
authorduke
Wed, 05 Jul 2017 21:52:51 +0200
changeset 39169 47e128f3d106
parent 39168 e02c166da4dd (current diff)
parent 39162 c8c444d87185 (diff)
child 39171 3078895132e7
Merge
jdk/src/java.base/share/classes/sun/net/www/protocol/netdoc/Handler.java
jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryImpl.java
--- a/.hgtags-top-repo	Fri Jun 24 14:46:45 2016 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 21:52:51 2017 +0200
@@ -366,3 +366,4 @@
 cae471d3b87783e0a3deea658e1e1c84b2485b6c jdk-9+121
 346be2df0f5b31d423807f53a719d1b9a67f3354 jdk-9+122
 405d811c0d7b9b48ff718ae6c240b732f098c028 jdk-9+123
+f80c841ae2545eaf9acd2724bccc305d98cefbe2 jdk-9+124
--- a/common/autoconf/generated-configure.sh	Fri Jun 24 14:46:45 2016 +0200
+++ b/common/autoconf/generated-configure.sh	Wed Jul 05 21:52:51 2017 +0200
@@ -5094,7 +5094,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1466007828
+DATE_WHEN_GENERATED=1467039751
 
 ###############################################################################
 #
@@ -36621,7 +36621,6 @@
   # Setup the assembler (AS)
   #
   if test "x$OPENJDK_TARGET_OS" = xsolaris; then
-    # FIXME: should this really be solaris, or solstudio?
 
 
   # Publish this variable in the help.
@@ -37105,6 +37104,9 @@
     fi
   fi
 
+    if test "x$AS" = x; then
+      as_fn_error $? "Solaris assembler (as) is required. Please install via \"pkg install pkg:/developer/assembler\"." "$LINENO" 5
+    fi
   else
     # FIXME: is this correct for microsoft?
     AS="$CC -c"
--- a/common/autoconf/toolchain.m4	Fri Jun 24 14:46:45 2016 +0200
+++ b/common/autoconf/toolchain.m4	Wed Jul 05 21:52:51 2017 +0200
@@ -597,9 +597,11 @@
   # Setup the assembler (AS)
   #
   if test "x$OPENJDK_TARGET_OS" = xsolaris; then
-    # FIXME: should this really be solaris, or solstudio?
     BASIC_PATH_PROGS(AS, as)
     BASIC_FIXUP_EXECUTABLE(AS)
+    if test "x$AS" = x; then
+      AC_MSG_ERROR([Solaris assembler (as) is required. Please install via "pkg install pkg:/developer/assembler".])
+    fi
   else
     # FIXME: is this correct for microsoft?
     AS="$CC -c"
--- a/common/bin/compare.sh	Fri Jun 24 14:46:45 2016 +0200
+++ b/common/bin/compare.sh	Wed Jul 05 21:52:51 2017 +0200
@@ -360,9 +360,11 @@
                 $RM $OTHER_FILE $THIS_FILE
                 #Note that | doesn't work on mac sed.
                 HTML_FILTER="$SED \
-                    -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
+                    -e 's/20[0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
+                    -e 's/20[0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}/<DATE>/g' \
                     -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
-                    -e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [0-9]\{4\} [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/<DATE>/'
+                    -e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [0-9]\{4\} [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/<DATE>/' \
+                    -e 's/from .*\.idl/\.idl/' \
                     "
                 $CAT $OTHER_DIR/$f | eval "$HTML_FILTER" > $OTHER_FILE &
                 $CAT $THIS_DIR/$f  | eval "$HTML_FILTER" > $THIS_FILE &
--- a/corba/.hgtags	Fri Jun 24 14:46:45 2016 +0200
+++ b/corba/.hgtags	Wed Jul 05 21:52:51 2017 +0200
@@ -366,3 +366,4 @@
 9a5fc5a27560ac272c1341f8f3838338fba49059 jdk-9+121
 a39131aafc51a6fd8836e6ebe1b04458702ce7d6 jdk-9+122
 e33a34cc551907617d8129c4faaf1a5a7e61d21c jdk-9+123
+45121d5afb9d5bfadab75378572ad96832e0809e jdk-9+124
--- a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java	Wed Jul 05 21:52:51 2017 +0200
@@ -2230,7 +2230,7 @@
      * REVISIT -- This code doesn't do what the comment says to when
      * getField() is null!
      */
-    private void inputClassFields(Object o, Class cl,
+    private void inputClassFields(Object o, Class<?> cl,
                                   ObjectStreamField[] fields,
                                   com.sun.org.omg.SendingContext.CodeBase sender)
         throws InvalidClassException, StreamCorruptedException,
@@ -2239,6 +2239,8 @@
 
         int primFields = fields.length - currentClassDesc.objFields;
 
+        // this will leave primitives in the inputstream
+        // should really consume and discard where necessary
         if (o != null) {
             for (int i = 0; i < primFields; ++i) {
                 inputPrimitiveField(o, cl, fields[i]);
@@ -2264,21 +2266,32 @@
                 }
 
                 try {
-                    Class fieldCl = fields[i].getClazz();
+                    Class<?> fieldCl = fields[i].getClazz();
                     if ((objectValue != null)
                             && (!fieldCl.isAssignableFrom(
                                     objectValue.getClass()))) {
                         throw new IllegalArgumentException("Field mismatch");
                     }
-                   Field classField = null;
+                    Field declaredClassField = null;
+                    final String inputStreamFieldName = fields[i].getName();
                     try {
-                        classField = cl.getDeclaredField(fields[i].getName());
-                    } catch (NoSuchFieldException nsfEx) {
-                        throw new IllegalArgumentException(nsfEx);
+                        declaredClassField = getDeclaredField( cl, inputStreamFieldName);
+                    } catch (PrivilegedActionException paEx) {
+                        throw new IllegalArgumentException(
+                            (NoSuchFieldException) paEx.getException());
                     } catch (SecurityException secEx) {
-                        throw new IllegalArgumentException(secEx.getCause());
+                        throw new IllegalArgumentException(secEx);
+                    } catch (NullPointerException npEx) {
+                        continue;
+                    } catch (NoSuchFieldException e) {
+                        continue;
                     }
-                    Class<?> declaredFieldClass = classField.getType();
+
+                    if (declaredClassField == null) {
+                        continue;
+                    }
+
+                    Class<?> declaredFieldClass = declaredClassField.getType();
 
                     // check input field type is a declared field type
                     // input field is a subclass of the declared field
@@ -2291,15 +2304,24 @@
                     }
                     bridge.putObject( o, fields[i].getFieldID(), objectValue ) ;
                     // reflective code: fields[i].getField().set( o, objectValue ) ;
-                } catch (IllegalArgumentException e) {
-                    ClassCastException exc = new ClassCastException("Assigning instance of class " +
-                                                 objectValue.getClass().getName() +
-                                                 " to field " +
-                                                 currentClassDesc.getName() +
-                                                 '#' +
-                                                 fields[i].getField().getName());
-                    exc.initCause( e ) ;
-                    throw exc ;
+                } catch (IllegalArgumentException iaEx) {
+                    String objectValueClassName = "null";
+                    String currentClassDescClassName = "null";
+                    String fieldName = "null";
+                    if (objectValue != null) {
+                        objectValueClassName = objectValue.getClass().getName();
+                    }
+                    if (currentClassDesc != null) {
+                        currentClassDescClassName = currentClassDesc.getName();
+                    }
+                    if (fields[i] != null && fields[i].getField() != null) {
+                        fieldName = fields[i].getField().getName();
+                    }
+                    ClassCastException ccEx = new ClassCastException(
+                            "Assigning instance of class " + objectValueClassName
+                                    + " to field " + currentClassDescClassName + '#' + fieldName);
+                    ccEx.initCause( iaEx ) ;
+                    throw ccEx ;
                 }
             } // end : for loop
             }
@@ -2592,12 +2614,11 @@
                 throw cce ;
             }
         }
-
     }
 
-    private static void setObjectField(Object o, Class c, String fieldName, Object v) {
+    private static void setObjectField(Object o, Class<?> c, String fieldName, Object v) {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             Class fieldCl = fld.getType();
             if(v != null && !fieldCl.isInstance(v)) {
                 throw new Exception();
@@ -2617,10 +2638,10 @@
         }
     }
 
-    private static void setBooleanField(Object o, Class c, String fieldName, boolean v)
+    private static void setBooleanField(Object o, Class<?> c, String fieldName, boolean v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Boolean.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putBoolean( o, key, v ) ;
@@ -2640,10 +2661,10 @@
         }
     }
 
-    private static void setByteField(Object o, Class c, String fieldName, byte v)
+    private static void setByteField(Object o, Class<?> c, String fieldName, byte v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Byte.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putByte( o, key, v ) ;
@@ -2663,10 +2684,10 @@
         }
     }
 
-    private static void setCharField(Object o, Class c, String fieldName, char v)
+    private static void setCharField(Object o, Class<?> c, String fieldName, char v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Character.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putChar( o, key, v ) ;
@@ -2686,10 +2707,10 @@
         }
     }
 
-    private static void setShortField(Object o, Class c, String fieldName, short v)
+    private static void setShortField(Object o, Class<?> c, String fieldName, short v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Short.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putShort( o, key, v ) ;
@@ -2709,10 +2730,10 @@
         }
     }
 
-    private static void setIntField(Object o, Class c, String fieldName, int v)
+    private static void setIntField(Object o, Class<?> c, String fieldName, int v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Integer.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putInt( o, key, v ) ;
@@ -2732,10 +2753,10 @@
         }
     }
 
-    private static void setLongField(Object o, Class c, String fieldName, long v)
+    private static void setLongField(Object o, Class<?> c, String fieldName, long v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Long.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putLong( o, key, v ) ;
@@ -2755,10 +2776,10 @@
         }
     }
 
-    private static void setFloatField(Object o, Class c, String fieldName, float v)
+    private static void setFloatField(Object o, Class<?> c, String fieldName, float v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Float.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putFloat( o, key, v ) ;
@@ -2778,10 +2799,10 @@
         }
     }
 
-    private static void setDoubleField(Object o, Class c, String fieldName, double v)
+    private static void setDoubleField(Object o, Class<?> c, String fieldName, double v)
     {
         try {
-            Field fld = c.getDeclaredField( fieldName ) ;
+            Field fld = getDeclaredField( c, fieldName ) ;
             if ((fld != null) && (fld.getType() == Double.TYPE)) {
                 long key = bridge.objectFieldOffset( fld ) ;
                 bridge.putDouble( o, key, v ) ;
@@ -2801,6 +2822,22 @@
         }
     }
 
+
+    private static Field getDeclaredField(final Class<?> c,
+                                            final String fieldName)
+        throws PrivilegedActionException, NoSuchFieldException, SecurityException {
+        if (System.getSecurityManager() == null) {
+            return c.getDeclaredField(fieldName);
+        } else {
+            return AccessController
+                    .doPrivileged(new PrivilegedExceptionAction<Field>() {
+                        public Field run() throws NoSuchFieldException {
+                            return c.getDeclaredField(fieldName);
+                        }
+                    });
+        }
+    }
+
     /**
      * This class maintains a map of stream position to
      * an Object currently being deserialized.  It is used
@@ -2811,12 +2848,12 @@
      */
     static class ActiveRecursionManager
     {
-        private Map offsetToObjectMap;
+        private Map<Integer, Object> offsetToObjectMap;
 
         public ActiveRecursionManager() {
             // A hash map is unsynchronized and allows
             // null values
-            offsetToObjectMap = new HashMap();
+            offsetToObjectMap = new HashMap<>();
         }
 
         // Called right after allocating a new object.
--- a/hotspot/.hgtags	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/.hgtags	Wed Jul 05 21:52:51 2017 +0200
@@ -526,3 +526,4 @@
 7e293105dbb0789a468655f81320c891f491f371 jdk-9+121
 af6b4ad908e732d23021f12e8322b204433d5cf6 jdk-9+122
 75f81e1fecfb444f34f357295fe06af60e2762d9 jdk-9+123
+479631362b4930be985245ea063d87d821a472eb jdk-9+124
--- a/hotspot/src/os/aix/vm/globals_aix.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/os/aix/vm/globals_aix.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -35,6 +35,7 @@
                          product, \
                          product_pd, \
                          diagnostic, \
+                         diagnostic_pd, \
                          notproduct, \
                          range, \
                          constraint, \
--- a/hotspot/src/os/bsd/vm/globals_bsd.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/os/bsd/vm/globals_bsd.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -33,6 +33,7 @@
                          product, \
                          product_pd, \
                          diagnostic, \
+                         diagnostic_pd, \
                          notproduct, \
                          range, \
                          constraint, \
--- a/hotspot/src/os/linux/vm/globals_linux.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/os/linux/vm/globals_linux.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -33,6 +33,7 @@
                          product, \
                          product_pd, \
                          diagnostic, \
+                         diagnostic_pd, \
                          notproduct, \
                          range, \
                          constraint, \
--- a/hotspot/src/os/solaris/vm/globals_solaris.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/os/solaris/vm/globals_solaris.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -33,6 +33,7 @@
                          product, \
                          product_pd, \
                          diagnostic, \
+                         diagnostic_pd, \
                          notproduct, \
                          range, \
                          constraint, \
--- a/hotspot/src/os/windows/vm/globals_windows.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/os/windows/vm/globals_windows.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -33,6 +33,7 @@
                          product, \
                          product_pd, \
                          diagnostic, \
+                         diagnostic_pd, \
                          notproduct, \
                          range, \
                          constraint, \
--- a/hotspot/src/share/vm/c1/c1_globals.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/c1/c1_globals.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -30,6 +30,7 @@
          MATERIALIZE_PRODUCT_FLAG, \
          MATERIALIZE_PD_PRODUCT_FLAG, \
          MATERIALIZE_DIAGNOSTIC_FLAG, \
+         MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
          MATERIALIZE_NOTPRODUCT_FLAG, \
          IGNORE_RANGE, \
          IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/c1/c1_globals.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/c1/c1_globals.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -65,6 +65,7 @@
                  product, \
                  product_pd, \
                  diagnostic, \
+                 diagnostic_pd, \
                  notproduct, \
                  range, \
                  constraint, \
@@ -356,6 +357,7 @@
          DECLARE_PRODUCT_FLAG, \
          DECLARE_PD_PRODUCT_FLAG, \
          DECLARE_DIAGNOSTIC_FLAG, \
+         DECLARE_PD_DIAGNOSTIC_FLAG, \
          DECLARE_NOTPRODUCT_FLAG, \
          IGNORE_RANGE, \
          IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/gc/g1/g1_globals.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1_globals.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -30,6 +30,7 @@
          MATERIALIZE_PRODUCT_FLAG, \
          MATERIALIZE_PD_PRODUCT_FLAG,     \
          MATERIALIZE_DIAGNOSTIC_FLAG, \
+         MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
          MATERIALIZE_EXPERIMENTAL_FLAG, \
          MATERIALIZE_NOTPRODUCT_FLAG,  \
          MATERIALIZE_MANAGEABLE_FLAG, \
--- a/hotspot/src/share/vm/gc/g1/g1_globals.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1_globals.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -36,6 +36,7 @@
                  product, \
                  product_pd, \
                  diagnostic, \
+                 diagnostic_pd, \
                  experimental, \
                  notproduct, \
                  manageable, \
@@ -323,6 +324,7 @@
          DECLARE_PRODUCT_FLAG, \
          DECLARE_PD_PRODUCT_FLAG, \
          DECLARE_DIAGNOSTIC_FLAG, \
+         DECLARE_PD_DIAGNOSTIC_FLAG, \
          DECLARE_EXPERIMENTAL_FLAG, \
          DECLARE_NOTPRODUCT_FLAG, \
          DECLARE_MANAGEABLE_FLAG, \
--- a/hotspot/src/share/vm/jvmci/jvmci_globals.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/jvmci/jvmci_globals.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -32,6 +32,7 @@
             MATERIALIZE_PRODUCT_FLAG, \
             MATERIALIZE_PD_PRODUCT_FLAG, \
             MATERIALIZE_DIAGNOSTIC_FLAG, \
+            MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
             MATERIALIZE_EXPERIMENTAL_FLAG, \
             MATERIALIZE_NOTPRODUCT_FLAG,
             IGNORE_RANGE, \
@@ -89,6 +90,7 @@
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_DIAGNOSTIC_FLAG_VALUE_CHANGED_CHECK_CODE, \
+                JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 IGNORE_RANGE, \
@@ -104,6 +106,7 @@
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+                JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_EXPERIMENTAL_FLAG_VALUE_CHANGED_CHECK_CODE, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 IGNORE_RANGE, \
@@ -129,6 +132,7 @@
               JVMCI_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
               JVMCI_PD_PRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+              JVMCI_IGNORE_FLAG_THREE_PARAM, \
               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
               JVMCI_NOTPRODUCT_FLAG_VALUE_CHANGED_CHECK_CODE, \
               IGNORE_RANGE, \
@@ -168,6 +172,7 @@
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_DIAGNOSTIC_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
+                JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 IGNORE_RANGE, \
@@ -181,6 +186,7 @@
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+                JVMCI_IGNORE_FLAG_THREE_PARAM, \
                 JVMCI_EXPERIMENTAL_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
                 JVMCI_IGNORE_FLAG_FOUR_PARAM, \
                 IGNORE_RANGE, \
@@ -206,6 +212,7 @@
               JVMCI_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
               JVMCI_PD_PRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
+              JVMCI_IGNORE_FLAG_THREE_PARAM, \
               JVMCI_IGNORE_FLAG_FOUR_PARAM, \
               JVMCI_NOTPRODUCT_FLAG_CHECK_PRINT_ERR_MSG_CODE, \
               IGNORE_RANGE, \
--- a/hotspot/src/share/vm/jvmci/jvmci_globals.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/jvmci/jvmci_globals.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -37,6 +37,7 @@
                     product, \
                     product_pd, \
                     diagnostic, \
+                    diagnostic_pd, \
                     experimental, \
                     notproduct, \
                     range, \
@@ -102,6 +103,7 @@
             DECLARE_PRODUCT_FLAG, \
             DECLARE_PD_PRODUCT_FLAG, \
             DECLARE_DIAGNOSTIC_FLAG, \
+            DECLARE_PD_DIAGNOSTIC_FLAG, \
             DECLARE_EXPERIMENTAL_FLAG, \
             DECLARE_NOTPRODUCT_FLAG, \
             IGNORE_RANGE, \
--- a/hotspot/src/share/vm/opto/c2_globals.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/opto/c2_globals.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -30,6 +30,7 @@
          MATERIALIZE_PRODUCT_FLAG, \
          MATERIALIZE_PD_PRODUCT_FLAG, \
          MATERIALIZE_DIAGNOSTIC_FLAG, \
+         MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
          MATERIALIZE_EXPERIMENTAL_FLAG, \
          MATERIALIZE_NOTPRODUCT_FLAG, \
          IGNORE_RANGE, \
--- a/hotspot/src/share/vm/opto/c2_globals.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -66,6 +66,7 @@
                  product, \
                  product_pd, \
                  diagnostic, \
+                 diagnostic_pd, \
                  experimental, \
                  notproduct, \
                  range, \
@@ -203,7 +204,7 @@
            "Map number of unrolls for main loop via "                       \
            "Superword Level Parallelism analysis")                          \
                                                                             \
-  product_pd(bool, PostLoopMultiversioning,                                 \
+  diagnostic_pd(bool, PostLoopMultiversioning,                              \
            "Multi versioned post loops to eliminate range checks")          \
                                                                             \
   notproduct(bool, TraceSuperWordLoopUnrollAnalysis, false,                 \
@@ -764,6 +765,7 @@
          DECLARE_PRODUCT_FLAG, \
          DECLARE_PD_PRODUCT_FLAG, \
          DECLARE_DIAGNOSTIC_FLAG, \
+         DECLARE_PD_DIAGNOSTIC_FLAG, \
          DECLARE_EXPERIMENTAL_FLAG, \
          DECLARE_NOTPRODUCT_FLAG, \
          IGNORE_RANGE, \
--- a/hotspot/src/share/vm/runtime/commandLineFlagConstraintList.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/runtime/commandLineFlagConstraintList.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -211,6 +211,7 @@
 #define EMIT_CONSTRAINT_MANAGEABLE_FLAG(type, name, value, doc)   ); emit_constraint_##type(#name
 #define EMIT_CONSTRAINT_PRODUCT_RW_FLAG(type, name, value, doc)   ); emit_constraint_##type(#name
 #define EMIT_CONSTRAINT_PD_PRODUCT_FLAG(type, name, doc)          ); emit_constraint_##type(#name
+#define EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG(type, name, doc)       ); emit_constraint_##type(#name
 #define EMIT_CONSTRAINT_DEVELOPER_FLAG(type, name, value, doc)    ); emit_constraint_##type(#name
 #define EMIT_CONSTRAINT_PD_DEVELOPER_FLAG(type, name, doc)        ); emit_constraint_##type(#name
 #define EMIT_CONSTRAINT_NOTPRODUCT_FLAG(type, name, value, doc)   ); emit_constraint_##type(#name
@@ -233,6 +234,7 @@
                                         EMIT_CONSTRAINT_PRODUCT_FLAG,
                                         EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
                                         EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+                                        EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
                                         EMIT_CONSTRAINT_EXPERIMENTAL_FLAG,
                                         EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
                                         EMIT_CONSTRAINT_MANAGEABLE_FLAG,
@@ -260,6 +262,7 @@
                                    EMIT_CONSTRAINT_PRODUCT_FLAG,
                                    EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
                                    EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+                                   EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
                                    EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
                                    IGNORE_RANGE,
                                    EMIT_CONSTRAINT_CHECK,
@@ -272,6 +275,7 @@
                                    EMIT_CONSTRAINT_PRODUCT_FLAG,
                                    EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
                                    EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+                                   EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
                                    EMIT_CONSTRAINT_EXPERIMENTAL_FLAG,
                                    EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
                                    IGNORE_RANGE,
@@ -285,6 +289,7 @@
                                    EMIT_CONSTRAINT_PRODUCT_FLAG,
                                    EMIT_CONSTRAINT_PD_PRODUCT_FLAG,
                                    EMIT_CONSTRAINT_DIAGNOSTIC_FLAG,
+                                   EMIT_CONSTRAINT_PD_DIAGNOSTIC_FLAG,
                                    EMIT_CONSTRAINT_EXPERIMENTAL_FLAG,
                                    EMIT_CONSTRAINT_NOTPRODUCT_FLAG,
                                    EMIT_CONSTRAINT_MANAGEABLE_FLAG,
--- a/hotspot/src/share/vm/runtime/commandLineFlagRangeList.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/runtime/commandLineFlagRangeList.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -278,6 +278,7 @@
 #define EMIT_RANGE_MANAGEABLE_FLAG(type, name, value, doc)   ); emit_range_##type(#name
 #define EMIT_RANGE_PRODUCT_RW_FLAG(type, name, value, doc)   ); emit_range_##type(#name
 #define EMIT_RANGE_PD_PRODUCT_FLAG(type, name, doc)          ); emit_range_##type(#name
+#define EMIT_RANGE_PD_DIAGNOSTIC_FLAG(type, name, doc)       ); emit_range_##type(#name
 #define EMIT_RANGE_DEVELOPER_FLAG(type, name, value, doc)    ); emit_range_##type(#name
 #define EMIT_RANGE_PD_DEVELOPER_FLAG(type, name, doc)        ); emit_range_##type(#name
 #define EMIT_RANGE_NOTPRODUCT_FLAG(type, name, value, doc)   ); emit_range_##type(#name
@@ -299,6 +300,7 @@
                                    EMIT_RANGE_PRODUCT_FLAG,
                                    EMIT_RANGE_PD_PRODUCT_FLAG,
                                    EMIT_RANGE_DIAGNOSTIC_FLAG,
+                                   EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
                                    EMIT_RANGE_EXPERIMENTAL_FLAG,
                                    EMIT_RANGE_NOTPRODUCT_FLAG,
                                    EMIT_RANGE_MANAGEABLE_FLAG,
@@ -325,6 +327,7 @@
                                  EMIT_RANGE_PRODUCT_FLAG,
                                  EMIT_RANGE_PD_PRODUCT_FLAG,
                                  EMIT_RANGE_DIAGNOSTIC_FLAG,
+                                 EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
                                  EMIT_RANGE_EXPERIMENTAL_FLAG,
                                  EMIT_RANGE_NOTPRODUCT_FLAG,
                                  EMIT_RANGE_CHECK,
@@ -338,6 +341,7 @@
                               EMIT_RANGE_PRODUCT_FLAG,
                               EMIT_RANGE_PD_PRODUCT_FLAG,
                               EMIT_RANGE_DIAGNOSTIC_FLAG,
+                              EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
                               EMIT_RANGE_NOTPRODUCT_FLAG,
                               EMIT_RANGE_CHECK,
                               IGNORE_CONSTRAINT,
@@ -350,6 +354,7 @@
                               EMIT_RANGE_PRODUCT_FLAG,
                               EMIT_RANGE_PD_PRODUCT_FLAG,
                               EMIT_RANGE_DIAGNOSTIC_FLAG,
+                              EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
                               EMIT_RANGE_EXPERIMENTAL_FLAG,
                               EMIT_RANGE_NOTPRODUCT_FLAG,
                               EMIT_RANGE_CHECK,
@@ -363,6 +368,7 @@
                               EMIT_RANGE_PRODUCT_FLAG,
                               EMIT_RANGE_PD_PRODUCT_FLAG,
                               EMIT_RANGE_DIAGNOSTIC_FLAG,
+                              EMIT_RANGE_PD_DIAGNOSTIC_FLAG,
                               EMIT_RANGE_EXPERIMENTAL_FLAG,
                               EMIT_RANGE_NOTPRODUCT_FLAG,
                               EMIT_RANGE_MANAGEABLE_FLAG,
--- a/hotspot/src/share/vm/runtime/commandLineFlagWriteableList.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/runtime/commandLineFlagWriteableList.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -108,6 +108,7 @@
 #define EMIT_WRITEABLE_PD_PRODUCT_FLAG(type, name, doc)          ); emit_writeable_##type(#name
 #define EMIT_WRITEABLE_DEVELOPER_FLAG(type, name, value, doc)    ); emit_writeable_##type(#name
 #define EMIT_WRITEABLE_PD_DEVELOPER_FLAG(type, name, doc)        ); emit_writeable_##type(#name
+#define EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG(type, name, doc)       ); emit_writeable_##type(#name
 #define EMIT_WRITEABLE_NOTPRODUCT_FLAG(type, name, value, doc)   ); emit_writeable_##type(#name
 #define EMIT_WRITEABLE_LP64_PRODUCT_FLAG(type, name, value, doc) ); emit_writeable_##type(#name
 
@@ -126,6 +127,7 @@
                                    EMIT_WRITEABLE_PRODUCT_FLAG,
                                    EMIT_WRITEABLE_PD_PRODUCT_FLAG,
                                    EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+                                   EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
                                    EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
                                    EMIT_WRITEABLE_NOTPRODUCT_FLAG,
                                    EMIT_WRITEABLE_MANAGEABLE_FLAG,
@@ -152,6 +154,7 @@
                                  EMIT_WRITEABLE_PRODUCT_FLAG,
                                  EMIT_WRITEABLE_PD_PRODUCT_FLAG,
                                  EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+                                 EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
                                  EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
                                  EMIT_WRITEABLE_NOTPRODUCT_FLAG,
                                  IGNORE_RANGE,
@@ -165,6 +168,7 @@
                               EMIT_WRITEABLE_PRODUCT_FLAG,
                               EMIT_WRITEABLE_PD_PRODUCT_FLAG,
                               EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+                              EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
                               EMIT_WRITEABLE_NOTPRODUCT_FLAG,
                               IGNORE_RANGE,
                               IGNORE_CONSTRAINT,
@@ -177,6 +181,7 @@
                               EMIT_WRITEABLE_PRODUCT_FLAG,
                               EMIT_WRITEABLE_PD_PRODUCT_FLAG,
                               EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+                              EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
                               EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
                               EMIT_WRITEABLE_NOTPRODUCT_FLAG,
                               IGNORE_RANGE,
@@ -190,6 +195,7 @@
                               EMIT_WRITEABLE_PRODUCT_FLAG,
                               EMIT_WRITEABLE_PD_PRODUCT_FLAG,
                               EMIT_WRITEABLE_DIAGNOSTIC_FLAG,
+                              EMIT_WRITEABLE_PD_DIAGNOSTIC_FLAG,
                               EMIT_WRITEABLE_EXPERIMENTAL_FLAG,
                               EMIT_WRITEABLE_NOTPRODUCT_FLAG,
                               EMIT_WRITEABLE_MANAGEABLE_FLAG,
--- a/hotspot/src/share/vm/runtime/globals.cpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/runtime/globals.cpp	Wed Jul 05 21:52:51 2017 +0200
@@ -58,6 +58,7 @@
               MATERIALIZE_PRODUCT_FLAG, \
               MATERIALIZE_PD_PRODUCT_FLAG, \
               MATERIALIZE_DIAGNOSTIC_FLAG, \
+              MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
               MATERIALIZE_EXPERIMENTAL_FLAG, \
               MATERIALIZE_NOTPRODUCT_FLAG, \
               MATERIALIZE_MANAGEABLE_FLAG, \
@@ -72,6 +73,7 @@
                  MATERIALIZE_PRODUCT_FLAG, \
                  MATERIALIZE_PD_PRODUCT_FLAG, \
                  MATERIALIZE_DIAGNOSTIC_FLAG, \
+                 MATERIALIZE_PD_DIAGNOSTIC_FLAG, \
                  MATERIALIZE_NOTPRODUCT_FLAG, \
                  IGNORE_RANGE, \
                  IGNORE_CONSTRAINT, \
@@ -650,6 +652,7 @@
 #define RUNTIME_PRODUCT_FLAG_STRUCT(     type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT) },
 #define RUNTIME_PD_PRODUCT_FLAG_STRUCT(  type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
 #define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(  type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DIAGNOSTIC) },
+#define RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT(type, name,       doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
 #define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_EXPERIMENTAL) },
 #define RUNTIME_MANAGEABLE_FLAG_STRUCT(  type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_MANAGEABLE) },
 #define RUNTIME_PRODUCT_RW_FLAG_STRUCT(  type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_READ_WRITE) },
@@ -660,6 +663,7 @@
 #define JVMCI_PRODUCT_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_PRODUCT) },
 #define JVMCI_PD_PRODUCT_FLAG_STRUCT(    type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
 #define JVMCI_DIAGNOSTIC_FLAG_STRUCT(    type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DIAGNOSTIC) },
+#define JVMCI_PD_DIAGNOSTIC_FLAG_STRUCT( type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
 #define JVMCI_EXPERIMENTAL_FLAG_STRUCT(  type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_EXPERIMENTAL) },
 #define JVMCI_DEVELOP_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DEVELOP) },
 #define JVMCI_PD_DEVELOP_FLAG_STRUCT(    type, name,        doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_JVMCI | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
@@ -674,6 +678,7 @@
 #define C1_PRODUCT_FLAG_STRUCT(          type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT) },
 #define C1_PD_PRODUCT_FLAG_STRUCT(       type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
 #define C1_DIAGNOSTIC_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DIAGNOSTIC) },
+#define C1_PD_DIAGNOSTIC_FLAG_STRUCT(    type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
 #define C1_DEVELOP_FLAG_STRUCT(          type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP) },
 #define C1_PD_DEVELOP_FLAG_STRUCT(       type, name,        doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
 #define C1_NOTPRODUCT_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_NOT_PRODUCT) },
@@ -681,6 +686,7 @@
 #define C2_PRODUCT_FLAG_STRUCT(          type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT) },
 #define C2_PD_PRODUCT_FLAG_STRUCT(       type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
 #define C2_DIAGNOSTIC_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DIAGNOSTIC) },
+#define C2_PD_DIAGNOSTIC_FLAG_STRUCT(    type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
 #define C2_EXPERIMENTAL_FLAG_STRUCT(     type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_EXPERIMENTAL) },
 #define C2_DEVELOP_FLAG_STRUCT(          type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP) },
 #define C2_PD_DEVELOP_FLAG_STRUCT(       type, name,        doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
@@ -695,6 +701,7 @@
 #define SHARK_PRODUCT_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT) },
 #define SHARK_PD_PRODUCT_FLAG_STRUCT(    type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
 #define SHARK_DIAGNOSTIC_FLAG_STRUCT(    type, name, value, doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DIAGNOSTIC) },
+#define SHARK_PD_DIAGNOSTIC_FLAG_STRUCT( type, name,        doc) { #type, XSTR(name), &name,         NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DIAGNOSTIC | Flag::KIND_PLATFORM_DEPENDENT) },
 #define SHARK_DEVELOP_FLAG_STRUCT(       type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP) },
 #define SHARK_PD_DEVELOP_FLAG_STRUCT(    type, name,        doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
 #define SHARK_NOTPRODUCT_FLAG_STRUCT(    type, name, value, doc) { #type, XSTR(name), (void*) &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_NOT_PRODUCT) },
@@ -705,6 +712,7 @@
                RUNTIME_PRODUCT_FLAG_STRUCT, \
                RUNTIME_PD_PRODUCT_FLAG_STRUCT, \
                RUNTIME_DIAGNOSTIC_FLAG_STRUCT, \
+               RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT, \
                RUNTIME_EXPERIMENTAL_FLAG_STRUCT, \
                RUNTIME_NOTPRODUCT_FLAG_STRUCT, \
                RUNTIME_MANAGEABLE_FLAG_STRUCT, \
@@ -718,6 +726,7 @@
                   RUNTIME_PRODUCT_FLAG_STRUCT, \
                   RUNTIME_PD_PRODUCT_FLAG_STRUCT, \
                   RUNTIME_DIAGNOSTIC_FLAG_STRUCT, \
+                  RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT, \
                   RUNTIME_NOTPRODUCT_FLAG_STRUCT, \
                   IGNORE_RANGE, \
                   IGNORE_CONSTRAINT, \
@@ -728,6 +737,7 @@
           RUNTIME_PRODUCT_FLAG_STRUCT, \
           RUNTIME_PD_PRODUCT_FLAG_STRUCT, \
           RUNTIME_DIAGNOSTIC_FLAG_STRUCT, \
+          RUNTIME_PD_DIAGNOSTIC_FLAG_STRUCT, \
           RUNTIME_EXPERIMENTAL_FLAG_STRUCT, \
           RUNTIME_NOTPRODUCT_FLAG_STRUCT, \
           RUNTIME_MANAGEABLE_FLAG_STRUCT, \
@@ -742,6 +752,7 @@
              JVMCI_PRODUCT_FLAG_STRUCT, \
              JVMCI_PD_PRODUCT_FLAG_STRUCT, \
              JVMCI_DIAGNOSTIC_FLAG_STRUCT, \
+             JVMCI_PD_DIAGNOSTIC_FLAG_STRUCT, \
              JVMCI_EXPERIMENTAL_FLAG_STRUCT, \
              JVMCI_NOTPRODUCT_FLAG_STRUCT, \
              IGNORE_RANGE, \
@@ -754,6 +765,7 @@
           C1_PRODUCT_FLAG_STRUCT, \
           C1_PD_PRODUCT_FLAG_STRUCT, \
           C1_DIAGNOSTIC_FLAG_STRUCT, \
+          C1_PD_DIAGNOSTIC_FLAG_STRUCT, \
           C1_NOTPRODUCT_FLAG_STRUCT, \
           IGNORE_RANGE, \
           IGNORE_CONSTRAINT, \
@@ -765,6 +777,7 @@
           C2_PRODUCT_FLAG_STRUCT, \
           C2_PD_PRODUCT_FLAG_STRUCT, \
           C2_DIAGNOSTIC_FLAG_STRUCT, \
+          C2_PD_DIAGNOSTIC_FLAG_STRUCT, \
           C2_EXPERIMENTAL_FLAG_STRUCT, \
           C2_NOTPRODUCT_FLAG_STRUCT, \
           IGNORE_RANGE, \
@@ -777,6 +790,7 @@
              SHARK_PRODUCT_FLAG_STRUCT, \
              SHARK_PD_PRODUCT_FLAG_STRUCT, \
              SHARK_DIAGNOSTIC_FLAG_STRUCT, \
+             SHARK_PD_DIAGNOSTIC_FLAG_STRUCT, \
              SHARK_NOTPRODUCT_FLAG_STRUCT, \
              IGNORE_RANGE, \
              IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/runtime/globals.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -644,6 +644,7 @@
                       product, \
                       product_pd, \
                       diagnostic, \
+                      diagnostic_pd, \
                       experimental, \
                       notproduct, \
                       manageable, \
@@ -2529,7 +2530,7 @@
   develop(bool, GenerateRangeChecks, true,                                  \
           "Generate range checks for array accesses")                       \
                                                                             \
-  develop_pd(bool, ImplicitNullChecks,                                      \
+  diagnostic_pd(bool, ImplicitNullChecks,                                   \
           "Generate code for implicit null checks")                         \
                                                                             \
   product_pd(bool, TrapBasedNullChecks,                                     \
@@ -3163,7 +3164,7 @@
           "Ratio of call site execution to caller method invocation")       \
           range(0, max_jint)                                                \
                                                                             \
-  develop_pd(intx, InlineFrequencyCount,                                    \
+  diagnostic_pd(intx, InlineFrequencyCount,                                 \
           "Count of call site execution necessary to trigger frequent "     \
           "inlining")                                                       \
           range(0, max_jint)                                                \
@@ -4144,7 +4145,7 @@
              "in the loaded class C. "                                      \
              "Check (3) is available only in debug builds.")                \
                                                                             \
-  develop_pd(intx, InitArrayShortSize,                                      \
+  diagnostic_pd(intx, InitArrayShortSize,                                   \
           "Threshold small size (in bytes) for clearing arrays. "           \
           "Anything this size or smaller may get converted to discrete "    \
           "scalar stores.")                                                 \
@@ -4168,6 +4169,7 @@
 #define DECLARE_PRODUCT_FLAG(type, name, value, doc)      extern "C" type name;
 #define DECLARE_PD_PRODUCT_FLAG(type, name, doc)          extern "C" type name;
 #define DECLARE_DIAGNOSTIC_FLAG(type, name, value, doc)   extern "C" type name;
+#define DECLARE_PD_DIAGNOSTIC_FLAG(type, name, doc)       extern "C" type name;
 #define DECLARE_EXPERIMENTAL_FLAG(type, name, value, doc) extern "C" type name;
 #define DECLARE_MANAGEABLE_FLAG(type, name, value, doc)   extern "C" type name;
 #define DECLARE_PRODUCT_RW_FLAG(type, name, value, doc)   extern "C" type name;
@@ -4191,6 +4193,7 @@
 #define MATERIALIZE_PRODUCT_FLAG(type, name, value, doc)      type name = value;
 #define MATERIALIZE_PD_PRODUCT_FLAG(type, name, doc)          type name = pd_##name;
 #define MATERIALIZE_DIAGNOSTIC_FLAG(type, name, value, doc)   type name = value;
+#define MATERIALIZE_PD_DIAGNOSTIC_FLAG(type, name, doc)       type name = pd_##name;
 #define MATERIALIZE_EXPERIMENTAL_FLAG(type, name, value, doc) type name = value;
 #define MATERIALIZE_MANAGEABLE_FLAG(type, name, value, doc)   type name = value;
 #define MATERIALIZE_PRODUCT_RW_FLAG(type, name, value, doc)   type name = value;
@@ -4221,6 +4224,7 @@
               DECLARE_PRODUCT_FLAG, \
               DECLARE_PD_PRODUCT_FLAG, \
               DECLARE_DIAGNOSTIC_FLAG, \
+              DECLARE_PD_DIAGNOSTIC_FLAG, \
               DECLARE_EXPERIMENTAL_FLAG, \
               DECLARE_NOTPRODUCT_FLAG, \
               DECLARE_MANAGEABLE_FLAG, \
@@ -4235,6 +4239,7 @@
                  DECLARE_PRODUCT_FLAG, \
                  DECLARE_PD_PRODUCT_FLAG, \
                  DECLARE_DIAGNOSTIC_FLAG, \
+                 DECLARE_PD_DIAGNOSTIC_FLAG, \
                  DECLARE_NOTPRODUCT_FLAG, \
                  IGNORE_RANGE, \
                  IGNORE_CONSTRAINT, \
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -49,6 +49,7 @@
 #define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc)      FLAG_MEMBER(name),
 #define RUNTIME_PD_PRODUCT_FLAG_MEMBER(type, name, doc)          FLAG_MEMBER(name),
 #define RUNTIME_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc)   FLAG_MEMBER(name),
+#define RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc)       FLAG_MEMBER(name),
 #define RUNTIME_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
 #define RUNTIME_MANAGEABLE_FLAG_MEMBER(type, name, value, doc)   FLAG_MEMBER(name),
 #define RUNTIME_PRODUCT_RW_FLAG_MEMBER(type, name, value, doc)   FLAG_MEMBER(name),
@@ -61,6 +62,7 @@
 #define JVMCI_DEVELOP_FLAG_MEMBER(type, name, value, doc)        FLAG_MEMBER(name),
 #define JVMCI_PD_DEVELOP_FLAG_MEMBER(type, name, doc)            FLAG_MEMBER(name),
 #define JVMCI_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc)     FLAG_MEMBER(name),
+#define JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc)         FLAG_MEMBER(name),
 #define JVMCI_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc)   FLAG_MEMBER(name),
 #define JVMCI_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)     FLAG_MEMBER(name),
 
@@ -73,6 +75,7 @@
 #define C1_PRODUCT_FLAG_MEMBER(type, name, value, doc)           FLAG_MEMBER(name),
 #define C1_PD_PRODUCT_FLAG_MEMBER(type, name, doc)               FLAG_MEMBER(name),
 #define C1_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc)        FLAG_MEMBER(name),
+#define C1_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc)            FLAG_MEMBER(name),
 #define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc)           FLAG_MEMBER(name),
 #define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc)               FLAG_MEMBER(name),
 #define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)        FLAG_MEMBER(name),
@@ -80,6 +83,7 @@
 #define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc)           FLAG_MEMBER(name),
 #define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc)               FLAG_MEMBER(name),
 #define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc)        FLAG_MEMBER(name),
+#define C2_PD_DIAGNOSTIC_FLAG_MEMBER(type, name, doc)            FLAG_MEMBER(name),
 #define C2_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc)      FLAG_MEMBER(name),
 #define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc)           FLAG_MEMBER(name),
 #define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc)               FLAG_MEMBER(name),
@@ -97,6 +101,7 @@
                RUNTIME_PRODUCT_FLAG_MEMBER, \
                RUNTIME_PD_PRODUCT_FLAG_MEMBER, \
                RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \
+               RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER, \
                RUNTIME_EXPERIMENTAL_FLAG_MEMBER, \
                RUNTIME_NOTPRODUCT_FLAG_MEMBER, \
                RUNTIME_MANAGEABLE_FLAG_MEMBER, \
@@ -110,6 +115,7 @@
                   RUNTIME_PRODUCT_FLAG_MEMBER, \
                   RUNTIME_PD_PRODUCT_FLAG_MEMBER, \
                   RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \
+                  RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER, \
                   RUNTIME_NOTPRODUCT_FLAG_MEMBER, \
                   IGNORE_RANGE, \
                   IGNORE_CONSTRAINT, \
@@ -120,6 +126,7 @@
           RUNTIME_PRODUCT_FLAG_MEMBER, \
           RUNTIME_PD_PRODUCT_FLAG_MEMBER, \
           RUNTIME_DIAGNOSTIC_FLAG_MEMBER, \
+          RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER, \
           RUNTIME_EXPERIMENTAL_FLAG_MEMBER, \
           RUNTIME_NOTPRODUCT_FLAG_MEMBER, \
           RUNTIME_MANAGEABLE_FLAG_MEMBER, \
@@ -134,6 +141,7 @@
              JVMCI_PRODUCT_FLAG_MEMBER, \
              JVMCI_PD_PRODUCT_FLAG_MEMBER, \
              JVMCI_DIAGNOSTIC_FLAG_MEMBER, \
+             JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER, \
              JVMCI_EXPERIMENTAL_FLAG_MEMBER, \
              JVMCI_NOTPRODUCT_FLAG_MEMBER, \
              IGNORE_RANGE, \
@@ -146,6 +154,7 @@
           C1_PRODUCT_FLAG_MEMBER, \
           C1_PD_PRODUCT_FLAG_MEMBER, \
           C1_DIAGNOSTIC_FLAG_MEMBER, \
+          C1_PD_DIAGNOSTIC_FLAG_MEMBER, \
           C1_NOTPRODUCT_FLAG_MEMBER, \
           IGNORE_RANGE, \
           IGNORE_CONSTRAINT, \
@@ -157,6 +166,7 @@
           C2_PRODUCT_FLAG_MEMBER, \
           C2_PD_PRODUCT_FLAG_MEMBER, \
           C2_DIAGNOSTIC_FLAG_MEMBER, \
+          C2_PD_DIAGNOSTIC_FLAG_MEMBER, \
           C2_EXPERIMENTAL_FLAG_MEMBER, \
           C2_NOTPRODUCT_FLAG_MEMBER, \
           IGNORE_RANGE, \
@@ -182,6 +192,7 @@
 #define RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)      FLAG_MEMBER_WITH_TYPE(name,type),
 #define RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc)          FLAG_MEMBER_WITH_TYPE(name,type),
 #define RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)   FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc)       FLAG_MEMBER_WITH_TYPE(name,type),
 #define RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
 #define RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)   FLAG_MEMBER_WITH_TYPE(name,type),
 #define RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)   FLAG_MEMBER_WITH_TYPE(name,type),
@@ -194,12 +205,14 @@
 #define JVMCI_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)        FLAG_MEMBER_WITH_TYPE(name,type),
 #define JVMCI_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc)            FLAG_MEMBER_WITH_TYPE(name,type),
 #define JVMCI_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)     FLAG_MEMBER_WITH_TYPE(name,type),
+#define JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc)         FLAG_MEMBER_WITH_TYPE(name,type),
 #define JVMCI_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)   FLAG_MEMBER_WITH_TYPE(name,type),
 #define JVMCI_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)     FLAG_MEMBER_WITH_TYPE(name,type),
 
 #define C1_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)           FLAG_MEMBER_WITH_TYPE(name,type),
 #define C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc)               FLAG_MEMBER_WITH_TYPE(name,type),
 #define C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)        FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc)            FLAG_MEMBER_WITH_TYPE(name,type),
 #define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)           FLAG_MEMBER_WITH_TYPE(name,type),
 #define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc)               FLAG_MEMBER_WITH_TYPE(name,type),
 #define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)        FLAG_MEMBER_WITH_TYPE(name,type),
@@ -213,6 +226,7 @@
 #define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)           FLAG_MEMBER_WITH_TYPE(name,type),
 #define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc)               FLAG_MEMBER_WITH_TYPE(name,type),
 #define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)        FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, doc)            FLAG_MEMBER_WITH_TYPE(name,type),
 #define C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)      FLAG_MEMBER_WITH_TYPE(name,type),
 #define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)           FLAG_MEMBER_WITH_TYPE(name,type),
 #define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc)               FLAG_MEMBER_WITH_TYPE(name,type),
@@ -230,6 +244,7 @@
                RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
                RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
                RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+               RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
                RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
                RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
                RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE,
@@ -243,6 +258,7 @@
                   RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
                   RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
                   RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+                  RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
                   RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
                   IGNORE_RANGE,
                   IGNORE_CONSTRAINT,
@@ -253,6 +269,7 @@
           RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+          RUNTIME_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
           RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE,
@@ -267,6 +284,7 @@
              JVMCI_PRODUCT_FLAG_MEMBER_WITH_TYPE,
              JVMCI_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
              JVMCI_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+             JVMCI_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
              JVMCI_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
              JVMCI_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
              IGNORE_RANGE,
@@ -279,6 +297,7 @@
           C1_PRODUCT_FLAG_MEMBER_WITH_TYPE,
           C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
           C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+          C1_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
           C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
           IGNORE_RANGE,
           IGNORE_CONSTRAINT,
@@ -290,6 +309,7 @@
           C2_PRODUCT_FLAG_MEMBER_WITH_TYPE,
           C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE,
           C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
+          C2_PD_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE,
           C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE,
           C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE,
           IGNORE_RANGE,
--- a/hotspot/src/share/vm/shark/shark_globals.hpp	Fri Jun 24 14:46:45 2016 +0200
+++ b/hotspot/src/share/vm/shark/shark_globals.hpp	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -31,7 +31,7 @@
 # include "shark_globals_zero.hpp"
 #endif
 
-#define SHARK_FLAGS(develop, develop_pd, product, product_pd, diagnostic, notproduct) \
+#define SHARK_FLAGS(develop, develop_pd, product, product_pd, diagnostic, diagnostic_pd, notproduct) \
                                                                               \
   product(intx, MaxNodeLimit, 65000,                                          \
           "Maximum number of nodes")                                          \
@@ -69,6 +69,7 @@
           "Runs LLVM verify over LLVM IR")                                    \
 
 
-SHARK_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_NOTPRODUCT_FLAG)
+SHARK_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_PD_DIAGNOSTIC_FLAG,
+           DECLARE_NOTPRODUCT_FLAG)
 
 #endif // SHARE_VM_SHARK_SHARK_GLOBALS_HPP
--- a/jdk/.hgtags	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/.hgtags	Wed Jul 05 21:52:51 2017 +0200
@@ -366,3 +366,4 @@
 ee29aaab5889555ea56e4c0ed690aabb7613529d jdk-9+121
 981ae344923f09c46d8d1d5a3ed9fa71deafe0c6 jdk-9+122
 c40c8739bcdc88892ff58ebee3fd8a3f287be94d jdk-9+123
+7ff61c55b5c6c124592f09b18953222009a204a6 jdk-9+124
--- a/jdk/src/java.base/macosx/native/libjava/java_props_macosx.c	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/macosx/native/libjava/java_props_macosx.c	Wed Jul 05 21:52:51 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
@@ -23,10 +23,10 @@
  * questions.
  */
 
-#include <dlfcn.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <objc/objc-runtime.h>
 
 #include <Security/AuthSession.h>
 #include <CoreFoundation/CoreFoundation.h>
@@ -35,18 +35,6 @@
 
 #include "java_props_macosx.h"
 
-// need dlopen/dlsym trick to avoid pulling in JavaRuntimeSupport before libjava.dylib is loaded
-static void *getJRSFramework() {
-    static void *jrsFwk = NULL;
-#ifndef STATIC_BUILD
-// JavaRuntimeSupport doesn't support static Java runtimes
-    if (jrsFwk == NULL) {
-       jrsFwk = dlopen("/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/JavaRuntimeSupport", RTLD_LAZY | RTLD_LOCAL);
-    }
-#endif
-    return jrsFwk;
-}
-
 char *getPosixLocale(int cat) {
     char *lc = setlocale(cat, NULL);
     if ((lc == NULL) || (strcmp(lc, "C") == 0)) {
@@ -61,18 +49,70 @@
     switch (cat) {
     case LC_MESSAGES:
         {
-            void *jrsFwk = getJRSFramework();
-            if (jrsFwk == NULL) return NULL;
+            // get preferred language code
+            CFArrayRef languages = CFLocaleCopyPreferredLanguages();
+            if (languages == NULL) {
+                return NULL;
+            }
+            if (CFArrayGetCount(languages) <= 0) {
+                CFRelease(languages);
+                return NULL;
+            }
+
+            CFStringRef primaryLanguage = (CFStringRef)CFArrayGetValueAtIndex(languages, 0);
+            if (primaryLanguage == NULL) {
+                CFRelease(languages);
+                return NULL;
+            }
+            char languageString[LOCALEIDLENGTH];
+            if (CFStringGetCString(primaryLanguage, languageString,
+                                   LOCALEIDLENGTH, CFStringGetSystemEncoding()) == false) {
+                CFRelease(languages);
+                return NULL;
+            }
+            CFRelease(languages);
 
-            char *(*JRSCopyPrimaryLanguage)() = dlsym(jrsFwk, "JRSCopyPrimaryLanguage");
-            char *primaryLanguage = JRSCopyPrimaryLanguage ? JRSCopyPrimaryLanguage() : NULL;
-            if (primaryLanguage == NULL) return NULL;
+            // Language IDs use the language designators and (optional) region
+            // and script designators of BCP 47.  So possible formats are:
+            //
+            // "en"         (language designator only)
+            // "haw"        (3-letter lanuage designator)
+            // "en-GB"      (language with alpha-2 region designator)
+            // "es-419"     (language with 3-digit UN M.49 area code)
+            // "zh-Hans"    (language with ISO 15924 script designator)
+            //
+            // In the case of region designators (alpha-2 or UN M.49), we convert
+            // to our locale string format by changing '-' to '_'.  That is, if
+            // the '-' is followed by fewer than 4 chars.
+            char* scriptOrRegion = strchr(languageString, '-');
+            if (scriptOrRegion != NULL && strlen(scriptOrRegion) < 5) {
+                *scriptOrRegion = '_';
 
-            char *(*JRSCopyCanonicalLanguageForPrimaryLanguage)(char *) = dlsym(jrsFwk, "JRSCopyCanonicalLanguageForPrimaryLanguage");
-            char *canonicalLanguage = JRSCopyCanonicalLanguageForPrimaryLanguage ?  JRSCopyCanonicalLanguageForPrimaryLanguage(primaryLanguage) : NULL;
-            free (primaryLanguage);
+                assert((strlen(scriptOrRegion) == 3 &&
+                        // '-' followed by a 2 character region designator
+                          isalpha(scriptOrRegion[1]) &&
+                          isalpha(scriptOrRegion[2])) ||
+                       (strlen(scriptOrRegion) == 4 &&
+                        // '-' followed by a 3-digit UN M.49 area code
+                          isdigit(scriptOrRegion[1]) &&
+                          isdigit(scriptOrRegion[2]) &&
+                          isdigit(scriptOrRegion[3])));
+            }
+            const char* retVal = languageString;
 
-            return canonicalLanguage;
+            // Special case for Portuguese in Brazil:
+            // The language code needs the "_BR" region code (to distinguish it
+            // from Portuguese in Portugal), but this is missing when using the
+            // "Portuguese (Brazil)" language.
+            // If language is "pt" and the current locale is pt_BR, return pt_BR.
+            char localeString[LOCALEIDLENGTH];
+            if (strcmp(retVal, "pt") == 0 &&
+                    CFStringGetCString(CFLocaleGetIdentifier(CFLocaleCopyCurrent()),
+                                       localeString, LOCALEIDLENGTH, CFStringGetSystemEncoding()) &&
+                    strcmp(localeString, "pt_BR") == 0) {
+                retVal = localeString;
+            }
+            return strdup(retVal);
         }
         break;
     default:
@@ -92,14 +132,6 @@
 char *setupMacOSXLocale(int cat) {
     char * ret = getMacOSXLocale(cat);
 
-    if (cat == LC_MESSAGES && ret != NULL) {
-        void *jrsFwk = getJRSFramework();
-        if (jrsFwk != NULL) {
-            void (*JRSSetDefaultLocalization)(char *) = dlsym(jrsFwk, "JRSSetDefaultLocalization");
-            if (JRSSetDefaultLocalization) JRSSetDefaultLocalization(ret);
-        }
-    }
-
     if (ret == NULL) {
         return getPosixLocale(cat);
     } else {
@@ -126,22 +158,35 @@
     return 0;
 }
 
+// 10.9 SDK does not include the NSOperatingSystemVersion struct.
+// For now, create our own
+typedef struct {
+        NSInteger majorVersion;
+        NSInteger minorVersion;
+        NSInteger patchVersion;
+} OSVerStruct;
+
 void setOSNameAndVersion(java_props_t *sprops) {
-    /* Don't rely on JRSCopyOSName because there's no guarantee the value will
-     * remain the same, or even if the JRS functions will continue to be part of
-     * Mac OS X.  So hardcode os_name, and fill in os_version if we can.
-     */
+    // Hardcode os_name, and fill in os_version
     sprops->os_name = strdup("Mac OS X");
 
-    void *jrsFwk = getJRSFramework();
-    if (jrsFwk != NULL) {
-        char *(*copyOSVersion)() = dlsym(jrsFwk, "JRSCopyOSVersion");
-        if (copyOSVersion != NULL) {
-            sprops->os_version = copyOSVersion();
-            return;
-        }
+    char* osVersionCStr = NULL;
+    // Mac OS 10.9 includes the [NSProcessInfo operatingSystemVersion] function,
+    // but it's not in the 10.9 SDK.  So, call it via objc_msgSend_stret.
+    if ([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) {
+        OSVerStruct (*procInfoFn)(id rec, SEL sel) = (OSVerStruct(*)(id, SEL))objc_msgSend_stret;
+        OSVerStruct osVer = procInfoFn([NSProcessInfo processInfo],
+                                       @selector(operatingSystemVersion));
+        NSString *nsVerStr = [NSString stringWithFormat:@"%ld.%ld.%ld",
+                (long)osVer.majorVersion, (long)osVer.minorVersion, (long)osVer.patchVersion];
+        // Copy out the char*
+        osVersionCStr = strdup([nsVerStr UTF8String]);
     }
-    sprops->os_version = strdup("Unknown");
+
+    if (osVersionCStr == NULL) {
+        osVersionCStr = strdup("Unknown");
+    }
+    sprops->os_version = osVersionCStr;
 }
 
 
--- a/jdk/src/java.base/share/classes/java/io/BufferedInputStream.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/io/BufferedInputStream.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -359,10 +359,10 @@
      * See the general contract of the <code>skip</code>
      * method of <code>InputStream</code>.
      *
-     * @exception  IOException  if the stream does not support seek,
-     *                          or if this input stream has been closed by
-     *                          invoking its {@link #close()} method, or an
-     *                          I/O error occurs.
+     * @throws IOException  if this input stream has been closed by
+     *                      invoking its {@link #close()} method,
+     *                      {@code in.skip(n)} throws an IOException,
+     *                      or an I/O error occurs.
      */
     public synchronized long skip(long n) throws IOException {
         getBufIfOpen(); // Check for closed stream
--- a/jdk/src/java.base/share/classes/java/io/FilterInputStream.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/io/FilterInputStream.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -144,8 +144,7 @@
      *
      * @param      n   the number of bytes to be skipped.
      * @return     the actual number of bytes skipped.
-     * @exception  IOException  if the stream does not support seek,
-     *                          or if some other I/O error occurs.
+     * @throws     IOException  if {@code in.skip(n)} throws an IOException.
      */
     public long skip(long n) throws IOException {
         return in.skip(n);
--- a/jdk/src/java.base/share/classes/java/io/InputStream.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/io/InputStream.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -325,7 +325,7 @@
      * returns 0, and no bytes are skipped. Subclasses may handle the negative
      * value differently.
      *
-     * <p> The <code>skip</code> method of this class creates a
+     * <p> The <code>skip</code> method implementation of this class creates a
      * byte array and then repeatedly reads into it until <code>n</code> bytes
      * have been read or the end of the stream has been reached. Subclasses are
      * encouraged to provide a more efficient implementation of this method.
@@ -333,8 +333,7 @@
      *
      * @param      n   the number of bytes to be skipped.
      * @return     the actual number of bytes skipped.
-     * @exception  IOException  if the stream does not support seek,
-     *                          or if some other I/O error occurs.
+     * @throws     IOException  if an I/O error occurs.
      */
     public long skip(long n) throws IOException {
 
--- a/jdk/src/java.base/share/classes/java/io/PushbackInputStream.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/io/PushbackInputStream.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -291,10 +291,10 @@
      *
      * @param      n  {@inheritDoc}
      * @return     {@inheritDoc}
-     * @exception  IOException  if the stream does not support seek,
-     *            or the stream has been closed by
-     *            invoking its {@link #close()} method,
-     *            or an I/O error occurs.
+     * @throws     IOException  if the stream has been closed by
+     *             invoking its {@link #close()} method,
+     *             {@code in.skip(n)} throws an IOException,
+     *             or an I/O error occurs.
      * @see        java.io.FilterInputStream#in
      * @see        java.io.InputStream#skip(long n)
      * @since      1.2
--- a/jdk/src/java.base/share/classes/java/lang/ApplicationShutdownHooks.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/ApplicationShutdownHooks.java	Wed Jul 05 21:52:51 2017 +0200
@@ -102,9 +102,13 @@
             hook.start();
         }
         for (Thread hook : threads) {
-            try {
-                hook.join();
-            } catch (InterruptedException x) { }
+            while (true) {
+                try {
+                    hook.join();
+                    break;
+                } catch (InterruptedException ignored) {
+                }
+            }
         }
     }
 }
--- a/jdk/src/java.base/share/classes/java/lang/StringUTF16.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/StringUTF16.java	Wed Jul 05 21:52:51 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
@@ -259,17 +259,7 @@
 
     @HotSpotIntrinsicCandidate
     public static int compareToLatin1(byte[] value, byte[] other) {
-        int len1 = length(value);
-        int len2 = StringLatin1.length(other);
-        int lim = Math.min(len1, len2);
-        for (int k = 0; k < lim; k++) {
-            char c1 = getChar(value, k);
-            char c2 = StringLatin1.getChar(other, k);
-            if (c1 != c2) {
-                return c1 - c2;
-            }
-        }
-        return len1 - len2;
+        return -StringLatin1.compareToUTF16(other, value);
     }
 
     public static int compareToCI(byte[] value, byte[] other) {
@@ -295,25 +285,7 @@
     }
 
     public static int compareToCI_Latin1(byte[] value, byte[] other) {
-        int len1 = length(value);
-        int len2 = StringLatin1.length(other);
-        int lim = Math.min(len1, len2);
-        for (int k = 0; k < lim; k++) {
-            char c1 = getChar(value, k);
-            char c2 = StringLatin1.getChar(other, k);
-            if (c1 != c2) {
-                c1 = Character.toUpperCase(c1);
-                c2 = Character.toUpperCase(c2);
-                if (c1 != c2) {
-                    c1 = Character.toLowerCase(c1);
-                    c2 = Character.toLowerCase(c2);
-                    if (c1 != c2) {
-                        return c1 - c2;
-                    }
-                }
-            }
-        }
-        return len1 - len2;
+        return -StringLatin1.compareToCI_UTF16(other, value);
     }
 
     public static int hashCode(byte[] value) {
@@ -566,24 +538,7 @@
     public static boolean regionMatchesCI_Latin1(byte[] value, int toffset,
                                                  byte[] other, int ooffset,
                                                  int len) {
-        int last = toffset + len;
-        while (toffset < last) {
-            char c1 = getChar(value, toffset++);
-            char c2 = (char)(other[ooffset++] & 0xff);
-            if (c1 == c2) {
-                continue;
-            }
-            char u1 = Character.toUpperCase(c1);
-            char u2 = Character.toUpperCase(c2);
-            if (u1 == u2) {
-                continue;
-            }
-            if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
-                continue;
-            }
-            return false;
-        }
-        return true;
+        return StringLatin1.regionMatchesCI_UTF16(other, ooffset, value, toffset, len);
     }
 
     public static String toLowerCase(String str, byte[] value, Locale locale) {
--- a/jdk/src/java.base/share/classes/java/net/MulticastSocket.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/net/MulticastSocket.java	Wed Jul 05 21:52:51 2017 +0200
@@ -300,8 +300,9 @@
      *
      * @param mcastaddr is the multicast address to join
      *
-     * @exception IOException if there is an error joining
-     * or when the address is not a multicast address.
+     * @exception IOException if there is an error joining, or when the address
+     *            is not a multicast address, or the platform does not support
+     *            multicasting
      * @exception  SecurityException  if a security manager exists and its
      * {@code checkMulticast} method doesn't allow the join.
      *
@@ -384,8 +385,9 @@
      *       {@link MulticastSocket#setInterface(InetAddress)} or
      *       {@link MulticastSocket#setNetworkInterface(NetworkInterface)}
      *
-     * @exception IOException if there is an error joining
-     * or when the address is not a multicast address.
+     * @exception IOException if there is an error joining, or when the address
+     *            is not a multicast address, or the platform does not support
+     *            multicasting
      * @exception  SecurityException  if a security manager exists and its
      * {@code checkMulticast} method doesn't allow the join.
      * @throws  IllegalArgumentException if mcastaddr is null or is a
--- a/jdk/src/java.base/share/classes/java/net/URLPermission.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/net/URLPermission.java	Wed Jul 05 21:52:51 2017 +0200
@@ -265,8 +265,14 @@
 
         URLPermission that = (URLPermission)p;
 
-        if (!this.methods.get(0).equals("*") &&
-                Collections.indexOfSubList(this.methods, that.methods) == -1) {
+        if (this.methods.isEmpty() && !that.methods.isEmpty()) {
+            return false;
+        }
+
+        if (!this.methods.isEmpty() &&
+            !this.methods.get(0).equals("*") &&
+            Collections.indexOfSubList(this.methods,
+                                       that.methods) == -1) {
             return false;
         }
 
@@ -455,15 +461,11 @@
     }
 
     private String actions() {
-        StringBuilder b = new StringBuilder();
-        for (String s : methods) {
-            b.append(s);
+        String b = String.join(",", methods);
+        if (!requestHeaders.isEmpty()) {
+            b += ":" + String.join(",", requestHeaders);
         }
-        b.append(":");
-        for (String s : requestHeaders) {
-            b.append(s);
-        }
-        return b.toString();
+        return b;
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/nio/channels/MulticastChannel.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/channels/MulticastChannel.java	Wed Jul 05 21:52:51 2017 +0200
@@ -40,10 +40,11 @@
  * address.
  *
  * <p> In the case of a channel to an {@link StandardProtocolFamily#INET IPv4} socket,
- * the underlying operating system supports <a href="http://www.ietf.org/rfc/rfc2236.txt">
- * <i>RFC&nbsp;2236: Internet Group Management Protocol, Version 2 (IGMPv2)</i></a>.
- * It may optionally support source filtering as specified by <a
- * href="http://www.ietf.org/rfc/rfc3376.txt"> <i>RFC&nbsp;3376: Internet Group
+ * the underlying operating system optionally supports
+ * <a href="http://www.ietf.org/rfc/rfc2236.txt"> <i>RFC&nbsp;2236: Internet Group
+ * Management Protocol, Version 2 (IGMPv2)</i></a>. When IGMPv2 is supported then
+ * the operating system may additionally support source filtering as specified by
+ * <a href="http://www.ietf.org/rfc/rfc3376.txt"> <i>RFC&nbsp;3376: Internet Group
  * Management Protocol, Version 3 (IGMPv3)</i></a>.
  * For channels to an {@link StandardProtocolFamily#INET6 IPv6} socket, the equivalent
  * standards are <a href="http://www.ietf.org/rfc/rfc2710.txt"> <i>RFC&nbsp;2710:
@@ -167,7 +168,8 @@
      *          If the channel already has source-specific membership of the
      *          group on the interface
      * @throws  UnsupportedOperationException
-     *          If the channel's socket is not an Internet Protocol socket
+     *          If the channel's socket is not an Internet Protocol socket, or
+     *          the platform does not support multicasting
      * @throws  ClosedChannelException
      *          If this channel is closed
      * @throws  IOException
@@ -214,8 +216,9 @@
      *          If the channel is currently a member of the group on the given
      *          interface to receive all datagrams
      * @throws  UnsupportedOperationException
-     *          If the channel's socket is not an Internet Protocol socket or
-     *          source filtering is not supported
+     *          If the channel's socket is not an Internet Protocol socket, or
+     *          source filtering is not supported, or the platform does not
+     *          support multicasting
      * @throws  ClosedChannelException
      *          If this channel is closed
      * @throws  IOException
--- a/jdk/src/java.base/share/classes/java/util/Formatter.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Formatter.java	Wed Jul 05 21:52:51 2017 +0200
@@ -3895,8 +3895,7 @@
                 TimeZone tz = t.getTimeZone();
                 sb.append(tz.getDisplayName((t.get(Calendar.DST_OFFSET) != 0),
                                            TimeZone.SHORT,
-                                           Objects.requireNonNullElse(l,
-                                               Locale.getDefault(Locale.Category.FORMAT))));
+                                           Objects.requireNonNullElse(l, Locale.US)));
                 break;
             }
 
@@ -3904,8 +3903,7 @@
             case DateTime.NAME_OF_DAY_ABBREV:     // 'a'
             case DateTime.NAME_OF_DAY:          { // 'A'
                 int i = t.get(Calendar.DAY_OF_WEEK);
-                Locale lt = Objects.requireNonNullElse(l,
-                                               Locale.getDefault(Locale.Category.FORMAT));
+                Locale lt = Objects.requireNonNullElse(l, Locale.US);
                 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
                 if (c == DateTime.NAME_OF_DAY)
                     sb.append(dfs.getWeekdays()[i]);
@@ -3917,8 +3915,7 @@
             case DateTime.NAME_OF_MONTH_ABBREV_X: // 'h' -- same b
             case DateTime.NAME_OF_MONTH:        { // 'B'
                 int i = t.get(Calendar.MONTH);
-                Locale lt = Objects.requireNonNullElse(l,
-                                               Locale.getDefault(Locale.Category.FORMAT));
+                Locale lt = Objects.requireNonNullElse(l, Locale.US);
                 DateFormatSymbols dfs = DateFormatSymbols.getInstance(lt);
                 if (c == DateTime.NAME_OF_MONTH)
                     sb.append(dfs.getMonths()[i]);
--- a/jdk/src/java.base/share/classes/java/util/Scanner.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Scanner.java	Wed Jul 05 21:52:51 2017 +0200
@@ -925,7 +925,6 @@
             needInput = true;
             return null;
         }
-
         // Must look for next delims. Simply attempting to match the
         // pattern at this point may find a match but it might not be
         // the first longest match because of missing input, or it might
@@ -941,16 +940,13 @@
             foundNextDelim = matcher.find();
         }
         if (foundNextDelim) {
-            // In two rare cases that more input might cause the match to be
-            // lost or change.
-            // (1) if requireEnd() is true, more input might cause the match
-            // to be lost, we must wait for more input.
-            // (2) while hitting the end is okay IF the match does not
-            // go away AND the beginning of the next delims does not change
-            // (we don't care if they potentially extend further). But it's
-            // possible that more input could cause the beginning of the
-            // delims change, so have to wait for more input as well.
-            if ((matcher.requireEnd() || matcher.hitEnd()) && !sourceClosed) {
+            // In the rare case that more input could cause the match
+            // to be lost and there is more input coming we must wait
+            // for more input. Note that hitting the end is okay as long
+            // as the match cannot go away. It is the beginning of the
+            // next delims we want to be sure about, we don't care if
+            // they potentially extend further.
+            if (matcher.requireEnd() && !sourceClosed) {
                 needInput = true;
                 return null;
             }
--- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/ExplodedImage.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/ExplodedImage.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,6 +25,7 @@
 package jdk.internal.jrtfs;
 
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.FileSystem;
 import java.nio.file.FileSystemException;
@@ -138,6 +139,15 @@
             }
             return children;
         }
+
+        @Override
+        public long size() {
+            try {
+                return isDirectory() ? 0 : Files.size(path);
+            } catch (IOException ex) {
+                throw new UncheckedIOException(ex);
+            }
+        }
     }
 
     @Override
--- a/jdk/src/java.base/share/classes/sun/net/NetworkClient.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/NetworkClient.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -165,8 +165,10 @@
                 // server & port will be the proxy address and port
                 s = new Socket(Proxy.NO_PROXY);
             }
-        } else
+        } else {
             s = createSocket();
+        }
+
         // Instance specific timeouts do have priority, that means
         // connectTimeout & readTimeout (-1 means not set)
         // Then global default timeouts
@@ -194,7 +196,7 @@
      * to create the socket.
      */
     protected Socket createSocket() throws IOException {
-        return new java.net.Socket();
+        return new java.net.Socket(Proxy.NO_PROXY);  // direct connection
     }
 
     protected InetAddress getLocalAddress() throws IOException {
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/netdoc/Handler.java	Fri Jun 24 14:46:45 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute 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.
- */
-
-/*-
- * netdoc urls point either into the local filesystem or externally
- * through an http url, with network documents being preferred.  Useful for
- * FAQs & other documents which are likely to be changing over time at the
- * central site, and where the user will want the most recent edition.
- *
- * @author Steven B. Byrne
- */
-
-package sun.net.www.protocol.netdoc;
-
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.MalformedURLException;
-import java.net.URLStreamHandler;
-import java.io.InputStream;
-import java.io.IOException;
-import sun.security.action.GetPropertyAction;
-
-public class Handler extends URLStreamHandler {
-    static URL base;
-
-    /*
-     * Attempt to find a load the given url using the default (network)
-     * documentation location.  If that fails, use the local copy
-     */
-    public synchronized URLConnection openConnection(URL u)
-        throws IOException
-    {
-        URLConnection uc = null;
-        URL ru;
-
-        boolean localonly = Boolean.parseBoolean(
-                GetPropertyAction.privilegedGetProperty("newdoc.localonly"));
-
-        String docurl = GetPropertyAction.privilegedGetProperty("doc.url");
-
-        String file = u.getFile();
-        if (!localonly) {
-            try {
-                if (base == null) {
-                    base = new URL(docurl);
-                }
-                ru = new URL(base, file);
-            } catch (MalformedURLException e) {
-                ru = null;
-            }
-            if (ru != null) {
-                uc = ru.openConnection();
-            }
-        }
-
-        if (uc == null) {
-            try {
-                ru = new URL("file", "~", file);
-
-                uc = ru.openConnection();
-                InputStream is = uc.getInputStream();   // Check for success.
-            } catch (MalformedURLException e) {
-                uc = null;
-            } catch (IOException e) {
-                uc = null;
-            }
-        }
-
-        if (uc == null) {
-            throw new IOException("Can't find file for URL: "
-                                  +u.toExternalForm());
-        }
-        return uc;
-    }
-}
--- a/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java	Wed Jul 05 21:52:51 2017 +0200
@@ -354,8 +354,8 @@
                         // We wait 250milli quanta, so the minimum wait time
                         // cannot be under 250milli.
                         int latch = 0;
-                        long l = System.currentTimeMillis() + 250;
-                        while (System.currentTimeMillis() < l) {
+                        long startTime = System.nanoTime();
+                        while (System.nanoTime() - startTime < 250000000) {
                             synchronized(this){};
                             latch++;
                         }
--- a/jdk/src/java.base/share/classes/sun/util/PropertyResourceBundleCharset.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/PropertyResourceBundleCharset.java	Wed Jul 05 21:52:51 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
@@ -34,7 +34,6 @@
 import java.nio.charset.CodingErrorAction;
 import java.nio.charset.StandardCharsets;
 import java.util.Objects;
-import sun.util.logging.PlatformLogger;
 
 /**
  * A Charset implementation for reading PropertyResourceBundle, in order
@@ -94,12 +93,11 @@
                 return cr;
             }
 
+            // Invalid or unmappable UTF-8 sequence detected.
+            // Switching to the ISO 8859-1 decorder.
+            assert cr.isMalformed() || cr.isUnmappable();
             in.reset();
             out.reset();
-
-            PlatformLogger.getLogger(getClass().getCanonicalName()).info(
-                "Invalid or unmappable UTF-8 sequence detected. " +
-                "Switching encoding from UTF-8 to ISO-8859-1");
             cdISO_8859_1 = StandardCharsets.ISO_8859_1.newDecoder();
             return cdISO_8859_1.decode(in, out, false);
         }
--- a/jdk/src/java.base/unix/native/libjava/locale_str.h	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.base/unix/native/libjava/locale_str.h	Wed Jul 05 21:52:51 2017 +0200
@@ -135,6 +135,16 @@
     "sr_SP", "sr_YU",
     "tchinese", "zh_TW",
 #endif
+#ifdef MACOSX
+    "sr-Latn", "sr_CS",   // Mappings as done by old Apple JRS code
+    "tk", "tk-Cyrl",
+    "tt-Latn", "tt-Cyrl",
+    "uz", "uz_UZ",
+    "uz-Arab", "uz_UZ",
+    "uz-Latn", "uz_UZ",
+    "zh-Hans", "zh_CN",
+    "zh-Hant", "zh_TW",
+#endif
     "", "",
  };
 
--- a/jdk/src/java.httpclient/share/classes/java/net/http/PlainHttpConnection.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/PlainHttpConnection.java	Wed Jul 05 21:52:51 2017 +0200
@@ -128,6 +128,7 @@
             this.chan = SocketChannel.open();
             int bufsize = client.getReceiveBufferSize();
             chan.setOption(StandardSocketOptions.SO_RCVBUF, bufsize);
+            chan.setOption(StandardSocketOptions.TCP_NODELAY, true);
         } catch (IOException e) {
             throw new InternalError(e);
         }
--- a/jdk/src/java.httpclient/share/classes/java/net/http/Stream.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/Stream.java	Wed Jul 05 21:52:51 2017 +0200
@@ -617,6 +617,7 @@
     void sendBodyImpl() throws IOException, InterruptedException {
         if (requestContentLen == 0) {
             // no body
+            requestSent();
             return;
         }
         DataFrame df;
@@ -667,7 +668,7 @@
                     responseFlowController); // TODO: filter headers
         if (body == null) {
             receiveData();
-            return processor.onResponseComplete();
+            body = processor.onResponseComplete();
         } else
             receiveDataAsync(processor);
         responseReceived();
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WS.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WS.java	Wed Jul 05 21:52:51 2017 +0200
@@ -34,7 +34,6 @@
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
-import java.util.stream.Stream;
 
 import static java.lang.System.Logger.Level.ERROR;
 import static java.lang.System.Logger.Level.WARNING;
@@ -104,15 +103,6 @@
     }
 
     @Override
-    public CompletableFuture<WebSocket> sendText(Stream<? extends CharSequence> message) {
-        requireNonNull(message, "message");
-        synchronized (stateLock) {
-            checkState();
-            return transmitter.sendText(message);
-        }
-    }
-
-    @Override
     public CompletableFuture<WebSocket> sendBinary(ByteBuffer message, boolean isLast) {
         requireNonNull(message, "message");
         synchronized (stateLock) {
@@ -179,11 +169,11 @@
     }
 
     @Override
-    public long request(long n) {
+    public void request(long n) {
         if (n < 0L) {
             throw new IllegalArgumentException("The number must not be negative: " + n);
         }
-        return receiver.request(n);
+        receiver.request(n);
     }
 
     @Override
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSBuilder.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSBuilder.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,6 +25,7 @@
 package java.net.http;
 
 import java.net.URI;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -59,8 +60,7 @@
     private final LinkedHashMap<String, List<String>> headers = new LinkedHashMap<>();
     private final WebSocket.Listener listener;
     private Collection<String> subprotocols = Collections.emptyList();
-    private long timeout;
-    private TimeUnit timeUnit;
+    private Duration timeout;
 
     WSBuilder(URI uri, HttpClient client, WebSocket.Listener listener) {
         checkURI(requireNonNull(uri, "uri"));
@@ -93,13 +93,8 @@
     }
 
     @Override
-    public WebSocket.Builder connectTimeout(long timeout, TimeUnit unit) {
-        if (timeout < 0) {
-            throw new IllegalArgumentException("Negative timeout: " + timeout);
-        }
-        requireNonNull(unit, "unit");
-        this.timeout = timeout;
-        this.timeUnit = unit;
+    public WebSocket.Builder connectTimeout(Duration timeout) {
+        this.timeout = requireNonNull(timeout, "timeout");
         return this;
     }
 
@@ -139,9 +134,7 @@
         return new ArrayList<>(subprotocols);
     }
 
-    long getTimeout() { return timeout; }
-
-    TimeUnit getTimeUnit() { return timeUnit; }
+    Duration getConnectTimeout() { return timeout; }
 
     private static Collection<String> checkSubprotocols(String mostPreferred,
                                                         String... lesserPreferred) {
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSFrameConsumer.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSFrameConsumer.java	Wed Jul 05 21:52:51 2017 +0200
@@ -206,7 +206,7 @@
                 boolean binaryNonEmpty = data.hasRemaining();
                 WSShared<CharBuffer> textData;
                 try {
-                    textData = decoder.decode(data, part.isLast());
+                    textData = decoder.decode(data, part == MessagePart.WHOLE || part == MessagePart.LAST);
                 } catch (CharacterCodingException e) {
                     throw new WSProtocolException
                             ("5.6.", "Invalid UTF-8 sequence in frame " + opcode, NOT_CONSISTENT, e);
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSMessageSender.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSMessageSender.java	Wed Jul 05 21:52:51 2017 +0200
@@ -30,7 +30,6 @@
 import java.net.http.WSOutgoingMessage.Close;
 import java.net.http.WSOutgoingMessage.Ping;
 import java.net.http.WSOutgoingMessage.Pong;
-import java.net.http.WSOutgoingMessage.StreamedText;
 import java.net.http.WSOutgoingMessage.Text;
 import java.net.http.WSOutgoingMessage.Visitor;
 import java.nio.ByteBuffer;
@@ -123,11 +122,6 @@
         }
 
         @Override
-        public void visit(StreamedText streamedText) {
-            throw new IllegalArgumentException("Not yet implemented");
-        }
-
-        @Override
         public void visit(Binary message) {
             buffers[1] = message.bytes;
             int mask = random.nextInt();
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSOpeningHandshake.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSOpeningHandshake.java	Wed Jul 05 21:52:51 2017 +0200
@@ -32,11 +32,14 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -77,8 +80,12 @@
     WSOpeningHandshake(WSBuilder b) {
         URI httpURI = createHttpUri(b.getUri());
         HttpRequest.Builder requestBuilder = b.getClient().request(httpURI);
-        if (b.getTimeUnit() != null) {
-            requestBuilder.timeout(b.getTimeUnit(), b.getTimeout());
+        Duration connectTimeout = b.getConnectTimeout();
+        if (connectTimeout != null) {
+            requestBuilder.timeout(
+                    TimeUnit.of(ChronoUnit.MILLIS),
+                    connectTimeout.get(ChronoUnit.MILLIS)
+            );
         }
         Collection<String> s = b.getSubprotocols();
         if (!s.isEmpty()) {
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSOutgoingMessage.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSOutgoingMessage.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,13 +25,11 @@
 package java.net.http;
 
 import java.nio.ByteBuffer;
-import java.util.stream.Stream;
 
 abstract class WSOutgoingMessage {
 
     interface Visitor {
         void visit(Text message);
-        void visit(StreamedText message);
         void visit(Binary message);
         void visit(Ping message);
         void visit(Pong message);
@@ -64,25 +62,6 @@
         }
     }
 
-    static final class StreamedText extends WSOutgoingMessage {
-
-        public final Stream<? extends CharSequence> characters;
-
-        StreamedText(Stream<? extends CharSequence> characters) {
-            this.characters = characters;
-        }
-
-        @Override
-        void accept(Visitor visitor) {
-            visitor.visit(this);
-        }
-
-        @Override
-        public String toString() {
-            return WSUtils.toStringSimple(this) + "[characters=" + characters + "]";
-        }
-    }
-
     static final class Binary extends WSOutgoingMessage {
 
         public final boolean isLast;
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSReceiver.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSReceiver.java	Wed Jul 05 21:52:51 2017 +0200
@@ -101,11 +101,10 @@
         }
     }
 
-    long request(long n) {
+    void request(long n) {
         long newDemand = demand.accumulateAndGet(n, (p, i) -> p + i < 0 ? Long.MAX_VALUE : p + i);
         handler.signal();
         assert newDemand >= 0 : newDemand;
-        return newDemand;
     }
 
     private boolean getData() throws IOException {
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WSTransmitter.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WSTransmitter.java	Wed Jul 05 21:52:51 2017 +0200
@@ -28,7 +28,6 @@
 import java.net.http.WSOutgoingMessage.Close;
 import java.net.http.WSOutgoingMessage.Ping;
 import java.net.http.WSOutgoingMessage.Pong;
-import java.net.http.WSOutgoingMessage.StreamedText;
 import java.net.http.WSOutgoingMessage.Text;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
@@ -40,7 +39,6 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.function.Consumer;
-import java.util.stream.Stream;
 
 import static java.lang.String.format;
 import static java.net.http.Pair.pair;
@@ -83,11 +81,6 @@
         return acceptMessage(new Text(isLast, message));
     }
 
-    CompletableFuture<WebSocket> sendText(Stream<? extends CharSequence> message) {
-        checkAndUpdateText(true);
-        return acceptMessage(new StreamedText(message));
-    }
-
     CompletableFuture<WebSocket> sendBinary(ByteBuffer message, boolean isLast) {
         checkAndUpdateBinary(isLast);
         return acceptMessage(new Binary(isLast, message));
--- a/jdk/src/java.httpclient/share/classes/java/net/http/WebSocket.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/WebSocket.java	Wed Jul 05 21:52:51 2017 +0200
@@ -28,13 +28,11 @@
 import java.net.ProtocolException;
 import java.net.URI;
 import java.nio.ByteBuffer;
+import java.time.Duration;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
 
 /**
  * A WebSocket client conforming to RFC&nbsp;6455.
@@ -47,8 +45,9 @@
  * receive messages. When the {@code WebSocket} is no longer
  * needed it must be closed: a Close message must both be {@linkplain
  * #sendClose() sent} and {@linkplain Listener#onClose(WebSocket, Optional,
- * String) received}. Or to close abruptly, {@link #abort()} is called. Once
- * closed it remains closed, cannot be reopened.
+ * String) received}. Otherwise, invoke {@link #abort() abort} to close abruptly.
+ *
+ * <p> Once closed the {@code WebSocket} remains closed and cannot be reopened.
  *
  * <p> Messages of type {@code X} are sent through the {@code WebSocket.sendX}
  * methods and received through {@link WebSocket.Listener}{@code .onX} methods
@@ -71,10 +70,6 @@
  * arranged from the {@code buffer}'s {@link ByteBuffer#position() position} to
  * the {@code buffer}'s {@link ByteBuffer#limit() limit}.
  *
- * <p> All message exchange is run by the threads belonging to the {@linkplain
- * HttpClient#executorService() executor service} of {@code WebSocket}'s {@link
- * HttpClient}.
- *
  * <p> Unless otherwise noted, passing a {@code null} argument to a constructor
  * or method of this type will cause a {@link NullPointerException
  * NullPointerException} to be thrown.
@@ -217,22 +212,17 @@
          * Sets a timeout for the opening handshake.
          *
          * <p> If the opening handshake is not finished within the specified
-         * timeout then {@link #buildAsync()} completes exceptionally with a
-         * {@code HttpTimeoutException}.
+         * amount of time then {@link #buildAsync()} completes exceptionally
+         * with a {@code HttpTimeoutException}.
          *
-         * <p> If the timeout is not specified then it's deemed infinite.
+         * <p> If this method is not invoked then the timeout is deemed infinite.
          *
          * @param timeout
-         *         the maximum time to wait
-         * @param unit
-         *         the time unit of the timeout argument
+         *         the timeout
          *
          * @return this builder
-         *
-         * @throws IllegalArgumentException
-         *         if the {@code timeout} is negative
          */
-        Builder connectTimeout(long timeout, TimeUnit unit);
+        Builder connectTimeout(Duration timeout);
 
         /**
          * Builds a {@code WebSocket}.
@@ -506,7 +496,7 @@
          * <p> Once a Close message is received, the server will not send any
          * more messages.
          *
-         * <p> A Close message may consist of a close code and a reason for
+         * <p> A Close message may consist of a status code and a reason for
          * closing. The reason will have a UTF-8 representation not longer than
          * {@code 123} bytes. The reason may be useful for debugging or passing
          * information relevant to the connection but is not necessarily human
@@ -545,12 +535,8 @@
          * the time {@code onError} is invoked, no more messages can be sent on
          * this {@code WebSocket}.
          *
-         * @apiNote Errors associated with send operations ({@link
-         * WebSocket#sendText(CharSequence, boolean) sendText}, {@link
-         * #sendBinary(ByteBuffer, boolean) sendBinary}, {@link
-         * #sendPing(ByteBuffer) sendPing}, {@link #sendPong(ByteBuffer)
-         * sendPong} and {@link #sendClose(CloseCode, CharSequence) sendClose})
-         * are reported to the {@code CompletionStage} operations return.
+         * @apiNote Errors associated with {@code sendX} methods are reported to
+         * the {@code CompletableFuture} these methods return.
          *
          * @implSpec The default implementation does nothing.
          *
@@ -563,8 +549,8 @@
     }
 
     /**
-     * A marker used by {@link WebSocket.Listener} for partial message
-     * receiving.
+     * A marker used by {@link WebSocket.Listener} in cases where a partial
+     * message may be received.
      *
      * @since 9
      */
@@ -586,19 +572,9 @@
         LAST,
 
         /**
-         * A whole message. The message consists of a single part.
+         * A whole message consisting of a single part.
          */
-        WHOLE;
-
-        /**
-         * Tells whether a part of a message received with this marker is the
-         * last part.
-         *
-         * @return {@code true} if LAST or WHOLE, {@code false} otherwise
-         */
-        public boolean isLast() {
-            return this == LAST || this == WHOLE;
-        }
+        WHOLE
     }
 
     /**
@@ -630,7 +606,7 @@
      * @param message
      *         the message
      * @param isLast
-     *         {@code true} if this is the final part of the message,
+     *         {@code true} if this is the last part of the message,
      *         {@code false} otherwise
      *
      * @return a CompletableFuture with this WebSocket
@@ -679,43 +655,6 @@
     }
 
     /**
-     * Sends a whole Text message with characters from {@code
-     * CharacterSequence}s provided by the given {@code Stream}.
-     *
-     * <p> This is a convenience method. For the general case use {@link
-     * #sendText(CharSequence, boolean)}.
-     *
-     * <p> Returns a {@code CompletableFuture<WebSocket>} which completes
-     * normally when the message has been sent or completes exceptionally if an
-     * error occurs.
-     *
-     * <p> Streamed character sequences should not be modified until the
-     * returned {@code CompletableFuture} completes (either normally or
-     * exceptionally).
-     *
-     * <p> The returned {@code CompletableFuture} can complete exceptionally
-     * with:
-     * <ul>
-     * <li> {@link IOException}
-     *          if an I/O error occurs during this operation
-     * <li> {@link IllegalStateException}
-     *          if the {@code WebSocket} closes while this operation is in progress;
-     *          or if a Close message has been sent already;
-     *          or if there is an outstanding send operation;
-     *          or if a previous Binary message was not sent with {@code isLast == true}
-     * </ul>
-     *
-     * @param message
-     *         the message
-     *
-     * @return a CompletableFuture with this WebSocket
-     *
-     * @throws IllegalArgumentException
-     *         if {@code message} is a malformed (or an incomplete) UTF-16 sequence
-     */
-    CompletableFuture<WebSocket> sendText(Stream<? extends CharSequence> message);
-
-    /**
      * Sends a Binary message with bytes from the given {@code ByteBuffer}.
      *
      * <p> Returns a {@code CompletableFuture<WebSocket>} which completes
@@ -737,7 +676,7 @@
      * @param message
      *         the message
      * @param isLast
-     *         {@code true} if this is the final part of the message,
+     *         {@code true} if this is the last part of the message,
      *         {@code false} otherwise
      *
      * @return a CompletableFuture with this WebSocket
@@ -745,43 +684,6 @@
     CompletableFuture<WebSocket> sendBinary(ByteBuffer message, boolean isLast);
 
     /**
-     * Sends a Binary message with bytes from the given {@code byte[]}.
-     *
-     * <p> Returns a {@code CompletableFuture<WebSocket>} which completes
-     * normally when the message has been sent or completes exceptionally if an
-     * error occurs.
-     *
-     * <p> The returned {@code CompletableFuture} can complete exceptionally
-     * with:
-     * <ul>
-     * <li> {@link IOException}
-     *          if an I/O error occurs during this operation
-     * <li> {@link IllegalStateException}
-     *          if the {@code WebSocket} closes while this operation is in progress;
-     *          or if a Close message has been sent already;
-     *          or if there is an outstanding send operation;
-     *          or if a previous Text message was not sent with {@code isLast == true}
-     * </ul>
-     *
-     * @implSpec This is equivalent to:
-     * <pre>{@code
-     *     sendBinary(ByteBuffer.wrap(message), isLast)
-     * }</pre>
-     *
-     * @param message
-     *         the message
-     * @param isLast
-     *         {@code true} if this is the final part of the message,
-     *         {@code false} otherwise
-     *
-     * @return a CompletableFuture with this WebSocket
-     */
-    default CompletableFuture<WebSocket> sendBinary(byte[] message, boolean isLast) {
-        Objects.requireNonNull(message, "message");
-        return sendBinary(ByteBuffer.wrap(message), isLast);
-    }
-
-    /**
      * Sends a Ping message.
      *
      * <p> Returns a {@code CompletableFuture<WebSocket>} which completes
@@ -858,10 +760,11 @@
      * normally when the message has been sent or completes exceptionally if an
      * error occurs.
      *
-     * <p> A Close message may consist of a close code and a reason for closing.
-     * The reason must have a valid UTF-8 representation not longer than {@code
-     * 123} bytes. The reason may be useful for debugging or passing information
-     * relevant to the connection but is not necessarily human readable.
+     * <p> A Close message may consist of a status code and a reason for
+     * closing. The reason must have a UTF-8 representation not longer than
+     * {@code 123} bytes. The reason may be useful for debugging or passing
+     * information relevant to the connection but is not necessarily human
+     * readable.
      *
      * <p> The returned {@code CompletableFuture} can complete exceptionally
      * with:
@@ -910,24 +813,21 @@
     CompletableFuture<WebSocket> sendClose();
 
     /**
-     * Requests {@code n} more messages to be received by the {@link Listener
+     * Allows {@code n} more messages to be received by the {@link Listener
      * Listener}.
      *
-     * <p> The actual number might be fewer if either of the endpoints decide to
-     * close the connection before that or an error occurs.
+     * <p> The actual number of received messages might be fewer if a Close
+     * message is received, the connection closes or an error occurs.
      *
      * <p> A {@code WebSocket} that has just been created, hasn't requested
      * anything yet. Usually the initial request for messages is done in {@link
      * Listener#onOpen(java.net.http.WebSocket) Listener.onOpen}.
      *
-     * If all requested messages have been received, and the server sends more,
-     * then these messages are queued.
-     *
      * @implNote This implementation does not distinguish between partial and
      * whole messages, because it's not known beforehand how a message will be
      * received.
      *
-     * <p> If a server sends more messages than requested, the implementation
+     * <p> If a server sends more messages than requested, this implementation
      * queues up these messages on the TCP connection and may eventually force
      * the sender to stop sending through TCP flow control.
      *
@@ -936,12 +836,8 @@
      *
      * @throws IllegalArgumentException
      *         if {@code n < 0}
-     *
-     * @return resulting unfulfilled demand with this request taken into account
      */
-    // TODO return void as it's breaking encapsulation (leaking info when exactly something deemed delivered)
-    // or demand behaves after LONG.MAX_VALUE
-    long request(long n);
+    void request(long n);
 
     /**
      * Returns a {@linkplain Builder#subprotocols(String, String...) subprotocol}
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/DigestClientId.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/DigestClientId.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, 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
@@ -60,7 +60,6 @@
 
     final private String[] propvals;
     final private int myHash;
-    private int pHash = 0;
 
     DigestClientId(int version, String hostname, int port,
         String protocol, Control[] bindCtls, OutputStream trace,
@@ -78,12 +77,9 @@
             propvals = new String[SASL_PROPS.length];
             for (int i = 0; i < SASL_PROPS.length; i++) {
                 propvals[i] = (String) env.get(SASL_PROPS[i]);
-                if (propvals[i] != null) {
-                    pHash = pHash * 31 + propvals[i].hashCode();
-                }
             }
         }
-        myHash = super.hashCode() + pHash;
+        myHash = super.hashCode() ^ Arrays.hashCode(propvals);
     }
 
     public boolean equals(Object obj) {
@@ -92,7 +88,6 @@
         }
         DigestClientId other = (DigestClientId)obj;
         return myHash == other.myHash
-            && pHash == other.pHash
             && super.equals(obj)
             && Arrays.equals(propvals, other.propvals);
     }
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/SimpleClientId.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/SimpleClientId.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, 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
@@ -49,21 +49,23 @@
                 socketFactory);
 
         this.username = username;
+        int pwdHashCode = 0;
         if (passwd == null) {
             this.passwd = null;
-        } else if (passwd instanceof String) {
-            this.passwd = passwd;
         } else if (passwd instanceof byte[]) {
             this.passwd = ((byte[])passwd).clone();
+            pwdHashCode = Arrays.hashCode((byte[])passwd);
         } else if (passwd instanceof char[]) {
             this.passwd = ((char[])passwd).clone();
+            pwdHashCode = Arrays.hashCode((char[])passwd);
         } else {
             this.passwd = passwd;
+            pwdHashCode = passwd.hashCode();
         }
 
         myHash = super.hashCode()
-            + (username != null ? username.hashCode() : 0)
-            + (passwd != null ? passwd.hashCode() : 0);
+            ^ (username != null ? username.hashCode() : 0)
+            ^ pwdHashCode;
     }
 
     public boolean equals(Object obj) {
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/wrapper/PKCS11.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/wrapper/PKCS11.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -54,6 +54,8 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
+import sun.security.util.Debug;
+
 import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
 
 /**
@@ -85,7 +87,8 @@
                 return null;
             }
         });
-        initializeLibrary();
+        boolean enableDebug = Debug.getInstance("sunpkcs11") != null;
+        initializeLibrary(enableDebug);
     }
 
     public static void loadNative() {
@@ -109,7 +112,7 @@
      * @preconditions
      * @postconditions
      */
-    private static native void initializeLibrary();
+    private static native void initializeLibrary(boolean debug);
 
     // XXX
     /**
--- a/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_general.c	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_general.c	Wed Jul 05 21:52:51 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.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -73,6 +73,8 @@
 
 JavaVM* jvm = NULL;
 
+jboolean debug = 0;
+
 JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {
     jvm = vm;
     return JNI_VERSION_1_4;
@@ -92,7 +94,7 @@
  */
 JNIEXPORT void JNICALL
 Java_sun_security_pkcs11_wrapper_PKCS11_initializeLibrary
-(JNIEnv *env, jclass thisClass)
+(JNIEnv *env, jclass thisClass, jboolean enableDebug)
 {
 #ifndef NO_CALLBACKS
     if (notifyListLock == NULL) {
@@ -101,6 +103,7 @@
 #endif
 
     prefetchFields(env, thisClass);
+    debug = enableDebug;
 }
 
 jclass fetchClass(JNIEnv *env, const char *name) {
--- a/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_keymgmt.c	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_keymgmt.c	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -152,6 +152,8 @@
     CK_OBJECT_HANDLE_PTR ckpKeyHandles;     /* pointer to array with Public and Private Key */
     jlongArray jKeyHandles = NULL;
     CK_RV rv;
+    int attempts;
+    const int MAX_ATTEMPTS = 3;
 
     CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj);
     if (ckpFunctions == NULL) { return NULL; }
@@ -190,10 +192,35 @@
         return NULL;
     }
 
-    rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism,
-                     ckpPublicKeyAttributes, ckPublicKeyAttributesLength,
-                     ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength,
-                     ckpPublicKeyHandle, ckpPrivateKeyHandle);
+    /*
+     * Workaround for NSS bug 1012786:
+     *
+     * Key generation may fail with CKR_FUNCTION_FAILED error
+     * if there is insufficient entropy to generate a random key.
+     *
+     * PKCS11 spec says the following about CKR_FUNCTION_FAILED error
+     * (see section 11.1.1):
+     *
+     *      ... In any event, although the function call failed, the situation
+     *      is not necessarily totally hopeless, as it is likely to be
+     *      when CKR_GENERAL_ERROR is returned. Depending on what the root cause of
+     *      the error actually was, it is possible that an attempt
+     *      to make the exact same function call again would succeed.
+     *
+     * Call C_GenerateKeyPair() several times if CKR_FUNCTION_FAILED occurs.
+     */
+    for (attempts = 0; attempts < MAX_ATTEMPTS; attempts++) {
+        rv = (*ckpFunctions->C_GenerateKeyPair)(ckSessionHandle, &ckMechanism,
+                        ckpPublicKeyAttributes, ckPublicKeyAttributesLength,
+                        ckpPrivateKeyAttributes, ckPrivateKeyAttributesLength,
+                        ckpPublicKeyHandle, ckpPrivateKeyHandle);
+        if (rv == CKR_FUNCTION_FAILED) {
+            printDebug("C_1GenerateKeyPair(): C_GenerateKeyPair() failed \
+                    with CKR_FUNCTION_FAILED error, try again\n");
+        } else {
+            break;
+        }
+    }
 
     if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
         jKeyHandles = ckULongArrayToJLongArray(env, ckpKeyHandles, 2);
--- a/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_util.c	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/p11_util.c	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -1143,3 +1143,15 @@
 
 #endif
 
+// prints a message to stdout if debug output is enabled
+void printDebug(const char *format, ...) {
+    if (debug == JNI_TRUE) {
+        va_list args;
+        fprintf(stdout, "sunpkcs11: ");
+        va_start(args, format);
+        vfprintf(stdout, format, args);
+        va_end(args);
+        fflush(stdout);
+    }
+}
+
--- a/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/pkcs11wrapper.h	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/native/libj2pkcs11/pkcs11wrapper.h	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 
 /* Copyright  (c) 2002 Graz University of Technology. All rights reserved.
@@ -159,6 +159,7 @@
 #include "pkcs-11v2-20a3.h"
 #include <jni.h>
 #include <jni_util.h>
+#include <stdarg.h>
 
 #define MAX_STACK_BUFFER_LEN (4 * 1024)
 #define MAX_HEAP_BUFFER_LEN (64 * 1024)
@@ -217,6 +218,10 @@
 #define TRACE_UNINTEND
 #endif
 
+/* debug output */
+extern jboolean debug;
+void printDebug(const char *format, ...);
+
 #define CK_ASSERT_OK 0L
 
 #define CLASS_INFO "sun/security/pkcs11/wrapper/CK_INFO"
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java	Wed Jul 05 21:52:51 2017 +0200
@@ -54,8 +54,8 @@
         }, "--dir"),
 
         new Option<JImageTask>(true, (task, option, arg) -> {
-            task.options.filters = arg;
-        }, "--filter"),
+            task.options.include = arg;
+        }, "--include"),
 
         new Option<JImageTask>(false, (task, option, arg) -> {
             task.options.fullVersion = true;
@@ -81,12 +81,12 @@
     private static final FileSystem JRT_FILE_SYSTEM = Utils.jrtFileSystem();
 
     private final OptionsValues options;
-    private final List<Predicate<String>> filterPredicates;
+    private final List<Predicate<String>> includePredicates;
     private PrintWriter log;
 
     JImageTask() {
         this.options = new OptionsValues();
-        this.filterPredicates = new ArrayList<>();
+        this.includePredicates = new ArrayList<>();
         log = null;
     }
 
@@ -98,7 +98,7 @@
     static class OptionsValues {
         Task task = Task.LIST;
         String directory = ".";
-        String filters = "";
+        String include = "";
         boolean fullVersion;
         boolean help;
         boolean verbose;
@@ -200,6 +200,8 @@
 
                         log.println(TASK_HELPER.getMessage("main.opt." + name));
                     }
+
+                    log.println(TASK_HELPER.getMessage("main.opt.footer"));
                 } else {
                     try {
                         log.println(TASK_HELPER.getMessage("main.usage." +
@@ -219,7 +221,7 @@
                 }
             }
 
-            processFilter(options.filters);
+            processInclude(options.include);
 
             return run() ? EXIT_OK : EXIT_ERROR;
         } catch (BadArgs e) {
@@ -239,15 +241,15 @@
         }
     }
 
-    private void processFilter(String filters) {
-        if (filters.isEmpty()) {
+    private void processInclude(String include) {
+        if (include.isEmpty()) {
             return;
         }
 
-        for (String filter : filters.split(",")) {
+        for (String filter : include.split(",")) {
             final PathMatcher matcher = Utils.getPathMatcher(JRT_FILE_SYSTEM, filter);
             Predicate<String> predicate = (path) -> matcher.matches(JRT_FILE_SYSTEM.getPath(path));
-            filterPredicates.add(predicate);
+            includePredicates.add(predicate);
         }
     }
 
@@ -388,9 +390,9 @@
                     String oldModule = "";
 
                     for (String name : entryNames) {
-                        boolean match = filterPredicates.isEmpty();
+                        boolean match = includePredicates.isEmpty();
 
-                        for (Predicate<String> predicate : filterPredicates) {
+                        for (Predicate<String> predicate : includePredicates) {
                             if (predicate.test(name)) {
                                 match = true;
                                 break;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties	Wed Jul 05 21:52:51 2017 +0200
@@ -62,9 +62,19 @@
 main.opt.dir=\
 \  --dir                             Target directory for extract directive
 
-main.opt.filter=\
-\  --filter                          Filter entries for list or extract\n\
-\                                    Ex. /java.base/*, */module-info.class
+main.opt.include=\
+\  --include <pattern-list>          Pattern list for filtering list or extract entries.
+
+main.opt.footer=\
+\n\
+\For options requiring a <pattern-list>, the value will be a comma\
+\ separated list of elements each using one the following forms:\n\
+\  <glob-pattern>\n\
+\  glob:<glob-pattern>\n\
+\  regex:<regex-pattern>\n\
+\  @<filename> where filename is the name of a file containing patterns to be\
+\ used, one pattern per line\n\
+
 
 main.opt.fullversion=\
 \  --fullversion                     Print full version information
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/AbstractModuleEntry.java	Wed Jul 05 21:52:51 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.  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.tools.jlink.internal;
+
+import java.io.InputStream;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+/**
+ * A LinkModuleEntry is the elementary unit of data inside an image. It is
+ * generally a file. e.g.: a java class file, a resource file, a shared library,
+ * ...
+ * <br>
+ * A LinkModuleEntry is identified by a path of the form:
+ * <ul>
+ * <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
+ * name}</li>
+ * <li>For other files (shared lib, launchers, config, ...):/{module name}/
+ * {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}</li>
+ * </ul>
+ */
+abstract class AbstractModuleEntry implements ModuleEntry {
+    private final String path;
+    private final String module;
+    private final Type type;
+
+    /**
+     * Create a new AbstractModuleEntry.
+     *
+     * @param module The module name.
+     * @param path The data path identifier.
+     * @param type The data type.
+     */
+    AbstractModuleEntry(String module, String path, Type type) {
+        this.module = Objects.requireNonNull(module);
+        this.path = Objects.requireNonNull(path);
+        this.type = Objects.requireNonNull(type);
+    }
+
+    @Override
+    public final String getModule() {
+        return module;
+    }
+
+    @Override
+    public final String getPath() {
+        return path;
+    }
+
+    @Override
+    public final Type getType() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 7;
+        hash = 89 * hash + Objects.hashCode(this.path);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof AbstractModuleEntry)) {
+            return false;
+        }
+        AbstractModuleEntry f = (AbstractModuleEntry) other;
+        return f.path.equals(path);
+    }
+
+    @Override
+    public String toString() {
+        return getPath();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ArchiveEntryModuleEntry.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+/**
+ * A ModuleEntry backed by a given Archive Entry.
+ */
+final class ArchiveEntryModuleEntry extends AbstractModuleEntry {
+    private final Archive.Entry entry;
+
+    /**
+     * Create a new ArchiveModuleEntry.
+     *
+     * @param module The module name.
+     * @param path The data path identifier.
+     * @param entry The archive Entry.
+     */
+    ArchiveEntryModuleEntry(String module, String path, Archive.Entry entry) {
+        super(module, path, getImageFileType(entry));
+        this.entry = entry;
+    }
+
+    @Override
+    public InputStream stream() {
+        try {
+            return entry.stream();
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        }
+    }
+
+    @Override
+    public long getLength() {
+        return entry.size();
+    }
+
+    private static ModuleEntry.Type getImageFileType(Archive.Entry entry) {
+        Objects.requireNonNull(entry);
+        switch(entry.type()) {
+            case CLASS_OR_RESOURCE:
+                return ModuleEntry.Type.CLASS_OR_RESOURCE;
+            case CONFIG:
+                return ModuleEntry.Type.CONFIG;
+            case NATIVE_CMD:
+                return ModuleEntry.Type.NATIVE_CMD;
+            case NATIVE_LIB:
+                return ModuleEntry.Type.NATIVE_LIB;
+            default:
+                return ModuleEntry.Type.OTHER;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ByteArrayModuleEntry.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,78 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UncheckedIOException;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+/**
+ * A ModuleEntry backed by a given byte[].
+ */
+class ByteArrayModuleEntry extends AbstractModuleEntry {
+    private final byte[] buffer;
+
+    /**
+     * Create a new ByteArrayModuleEntry.
+     *
+     * @param module The module name.
+     * @param path The data path identifier.
+     * @param type The data type.
+     * @param buf  The byte buffer.
+     */
+    ByteArrayModuleEntry(String module, String path, Type type, byte[] buffer) {
+        super(module, path, type);
+        this.buffer = Objects.requireNonNull(buffer);
+    }
+
+    @Override
+    public byte[] getBytes() {
+        return buffer.clone();
+    }
+
+    @Override
+    public InputStream stream() {
+        return new ByteArrayInputStream(buffer);
+    }
+
+    @Override
+    public void write(OutputStream out) {
+        try {
+            out.write(buffer);
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        }
+    }
+
+    @Override
+    public long getLength() {
+        return buffer.length;
+    }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java	Wed Jul 05 21:52:51 2017 +0200
@@ -233,8 +233,7 @@
 
         // write module content
         for (ModuleEntry res : content) {
-            byte[] buf = res.getBytes();
-            out.write(buf, 0, buf.length);
+            res.write(out);
         }
 
         tree.addContent(out);
@@ -244,21 +243,6 @@
         return resultResources;
     }
 
-    private static ModuleEntry.Type mapImageFileType(EntryType type) {
-        switch(type) {
-            case CONFIG: {
-                return ModuleEntry.Type.CONFIG;
-            }
-            case NATIVE_CMD: {
-                return ModuleEntry.Type.NATIVE_CMD;
-            }
-            case NATIVE_LIB: {
-                return ModuleEntry.Type.NATIVE_LIB;
-            }
-        }
-        return null;
-    }
-
     private static ModulePoolImpl createPools(Set<Archive> archives,
             Map<String, List<Entry>> entriesForModule,
             ByteOrder byteOrder,
@@ -278,34 +262,22 @@
         for (Archive archive : archives) {
             String mn = archive.moduleName();
             for (Entry entry : entriesForModule.get(mn)) {
-
+                String path;
                 if (entry.type() == EntryType.CLASS_OR_RESOURCE) {
                     // Removal of "classes/" radical.
-                    String path = entry.name();
-                    try (InputStream stream = entry.stream()) {
-                        byte[] bytes = readAllBytes(stream);
-                        if (path.endsWith("module-info.class")) {
-                            path = "/" + path;
-                        } else {
-                            path = "/" + mn + "/" + path;
-                        }
-                        try {
-                            resources.add(ModuleEntry.create(path, bytes));
-                        } catch (Exception ex) {
-                            throw new IOException(ex);
-                        }
+                    path = entry.name();
+                    if (path.endsWith("module-info.class")) {
+                        path = "/" + path;
+                    } else {
+                        path = "/" + mn + "/" + path;
                     }
                 } else {
-                    try {
-                        // Entry.path() contains the kind of file native, conf, bin, ...
-                        // Keep it to avoid naming conflict (eg: native/jvm.cfg and config/jvm.cfg
-                        resources.add(ModuleEntry.create(mn,
-                                "/" + mn + "/" + entry.path(), mapImageFileType(entry.type()),
-                                entry.stream(), entry.size()));
-                    } catch (Exception ex) {
-                        throw new IOException(ex);
-                    }
+                    // Entry.path() contains the kind of file native, conf, bin, ...
+                    // Keep it to avoid naming conflict (eg: native/jvm.cfg and config/jvm.cfg
+                    path = "/" + mn + "/" + entry.path();
                 }
+
+                resources.add(new ArchiveEntryModuleEntry(mn, path, entry));
             }
         }
         return resources;
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java	Wed Jul 05 21:52:51 2017 +0200
@@ -101,7 +101,7 @@
             List<Plugin> orderedPlugins = PluginOrderingGraph.sort(entry.getValue());
             Category category = entry.getKey();
             for (Plugin p : orderedPlugins) {
-                if (Utils.isPostProcessor(category)) {
+                if (category.isPostProcessor()) {
                     @SuppressWarnings("unchecked")
                     PostProcessorPlugin pp = (PostProcessorPlugin) p;
                     postProcessingPlugins.add(pp);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Wed Jul 05 21:52:51 2017 +0200
@@ -443,9 +443,7 @@
                         byte[] bytes = decompressor.decompressResource(getByteOrder(),
                                 (int offset) -> pool.getStringTable().getString(offset),
                                 res.getBytes());
-                        res = ModuleEntry.create(res.getPath(),
-                                new ByteArrayInputStream(bytes),
-                                bytes.length);
+                        res = res.create(bytes);
                     } catch (IOException ex) {
                         throw new PluginException(ex);
                     }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Wed Jul 05 21:52:51 2017 +0200
@@ -39,15 +39,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Date;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import jdk.internal.module.ConfigurableModuleFinder;
@@ -96,11 +88,9 @@
         }, "--help"),
         new Option<JlinkTask>(true, (task, opt, arg) -> {
             String[] dirs = arg.split(File.pathSeparator);
-            task.options.modulePath = new Path[dirs.length];
-            int i = 0;
-            for (String dir : dirs) {
-                task.options.modulePath[i++] = Paths.get(dir);
-            }
+            Arrays.stream(dirs)
+                  .map(Paths::get)
+                  .forEach(task.options.modulePath::add);
         }, "--modulepath", "--mp"),
         new Option<JlinkTask>(true, (task, opt, arg) -> {
             for (String mn : arg.split(",")) {
@@ -176,7 +166,7 @@
         String  saveoptsfile;
         boolean version;
         boolean fullVersion;
-        Path[] modulePath;
+        List<Path> modulePath = new ArrayList<>();
         Set<String> limitMods = new HashSet<>();
         Set<String> addMods = new HashSet<>();
         Path output;
@@ -186,7 +176,7 @@
 
     int run(String[] args) {
         if (log == null) {
-            setLog(new PrintWriter(System.err, true));
+            setLog(new PrintWriter(System.out, true));
         }
         try {
             optionsHelper.handleOptions(this, args);
@@ -203,7 +193,7 @@
                 return EXIT_OK;
             }
             if (taskHelper.getExistingImage() == null) {
-                if (options.modulePath == null || options.modulePath.length == 0) {
+                if (options.modulePath == null || options.modulePath.isEmpty()) {
                     throw taskHelper.newBadArgs("err.modulepath.must.be.specified").showUsage(true);
                 }
                 createImage();
@@ -245,7 +235,7 @@
      * Jlink API entry point.
      */
     public static void createImage(JlinkConfiguration config,
-            PluginsConfiguration plugins)
+                                   PluginsConfiguration plugins)
             throws Exception {
         Objects.requireNonNull(config);
         Objects.requireNonNull(config.getOutput());
@@ -254,10 +244,9 @@
         if (config.getModulepaths().isEmpty()) {
             throw new Exception("Empty module paths");
         }
-        Path[] arr = new Path[config.getModulepaths().size()];
-        arr = config.getModulepaths().toArray(arr);
+
         ModuleFinder finder
-                = newModuleFinder(arr, config.getLimitmods(), config.getModules());
+                = newModuleFinder(config.getModulepaths(), config.getLimitmods(), config.getModules());
 
         // First create the image provider
         ImageProvider imageProvider
@@ -332,10 +321,12 @@
         return addMods;
     }
 
-    private static ModuleFinder newModuleFinder(Path[] paths,
-            Set<String> limitMods,
-            Set<String> addMods) {
-        ModuleFinder finder = ModuleFinder.of(paths);
+    public static ModuleFinder newModuleFinder(List<Path> paths,
+                                               Set<String> limitMods,
+                                               Set<String> addMods)
+    {
+
+        ModuleFinder finder = ModuleFinder.of(paths.toArray(new Path[0]));
 
         // jmods are located at link-time
         if (finder instanceof ConfigurableModuleFinder) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryFactory.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.tools.jlink.internal;
+
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+public final class ModuleEntryFactory {
+    private ModuleEntryFactory() {}
+
+    public static ModuleEntry create(String path,
+            ModuleEntry.Type type, byte[] content) {
+        return new ByteArrayModuleEntry(moduleFrom(path), path, type, content);
+    }
+
+    public static ModuleEntry create(String path,
+            ModuleEntry.Type type, Path file) {
+        return new PathModuleEntry(moduleFrom(path), path, type, file);
+    }
+
+    public static ModuleEntry create(ModuleEntry original, byte[] content) {
+        return new ByteArrayModuleEntry(original.getModule(),
+                original.getPath(), original.getType(), content);
+    }
+
+    public static ModuleEntry create(ModuleEntry original, Path file) {
+        return new PathModuleEntry(original.getModule(),
+                original.getPath(), original.getType(), file);
+    }
+
+    private static String moduleFrom(String path) {
+        Objects.requireNonNull(path);
+        if (path.isEmpty() || path.charAt(0) != '/') {
+            throw new IllegalArgumentException(path + " must start with /");
+        }
+        String noRoot = path.substring(1);
+        int idx = noRoot.indexOf('/');
+        if (idx == -1) {
+            throw new IllegalArgumentException("/ missing after module: " + path);
+        }
+        return noRoot.substring(0, idx);
+    }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModuleEntryImpl.java	Fri Jun 24 14:46:45 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +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.  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.tools.jlink.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UncheckedIOException;
-import java.util.Objects;
-import jdk.tools.jlink.plugin.ModuleEntry;
-
-/**
- * A LinkModuleEntry is the elementary unit of data inside an image. It is
- * generally a file. e.g.: a java class file, a resource file, a shared library,
- * ...
- * <br>
- * A LinkModuleEntry is identified by a path of the form:
- * <ul>
- * <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
- * name}</li>
- * <li>For other files (shared lib, launchers, config, ...):/{module name}/
- * {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}</li>
- * </ul>
- */
-public class ModuleEntryImpl implements ModuleEntry {
-
-    private final Type type;
-    private final String path;
-    private final String module;
-    private final long length;
-    private final InputStream stream;
-    private byte[] buffer;
-
-    /**
-     * Create a new LinkModuleEntry.
-     *
-     * @param module The module name.
-     * @param path The data path identifier.
-     * @param type The data type.
-     * @param stream The data content stream.
-     * @param length The stream length.
-     */
-    public ModuleEntryImpl(String module, String path, Type type, InputStream stream, long length) {
-        Objects.requireNonNull(module);
-        Objects.requireNonNull(path);
-        Objects.requireNonNull(type);
-        Objects.requireNonNull(stream);
-        this.path = path;
-        this.type = type;
-        this.module = module;
-        this.stream = stream;
-        this.length = length;
-    }
-
-    /**
-     * The LinkModuleEntry module name.
-     *
-     * @return The module name.
-     */
-    @Override
-    public final String getModule() {
-        return module;
-    }
-
-    /**
-     * The LinkModuleEntry path.
-     *
-     * @return The module path.
-     */
-    @Override
-    public final String getPath() {
-        return path;
-    }
-
-    /**
-     * The LinkModuleEntry's type.
-     *
-     * @return The data type.
-     */
-    @Override
-    public final Type getType() {
-        return type;
-    }
-
-    /**
-     * The LinkModuleEntry content as an array of byte.
-     *
-     * @return An Array of bytes.
-     */
-    @Override
-    public byte[] getBytes() {
-        if (buffer == null) {
-            try (InputStream is = stream) {
-                buffer = is.readAllBytes();
-            } catch (IOException ex) {
-                throw new UncheckedIOException(ex);
-            }
-        }
-        return buffer;
-    }
-
-    /**
-     * The LinkModuleEntry content length.
-     *
-     * @return The length.
-     */
-    @Override
-    public long getLength() {
-        return length;
-    }
-
-    /**
-     * The LinkModuleEntry stream.
-     *
-     * @return The module data stream.
-     */
-    @Override
-    public InputStream stream() {
-        return stream;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 7;
-        hash = 89 * hash + Objects.hashCode(this.path);
-        return hash;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof ModuleEntryImpl)) {
-            return false;
-        }
-        ModuleEntryImpl f = (ModuleEntryImpl) other;
-        return f.path.equals(path);
-    }
-
-    @Override
-    public String toString() {
-        return getPath();
-    }
-}
\ No newline at end of file
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ModulePoolImpl.java	Wed Jul 05 21:52:51 2017 +0200
@@ -95,7 +95,7 @@
         @Override
         public void add(ModuleEntry data) {
             if (isReadOnly()) {
-                throw new PluginException("LinkConfiguration is readonly");
+                throw new PluginException("ModulePool is readonly");
             }
             Objects.requireNonNull(data);
             if (!data.getModule().equals(name)) {
@@ -180,7 +180,7 @@
     @Override
     public void add(ModuleEntry data) {
         if (isReadOnly()) {
-            throw new PluginException("LinkConfiguration is readonly");
+            throw new PluginException("ModulePool is readonly");
         }
         Objects.requireNonNull(data);
         if (resources.get(data.getPath()) != null) {
@@ -215,7 +215,7 @@
     }
 
     /**
-     * The stream of modules contained in this LinkConfiguration.
+     * The stream of modules contained in this ModulePool.
      *
      * @return The stream of modules.
      */
@@ -225,7 +225,7 @@
     }
 
     /**
-     * Return the number of LinkModule count in this LinkConfiguration.
+     * Return the number of LinkModule count in this ModulePool.
      *
      * @return the module count.
      */
@@ -235,7 +235,7 @@
     }
 
     /**
-     * Get all ModuleEntry contained in this LinkConfiguration instance.
+     * Get all ModuleEntry contained in this ModulePool instance.
      *
      * @return The stream of LinkModuleEntries.
      */
@@ -245,7 +245,7 @@
     }
 
     /**
-     * Return the number of ModuleEntry count in this LinkConfiguration.
+     * Return the number of ModuleEntry count in this ModulePool.
      *
      * @return the entry count.
      */
@@ -267,7 +267,7 @@
     }
 
     /**
-     * Check if the LinkConfiguration contains the given ModuleEntry.
+     * Check if the ModulePool contains the given ModuleEntry.
      *
      * @param data The module data to check existence for.
      * @return The module data or null if not found.
@@ -279,7 +279,7 @@
     }
 
     /**
-     * Check if the LinkConfiguration contains some content at all.
+     * Check if the ModulePool contains some content at all.
      *
      * @return True, no content, false otherwise.
      */
@@ -289,16 +289,16 @@
     }
 
     /**
-     * Visit each ModuleEntry in this LinkConfiguration to transform it and
-     * copy the transformed ModuleEntry to the output LinkConfiguration.
+     * Visit each ModuleEntry in this ModulePool to transform it and
+     * copy the transformed ModuleEntry to the output ModulePool.
      *
      * @param transform The function called for each ModuleEntry found in
-     * the LinkConfiguration. The transform function should return a
+     * the ModulePool. The transform function should return a
      * ModuleEntry instance which will be added to the output or it should
      * return null if the passed ModuleEntry is to be ignored for the
      * output.
      *
-     * @param output The LinkConfiguration to be filled with Visitor returned
+     * @param output The ModulePool to be filled with Visitor returned
      * ModuleEntry.
      */
     @Override
@@ -351,14 +351,13 @@
     /**
      * A resource that has been compressed.
      */
-    public static final class CompressedModuleData extends ModuleEntryImpl {
+    public static final class CompressedModuleData extends ByteArrayModuleEntry {
 
         final long uncompressed_size;
 
         private CompressedModuleData(String module, String path,
-                InputStream stream, long size,
-                long uncompressed_size) {
-            super(module, path, ModuleEntry.Type.CLASS_OR_RESOURCE, stream, size);
+                byte[] content, long uncompressed_size) {
+            super(module, path, ModuleEntry.Type.CLASS_OR_RESOURCE, content);
             this.uncompressed_size = uncompressed_size;
         }
 
@@ -413,8 +412,7 @@
 
         CompressedModuleData compressedResource
                 = new CompressedModuleData(original.getModule(), original.getPath(),
-                        new ByteArrayInputStream(contentWithHeader),
-                        contentWithHeader.length, uncompressed_size);
+                        contentWithHeader, uncompressed_size);
         return compressedResource;
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/PathModuleEntry.java	Wed Jul 05 21:52:51 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.  Oracle designates this
+ * particular file as subject to the "Classfile" 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.tools.jlink.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Objects;
+import jdk.tools.jlink.plugin.ModuleEntry;
+
+/**
+ * A ModuleEntry backed by a given nio Path.
+ */
+public class PathModuleEntry extends AbstractModuleEntry {
+    private final Path file;
+
+    /**
+     * Create a new PathModuleEntry.
+     *
+     * @param module The module name.
+     * @param file The data file identifier.
+     * @param type The data type.
+     * @param file The Path for the resource content.
+     */
+    public PathModuleEntry(String module, String path, Type type, Path file) {
+        super(module, path, type);
+        this.file = Objects.requireNonNull(file);
+        if (!Files.isRegularFile(file)) {
+            throw new IllegalArgumentException(file + " not a file");
+        }
+    }
+
+    @Override
+    public final InputStream stream() {
+        try {
+            return Files.newInputStream(file);
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        }
+    }
+
+    @Override
+    public final long getLength() {
+        try {
+            return Files.size(file);
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        }
+    }
+}
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Wed Jul 05 21:52:51 2017 +0200
@@ -584,6 +584,8 @@
                     showPlugin(plugin, log, showsImageBuilder);
                 }
             }
+
+            log.println("\n" + bundleHelper.getMessage("main.extended.help.footer"));
         }
 
         private void showPlugin(Plugin plugin, PrintWriter log, boolean showsImageBuilder) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java	Wed Jul 05 21:52:51 2017 +0200
@@ -35,7 +35,6 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
-import java.util.Set;
 import java.util.stream.Collectors;
 import jdk.tools.jlink.plugin.Plugin;
 import jdk.tools.jlink.plugin.Plugin.Category;
@@ -57,46 +56,16 @@
                      .collect(Collectors.toList());
     }
 
-    public static boolean isPostProcessor(Category category) {
-        return category.equals(Category.VERIFIER)
-                || category.equals(Category.PROCESSOR)
-                || category.equals(Category.PACKAGER);
-    }
-
-    public static boolean isPreProcessor(Category category) {
-        return category.equals(Category.COMPRESSOR)
-                || category.equals(Category.FILTER)
-                || category.equals(Category.MODULEINFO_TRANSFORMER)
-                || category.equals(Category.SORTER)
-                || category.equals(Category.TRANSFORMER)
-                || category.equals(Category.METAINFO_ADDER);
-    }
-
     public static boolean isPostProcessor(Plugin provider) {
-        Set<Category> types = provider.getType();
-        Objects.requireNonNull(types);
-        for (Category pt : types) {
-            return isPostProcessor(pt);
-        }
-        return false;
+        return provider.getType().isPostProcessor();
     }
 
     public static boolean isPreProcessor(Plugin provider) {
-        Set<Category> types = provider.getType();
-        Objects.requireNonNull(types);
-        for (Category pt : types) {
-            return isPreProcessor(pt);
-        }
-        return false;
+        return !isPostProcessor(provider);
     }
 
     public static Category getCategory(Plugin provider) {
-        Set<Category> types = provider.getType();
-        Objects.requireNonNull(types);
-        for (Category t : types) {
-            return t;
-        }
-        return null;
+        return provider.getType();
     }
 
     public static List<Plugin> getPreProcessors(List<Plugin> plugins) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Wed Jul 05 21:52:51 2017 +0200
@@ -27,36 +27,19 @@
 
 
 import jdk.tools.jlink.Jlink;
-import jdk.tools.jlink.builder.ImageBuilder;
+import jdk.tools.jlink.builder.DefaultImageBuilder;
+import jdk.tools.jlink.internal.JlinkTask;
 import jdk.tools.jlink.plugin.Plugin;
-import jdk.tools.jlink.builder.*;
-import jdk.tools.jlink.plugin.ModulePool;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringReader;
+import java.lang.module.ModuleFinder;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
-import java.util.ResourceBundle;
 import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.TreeSet;
-import java.util.stream.Collectors;
 
 /**
  * AppRuntimeImageBuilder is a private API used only by the Java Packager to generate
@@ -143,4 +126,14 @@
         Jlink jlink = new Jlink();
         jlink.build(jlinkConfig, pluginConfig);
     }
+
+    /**
+     * Returns a ModuleFinder that limits observability to the given root
+     * modules, their transitive dependences, plus a set of other modules.
+     */
+    public static ModuleFinder moduleFinder(List<Path> modulepaths,
+                                            Set<String> roots,
+                                            Set<String> otherModules) {
+        return JlinkTask.newModuleFinder(modulepaths, roots, otherModules);
+    }
 }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,9 +25,7 @@
 package jdk.tools.jlink.internal.plugins;
 
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 import jdk.tools.jlink.internal.ModulePoolImpl;
 import jdk.tools.jlink.plugin.ModulePool;
@@ -77,10 +75,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.COMPRESSOR);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.COMPRESSOR;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -26,9 +26,7 @@
 
 import java.io.UncheckedIOException;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 import java.util.function.Predicate;
 import jdk.tools.jlink.plugin.TransformerPlugin;
 import jdk.tools.jlink.plugin.ModulePool;
@@ -60,10 +58,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.FILTER);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.FILTER;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,9 +25,7 @@
 package jdk.tools.jlink.internal.plugins;
 
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 import java.util.function.Predicate;
 import jdk.tools.jlink.plugin.TransformerPlugin;
 import jdk.tools.jlink.plugin.ModuleEntry;
@@ -73,10 +71,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.FILTER);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.FILTER;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -32,10 +32,8 @@
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -159,10 +157,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.FILTER);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.FILTER;
     }
 
     @Override
@@ -248,10 +244,7 @@
 
         byte[] content = builder.toString().getBytes(StandardCharsets.UTF_8);
 
-        return ModuleEntry.create(orig.getModule(),
-                orig.getPath(),
-                orig.getType(),
-                new ByteArrayInputStream(content), content.length);
+        return orig.create(content);
     }
 
     private static String jvmlib() {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -36,12 +36,10 @@
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
-import jdk.tools.jlink.internal.ModuleEntryImpl;
+import jdk.tools.jlink.internal.PathModuleEntry;
 import jdk.tools.jlink.plugin.PluginException;
 import jdk.tools.jlink.plugin.ModuleEntry;
 import jdk.tools.jlink.plugin.ModulePool;
@@ -68,13 +66,13 @@
     /**
      * Symbolic link to another path.
      */
-    public static abstract class SymImageFile extends ModuleEntryImpl {
+    public static abstract class SymImageFile extends PathModuleEntry {
 
         private final String targetPath;
 
         public SymImageFile(String targetPath, String module, String path,
-                ModuleEntry.Type type, InputStream stream, long size) {
-            super(module, path, type, stream, size);
+                ModuleEntry.Type type, Path file) {
+            super(module, path, type, file);
             this.targetPath = targetPath;
         }
 
@@ -87,23 +85,7 @@
 
         public SymImageFileImpl(String targetPath, Path file, String module,
                 String path, ModuleEntry.Type type) {
-            super(targetPath, module, path, type, newStream(file), length(file));
-        }
-    }
-
-    private static long length(Path file) {
-        try {
-            return Files.size(file);
-        } catch (IOException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
-    private static InputStream newStream(Path file) {
-        try {
-            return Files.newInputStream(file);
-        } catch (IOException ex) {
-            throw new UncheckedIOException(ex);
+            super(targetPath, module, path, type, file);
         }
     }
 
@@ -177,9 +159,9 @@
         Objects.requireNonNull(pool);
         Objects.requireNonNull(file);
         Objects.requireNonNull(path);
-        ModuleEntry impl = ModuleEntry.create(FAKE_MODULE,
+        ModuleEntry impl = ModuleEntry.create(
                 "/" + FAKE_MODULE + "/other/" + path,
-                ModuleEntry.Type.OTHER, newStream(file), length(file));
+                ModuleEntry.Type.OTHER, file);
         try {
             pool.add(impl);
         } catch (Exception ex) {
@@ -188,13 +170,6 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.TRANSFORMER);
-        return Collections.unmodifiableSet(set);
-    }
-
-    @Override
     public void configure(Map<String, String> config) {
         List<String> arguments = Utils.parseList(config.get(NAME));
         if (arguments.isEmpty()) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -61,11 +61,6 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        return Collections.singleton(Category.TRANSFORMER);
-    }
-
-    @Override
     public String getName() {
         return NAME;
     }
@@ -176,10 +171,9 @@
             byte[] bytes = result.getValue();
 
             // Add class to pool
-            ModuleEntry ndata = ModuleEntry.create(data.getModule(),
+            ModuleEntry ndata = ModuleEntry.create(
                     "/java.base/" + className + ".class",
-                    ModuleEntry.Type.CLASS_OR_RESOURCE,
-                    new ByteArrayInputStream(bytes), bytes.length);
+                    bytes);
             if (!out.contains(ndata)) {
                 out.add(ndata);
             }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,9 +25,9 @@
 package jdk.tools.jlink.internal.plugins;
 
 import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.IllformedLocaleException;
 import java.util.Locale;
 import java.util.List;
@@ -82,15 +82,15 @@
         "sun.util.resources.ext",
         "sun.util.resources.provider");
     private static final String METAINFONAME = "LocaleDataMetaInfo";
-    private static final String META_FILES =
-        "*module-info.class," +
-        "*LocaleDataProvider.class," +
-        "*" + METAINFONAME + ".class,";
-    private static final String INCLUDE_LOCALE_FILES =
-        "*sun/text/resources/ext/[^\\/]+_%%.class," +
-        "*sun/util/resources/ext/[^\\/]+_%%.class," +
-        "*sun/text/resources/cldr/ext/[^\\/]+_%%.class," +
-        "*sun/util/resources/cldr/ext/[^\\/]+_%%.class,";
+    private static final List<String> META_FILES = List.of(
+        ".+module-info.class",
+        ".+LocaleDataProvider.class",
+        ".+" + METAINFONAME + ".class");
+    private static final List<String> INCLUDE_LOCALE_FILES = List.of(
+        ".+sun/text/resources/ext/[^_]+_",
+        ".+sun/util/resources/ext/[^_]+_",
+        ".+sun/text/resources/cldr/ext/[^_]+_",
+        ".+sun/util/resources/cldr/ext/[^_]+_");
     private Predicate<String> predicate;
     private String userParam;
     private List<Locale.LanguageRange> priorityList;
@@ -123,9 +123,7 @@
                     if (Arrays.stream(cr.getInterfaces())
                         .anyMatch(i -> i.contains(METAINFONAME)) &&
                         stripUnsupportedLocales(bytes, cr)) {
-                        resource = ModuleEntry.create(MODULENAME, path,
-                            resource.getType(),
-                            new ByteArrayInputStream(bytes), bytes.length);
+                        resource = resource.create(bytes);
                     }
                 }
             }
@@ -134,10 +132,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.FILTER);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.FILTER;
     }
 
     @Override
@@ -206,15 +202,17 @@
                 String.format(PluginsResourceBundle.getMessage(NAME + ".nomatchinglocales"), userParam));
         }
 
-        String value = META_FILES + filtered.stream()
-            .map(s -> includeLocaleFilePatterns(s))
-            .collect(Collectors.joining(","));
+        List<String> value = Stream.concat(
+                META_FILES.stream(),
+                filtered.stream().flatMap(s -> includeLocaleFilePatterns(s).stream()))
+            .map(s -> "regex:" + s)
+            .collect(Collectors.toList());
         predicate = ResourceFilter.includeFilter(value);
     }
 
-    private String includeLocaleFilePatterns(String tag) {
+    private List<String> includeLocaleFilePatterns(String tag) {
+        List<String> files = new ArrayList<>();
         String pTag = tag.replaceAll("-", "_");
-        String files = "";
         int lastDelimiter = tag.length();
         String isoSpecial = pTag.matches("^(he|yi|id).*") ?
                             pTag.replaceFirst("he", "iw")
@@ -224,11 +222,11 @@
         // Add tag patterns including parents
         while (true) {
             pTag = pTag.substring(0, lastDelimiter);
-            files += INCLUDE_LOCALE_FILES.replaceAll("%%", pTag);
+            files.addAll(includeLocaleFiles(pTag));
 
             if (!isoSpecial.isEmpty()) {
                 isoSpecial = isoSpecial.substring(0, lastDelimiter);
-                files += INCLUDE_LOCALE_FILES.replaceAll("%%", isoSpecial);
+                files.addAll(includeLocaleFiles(isoSpecial));
             }
 
             lastDelimiter = pTag.lastIndexOf('_');
@@ -240,31 +238,37 @@
         final String lang = pTag;
 
         // Add possible special locales of the COMPAT provider
-        files += Set.of(jaJPJPTag, noNONYTag, thTHTHTag).stream()
+        Set.of(jaJPJPTag, noNONYTag, thTHTHTag).stream()
             .filter(stag -> lang.equals(stag.substring(0,2)))
-            .map(t -> INCLUDE_LOCALE_FILES.replaceAll("%%", t.replaceAll("-", "_")))
-            .collect(Collectors.joining(","));
+            .map(t -> includeLocaleFiles(t.replaceAll("-", "_")))
+            .forEach(files::addAll);
 
         // Add possible UN.M49 files (unconditional for now) for each language
-        files += INCLUDE_LOCALE_FILES.replaceAll("%%", lang + "_[0-9]{3}");
+        files.addAll(includeLocaleFiles(lang + "_[0-9]{3}"));
         if (!isoSpecial.isEmpty()) {
-            files += INCLUDE_LOCALE_FILES.replaceAll("%%", isoSpecial + "_[0-9]{3}");
+            files.addAll(includeLocaleFiles(isoSpecial + "_[0-9]{3}"));
         }
 
         // Add Thai BreakIterator related data files
         if (lang.equals("th")) {
-            files += "*sun/text/resources/thai_dict," +
-                     "*sun/text/resources/[^\\/]+BreakIteratorData_th,";
+            files.add(".+sun/text/resources/thai_dict");
+            files.add(".+sun/text/resources/[^_]+BreakIteratorData_th");
         }
 
         // Add Taiwan resource bundles for Hong Kong
         if (tag.startsWith("zh-HK")) {
-            files += INCLUDE_LOCALE_FILES.replaceAll("%%", "zh_TW");
+            files.addAll(includeLocaleFiles("zh_TW"));
         }
 
         return files;
     }
 
+    private List<String> includeLocaleFiles(String localeStr) {
+        return INCLUDE_LOCALE_FILES.stream()
+            .map(s -> s + localeStr + ".class")
+            .collect(Collectors.toList());
+    }
+
     private boolean stripUnsupportedLocales(byte[] bytes, ClassReader cr) {
         char[] buf = new char[cr.getMaxStringLength()];
         boolean[] modified = new boolean[1];
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -31,7 +31,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -284,11 +283,4 @@
             }
         }
     }
-
-    @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.TRANSFORMER);
-        return Collections.unmodifiableSet(set);
-    }
 }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -32,7 +32,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -143,11 +142,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.SORTER);
-
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.SORTER;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -49,8 +49,8 @@
     private final Map<String, String> release = new HashMap<>();
 
     @Override
-    public Set<Category> getType() {
-        return Collections.singleton(Category.METAINFO_ADDER);
+    public Category getType() {
+        return Category.METAINFO_ADDER;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -343,10 +343,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.COMPRESSOR);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.COMPRESSOR;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -27,8 +27,6 @@
 import java.io.ByteArrayInputStream;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
 import java.util.function.Predicate;
 import jdk.internal.org.objectweb.asm.ClassReader;
 import jdk.internal.org.objectweb.asm.ClassWriter;
@@ -58,13 +56,6 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.TRANSFORMER);
-        return Collections.unmodifiableSet(set);
-    }
-
-    @Override
     public String getDescription() {
         return PluginsResourceBundle.getDescription(NAME);
     }
@@ -84,7 +75,7 @@
                         ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
                         reader.accept(writer, ClassReader.SKIP_DEBUG);
                         byte[] content = writer.toByteArray();
-                        res = ModuleEntry.create(path, new ByteArrayInputStream(content), content.length);
+                        res = resource.create(content);
                     }
                 }
             } else if (predicate.test(res.getPath())) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -25,8 +25,6 @@
 package jdk.tools.jlink.internal.plugins;
 
 import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
 import jdk.tools.jlink.plugin.ModuleEntry;
 import jdk.tools.jlink.plugin.ModulePool;
 import jdk.tools.jlink.plugin.TransformerPlugin;
@@ -45,10 +43,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.FILTER);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.FILTER;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -83,11 +83,6 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        return Collections.singleton(Category.TRANSFORMER);
-    }
-
-    @Override
     public String getName() {
         return NAME;
     }
@@ -144,11 +139,7 @@
                     ModuleInfoRewriter minfoWriter =
                         new ModuleInfoRewriter(bain, mbuilder.conceals());
                     // replace with the overridden version
-                    data = ModuleEntry.create(data.getModule(),
-                                               data.getPath(),
-                                               data.getType(),
-                                               minfoWriter.stream(),
-                                               minfoWriter.size());
+                    data = data.create(minfoWriter.getBytes());
                 }
                 out.add(data);
             } catch (IOException e) {
@@ -163,12 +154,7 @@
                 return;
             if (builder.isOverriddenClass(data.getPath())) {
                 byte[] bytes = cwriter.toByteArray();
-                ModuleEntry ndata =
-                    ModuleEntry.create(data.getModule(),
-                                        data.getPath(),
-                                        data.getType(),
-                                        new ByteArrayInputStream(bytes),
-                                        bytes.length);
+                ModuleEntry ndata = data.create(bytes);
                 out.add(ndata);
             } else {
                 out.add(data);
@@ -188,8 +174,8 @@
             this.extender.write(this);
         }
 
-        InputStream stream() {
-            return new ByteArrayInputStream(buf);
+        byte[] getBytes() {
+            return buf;
         }
     }
 
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -29,9 +29,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 import java.util.function.Predicate;
 import java.util.zip.Deflater;
 import jdk.tools.jlink.internal.ModulePoolImpl;
@@ -66,10 +64,8 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.COMPRESSOR);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.COMPRESSOR;
     }
 
     @Override
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/asm/AsmPoolImpl.java	Wed Jul 05 21:52:51 2017 +0200
@@ -93,8 +93,7 @@
             }
 
             byte[] content = writer.toByteArray();
-            ModuleEntry res = ModuleEntry.create(path,
-                    new ByteArrayInputStream(content), content.length);
+            ModuleEntry res = ModuleEntry.create(path, content);
             transformedClasses.put(className, res);
         }
 
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ModuleEntry.java	Wed Jul 05 21:52:51 2017 +0200
@@ -26,16 +26,18 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
-import java.util.Objects;
-import jdk.tools.jlink.internal.ImageFileCreator;
-import jdk.tools.jlink.internal.ModuleEntryImpl;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import jdk.tools.jlink.internal.ModuleEntryFactory;
 
 /**
- * A LinkModuleEntry is the elementary unit of data inside an image. It is
- * generally a file. e.g.: a java class file, a resource file, a shared library,
- * ...
+ * A ModuleEntry is the elementary unit of data inside an image. It is
+ * generally a file. e.g.: a java class file, a resource file, a shared library.
  * <br>
- * A LinkModuleEntry is identified by a path of the form:
+ * A ModuleEntry is identified by a path of the form:
  * <ul>
  * <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
  * name}</li>
@@ -63,93 +65,133 @@
         OTHER
     }
     /**
-     * The LinkModuleEntry module name.
+     * The ModuleEntry module name.
      *
      * @return The module name.
      */
     public String getModule();
 
     /**
-     * The LinkModuleEntry path.
+     * The ModuleEntry path.
      *
      * @return The module path.
      */
     public String getPath();
 
     /**
-     * The LinkModuleEntry's type.
+     * The ModuleEntry's type.
      *
      * @return The data type.
      */
     public Type getType();
 
     /**
-     * The LinkModuleEntry content as an array of byte.
+     * The ModuleEntry content as an array of bytes.
      *
      * @return An Array of bytes.
      */
-    public byte[] getBytes();
+    public default byte[] getBytes() {
+        try (InputStream is = stream()) {
+            return is.readAllBytes();
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        }
+    }
 
     /**
-     * The LinkModuleEntry content length.
+     * The ModuleEntry content length.
      *
      * @return The length.
      */
     public long getLength();
 
     /**
-     * The LinkModuleEntry stream.
+     * The ModuleEntry stream.
      *
      * @return The module data stream.
      */
     public InputStream stream();
 
+    /**
+     * Write the content of this ModuleEntry to stream.
+     *
+     * @param out the output stream
+     */
+    public default void write(OutputStream out) {
+        try {
+            out.write(getBytes());
+        } catch (IOException ex) {
+            throw new UncheckedIOException(ex);
+        }
+    }
 
     /**
-     * Create a LinkModuleEntry located inside a jimage file. Such
-     * LinkModuleEntry has a Type being equals to CLASS_OR_RESOURCE.
+     * Create a ModuleEntry with new content but other information
+     * copied from this ModuleEntry.
      *
-     * @param path The complete resource path (contains the module radical).
-     * @param content The resource content.
-     * @param size The content size.
-     * @return A new LinkModuleEntry.
+     * @param content The new resource content.
+     * @return A new ModuleEntry.
      */
-    public static ModuleEntry create(String path, InputStream content, long size) {
-        Objects.requireNonNull(path);
-        Objects.requireNonNull(content);
-        String[] split = ImageFileCreator.splitPath(path);
-        String module = split[0];
-        return new ModuleEntryImpl(module, path, Type.CLASS_OR_RESOURCE, content, size);
+    public default ModuleEntry create(byte[] content) {
+        return ModuleEntryFactory.create(this, content);
     }
 
     /**
-     * Create a LinkModuleEntry for a file that will be located inside a jimage
-     * file.
+     * Create a ModuleEntry with new content but other information
+     * copied from this ModuleEntry.
+     *
+     * @param file The new resource content.
+     * @return A new ModuleEntry.
+     */
+    public default ModuleEntry create(Path file) {
+        return ModuleEntryFactory.create(this, file);
+    }
+
+    /**
+     * Create a ModuleEntry for a resource of the given type.
+     *
+     * @param path The resource path.
+     * @param type The ModuleEntry type.
+     * @param content The resource content.
+     * @return A new ModuleEntry.
+     */
+    public static ModuleEntry create(String path,
+            ModuleEntry.Type type, byte[] content) {
+        return ModuleEntryFactory.create(path, type, content);
+    }
+
+    /**
+     * Create a ModuleEntry for a resource of type {@link Type#CLASS_OR_RESOURCE}.
      *
      * @param path The resource path.
      * @param content The resource content.
-     * @return A new LinkModuleEntry.
+     * @return A new ModuleEntry.
      */
     public static ModuleEntry create(String path, byte[] content) {
-        return create(path, new ByteArrayInputStream(content),
-                content.length);
+        return create(path, Type.CLASS_OR_RESOURCE, content);
     }
 
     /**
-     * Create a LinkModuleEntry for a file that will be located outside a jimage
-     * file.
+     * Create a ModuleEntry for a resource of the given type.
      *
-     * @param module The module in which this files is located.
-     * @param path The file path locator (doesn't contain the module name).
-     * @param type The LinkModuleEntry type.
-     * @param content The file content.
-     * @param size The content size.
-     * @return A new LinkModuleEntry.
+     * @param path The resource path.
+     * @param type The ModuleEntry type.
+     * @param file The resource file.
+     * @return A new ModuleEntry.
      */
-    public static ModuleEntry create(String module, String path, ModuleEntry.Type type,
-            InputStream content, long size) {
-        Objects.requireNonNull(path);
-        Objects.requireNonNull(content);
-        return new ModuleEntryImpl(module, path, type, content, size);
+    public static ModuleEntry create(String path,
+            ModuleEntry.Type type, Path file) {
+        return ModuleEntryFactory.create(path, type, file);
+    }
+
+    /**
+     * Create a ModuleEntry for a resource of type {@link Type#CLASS_OR_RESOURCE}.
+     *
+     * @param path The resource path.
+     * @param file The resource file.
+     * @return A new ModuleEntry.
+     */
+    public static ModuleEntry create(String path, Path file) {
+        return create(path, Type.CLASS_OR_RESOURCE, file);
     }
 }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -57,19 +57,29 @@
         SORTER("SORTER"),
         COMPRESSOR("COMPRESSOR"),
         METAINFO_ADDER("METAINFO_ADDER"),
-        VERIFIER("VERIFIER"),
-        PROCESSOR("PROCESSOR"),
-        PACKAGER("PACKAGER");
+        VERIFIER("VERIFIER", true),
+        PROCESSOR("PROCESSOR", true),
+        PACKAGER("PACKAGER", true);
 
         private final String name;
+        private final boolean postProcessor;
+
+        Category(String name, boolean postProcessor) {
+            this.name = name;
+            this.postProcessor = postProcessor;
+        }
 
         Category(String name) {
-            this.name = name;
+            this(name, false);
         }
 
         public String getName() {
             return name;
         }
+
+        public boolean isPostProcessor() {
+            return postProcessor;
+        }
     }
 
     /**
@@ -90,11 +100,12 @@
     }
 
     /**
-     * The Plugin set of types.
-     * @return The set of types.
+     * The type of this plugin.
+     *
+     * @return The type of this plugin
      */
-    public default Set<Category> getType() {
-        return Collections.emptySet();
+    public default Category getType() {
+        return Category.TRANSFORMER;
     }
 
     /**
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Wed Jul 05 21:52:51 2017 +0200
@@ -29,7 +29,7 @@
 
 main.usage=\
 Usage: {0} <options> --modulepath <modulepath> --addmods <mods> --output <path>\n\
-Possible options include:
+\Possible options include:
 
 error.prefix=Error:
 warn.prefix=Warning:
@@ -68,7 +68,18 @@
 Include your program and the following diagnostic in your report.  Thank you.
 
 main.extended.help=\
-List of available plugins:
+\List of available plugins:
+
+main.extended.help.footer=\
+\For options requiring a <pattern-list>, the value will be a comma\
+\ separated list of elements each using one the following forms:\n\
+\  <glob-pattern>\n\
+\  glob:<glob-pattern>\n\
+\  regex:<regex-pattern>\n\
+\  @<filename> where filename is the name of a file containing patterns to be\
+\ used, one pattern per line\n\
+\n\
+
 
 err.unknown.byte.order:unknown byte order {0}
 err.output.must.be.specified:--output must be specified
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties	Wed Jul 05 21:52:51 2017 +0200
@@ -37,15 +37,16 @@
 Class optimization. Warning: This plugin is experimental.\n\
 An optional <log file> can be specified to log applied optimizations.
 
-compress.argument=<0|1|2>[:filter=<pattern>]
+compress.argument=<0|1|2>[:filter=<pattern-list>]
 
 compress.description=\
 Compress all resources in the output image.\n\
 Level 0: constant string sharing\n\
 Level 1: ZIP\n\
 Level 2: both.\n\
-An optional filter can be specified to list the pattern of files to be filtered.\n\
-Use ^ for negation. e.g.: *Exception.class,*Error.class,^/java.base/java/lang/*
+An optional <pattern-list> filter can be specified to list the pattern of\n\
+files to be included.
+
 
 compact-cp.argument=<resource paths>
 
@@ -59,15 +60,15 @@
 If files to copy are not absolute path, JDK home dir is used.\n\
 e.g.: jrt-fs.jar,LICENSE,/home/me/myfile.txt=somewehere/conf.txt
 
-exclude-files.argument=<files to exclude | files of excluded files>
+exclude-files.argument=<pattern-list> of files to exclude
 
 exclude-files.description=\
-Specify files to exclude. e.g.: *.diz, /java.base/native/client/*
+Specify files to exclude. e.g.: **.java,glob:/java.base/native/client/**
 
-exclude-resources.argument=<resources to exclude | file of excluded resources>
+exclude-resources.argument=<pattern-list> resources to exclude
 
 exclude-resources.description=\
-Specify resources to exclude. e.g.: *.jcov, */META-INF/*
+Specify resources to exclude. e.g.: **.jcov,glob:**/META-INF/**
 
 generate-jli-classes.argument=<bmh[:bmh-species=LL,L3,...]>
 
@@ -78,10 +79,11 @@
 
 onoff.argument=<on|off>
 
-order-resources.argument=<paths in priority order | file with resource paths>
+order-resources.argument=<pattern-list> of paths in priority order.  If a @file\n\
+is specified, then each line should be an exact match for the path to be ordered
 
 order-resources.description=\
-Order resources. e.g.: */module-info.class,/java.base/java/lang/*
+Order resources. e.g.: **/module-info.class,@classlist,/java.base/java/lang/**
 
 strip-debug.description=\
 Strip debug information from the output image
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1085,7 +1085,7 @@
 
         @Override public Class<Pattern> valueType() { return Pattern.class; }
 
-        @Override public String valuePattern() { return "pattern"; }
+        @Override public String valuePattern() { return "regex-pattern"; }
     }
 
     static class PathMatcherConverter implements ValueConverter<PathMatcher> {
@@ -1100,7 +1100,7 @@
 
         @Override public Class<PathMatcher> valueType() { return PathMatcher.class; }
 
-        @Override public String valuePattern() { return "pattern"; }
+        @Override public String valuePattern() { return "pattern-list"; }
     }
 
     /* Support for @<file> in jmod help */
@@ -1145,7 +1145,7 @@
             String content = super.format(all);
             StringBuilder builder = new StringBuilder();
 
-            builder.append("\n").append(" Main operation modes:\n  ");
+            builder.append(getMessage("main.opt.mode")).append("\n  ");
             builder.append(getMessage("main.opt.mode.create")).append("\n  ");
             builder.append(getMessage("main.opt.mode.list")).append("\n  ");
             builder.append(getMessage("main.opt.mode.describe")).append("\n  ");
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties	Wed Jul 05 21:52:51 2017 +0200
@@ -28,11 +28,13 @@
 use --help for a list of possible options
 
 main.usage=\
-Usage: {0} (create|list|describe|hash) <OPTIONS> <jmod-file>
+Usage: {0} (create|list|describe|hash) <OPTIONS> <jmod-file>\n\
 
 error.prefix=Error:
 warn.prefix=Warning:
 
+main.opt.mode=\
+\Main operation modes:
 main.opt.mode.create=\
 \create    - Creates a new jmod archive
 main.opt.mode.list=\
@@ -49,7 +51,9 @@
 main.opt.cmds=Location of native commands
 main.opt.config=Location of user-editable config files
 main.opt.dry-run=Dry run of hash mode
-main.opt.exclude=Exclude files, given as a PATTERN
+main.opt.exclude=Exclude files matching the supplied comma separated pattern\
+\ list, each element using one the following forms: <glob-pattern>,\
+\ glob:<glob-pattern> or regex:<regex-pattern>
 main.opt.module-version= Module version
 main.opt.main-class=Main class
 main.opt.main-class.arg=class-name
@@ -61,7 +65,7 @@
 main.opt.os-version.arg=os-version
 main.opt.modulepath=Module path
 main.opt.hash-modules=Compute and record hashes to tie a packaged module\
-\ with modules matching the given pattern and depending upon it directly\
+\ with modules matching the given <regex-pattern> and depending upon it directly\
 \ or indirectly. The hashes are recorded in the JMOD file being created, or\
 \ a JMOD file or modular JAR on the module path specified the jmod hash command.
 
--- a/jdk/test/ProblemList.txt	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 21:52:51 2017 +0200
@@ -272,8 +272,6 @@
 sun/security/pkcs11/tls/TestPRF.java                            8077138,8023434 windows-all
 sun/security/pkcs11/tls/TestPremaster.java                      8077138,8023434 windows-all
 
-sun/security/pkcs11/rsa/TestKeyPairGenerator.java               8074580 generic-all
-
 sun/security/krb5/auto/HttpNegotiateServer.java                 8038079 generic-all
 
 sun/security/tools/keytool/autotest.sh                          8130302 generic-all
@@ -338,9 +336,6 @@
 
 # jdk_time
 
-java/time/test/java/time/TestClock_System.java                  8158128 solaris-all
-
-
 ############################################################################
 
 # jdk_util
@@ -387,8 +382,6 @@
 
 # core_tools
 
-tools/jlink/plugins/IncludeLocalesPluginTest.java               8159781 generic-all
-
 tools/jlink/JLinkOptimTest.java                                 8159264 generic-all
 
 ############################################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jndi/ldap/SimpleClientIdHashCode.java	Wed Jul 05 21:52:51 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 8158802
+ * @summary com.sun.jndi.ldap.SimpleClientId produces wrong hash code
+ * @modules java.naming/com.sun.jndi.ldap
+ */
+
+import java.io.OutputStream;
+import java.lang.reflect.Constructor;
+import javax.naming.ldap.Control;
+
+
+public class SimpleClientIdHashCode {
+    public static void main(String[] args) throws Throwable {
+        Class<?> simpleClientIdClass
+                = Class.forName("com.sun.jndi.ldap.SimpleClientId");
+        Constructor<?> init = simpleClientIdClass.getDeclaredConstructor(
+                int.class, String.class, int.class, String.class,
+                Control[].class, OutputStream.class, String.class,
+                String.class, Object.class);
+        init.setAccessible(true);
+
+        Object p1 = new byte[]{66,77};
+        Object p2 = new char[]{'w','d'};
+        Object p3 = "word";
+
+        test(init, new byte[]{65}, new byte[]{65});
+        test(init, new char[]{'p'}, new char[]{'p'});
+        test(init, "pass", "pass");
+        test(init, p1, p1);
+        test(init, p2, p2);
+        test(init, p3, p3);
+        test(init, null, null);
+    }
+
+    private static void test(Constructor<?> init, Object pass1, Object pass2)
+            throws Throwable {
+
+        Object o1 = init.newInstance(1, "host", 3, "", null, System.out,
+                null, null, pass1);
+        Object o2 = init.newInstance(1, "host", 3, "", null, System.out,
+                null, null, pass2);
+
+        if (!o1.equals(o2))
+            throw new RuntimeException("Objects not equal");
+
+        if (o1.hashCode() != o2.hashCode())
+            throw new RuntimeException("Inconsistent hash codes");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/Runtime/shutdown/ShutdownInterruptedMain.java	Wed Jul 05 21:52:51 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 8154017
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @summary Shutdown hooks are racing against shutdown sequence,
+            if System.exit()-calling thread is interrupted
+ * @run main ShutdownInterruptedMain exec
+ */
+
+import jdk.testlibrary.OutputAnalyzer;
+import static jdk.testlibrary.ProcessTools.createJavaProcessBuilder;
+import static jdk.testlibrary.ProcessTools.executeProcess;
+
+public class ShutdownInterruptedMain {
+
+    public static void main(String[] args) throws Exception {
+        if (args.length > 0) {
+            ProcessBuilder pb = createJavaProcessBuilder(true, "ShutdownInterruptedMain");
+            OutputAnalyzer output = executeProcess(pb);
+            output.shouldContain("Shutdown Hook");
+            output.shouldHaveExitValue(0);
+            return;
+        }
+
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
+            public void run() {
+                // Wait for the race to unfold:
+                try {
+                    Thread.sleep(5_000);
+                } catch (InterruptedException e) {}
+                System.out.println("Shutdown Hook");
+                System.out.flush();
+            }
+        });
+        Thread.currentThread().interrupt();
+        System.exit(0);
+    }
+}
--- a/jdk/test/java/lang/module/ConfigurationTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/java/lang/module/ConfigurationTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -157,7 +157,7 @@
      *
      * The test consists of three configurations:
      * - Configuration cf1: m1, m2 requires public m1
-     * - Configuration cf2: m3 requires m1
+     * - Configuration cf2: m3 requires m2
      */
     public void testRequiresPublic2() {
 
@@ -219,7 +219,7 @@
      *
      * The test consists of three configurations:
      * - Configuration cf1: m1
-     * - Configuration cf2: m2 requires public m3, m3 requires m2
+     * - Configuration cf2: m2 requires public m1, m3 requires m2
      */
     public void testRequiresPublic3() {
 
@@ -283,7 +283,7 @@
      * The test consists of three configurations:
      * - Configuration cf1: m1
      * - Configuration cf2: m2 requires public m1
-     * - Configuraiton cf3: m3 requires m3
+     * - Configuraiton cf3: m3 requires m2
      */
     public void testRequiresPublic4() {
 
@@ -657,8 +657,8 @@
      * Basic test of binding services with configurations.
      *
      * Configuration cf1: p@1.0 provides p.S
+     * Test configuration cf2: m1 uses p.S, p@2.0 provides p.S
      * Test configuration cf2: m1 uses p.S
-     * Test configuration cf2: m1 uses p.S, p@2.0 uses p.S
      */
     public void testServiceBindingWithConfigurations3() {
 
@@ -896,7 +896,7 @@
 
         Configuration cf2 = resolveRequires(cf1, finder, "m1");
         assertTrue(cf2.modules().size() == 1);
-        assertTrue(cf1.findModule("m1").isPresent());
+        assertTrue(cf2.findModule("m1").isPresent());
     }
 
 
@@ -1305,7 +1305,7 @@
 
 
     /**
-     * Test "provides p.S" where p is not local
+     * Test "provides p.S with q.T" where q.T is not local
      */
     @Test(expectedExceptions = { ResolutionException.class })
     public void testProviderPackageNotLocal() {
--- a/jdk/test/java/lang/module/ModuleReferenceTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/java/lang/module/ModuleReferenceTest.java	Wed Jul 05 21:52:51 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
@@ -110,7 +110,7 @@
         ModuleReference mref3 = new ModuleReference(descriptor1, null, supplier);
 
         assertTrue(mref1.equals(mref1));
-        assertTrue(mref1.equals(mref1));
+        assertTrue(mref1.equals(mref2));
         assertTrue(mref2.equals(mref1));
         assertTrue(mref1.hashCode() == mref2.hashCode());
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/HttpURLConnection/NoProxyTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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 8144008
+ * @summary Setting NO_PROXY on HTTP URL connections does not stop proxying
+ * @run main/othervm NoProxyTest
+ */
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.SocketAddress;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.List;
+
+public class NoProxyTest {
+
+    static class NoProxyTestSelector extends ProxySelector {
+        @Override
+        public List<Proxy> select(URI uri) {
+            throw new RuntimeException("Should not reach here as proxy==Proxy.NO_PROXY");
+        }
+        @Override
+        public void connectFailed(URI u, SocketAddress s, IOException e) { }
+    }
+
+    public static void main(String args[]) throws MalformedURLException {
+        ProxySelector.setDefault(new NoProxyTestSelector());
+
+        URL url = URI.create("http://127.0.0.1/").toURL();
+        URLConnection connection;
+        try {
+            connection = url.openConnection(Proxy.NO_PROXY);
+            connection.connect();
+        } catch (IOException ignore) {
+            //ignore
+        }
+    }
+}
--- a/jdk/test/java/net/URLPermission/URLPermissionTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/java/net/URLPermission/URLPermissionTest.java	Wed Jul 05 21:52:51 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
@@ -26,7 +26,7 @@
 
 /**
  * @test
- * @bug 8010464 8027570 8027687 8029354
+ * @bug 8010464 8027570 8027687 8029354 8114860 8071660
  */
 
 public class URLPermissionTest {
@@ -110,6 +110,8 @@
 
     static class ActionImpliesTest extends Test {
         String arg1, arg2;
+        String url1 = "http://www.foo.com/-";
+        String url2 = "http://www.foo.com/a/b";
 
         ActionImpliesTest(String arg1, String arg2, boolean expected) {
             this.arg1 = arg1;
@@ -117,10 +119,17 @@
             this.expected = expected;
         }
 
+        ActionImpliesTest(String ur11, String url2, String arg1, String arg2,
+            boolean expected) {
+            this.url1 = ur11;
+            this.url2 = url2;
+            this.arg1 = arg1;
+            this.arg2 = arg2;
+            this.expected = expected;
+        }
+
         @Override
           boolean execute() {
-            String url1 = "http://www.foo.com/-";
-            String url2 = "http://www.foo.com/a/b";
             URLPermission p1 = new URLPermission(url1, arg1);
             URLPermission p2 = new URLPermission(url2, arg2);
             boolean result = p1.implies(p2);
@@ -129,10 +138,37 @@
         }
     }
 
+    static ActionsStringTest actionstest(String arg, String expectedActions) {
+        return new ActionsStringTest(arg, expectedActions);
+    }
+
+    static class ActionsStringTest extends Test {
+
+        String expectedActions;
+        String arg;
+
+        public ActionsStringTest(String arg, String expectedActions) {
+            this.arg = arg;
+            this.expectedActions = expectedActions;
+        }
+
+        @Override
+        boolean execute() {
+            String url = "http://www.foo.com/";
+            URLPermission urlp = new URLPermission(url, arg);
+            return (expectedActions.equals(urlp.getActions()));
+        }
+    }
+
     static ActionImpliesTest actest(String arg1, String arg2, boolean expected) {
         return new ActionImpliesTest(arg1, arg2, expected);
     }
 
+    static ActionImpliesTest actest(String url1, String url2, String arg1,
+        String arg2, boolean expected) {
+        return new ActionImpliesTest(url1, url2, arg1, arg2, expected);
+    }
+
     static class HashCodeTest extends Test {
         String arg1, arg2;
         int hash;
@@ -292,6 +328,9 @@
         imtest("https:*", "http:*", false)
     };
 
+    static final String FOO_URL = "http://www.foo.com/";
+    static final String BAR_URL = "http://www.bar.com/";
+
     static Test[] actionImplies = {
         actest("GET", "GET", true),
         actest("GET", "POST", false),
@@ -305,7 +344,28 @@
         actest("GET:X-Foo,X-Bar", "GET:x-bar,x-foo", true),
         actest("GET:X-Bar,X-Foo,X-Bar,Y-Foo", "GET:x-bar,x-foo", true),
         actest("GET:*", "GET:x-bar,x-foo", true),
-        actest("*:*", "GET:x-bar,x-foo", true)
+        actest("*:*", "GET:x-bar,x-foo", true),
+        actest("", "GET:x-bar,x-foo", false),
+        actest("GET:x-bar,x-foo", "", true),
+        actest("", "", true),
+        actest("GET,DELETE", "GET,DELETE:x-foo", false),
+        actest(FOO_URL, BAR_URL, "", "GET:x-bar,x-foo", false),
+        actest(FOO_URL, BAR_URL, "GET:x-bar,x-foo", "", false),
+        actest(FOO_URL, BAR_URL, "", "", false)
+    };
+
+    static Test[] actionsStringTest = {
+        actionstest("", ""),
+        actionstest(":X-Bar", ":X-Bar"),
+        actionstest("GET", "GET"),
+        actionstest("get", "GET"),
+        actionstest("GET,POST", "GET,POST"),
+        actionstest("GET,post", "GET,POST"),
+        actionstest("get,post", "GET,POST"),
+        actionstest("get,post,DELETE", "DELETE,GET,POST"),
+        actionstest("GET,POST:", "GET,POST"),
+        actionstest("GET:X-Foo,X-bar", "GET:X-Bar,X-Foo"),
+        actionstest("GET,POST,DELETE:X-Bar,X-Foo,X-Bar,Y-Foo", "DELETE,GET,POST:X-Bar,X-Bar,X-Foo,Y-Foo")
     };
 
     static Test[] equalityTests = {
@@ -449,6 +509,23 @@
             System.out.println ("action test " + i + " OK");
         }
 
+        for (int i = 0; i < actionsStringTest.length; i++) {
+            ActionsStringTest test = (ActionsStringTest) actionsStringTest[i];
+            Exception caught = null;
+            boolean result = false;
+            try {
+                result = test.execute();
+            } catch (Exception e) {
+                caught = e;
+            }
+            if (!result) {
+                failed = true;
+                System.out.println("test failed: " + test.arg + ": "
+                        + test.expectedActions + " Exception: " + caught);
+            }
+            System.out.println("Actions String test " + i + " OK");
+        }
+
         serializationTest("http://www.foo.com/-", "GET,DELETE:*");
         serializationTest("https://www.foo.com/-", "POST:X-Foo");
         serializationTest("https:*", "*:*");
--- a/jdk/test/java/net/httpclient/BasicWebSocketAPITest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/java/net/httpclient/BasicWebSocketAPITest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -32,10 +32,9 @@
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.channels.SocketChannel;
+import java.time.Duration;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
-import java.util.stream.Stream;
 
 /*
  * @test
@@ -83,13 +82,7 @@
                 (ws) ->
                         TestKit.assertThrows(NullPointerException.class,
                                 "message",
-                                () -> ws.sendBinary((byte[]) null, true))
-        );
-        checkAndClose(
-                (ws) ->
-                        TestKit.assertThrows(NullPointerException.class,
-                                "message",
-                                () -> ws.sendBinary((ByteBuffer) null, true))
+                                () -> ws.sendBinary(null, true))
         );
         checkAndClose(
                 (ws) ->
@@ -125,13 +118,7 @@
                 (ws) ->
                         TestKit.assertThrows(NullPointerException.class,
                                 "message",
-                                () -> ws.sendText((CharSequence) null))
-        );
-        checkAndClose(
-                (ws) ->
-                        TestKit.assertThrows(NullPointerException.class,
-                                "message",
-                                () -> ws.sendText((Stream<? extends CharSequence>) null))
+                                () -> ws.sendText(null))
         );
         checkAndClose(
                 (ws) ->
@@ -214,17 +201,7 @@
         // FIXME: check timeout works
         // (i.e. it directly influences the time WebSocket waits for connection + opening handshake)
         TestKit.assertNotThrows(
-                () -> WebSocket.newBuilder(ws, defaultListener()).connectTimeout(1, TimeUnit.SECONDS)
-        );
-        WebSocket.Builder builder = WebSocket.newBuilder(ws, defaultListener());
-        TestKit.assertThrows(IllegalArgumentException.class,
-                "(?i).*\\bnegative\\b.*",
-                () -> builder.connectTimeout(-1, TimeUnit.SECONDS)
-        );
-        WebSocket.Builder builder1 = WebSocket.newBuilder(ws, defaultListener());
-        TestKit.assertThrows(NullPointerException.class,
-                "unit",
-                () -> builder1.connectTimeout(1, null)
+                () -> WebSocket.newBuilder(ws, defaultListener()).connectTimeout(Duration.ofSeconds(1))
         );
         // FIXME: check these headers are actually received by the server
         TestKit.assertNotThrows(
--- a/jdk/test/java/util/Formatter/FormatLocale.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/java/util/Formatter/FormatLocale.java	Wed Jul 05 21:52:51 2017 +0200
@@ -23,17 +23,22 @@
 
 /**
  * @test
- * @bug 8146156
+ * @bug 8146156 8159548
  * @summary test whether uppercasing follows Locale.Category.FORMAT locale.
  * @run main/othervm FormatLocale
  */
 
 import java.time.LocalDate;
+import java.time.ZonedDateTime;
+import java.time.ZoneId;
 import java.time.Month;
+import java.util.Calendar;
 import java.util.Formatter;
+import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.Locale;
 import java.util.Locale.Category;
+import java.util.TimeZone;
 import java.util.stream.IntStream;
 
 public class FormatLocale {
@@ -61,7 +66,7 @@
         "N\u0130SAN",
         "1,00000E+08");
 
-    public static void main(String [] args) {
+    static void formatLocaleTest() {
         StringBuilder sb = new StringBuilder();
 
         IntStream.range(0, src.size()).forEach(i -> {
@@ -79,4 +84,44 @@
             }
         });
     }
+
+    static void nullLocaleTest() {
+        String fmt = "%1$ta %1$tA %1$th %1$tB %1tZ";
+        String expected = "Fri Friday Jan January PST";
+        StringBuilder sb = new StringBuilder();
+        Locale orig = Locale.getDefault();
+
+        try {
+            Locale.setDefault(Locale.JAPAN);
+            Formatter f = new Formatter(sb, (Locale)null);
+            ZoneId zid = ZoneId.of("America/Los_Angeles");
+            Calendar c = new GregorianCalendar(TimeZone.getTimeZone(zid), Locale.US);
+            c.set(2016, 0, 1, 0, 0, 0);
+            f.format(fmt, c);
+            if (!sb.toString().equals(expected)) {
+                throw new RuntimeException(
+                    "Localized text returned with null locale.\n" +
+                    "    expected: " + expected + "\n" +
+                    "    returned: " + sb.toString());
+            }
+
+            sb.setLength(0);
+            ZonedDateTime zdt = ZonedDateTime.of(2016, 1, 1, 0, 0, 0, 0, zid);
+            f.format(fmt, zdt);
+
+            if (!sb.toString().equals(expected)) {
+                throw new RuntimeException(
+                    "Localized text returned with null locale.\n" +
+                    "    expected: " + expected + "\n" +
+                    "    returned: " + sb.toString());
+            }
+        } finally {
+            Locale.setDefault(orig);
+        }
+    }
+
+    public static void main(String [] args) {
+        formatLocaleTest();
+        nullLocaleTest();
+    }
 }
--- a/jdk/test/java/util/Scanner/ScanTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/java/util/Scanner/ScanTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -24,7 +24,7 @@
 /**
  * @test
  * @bug 4313885 4926319 4927634 5032610 5032622 5049968 5059533 6223711 6277261 6269946 6288823
- *      8072722 8072582 8139414
+ *      8072722 8139414
  * @summary Basic tests of java.util.Scanner methods
  * @key randomness
  * @modules jdk.localedata
@@ -512,27 +512,9 @@
     }
 
     public static void boundaryDelimTest() throws Exception {
-        // 8072582
-        StringBuilder sb = new StringBuilder();
-        append(sb, 'a', 228); sb.append(",");
-        append(sb, 'b', 293); sb.append("#,#");
-        append(sb, 'c', 308); sb.append(",");
-        append(sb, 'd', 188); sb.append("#,#");
-        append(sb, 'e', 2);
-        try (Scanner scanner = new Scanner(sb.toString())) {
-            scanner.useDelimiter("(#,#)|(,)");
-            while(scanner.hasNext()){
-                String next = scanner.next();
-                if(next.contains("#")){
-                    System.out.printf("[%s]%n", next);
-                    failCount++;
-                }
-            }
-        }
-
         // 8139414
         int i = 1019;
-        sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
         sb.append("--;");
         for (int j = 0; j < 1019; ++j) {
             sb.append(j%10);
--- a/jdk/test/javax/net/ssl/DTLS/WeakCipherSuite.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/net/ssl/DTLS/WeakCipherSuite.java	Wed Jul 05 21:52:51 2017 +0200
@@ -27,7 +27,6 @@
 /*
  * @test
  * @bug 8043758
- * @key intermittent
  * @summary Datagram Transport Layer Security (DTLS)
  * @modules java.base/sun.security.util
  * @build DTLSOverDatagram
--- a/jdk/test/javax/net/ssl/TLS/CipherTestUtils.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/net/ssl/TLS/CipherTestUtils.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -73,6 +73,7 @@
     private static final List<TestParameters> TESTS = new ArrayList<>(3);
     private static final List<Exception> EXCEPTIONS
             = Collections.synchronizedList(new ArrayList<>(1));
+
     private static final String CLIENT_PUBLIC_KEY
         = "-----BEGIN CERTIFICATE-----\n"
         + "MIICtTCCAh4CCQDkYJ46DMcGRjANBgkqhkiG9w0BAQUFADCBnDELMAkGA1UEBhMC\n"
@@ -191,7 +192,7 @@
     private final X509TrustManager clientTrustManager;
     private final X509TrustManager serverTrustManager;
 
-    static abstract class Server implements Runnable {
+    static abstract class Server implements Runnable, AutoCloseable {
 
         final CipherTestUtils cipherTest;
 
@@ -240,12 +241,11 @@
 
     public static class TestParameters {
 
-        String cipherSuite;
-        String protocol;
-        String clientAuth;
+        final String cipherSuite;
+        final String protocol;
+        final String clientAuth;
 
-        TestParameters(String cipherSuite, String protocol,
-                String clientAuth) {
+        TestParameters(String cipherSuite, String protocol, String clientAuth) {
             this.cipherSuite = cipherSuite;
             this.protocol = protocol;
             this.clientAuth = clientAuth;
@@ -267,10 +267,7 @@
 
     private static volatile CipherTestUtils instance = null;
 
-    public static CipherTestUtils getInstance() throws IOException,
-            FileNotFoundException, KeyStoreException,
-            NoSuchAlgorithmException, CertificateException,
-            UnrecoverableKeyException, InvalidKeySpecException {
+    public static CipherTestUtils getInstance() throws Exception {
         if (instance == null) {
             synchronized (CipherTestUtils.class) {
                 if (instance == null) {
@@ -281,21 +278,10 @@
         return instance;
     }
 
-    public static void setTestedArguments(String testedProtocol,
-            String testedCipherSuite) {
-
-        TestParameters testedParams;
-
-        String cipherSuite = testedCipherSuite.trim();
-        if (cipherSuite.startsWith("SSL_")) {
-            testedParams =
-                new TestParameters(cipherSuite, testedProtocol, null);
-            TESTS.add(testedParams);
-
-        } else {
-            System.out.println("Your input Cipher suites is not correct, "
-                    + "please try another one .");
-        }
+    public static void setTestedArguments(String protocol, String ciphersuite) {
+        ciphersuite = ciphersuite.trim();
+        TestParameters params = new TestParameters(ciphersuite, protocol, null);
+        TESTS.add(params);
     }
 
     public X509ExtendedKeyManager getClientKeyManager() {
@@ -318,10 +304,7 @@
         EXCEPTIONS.add(e);
     }
 
-    private CipherTestUtils()
-            throws IOException, FileNotFoundException, KeyStoreException,
-            NoSuchAlgorithmException, CertificateException,
-            UnrecoverableKeyException, InvalidKeySpecException {
+    private CipherTestUtils() throws Exception {
         factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
         KeyStore serverKeyStore = createServerKeyStore(SERVER_PUBLIC_KEY,
                 SERVER_PRIVATE_KEY);
@@ -329,12 +312,11 @@
                 CA_PRIVATE_KEY);
 
         if (serverKeyStore != null) {
-            KeyManagerFactory keyFactory1
-                    = KeyManagerFactory.getInstance(
+            KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(
                             KeyManagerFactory.getDefaultAlgorithm());
-            keyFactory1.init(serverKeyStore, PASSWORD);
-            serverKeyManager = (X509ExtendedKeyManager) keyFactory1.
-                    getKeyManagers()[0];
+            keyFactory.init(serverKeyStore, PASSWORD);
+            serverKeyManager = (X509ExtendedKeyManager)
+                    keyFactory.getKeyManagers()[0];
         } else {
             serverKeyManager = null;
         }
@@ -346,12 +328,11 @@
         clientKeyStore =
                 createServerKeyStore(CLIENT_PUBLIC_KEY,CLIENT_PRIVATE_KEY);
         if (clientKeyStore != null) {
-            KeyManagerFactory keyFactory
-                    = KeyManagerFactory.getInstance(
+            KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(
                             KeyManagerFactory.getDefaultAlgorithm());
             keyFactory.init(clientKeyStore, PASSWORD);
-            clientKeyManager = (X509ExtendedKeyManager) keyFactory.
-                    getKeyManagers()[0];
+            clientKeyManager = (X509ExtendedKeyManager)
+                    keyFactory.getKeyManagers()[0];
         } else {
             clientKeyManager = null;
         }
@@ -395,8 +376,8 @@
             this.cipherTest = cipherTest;
         }
 
-        Client(CipherTestUtils cipherTest,
-                String testedCipherSuite) throws Exception {
+        Client(CipherTestUtils cipherTest, String testedCipherSuite)
+                throws Exception {
             this.cipherTest = cipherTest;
         }
 
@@ -417,7 +398,7 @@
                     CipherTestUtils.addFailure(e);
                     System.out.println("** Failed " + params
                             + "**, got exception:");
-                    e.printStackTrace(System.err);
+                    e.printStackTrace(System.out);
                 }
             });
         }
@@ -448,11 +429,7 @@
     }
 
     public static void printStringArray(String[] stringArray) {
-        System.out.print(stringArray.length + " : ");
-        for (String stringArray1 : stringArray) {
-            System.out.print(stringArray1);
-            System.out.print(",");
-        }
+        System.out.println(Arrays.toString(stringArray));
         System.out.println();
     }
 
@@ -496,15 +473,15 @@
         System.out.println("-----------------------");
     }
 
-    private static KeyStore createServerKeyStore(String publicKeyStr,
+    private static KeyStore createServerKeyStore(String publicKey,
             String keySpecStr) throws KeyStoreException, IOException,
             NoSuchAlgorithmException, CertificateException,
             InvalidKeySpecException {
 
         KeyStore ks = KeyStore.getInstance("JKS");
         ks.load(null, null);
-        if (publicKeyStr == null || keySpecStr == null) {
-            throw new IllegalArgumentException("publicKeyStr or "
+        if (publicKey == null || keySpecStr == null) {
+            throw new IllegalArgumentException("publicKey or "
                     + "keySpecStr cannot be null");
         }
         String strippedPrivateKey = keySpecStr.substring(
@@ -518,8 +495,7 @@
                 = (RSAPrivateKey) kf.generatePrivate(priKeySpec);
 
         // generate certificate chain
-        try (InputStream is =
-                new ByteArrayInputStream(publicKeyStr.getBytes())) {
+        try (InputStream is = new ByteArrayInputStream(publicKey.getBytes())) {
             // generate certificate from cert string
             CertificateFactory cf = CertificateFactory.getInstance("X.509");
             Certificate keyCert = cf.generateCertificate(is);
@@ -530,10 +506,9 @@
         return ks;
     }
 
-    public static int mainServer(PeerFactory peerFactory,
+    public static Server mainServer(PeerFactory peerFactory,
             String expectedException) throws Exception {
 
-        long time = System.currentTimeMillis();
         setTestedArguments(peerFactory.getTestedProtocol(),
                 peerFactory.getTestedCipher());
 
@@ -542,14 +517,11 @@
         secureRandom.nextInt();
 
         CipherTestUtils cipherTest = CipherTestUtils.getInstance();
-        Server server = peerFactory.newServer(cipherTest, PeerFactory.FREE_PORT);
-        Thread serverThread = new Thread(server, "Server");
+        Server srv = peerFactory.newServer(cipherTest, PeerFactory.FREE_PORT);
+        Thread serverThread = new Thread(srv, "Server");
         serverThread.start();
 
-        time = System.currentTimeMillis() - time;
-        System.out.println("Elapsed time " + time);
-
-        return server.getPort();
+        return srv;
     }
 
     public static void mainClient(PeerFactory peerFactory, int port,
@@ -566,7 +538,6 @@
         CipherTestUtils cipherTest = CipherTestUtils.getInstance();
         peerFactory.newClient(cipherTest, port).run();
         cipherTest.checkResult(expectedException);
-        JSSEServer.closeServer = true;
 
         time = System.currentTimeMillis() - time;
         System.out.println("Elapsed time " + time);
@@ -582,9 +553,11 @@
 
         abstract String getTestedCipher();
 
-        abstract Client newClient(CipherTestUtils cipherTest, int testPort) throws Exception;
+        abstract Client newClient(CipherTestUtils cipherTest, int testPort)
+                throws Exception;
 
-        abstract Server newServer(CipherTestUtils cipherTest, int testPort) throws Exception;
+        abstract Server newServer(CipherTestUtils cipherTest, int testPort)
+                throws Exception;
 
         boolean isSupported(String cipherSuite) {
             return true;
@@ -618,7 +591,7 @@
         try {
             trustManager.checkClientTrusted(chain, authType);
         } catch (CertificateException excep) {
-            System.out.println("ERROR in client trust manager");
+            System.out.println("ERROR in client trust manager: " + excep);
         }
     }
 
@@ -628,7 +601,7 @@
         try {
             trustManager.checkServerTrusted(chain, authType);
         } catch (CertificateException excep) {
-            System.out.println("ERROR in server Trust manger");
+            System.out.println("ERROR in server trust manager: " + excep);
         }
     }
 
--- a/jdk/test/javax/net/ssl/TLS/JSSEClient.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/net/ssl/TLS/JSSEClient.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,5 +1,5 @@
-/**
- * Copyright (c) 2010, 2014, 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 under
@@ -35,39 +35,37 @@
     private static final String DEFAULT = "DEFAULT";
     private static final String TLS = "TLS";
 
-    private final SSLContext sslContext;
+    private final SSLContext context;
     private final MyX509KeyManager keyManager;
-    private final int serverPort;
-    private final String serverHost;
-    private final String testedProtocol;
+    private final int port;
+    private final String host;
+    private final String protocol;
 
-    JSSEClient(CipherTestUtils cipherTest, String serverHost, int serverPort,
-            String testedProtocols, String testedCipherSuite) throws Exception {
-        super(cipherTest, testedCipherSuite);
-        this.serverHost = serverHost;
-        this.serverPort = serverPort;
-        this.testedProtocol = testedProtocols;
-        this.keyManager =
-                new MyX509KeyManager(cipherTest.getClientKeyManager());
-        sslContext = SSLContext.getInstance(TLS);
+    JSSEClient(CipherTestUtils cipherTest, String host, int port,
+            String protocols, String ciphersuite) throws Exception {
+        super(cipherTest, ciphersuite);
+        this.host = host;
+        this.port = port;
+        this.protocol = protocols;
+        this.keyManager = new MyX509KeyManager(
+                                    cipherTest.getClientKeyManager());
+        context = SSLContext.getInstance(TLS);
     }
 
     @Override
     void runTest(CipherTestUtils.TestParameters params) throws Exception {
-        SSLSocket socket = null;
-        try {
-            System.out.println("Connecting to server...");
-            keyManager.setAuthType(params.clientAuth);
-            sslContext.init(new KeyManager[]{keyManager},
-                    new TrustManager[]{cipherTest.getClientTrustManager()},
-                    CipherTestUtils.secureRandom);
-            SSLSocketFactory factory = (SSLSocketFactory) sslContext.
-                    getSocketFactory();
-            socket = (SSLSocket) factory.createSocket(serverHost,
-                    serverPort);
+        keyManager.setAuthType(params.clientAuth);
+        context.init(
+                new KeyManager[]{ keyManager },
+                new TrustManager[]{ cipherTest.getClientTrustManager() },
+                CipherTestUtils.secureRandom);
+        SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory();
+
+        System.out.println("Connecting to server...");
+        try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) {
             socket.setSoTimeout(CipherTestUtils.TIMEOUT);
             socket.setEnabledCipherSuites(params.cipherSuite.split(","));
-            if (params.protocol != null && !params.protocol.trim().equals("")
+            if (params.protocol != null && !params.protocol.trim().isEmpty()
                     && !params.protocol.trim().equals(DEFAULT)) {
                 socket.setEnabledProtocols(params.protocol.split(","));
             }
@@ -105,16 +103,11 @@
                 if ("EC".equals(keyAlg)) {
                     keyAlg = "ECDSA";
                 }
-                if (params.clientAuth == null ? keyAlg != null
-                        : !params.clientAuth.equals(keyAlg)) {
+                if (!params.clientAuth.equals(keyAlg)) {
                     throw new RuntimeException("Certificate type mismatch: "
                             + keyAlg + " != " + params.clientAuth);
                 }
             }
-        } finally {
-            if (socket != null) {
-                socket.close();
-            }
         }
     }
 }
--- a/jdk/test/javax/net/ssl/TLS/JSSEServer.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/net/ssl/TLS/JSSEServer.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -33,13 +33,11 @@
 public class JSSEServer extends CipherTestUtils.Server {
 
     private final SSLServerSocket serverSocket;
-    private final int serverPort;
-    static volatile boolean closeServer = false;
+    private static volatile boolean closeServer = false;
 
     JSSEServer(CipherTestUtils cipherTest, int serverPort,
             String protocol, String cipherSuite) throws Exception {
         super(cipherTest);
-        this.serverPort = serverPort;
         SSLContext serverContext = SSLContext.getInstance("TLS");
         serverContext.init(new KeyManager[]{cipherTest.getServerKeyManager()},
                 new TrustManager[]{cipherTest.getServerTrustManager()},
@@ -56,7 +54,7 @@
 
     @Override
     public void run() {
-        System.out.println("JSSE Server listening on port " + serverPort);
+        System.out.println("JSSE Server listening on port " + getPort());
         while (!closeServer) {
             try (final SSLSocket socket = (SSLSocket) serverSocket.accept()) {
                 socket.setSoTimeout(CipherTestUtils.TIMEOUT);
@@ -68,12 +66,12 @@
                 } catch (IOException e) {
                     CipherTestUtils.addFailure(e);
                     System.out.println("Got IOException:");
-                    e.printStackTrace(System.err);
+                    e.printStackTrace(System.out);
                 }
             } catch (Exception e) {
                 CipherTestUtils.addFailure(e);
                 System.out.println("Exception:");
-                e.printStackTrace(System.err);
+                e.printStackTrace(System.out);
             }
         }
     }
@@ -81,4 +79,12 @@
     int getPort() {
         return serverSocket.getLocalPort();
     }
+
+    @Override
+    public void close() throws IOException {
+        closeServer = true;
+        if (serverSocket != null && !serverSocket.isClosed()) {
+            serverSocket.close();
+        }
+    }
 }
--- a/jdk/test/javax/net/ssl/TLS/TestJSSE.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/net/ssl/TLS/TestJSSE.java	Wed Jul 05 21:52:51 2017 +0200
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -20,59 +20,9 @@
  * questions.
  */
 
-import static java.lang.System.out;
 import java.security.Provider;
 import java.security.Security;
 
-/**
- * @test
- * @bug 8049429
- * @modules java.management
- *          jdk.crypto.ec/sun.security.ec
- * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java
- * @summary Test that all cipher suites work in all versions and all client
- * authentication types. The way this is setup the server is stateless and
- * all checking is done on the client side.
- * @run main/othervm -DSERVER_PROTOCOL=SSLv3
- *        -DCLIENT_PROTOCOL=SSLv3
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=TLSv1
- *        -DCLIENT_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=TLSv1.1
- *        -DCLIENT_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=TLSv1.2
- *        -DCLIENT_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv3,TLSv1
- *        -DCLIENT_PROTOCOL=TLSv1 -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv3,TLSv1,TLSv1.1
- *        -DCLIENT_PROTOCOL=TLSv1.1 -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv3
- *        -DCLIENT_PROTOCOL=TLSv1.1,TLSv1.2
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
- *        TestJSSE javax.net.ssl.SSLHandshakeException
- * @run main/othervm -DSERVER_PROTOCOL=TLSv1
- *        -DCLIENT_PROTOCOL=TLSv1.1,TLSv1.2
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
- *        TestJSSE javax.net.ssl.SSLHandshakeException
- * @run main/othervm -DSERVER_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
- *        -DCLIENT_PROTOCOL=TLSv1.2 -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1
- *        -DCLIENT_PROTOCOL=DEFAULT -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2
- *        -DCLIENT_PROTOCOL=DEFAULT -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2
- *        -DCLIENT_PROTOCOL=DEFAULT -Djdk.tls.client.protocols=TLSv1
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5 TestJSSE
- * @run main/othervm -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1
- *        -DCLIENT_PROTOCOL=DEFAULT -Djdk.tls.client.protocols=TLSv1.2
- *        -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
- *        TestJSSE javax.net.ssl.SSLHandshakeException
- *
- */
-
 public class TestJSSE {
 
     private static final String LOCAL_IP = "127.0.0.1";
@@ -82,72 +32,64 @@
         // and keys used in this test are not disabled.
         Security.setProperty("jdk.tls.disabledAlgorithms", "");
 
-        String serverProtocol = System.getProperty("SERVER_PROTOCOL");
-        String clientProtocol = System.getProperty("CLIENT_PROTOCOL");
-        String cipher = System.getProperty("CIPHER");
-        if (serverProtocol == null
-                || clientProtocol == null
-                || cipher == null) {
-            throw new IllegalArgumentException("SERVER_PROTOCOL "
-                    + "or CLIENT_PROTOCOL or CIPHER is missing");
-        }
-        out.println("ServerProtocol =" + serverProtocol);
-        out.println("ClientProtocol =" + clientProtocol);
-        out.println("Cipher         =" + cipher);
-        int port = server(serverProtocol, cipher, args);
-        client(port, clientProtocol, cipher, args);
+        // enable debug output
+        System.setProperty("javax.net.debug", "ssl,record");
 
-    }
+        String srvProtocol = System.getProperty("SERVER_PROTOCOL");
+        String clnProtocol = System.getProperty("CLIENT_PROTOCOL");
+        String cipher = System.getProperty("CIPHER");
+        if (srvProtocol == null || clnProtocol == null || cipher == null) {
+            throw new IllegalArgumentException("Incorrect parameters");
+        }
 
-    public static void client(int testPort,
-            String testProtocols, String testCipher,
-            String... exception) throws Exception {
-        String expectedException = exception.length >= 1
-                ? exception[0] : null;
-        out.println("=========================================");
-        out.println(" Testing - https://" + LOCAL_IP + ":" + testPort);
-        out.println(" Testing - Protocol : " + testProtocols);
-        out.println(" Testing - Cipher : " + testCipher);
-        try {
-            CipherTestUtils.mainClient(new JSSEFactory(LOCAL_IP, testProtocols,
-                        testCipher, "Client JSSE"),
-                    testPort, expectedException);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+        System.out.println("ServerProtocol = " + srvProtocol);
+        System.out.println("ClientProtocol = " + clnProtocol);
+        System.out.println("Cipher         = " + cipher);
+
+        try (CipherTestUtils.Server srv = server(srvProtocol, cipher, args)) {
+            client(srv.getPort(), clnProtocol, cipher, args);
         }
     }
 
-    public static int server(String testProtocol, String testCipher,
-            String... exception) throws Exception {
+    public static void client(int port, String protocols, String cipher,
+            String... exceptions) throws Exception {
 
-        String expectedException = exception.length >= 1
-                ? exception[0] : null;
-        out.println(" This is Server");
-        out.println(" Testing Protocol: " + testProtocol);
-        out.println(" Testing Cipher: " + testCipher);
+        String expectedExcp = exceptions.length >= 1 ? exceptions[0] : null;
+
+        System.out.println("This is client");
+        System.out.println("Testing protocol: " + protocols);
+        System.out.println("Testing cipher  : " + cipher);
 
-        try {
-            int port = CipherTestUtils.mainServer(new JSSEFactory(
-                        null, testProtocol, testCipher, "Server JSSE"),
-                    expectedException);
+        CipherTestUtils.mainClient(
+            new JSSEFactory(LOCAL_IP, protocols, cipher, "Client JSSE"),
+            port, expectedExcp);
+    }
+
+    public static CipherTestUtils.Server server(String protocol,
+                String cipher, String... exceptions) throws Exception {
 
-            out.println(" Testing Port: " + port);
-            return port;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+        String expectedExcp = exceptions.length >= 1 ? exceptions[0] : null;
+
+        System.out.println("This is server");
+        System.out.println("Testing protocol: " + protocol);
+        System.out.println("Testing cipher  : " + cipher);
+
+        return CipherTestUtils.mainServer(
+            new JSSEFactory(null, protocol, cipher, "Server JSSE"),
+            expectedExcp);
     }
 
     private static class JSSEFactory extends CipherTestUtils.PeerFactory {
 
-        final String testedCipherSuite, testedProtocol, testHost;
-        final String name;
+        private final String cipher;
+        private final String protocol;
+        private final String host;
+        private final String name;
 
-        JSSEFactory(String testHost, String testedProtocol,
-                String testedCipherSuite, String name) {
-            this.testedCipherSuite = testedCipherSuite;
-            this.testedProtocol = testedProtocol;
-            this.testHost = testHost;
+        JSSEFactory(String host, String protocol, String cipher, String name) {
+            this.cipher = cipher;
+            this.protocol = protocol;
+            this.host = host;
             this.name = name;
         }
 
@@ -158,26 +100,24 @@
 
         @Override
         String getTestedCipher() {
-            return testedCipherSuite;
+            return cipher;
         }
 
         @Override
         String getTestedProtocol() {
-            return testedProtocol;
+            return protocol;
         }
 
         @Override
-        CipherTestUtils.Client newClient(CipherTestUtils cipherTest, int testPort)
+        CipherTestUtils.Client newClient(CipherTestUtils cipherTest, int port)
                 throws Exception {
-            return new JSSEClient(cipherTest, testHost, testPort,
-                    testedProtocol, testedCipherSuite);
+            return new JSSEClient(cipherTest, host, port, protocol, cipher);
         }
 
         @Override
-        CipherTestUtils.Server newServer(CipherTestUtils cipherTest, int testPort)
+        CipherTestUtils.Server newServer(CipherTestUtils cipherTest, int port)
                 throws Exception {
-            return new JSSEServer(cipherTest, testPort,
-                    testedProtocol, testedCipherSuite);
+            return new JSSEServer(cipherTest, port, protocol, cipher);
         }
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TestJSSEClientDefaultProtocol.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 only, as published by
+ * the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License version 2 for more
+ * details (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version 2
+ * along with this work; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA or
+ * visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8049429
+ * @modules java.management
+ *          jdk.crypto.ec/sun.security.ec
+ * @summary Test that all cipher suites work in all versions and all client
+ *          authentication types. The way this is setup the server is stateless
+ *          and all checking is done on the client side.
+ * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1
+ *              -DCLIENT_PROTOCOL=DEFAULT
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2
+ *              -DCLIENT_PROTOCOL=DEFAULT
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2
+ *              -DCLIENT_PROTOCOL=DEFAULT
+ *              -Djdk.tls.client.protocols=TLSv1
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv2Hello,SSLv3,TLSv1
+ *              -DCLIENT_PROTOCOL=DEFAULT
+ *              -Djdk.tls.client.protocols=TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE javax.net.ssl.SSLHandshakeException
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TestJSSEClientProtocol.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 only, as published by
+ * the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License version 2 for more
+ * details (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version 2
+ * along with this work; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA or
+ * visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8049429
+ * @modules java.management
+ *          jdk.crypto.ec/sun.security.ec
+ * @summary Test that all cipher suites work in all versions and all client
+ *          authentication types. The way this is setup the server is stateless
+ *          and all checking is done on the client side.
+ * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv3
+ *              -DCLIENT_PROTOCOL=SSLv3
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv3,TLSv1
+ *              -DCLIENT_PROTOCOL=TLSv1
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv3,TLSv1,TLSv1.1
+ *              -DCLIENT_PROTOCOL=TLSv1.1
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
+ *              -DCLIENT_PROTOCOL=TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TestJSSENoCommonProtocols.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 only, as published by
+ * the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License version 2 for more
+ * details (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version 2
+ * along with this work; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA or
+ * visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8049429
+ * @modules java.management
+ *          jdk.crypto.ec/sun.security.ec
+ * @summary Test that all cipher suites work in all versions and all client
+ *          authentication types. The way this is setup the server is stateless
+ *          and all checking is done on the client side.
+ * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=TLSv1
+ *              -DCLIENT_PROTOCOL=TLSv1.1,TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE javax.net.ssl.SSLHandshakeException
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TestJSSEServerProtocol.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 only, as published by
+ * the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License version 2 for more
+ * details (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version 2
+ * along with this work; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA or
+ * visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8049429
+ * @modules java.management
+ *          jdk.crypto.ec/sun.security.ec
+ * @summary Test that all cipher suites work in all versions and all client
+ *          authentication types. The way this is setup the server is stateless
+ *          and all checking is done on the client side.
+ * @compile CipherTestUtils.java JSSEClient.java JSSEServer.java
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=SSLv3
+ *              -DCLIENT_PROTOCOL=TLSv1.1,TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE javax.net.ssl.SSLHandshakeException
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=TLSv1
+ *              -DCLIENT_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=TLSv1.1
+ *              -DCLIENT_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ * @run main/othervm
+ *              -DSERVER_PROTOCOL=TLSv1.2
+ *              -DCLIENT_PROTOCOL=SSLv3,TLSv1,TLSv1.1,TLSv1.2
+ *              -DCIPHER=SSL_RSA_WITH_RC4_128_MD5
+ *          TestJSSE
+ */
--- a/jdk/test/javax/net/ssl/templates/SSLSocketSSLEngineTemplate.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/net/ssl/templates/SSLSocketSSLEngineTemplate.java	Wed Jul 05 21:52:51 2017 +0200
@@ -178,8 +178,11 @@
 
         char[] passphrase = "passphrase".toCharArray();
 
-        ks.load(new FileInputStream(keyFilename), passphrase);
-        ts.load(new FileInputStream(trustFilename), passphrase);
+        try (FileInputStream keyFile = new FileInputStream(keyFilename);
+                FileInputStream trustFile = new FileInputStream(trustFilename)) {
+            ks.load(keyFile, passphrase);
+            ts.load(trustFile, passphrase);
+        }
 
         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
         kmf.init(ks, passphrase);
@@ -310,6 +313,7 @@
                             if (retry &&
                                     serverIn.remaining() < clientMsg.length) {
                                 log("Need to read more from client");
+                                serverIn.compact();
                                 retry = false;
                                 continue;
                             } else {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/HelloClient.java	Wed Jul 05 21:52:51 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.
+ */
+
+import java.util.ArrayList;
+
+import javax.naming.InitialContext;
+import javax.naming.Context;
+import javax.naming.NameNotFoundException;
+
+import javax.rmi.PortableRemoteObject;
+
+
+
+public class HelloClient implements Runnable {
+    static final int MAX_RETRY = 10;
+    static final int ONE_SECOND = 1000;
+    private static boolean responseReceived;
+
+    public static void main(String args[]) throws Exception {
+        executeRmiClientCall();
+    }
+
+    @Override
+    public void run() {
+        try {
+            executeRmiClientCall();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public static boolean isResponseReceived () {
+        return responseReceived;
+    }
+
+    public static void executeRmiClientCall() throws Exception {
+        Context ic;
+        Object objref;
+        HelloInterface helloSvc;
+        String response;
+        Object testResponse;
+        int retryCount = 0;
+
+        ArrayList<Test> listParam = new ArrayList<Test>();
+        listParam.add(null);
+        System.out.println("HelloClient.main: enter ...");
+        while (retryCount < MAX_RETRY) {
+            try {
+                ic = new InitialContext();
+                System.out.println("HelloClient.main: HelloService lookup ...");
+                // STEP 1: Get the Object reference from the Name Service
+                // using JNDI call.
+                objref = ic.lookup("HelloService");
+                System.out.println("HelloClient: Obtained a ref. to Hello server.");
+
+                // STEP 2: Narrow the object reference to the concrete type and
+                // invoke the method.
+                helloSvc = (HelloInterface) PortableRemoteObject.narrow(objref,
+                    HelloInterface.class);
+
+                Test3 test3 = new Test3(listParam);
+                Test3 test3Response = helloSvc.sayHelloWithTest3(test3);
+                System.out.println("Server says: Test3 response  ==  " + test3Response);
+
+                Test3 test3WithNullList = new Test3(null);
+                test3Response = helloSvc.sayHelloWithTest3(test3WithNullList);
+                System.out.println("Server says: Test3 response  ==  "
+                        + test3Response);
+
+                Test4 test4 = new Test4(listParam);
+                Test3 test4Response = helloSvc.sayHelloWithTest3(test4);
+                System.out.println("Server says: Test4 response  ==  " + test4Response);
+
+                responseReceived = true;
+                break;
+            } catch (NameNotFoundException nnfEx) {
+                System.err.println("NameNotFoundException Caught  .... try again");
+                retryCount++;
+                try {
+                    Thread.sleep(ONE_SECOND);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                continue;
+            } catch (Throwable t) {
+                System.err.println("Exception " + t + "Caught");
+                t.printStackTrace();
+                throw new RuntimeException(t);
+            }
+        }
+        System.err.println("HelloClient terminating ");
+        try {
+            Thread.sleep(ONE_SECOND);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/HelloImpl.java	Wed Jul 05 21:52:51 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.rmi.RemoteException;
+import javax.rmi.PortableRemoteObject;
+
+public class HelloImpl extends PortableRemoteObject implements HelloInterface {
+
+    public HelloImpl() throws java.rmi.RemoteException {
+        super(); // invoke rmi linking and remote object initialization
+    }
+
+
+    @Override
+    public Test3 sayHelloWithTest3(Test3 test) throws RemoteException {
+        System.out.println("sayHelloToTest3: ENTER " );
+
+        return test;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/HelloInterface.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,28 @@
+/*
+ * 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.rmi.Remote;
+
+public interface HelloInterface extends Remote {
+    public Test3 sayHelloWithTest3( Test3 test ) throws java.rmi.RemoteException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/HelloServer.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.naming.InitialContext;
+import javax.naming.Context;
+
+public class HelloServer {
+
+    static final int MAX_RETRY = 10;
+    static final int ONE_SECOND = 1000;
+
+    public static void main(String[] args) {
+        int retryCount = 0;
+        while (retryCount < MAX_RETRY) {
+            try {
+                // Step 1: Instantiate the Hello servant
+                HelloImpl helloRef = new HelloImpl();
+
+                // Step 2: Publish the reference in the Naming Service
+                // using JNDI API
+                Context initialNamingContext = new InitialContext();
+                initialNamingContext.rebind("HelloService", helloRef);
+
+                System.out.println("Hello Server: Ready...");
+                break;
+            } catch (Exception e) {
+                System.out.println("Server initialization problem: " + e);
+                e.printStackTrace();
+                retryCount++;
+                try {
+                    Thread.sleep(ONE_SECOND);
+                } catch (InterruptedException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/RmiIiopReturnValueTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,157 @@
+/*
+ * 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 8146975
+ * @summary test RMI-IIOP with value object return
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @compile -addmods java.corba Test.java Test3.java Test4.java
+ *    HelloInterface.java HelloServer.java
+ *    HelloClient.java HelloImpl.java _HelloImpl_Tie.java _HelloInterface_Stub.java
+ *    RmiIiopReturnValueTest.java
+ * @run main/othervm -addmods java.corba
+ *    -Djava.naming.provider.url=iiop://localhost:5050
+ *    -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
+ *    RmiIiopReturnValueTest -port 5049
+ * @run main/othervm/secure=java.lang.SecurityManager/policy=jtreg.test.policy
+ *    -addmods java.corba -Djava.naming.provider.url=iiop://localhost:5050
+ *    -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
+ *    RmiIiopReturnValueTest -port 5049
+ */
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import jdk.testlibrary.JDKToolFinder;
+import jdk.testlibrary.JDKToolLauncher;
+
+public class RmiIiopReturnValueTest {
+
+    static final String ORBD = JDKToolFinder.getTestJDKTool("orbd");
+    static final String JAVA = JDKToolFinder.getTestJDKTool("java");
+    static final JDKToolLauncher orbdLauncher = JDKToolLauncher.createUsingTestJDK("orbd");
+    static final String CLASSPATH = System.getProperty("java.class.path");
+    static final int FIVE_SECONDS = 5000;
+
+    private static Throwable clientException;
+    private static boolean exceptionInClient;
+    private static Process orbdProcess;
+    private static Process rmiServerProcess;
+
+    public static void main(String[] args) throws Exception {
+        startTestComponents();
+        stopTestComponents();
+        System.err.println("Test completed OK ");
+    }
+
+    static void startTestComponents () throws Exception {
+        startOrbd();
+        Thread.sleep(FIVE_SECONDS);
+        startRmiIiopServer();
+        Thread.sleep(FIVE_SECONDS);
+        executeRmiIiopClient();
+    }
+
+    private static void stopTestComponents() throws Exception {
+        stopRmiIiopServer();
+        stopOrbd();
+        if (exceptionInClient) {
+            throw new RuntimeException(clientException);
+        } else if (!isResponseReceived()) {
+            throw new RuntimeException("Expected Response not received");
+        }
+    }
+
+    static void startOrbd() throws Exception {
+        System.out.println("\nStarting orbd with NS port 5050 and activation port 5049 ");
+
+        //orbd -ORBInitialHost localhost -ORBInitialPort 5050 -port 5049
+        orbdLauncher.addToolArg("-ORBInitialHost").addToolArg("localhost")
+            .addToolArg("-ORBInitialPort").addToolArg("5050")
+            .addToolArg("-port").addToolArg("5049");
+
+        System.out.println("RmiIiopReturnValueTest: Executing: " + Arrays.asList(orbdLauncher.getCommand()));
+        ProcessBuilder pb = new ProcessBuilder(orbdLauncher.getCommand());
+        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+        orbdProcess = pb.start();
+    }
+
+
+    static void startRmiIiopServer() throws Exception {
+        System.out.println("\nStarting RmiIiopServer");
+        // java -addmods java.corba -cp .
+        // -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
+        // -Djava.naming.provider.url=iiop://localhost:5050 HelloServer -port 5049
+        List<String> commands = new ArrayList<>();
+        commands.add(RmiIiopReturnValueTest.JAVA);
+        commands.add("-addmods");
+        commands.add("java.corba");
+        commands.add("-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory");
+        commands.add("-Djava.naming.provider.url=iiop://localhost:5050");
+        commands.add("-cp");
+        commands.add(RmiIiopReturnValueTest.CLASSPATH);
+        commands.add("HelloServer");
+        commands.add("-port");
+        commands.add("5049");
+
+        System.out.println("RmiIiopReturnValueTest: Executing: " + commands);
+        ProcessBuilder pb = new ProcessBuilder(commands);
+        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+        rmiServerProcess = pb.start();
+    }
+
+    static boolean isResponseReceived() {
+        return HelloClient.isResponseReceived();
+    }
+
+    static void stopRmiIiopServer() throws Exception {
+        if (rmiServerProcess != null) {
+            System.out.println("RmiIiopReturnValueTest.stopRmiIiopServer: destroy rmiServerProcess");
+            rmiServerProcess.destroyForcibly();
+            rmiServerProcess.waitFor();
+            System.out.println("serverProcess exitCode:"
+                + rmiServerProcess.exitValue());
+        }
+    }
+
+    static void stopOrbd() throws Exception {
+        System.out.println("RmiIiopReturnValueTest.stopOrbd: destroy orbdProcess ");
+        orbdProcess.destroyForcibly();
+        orbdProcess.waitFor();
+        System.out.println("orbd exitCode:"
+            + orbdProcess.exitValue());
+    }
+
+    static void executeRmiIiopClient() throws Exception {
+        System.out.println("RmiIiopReturnValueTest.executeRmiIiopClient: HelloClient.executeRmiClientCall");
+        try {
+            HelloClient.executeRmiClientCall();
+        } catch (Throwable t) {
+            clientException = t;
+            exceptionInClient = true;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/Test.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,29 @@
+/*
+ * 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.Serializable;
+
+
+public class Test implements Serializable {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/Test3.java	Wed Jul 05 21:52:51 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.
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+
+public class Test3 implements Serializable {
+
+    private List<Test> list;
+
+    public Test3(List<Test> list) {
+        this.list = list;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/Test4.java	Wed Jul 05 21:52:51 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.util.List;
+
+
+public class Test4 extends Test3 {
+
+    private int aNumber = 1;
+
+    public Test4(List<Test> list) {
+        super(list);
+    }
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/_HelloImpl_Tie.java	Wed Jul 05 21:52:51 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.
+ */
+
+// Tie class generated by rmic, do not edit.
+// Contents subject to change without notice.
+
+import java.io.Serializable;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import javax.rmi.CORBA.Tie;
+import javax.rmi.CORBA.Util;
+import org.omg.CORBA.BAD_OPERATION;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+import org.omg.CORBA.portable.ResponseHandler;
+import org.omg.CORBA.portable.UnknownException;
+import org.omg.CORBA_2_3.portable.ObjectImpl;
+
+
+public class _HelloImpl_Tie extends ObjectImpl implements Tie {
+
+    volatile private HelloImpl target = null;
+
+    private static final String[] _type_ids = {
+        "RMI:HelloInterface:0000000000000000"
+    };
+
+    public void setTarget(Remote target) {
+        this.target = (HelloImpl) target;
+    }
+
+    public Remote getTarget() {
+        return target;
+    }
+
+    public org.omg.CORBA.Object thisObject() {
+        return this;
+    }
+
+    public void deactivate() {
+        _orb().disconnect(this);
+        _set_delegate(null);
+        target = null;
+    }
+
+    public ORB orb() {
+        return _orb();
+    }
+
+    public void orb(ORB orb) {
+        orb.connect(this);
+    }
+
+    public String[] _ids() {
+        return (String[]) _type_ids.clone();
+    }
+
+    public OutputStream  _invoke(String method, InputStream _in, ResponseHandler reply) throws SystemException {
+        try {
+            HelloImpl target = this.target;
+            if (target == null) {
+                throw new java.io.IOException();
+            }
+            org.omg.CORBA_2_3.portable.InputStream in =
+                (org.omg.CORBA_2_3.portable.InputStream) _in;
+            if (method.equals("sayHelloWithTest3")) {
+                Test3 arg0 = (Test3) in.read_value(Test3.class);
+                Test3 result = target.sayHelloWithTest3(arg0);
+                org.omg.CORBA_2_3.portable.OutputStream out =
+                    (org.omg.CORBA_2_3.portable.OutputStream) reply.createReply();
+                out.write_value(result,Test3.class);
+                return out;
+            }
+            throw new BAD_OPERATION();
+        } catch (SystemException ex) {
+            throw ex;
+        } catch (Throwable ex) {
+            throw new UnknownException(ex);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/_HelloInterface_Stub.java	Wed Jul 05 21:52:51 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.
+ */
+
+// Stub class generated by rmic, do not edit.
+// Contents subject to change without notice.
+
+import java.io.Serializable;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.UnexpectedException;
+import javax.rmi.CORBA.Stub;
+import javax.rmi.CORBA.Util;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.portable.ApplicationException;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
+import org.omg.CORBA.portable.RemarshalException;
+import org.omg.CORBA.portable.ResponseHandler;
+import org.omg.CORBA.portable.ServantObject;
+
+
+public class _HelloInterface_Stub extends Stub implements HelloInterface {
+
+    private static final String[] _type_ids = {
+        "RMI:HelloInterface:0000000000000000"
+    };
+
+        public String[] _ids() {
+            return (String[]) _type_ids.clone();
+        }
+
+        public Test3 sayHelloWithTest3(Test3 arg0) throws java.rmi.RemoteException {
+            if (!Util.isLocal(this)) {
+                try {
+                    org.omg.CORBA_2_3.portable.InputStream in = null;
+                    try {
+                        org.omg.CORBA_2_3.portable.OutputStream out =
+                            (org.omg.CORBA_2_3.portable.OutputStream)
+                            _request("sayHelloWithTest3", true);
+                        out.write_value(arg0,Test3.class);
+                        in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);
+                        return (Test3) in.read_value(Test3.class);
+                    } catch (ApplicationException ex) {
+                        in = (org.omg.CORBA_2_3.portable.InputStream) ex.getInputStream();
+                        String $_id = in.read_string();
+                        throw new UnexpectedException($_id);
+                    } catch (RemarshalException ex) {
+                        return sayHelloWithTest3(arg0);
+                    } finally {
+                        _releaseReply(in);
+                    }
+                } catch (SystemException ex) {
+                    throw Util.mapSystemException(ex);
+                }
+            } else {
+                ServantObject so = _servant_preinvoke("sayHelloWithTest3",HelloInterface.class);
+                if (so == null) {
+                    return sayHelloWithTest3(arg0);
+                }
+                try {
+                    Test3 arg0Copy = (Test3) Util.copyObject(arg0,_orb());
+                    Test3 result = ((HelloInterface)so.servant).sayHelloWithTest3(arg0Copy);
+                    return (Test3)Util.copyObject(result,_orb());
+                } catch (Throwable ex) {
+                    Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
+                    throw Util.wrapException(exCopy);
+                } finally {
+                    _servant_postinvoke(so);
+                }
+            }
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/jtreg.test.policy	Wed Jul 05 21:52:51 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.
+ */
+
+grant codeBase "jrt:/java.corba" {
+        permission java.security.AllPermission;
+};
+
+
+
+grant {
+  permission java.io.FilePermission "./-", "read,write,execute";
+  permission java.io.FilePermission "*", "read";
+  permission java.net.SocketPermission "*:*", "connect, accept, listen, resolve";
+  permission java.util.PropertyPermission "*", "read, write";
+  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
+  permission java.io.SerializablePermission "enableSubclassImplementation";
+  permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
+  permission java.lang.RuntimePermission "accessClassInPackage.sun.corba";
+  permission java.lang.RuntimePermission "defineClassInPackage.sun.corba";
+  permission java.lang.RuntimePermission "reflectionFactoryAccess";
+  permission sun.corba.BridgePermission "getBridge";
+  permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.reflect";
+  permission java.util.PropertyPermission "*", "read, write";
+  permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute";
+};
--- a/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -31,17 +31,16 @@
  *    HelloImpl.java _HelloImpl_Tie.java _HelloInterface_Stub.java ConcurrentHashMapTest.java
  * @run main/othervm -addmods java.corba -Djava.naming.provider.url=iiop://localhost:1050
  *    -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory ConcurrentHashMapTest
+ * @run main/othervm/secure=java.lang.SecurityManager/policy=jtreg.test.policy
+ *    -addmods java.corba -Djava.naming.provider.url=iiop://localhost:1050
+ *    -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory ConcurrentHashMapTest
  * @key intermittent
  */
 
 
-import java.io.DataInputStream;
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.CountDownLatch;
 import jdk.testlibrary.JDKToolFinder;
 import jdk.testlibrary.JDKToolLauncher;
 
@@ -83,7 +82,7 @@
     }
 
     static void startOrbd() throws Exception {
-        System.out.println("\nStarting orbd on port 1050 ");
+        System.out.println("\nStarting orbd with NS port 1050 ");
 
         //orbd -ORBInitialHost localhost -ORBInitialPort 1050
         orbdLauncher.addToolArg("-ORBInitialHost").addToolArg("localhost")
@@ -98,7 +97,7 @@
 
     static void startRmiIiopServer() throws Exception {
         System.out.println("\nStarting RmiServer");
-        // java -cp .
+        // java -cp . -addmods java.corba
         // -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
         // -Djava.naming.provider.url=iiop://localhost:1050 HelloServer
         List<String> commands = new ArrayList<>();
@@ -122,17 +121,15 @@
     }
 
     static void stopRmiIiopServer() throws Exception {
-        rmiServerProcess.destroy();
+        rmiServerProcess.destroyForcibly();
         rmiServerProcess.waitFor();
-        //rmiServerProcess.waitFor(30, TimeUnit.SECONDS);
         System.out.println("serverProcess exitCode:"
             + rmiServerProcess.exitValue());
     }
 
     static void stopOrbd() throws Exception {
-        orbdProcess.destroy();
+        orbdProcess.destroyForcibly();
         orbdProcess.waitFor();
-        //orbdProcess.waitFor(30, TimeUnit.SECONDS);
         System.out.println("orbd exitCode:"
             + orbdProcess.exitValue());
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/rmi/PortableRemoteObject/jtreg.test.policy	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+grant codeBase "jrt:/java.corba" {
+        permission java.security.AllPermission;
+};
+
+grant {
+  permission java.io.FilePermission "./-", "read,write,execute";
+  permission java.io.FilePermission "*", "read";
+  permission java.net.SocketPermission "*:*", "connect, accept, listen, resolve";
+  permission java.util.PropertyPermission "*", "read, write";
+  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
+  permission java.io.SerializablePermission "enableSubclassImplementation";
+  permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
+  permission java.lang.RuntimePermission "accessClassInPackage.sun.corba";
+  permission java.lang.RuntimePermission "defineClassInPackage.sun.corba";
+  permission java.lang.RuntimePermission "reflectionFactoryAccess";
+  permission sun.corba.BridgePermission "getBridge";
+  permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.reflect";
+  permission java.util.PropertyPermission "*", "read, write";
+  permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute";
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithAbstractFactory.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBContextFactory;
+import javax.xml.bind.JAXBException;
+
+/**
+ * @test
+ * @bug 8150173
+ * @summary Verifies that a factory which inherit its createContext method
+ *          from an abstract subclass of JAXBContextFactory can be instantiated.
+ * @compile -addmods java.xml.bind JAXBContextWithAbstractFactory.java
+ * @run main/othervm -addmods java.xml.bind JAXBContextWithAbstractFactory
+ */
+public class JAXBContextWithAbstractFactory {
+    private static JAXBContext tmp;
+
+    public static abstract class FactoryBase implements JAXBContextFactory {
+        @Override
+        public JAXBContext createContext(Class<?>[] classesToBeBound,
+                Map<String, ?> properties) throws JAXBException {
+            return tmp;
+        }
+
+        @Override
+        public JAXBContext createContext(String contextPath,
+                ClassLoader classLoader, Map<String, ?> properties)
+                throws JAXBException {
+            return tmp;
+        }
+    }
+
+    public static class Factory extends FactoryBase {}
+
+    // test both without and then with a security manager as the code path
+    // can be different when System.getSecurityManager() != null;
+    public static void main(String[] args) throws JAXBException {
+        System.out.println("\nWithout security manager\n");
+        test();
+
+        System.out.println("\nWith security manager\n");
+        Policy.setPolicy(new Policy() {
+            @Override
+            public boolean implies(ProtectionDomain domain, Permission permission) {
+                return true; // allow all
+            }
+        });
+        System.setSecurityManager(new SecurityManager());
+        test();
+    }
+
+    public static void test() throws JAXBException {
+        System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+        System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+                + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY, ""));
+        System.out.println("Calling "
+                + "JAXBContext.newInstance(JAXBContextWithAbstractFactory.class)");
+        tmp = JAXBContext.newInstance(JAXBContextWithAbstractFactory.class);
+        System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY,
+                "JAXBContextWithAbstractFactory$Factory");
+        System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+                + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY));
+        System.out.println("Calling "
+                + "JAXBContext.newInstance(JAXBContextWithAbstractFactory.class)");
+        JAXBContext ctxt = JAXBContext.newInstance(JAXBContextWithAbstractFactory.class);
+        System.out.println("Successfully loaded JAXBcontext: " +
+                System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+        if (ctxt != tmp) {
+            throw new RuntimeException("Wrong JAXBContext instance"
+                + "\n\texpected: "
+                + System.identityHashCode(tmp) + "@" + tmp.getClass().getName()
+                + "\n\tactual:   "
+                + System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithLegacyFactory.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.Validator;
+
+/**
+ * @test
+ * @bug 8150173
+ * @summary Verifies that a JAXBContext can be created with a legacy
+ *          factory class that has static createContext methods.
+ * @compile -addmods java.xml.bind JAXBContextWithLegacyFactory.java
+ * @run main/othervm -addmods java.xml.bind JAXBContextWithLegacyFactory
+ */
+public class JAXBContextWithLegacyFactory {
+    private static JAXBContext tmp;
+
+        public static class JAXBContextImpl extends JAXBContext {
+        public final Class<?> creator;
+        JAXBContextImpl(Class<?> creator) {
+            this.creator = creator;
+        }
+
+        @Override
+        public Unmarshaller createUnmarshaller() throws JAXBException {
+            return tmp.createUnmarshaller();
+        }
+
+        @Override
+        public Marshaller createMarshaller() throws JAXBException {
+            return tmp.createMarshaller();
+        }
+
+        @Override
+        public Validator createValidator() throws JAXBException {
+            return tmp.createValidator();
+        }
+    }
+
+    public static abstract class FactoryBase {
+        public static JAXBContext createContext(Class<?>[] classesToBeBound,
+                Map<String, ?> properties) throws JAXBException {
+            return new JAXBContextImpl(FactoryBase.class);
+        }
+
+        public static JAXBContext createContext(String contextPath,
+                ClassLoader classLoader, Map<String, ?> properties)
+                throws JAXBException {
+            return new JAXBContextImpl(FactoryBase.class);
+        }
+    }
+
+    public static class Factory1 extends FactoryBase {}
+
+    public static class Factory2 extends FactoryBase {
+        public static JAXBContext createContext(Class<?>[] classesToBeBound,
+                Map<String, ?> properties) throws JAXBException {
+            return new JAXBContextImpl(Factory2.class);
+        }
+
+        public static JAXBContext createContext(String contextPath,
+                ClassLoader classLoader, Map<String, ?> properties)
+                throws JAXBException {
+            return new JAXBContextImpl(Factory2.class);
+        }
+    }
+
+    // test both without and then with a security manager as the code path
+    // can be different when System.getSecurityManager() != null;
+    public static void main(String[] args) throws JAXBException {
+        System.out.println("\nWithout security manager\n");
+        test(FactoryBase.class, FactoryBase.class);
+        test(Factory1.class, FactoryBase.class);
+        test(Factory2.class, Factory2.class);
+
+        System.out.println("\nWith security manager\n");
+        Policy.setPolicy(new Policy() {
+            @Override
+            public boolean implies(ProtectionDomain domain, Permission permission) {
+                return true; // allow all
+            }
+        });
+        System.setSecurityManager(new SecurityManager());
+        test(FactoryBase.class, FactoryBase.class);
+        test(Factory1.class, FactoryBase.class);
+        test(Factory2.class, Factory2.class);
+    }
+
+    public static void test(Class<?> factoryClass, Class<?> creatorClass) throws JAXBException {
+        System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+        System.out.println("** Testing  with Factory Class: " + factoryClass.getName());
+        System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+                + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY, ""));
+        System.out.println("Calling "
+                + "JAXBContext.newInstance(JAXBContextWithLegacyFactory.class)");
+        tmp = JAXBContext.newInstance(JAXBContextWithLegacyFactory.class);
+        System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY,
+                factoryClass.getName());
+        System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+                + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY));
+        System.out.println("Calling "
+                + "JAXBContext.newInstance(JAXBContextWithLegacyFactory.class)");
+        JAXBContext ctxt = JAXBContext.newInstance(JAXBContextWithLegacyFactory.class);
+        System.out.println("Successfully loaded JAXBcontext: " +
+                System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+        if (ctxt.getClass() != JAXBContextImpl.class) {
+            throw new RuntimeException("Wrong JAXBContext class"
+                + "\n\texpected: "
+                + System.identityHashCode(tmp) + "@" + JAXBContextImpl.class.getName()
+                + "\n\tactual:   "
+                + System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+        }
+        if (((JAXBContextImpl)ctxt).creator != creatorClass) {
+            throw new RuntimeException("Wrong Factory class"
+                + "\n\texpected: "
+                + System.identityHashCode(tmp) + "@" + creatorClass.getName()
+                + "\n\tactual:   "
+                + System.identityHashCode(ctxt) + "@" + ((JAXBContextImpl)ctxt).creator.getName());
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithSubclassedFactory.java	Wed Jul 05 21:52:51 2017 +0200
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.Map;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBContextFactory;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.Validator;
+
+/**
+ * @test
+ * @bug 8150173
+ * @summary Verifies that a factory which inherit its createContext method
+ *          from a concrete subclass of JAXBContextFactory is be instantiated.
+ * @compile -addmods java.xml.bind JAXBContextWithSubclassedFactory.java
+ * @run main/othervm -addmods java.xml.bind JAXBContextWithSubclassedFactory
+ */
+public class JAXBContextWithSubclassedFactory {
+    static JAXBContext tmp;
+
+    public static class JAXBContextImpl extends JAXBContext {
+        public final Class<?> creator;
+        JAXBContextImpl(Class<?> creator) {
+            this.creator = creator;
+        }
+
+        @Override
+        public Unmarshaller createUnmarshaller() throws JAXBException {
+            return tmp.createUnmarshaller();
+        }
+
+        @Override
+        public Marshaller createMarshaller() throws JAXBException {
+            return tmp.createMarshaller();
+        }
+
+        @Override
+        public Validator createValidator() throws JAXBException {
+            return tmp.createValidator();
+        }
+    }
+
+    public static class FactoryBase implements JAXBContextFactory {
+
+        @Override
+        public JAXBContext createContext(Class<?>[] classesToBeBound,
+                Map<String, ?> properties) throws JAXBException {
+            return new JAXBContextImpl(this.getClass());
+        }
+
+        @Override
+        public JAXBContext createContext(String contextPath,
+                ClassLoader classLoader, Map<String, ?> properties)
+                throws JAXBException {
+            return new JAXBContextImpl(this.getClass());
+        }
+    }
+
+    public static class NonFactoryBase {
+
+        public JAXBContext createContext(Class<?>[] classesToBeBound,
+                Map<String, ?> properties) throws JAXBException {
+            return new JAXBContextImpl(this.getClass());
+        }
+
+        public JAXBContext createContext(String contextPath,
+                ClassLoader classLoader, Map<String, ?> properties)
+                throws JAXBException {
+            return new JAXBContextImpl(this.getClass());
+        }
+    }
+
+    public static class Factory1 extends FactoryBase {}
+    public static class Factory2 extends NonFactoryBase implements JAXBContextFactory {}
+
+    // test both without and then with a security manager as the code path
+    // can be different when System.getSecurityManager() != null;
+    public static void main(String[] args) throws JAXBException {
+        System.out.println("\nWithout security manager\n");
+        test(FactoryBase.class);
+        test(Factory1.class);
+        test(Factory2.class);
+
+        System.out.println("\nWith security manager\n");
+        Policy.setPolicy(new Policy() {
+            @Override
+            public boolean implies(ProtectionDomain domain, Permission permission) {
+                return true; // allow all
+            }
+        });
+        System.setSecurityManager(new SecurityManager());
+        test(FactoryBase.class);
+        test(Factory1.class);
+        test(Factory2.class);
+    }
+
+    public static void test(Class<?> factoryClass) throws JAXBException {
+        System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+        System.out.println("** Testing  with Factory Class: " + factoryClass.getName());
+        System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+                + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY, ""));
+        System.out.println("Calling "
+                + "JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class)");
+        tmp = JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class);
+        System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY,
+                factoryClass.getName());
+        System.out.println(JAXBContext.JAXB_CONTEXT_FACTORY + " = "
+                + System.getProperty(JAXBContext.JAXB_CONTEXT_FACTORY));
+        System.out.println("Calling "
+                + "JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class)");
+        JAXBContext ctxt = JAXBContext.newInstance(JAXBContextWithSubclassedFactory.class);
+        System.out.println("Successfully loaded JAXBcontext: " +
+                System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+        if (ctxt.getClass() != JAXBContextImpl.class) {
+            throw new RuntimeException("Wrong JAXBContext class"
+                + "\n\texpected: "
+                + System.identityHashCode(tmp) + "@" + JAXBContextImpl.class.getName()
+                + "\n\tactual:   "
+                + System.identityHashCode(ctxt) + "@" + ctxt.getClass().getName());
+        }
+        if (((JAXBContextImpl)ctxt).creator != factoryClass) {
+            throw new RuntimeException("Wrong Factory class"
+                + "\n\texpected: "
+                + System.identityHashCode(tmp) + "@" + factoryClass.getName()
+                + "\n\tactual:   "
+                + System.identityHashCode(ctxt) + "@" + ((JAXBContextImpl)ctxt).creator.getName());
+        }
+    }
+}
--- a/jdk/test/jdk/internal/jrtfs/Basic.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/jdk/internal/jrtfs/Basic.java	Wed Jul 05 21:52:51 2017 +0200
@@ -715,5 +715,14 @@
         assertTrue(childCount != 0);
         assertEquals(dirPrefixOkayCount, childCount);
     }
+
+    @Test
+    public void objectClassSizeTest() throws Exception {
+        String path = "/modules/java.base/java/lang/Object.class";
+        FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
+        Path classFile = fs.getPath(path);
+
+        assertTrue(Files.size(classFile) > 0L);
+    }
 }
 
--- a/jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/sun/security/pkcs11/rsa/TestKeyPairGenerator.java	Wed Jul 05 21:52:51 2017 +0200
@@ -29,8 +29,9 @@
  * @library ..
  * @library /lib/testlibrary
  * @build jdk.testlibrary.*
- * @run main/othervm TestKeyPairGenerator
- * @run main/othervm TestKeyPairGenerator sm TestKeyPairGenerator.policy
+ * @run main/othervm -Djava.security.debug=sunpkcs11 TestKeyPairGenerator
+ * @run main/othervm -Djava.security.debug=sunpkcs11 TestKeyPairGenerator
+ *                                                   sm TestKeyPairGenerator.policy
  * @key intermittent randomness
  */
 
--- a/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java	Wed Jul 05 21:52:51 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
@@ -39,6 +39,7 @@
 import java.util.Calendar;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
+import java.util.Locale;
 
 import sun.security.pkcs.ContentInfo;
 import sun.security.pkcs.PKCS7;
@@ -371,7 +372,7 @@
     static void jarsigner(String cmd, int path, boolean expected)
             throws Exception {
         System.err.println("Test " + path);
-        Process p = Runtime.getRuntime().exec(String.format(cmd, path, path));
+        Process p = Runtime.getRuntime().exec(String.format(Locale.ROOT,cmd, path, path));
         BufferedReader reader = new BufferedReader(
                 new InputStreamReader(p.getErrorStream()));
         while (true) {
--- a/jdk/test/tools/jlink/DefaultProviderTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/DefaultProviderTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -26,7 +26,6 @@
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -65,13 +64,6 @@
         private boolean enabled = true;
 
         @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.TRANSFORMER);
-            return Collections.unmodifiableSet(set);
-        }
-
-        @Override
         public Set<State> getState() {
              return enabled ? EnumSet.of(State.AUTO_ENABLED, State.FUNCTIONAL)
                 : EnumSet.of(State.DISABLED);
--- a/jdk/test/tools/jlink/ImageFilePoolTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/ImageFilePoolTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -33,7 +33,7 @@
 import java.io.ByteArrayInputStream;
 import java.util.Optional;
 import java.util.function.Function;
-import jdk.tools.jlink.internal.ModuleEntryImpl;
+import jdk.tools.jlink.internal.ModuleEntryFactory;
 import jdk.tools.jlink.internal.ModulePoolImpl;
 import jdk.tools.jlink.plugin.ModuleEntry;
 import jdk.tools.jlink.plugin.ModulePool;
@@ -54,7 +54,7 @@
         ModulePool input = new ModulePoolImpl();
         for (int i = 0; i < 1000; ++i) {
             String module = "module" + (i / 100);
-            input.add(new InMemoryImageFile(module, "/" + module + "/java/class" + i,
+            input.add(newInMemoryImageFile("/" + module + "/java/class" + i,
                     ModuleEntry.Type.CONFIG, "class" + i));
         }
         if (input.getEntryCount() != 1000) {
@@ -94,11 +94,11 @@
             switch (index) {
                 case 0:
                     ++amountAfter;
-                    return new InMemoryImageFile(file.getModule(), file.getPath() + SUFFIX,
+                    return newInMemoryImageFile(file.getPath() + SUFFIX,
                             file.getType(), file.getPath());
                 case 1:
                     ++amountAfter;
-                    return new InMemoryImageFile(file.getModule(), file.getPath(),
+                    return newInMemoryImageFile(file.getPath(),
                             file.getType(), file.getPath());
             }
             return null;
@@ -130,28 +130,27 @@
         if (input.findEntry("unknown").isPresent()) {
             throw new AssertionError("ImageFileModulePool does not return null for unknown file");
         }
-        if (input.contains(new InMemoryImageFile("", "unknown", ModuleEntry.Type.CONFIG, "unknown"))) {
-            throw new AssertionError("'contain' returns true for unknown file");
+        if (input.contains(newInMemoryImageFile("/unknown/foo", ModuleEntry.Type.CONFIG, "unknown"))) {
+            throw new AssertionError("'contain' returns true for /unknown/foo file");
         }
-        input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
+        input.add(newInMemoryImageFile("/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
         try {
-            input.add(new InMemoryImageFile("", "/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
+            input.add(newInMemoryImageFile("/aaa/bbb", ModuleEntry.Type.CONFIG, ""));
             throw new AssertionError("Exception expected");
         } catch (Exception e) {
             // expected
         }
         input.setReadOnly();
         try {
-            input.add(new InMemoryImageFile("", "/aaa/ccc", ModuleEntry.Type.CONFIG, ""));
+            input.add(newInMemoryImageFile("/aaa/ccc", ModuleEntry.Type.CONFIG, ""));
             throw new AssertionError("Exception expected");
         } catch (Exception e) {
             // expected
         }
     }
 
-    private static class InMemoryImageFile extends ModuleEntryImpl {
-        public InMemoryImageFile(String module, String path, ModuleEntry.Type type, String content) {
-            super(module, path, type, new ByteArrayInputStream(content.getBytes()), content.getBytes().length);
-        }
+    private static ModuleEntry newInMemoryImageFile(String path,
+            ModuleEntry.Type type, String content) {
+        return ModuleEntryFactory.create(path, type, content.getBytes());
     }
 }
--- a/jdk/test/tools/jlink/IntegrationTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/IntegrationTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -90,10 +90,8 @@
         }
 
         @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.PROCESSOR);
-            return Collections.unmodifiableSet(set);
+        public Category getType() {
+            return Category.PROCESSOR;
         }
 
         @Override
@@ -139,13 +137,6 @@
         }
 
         @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.TRANSFORMER);
-            return Collections.unmodifiableSet(set);
-        }
-
-        @Override
         public String getDescription() {
             return null;
         }
--- a/jdk/test/tools/jlink/JLinkOptimTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/JLinkOptimTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -9,11 +9,9 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Stream;
 import jdk.internal.org.objectweb.asm.ClassReader;
 import jdk.internal.org.objectweb.asm.Opcodes;
@@ -132,13 +130,6 @@
         public String getName() {
             return NAME;
         }
-
-        @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.TRANSFORMER);
-            return Collections.unmodifiableSet(set);
-        }
     }
 
     private static void testForName() throws Exception {
--- a/jdk/test/tools/jlink/JLinkPostProcessingTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/JLinkPostProcessingTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -26,10 +26,8 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import jdk.tools.jlink.internal.PluginRepository;
 import jdk.tools.jlink.plugin.ExecutableImage;
@@ -75,10 +73,8 @@
         }
 
         @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.PROCESSOR);
-            return Collections.unmodifiableSet(set);
+        public Category getType() {
+            return Category.PROCESSOR;
         }
 
         @Override
--- a/jdk/test/tools/jlink/JLinkTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/JLinkTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -24,6 +24,7 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.lang.module.ModuleDescriptor;
 import java.lang.reflect.Layer;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -34,6 +35,7 @@
 import java.util.stream.Stream;
 
 import jdk.tools.jlink.plugin.Plugin;
+import jdk.tools.jlink.plugin.TransformerPlugin;
 import jdk.tools.jlink.internal.PluginRepository;
 import tests.Helper;
 import tests.JImageGenerator;
@@ -54,6 +56,13 @@
  * @run main/othervm -verbose:gc -Xmx1g JLinkTest
  */
 public class JLinkTest {
+    // number of built-in plugins from jdk.jlink module
+    private static int getNumJlinkPlugins() {
+        ModuleDescriptor desc = Plugin.class.getModule().getDescriptor();
+        return desc.provides().
+                    get(TransformerPlugin.class.getName()).
+                    providers().size();
+    }
 
     public static void main(String[] args) throws Exception {
 
@@ -63,7 +72,7 @@
             return;
         }
         helper.generateDefaultModules();
-        int numPlugins = 13;
+        int numPlugins = getNumJlinkPlugins();
         {
             // number of built-in plugins
             List<Plugin> builtInPlugins = new ArrayList<>();
@@ -72,7 +81,9 @@
                 p.getState();
                 p.getType();
             }
-            if (builtInPlugins.size() != numPlugins) {
+            // Note: other boot layer modules may provide jlink plugins.
+            // We should at least see the builtin plugins from jdk.jlink.
+            if (builtInPlugins.size() < numPlugins) {
                 throw new AssertionError("Found plugins doesn't match expected number : " +
                         numPlugins + "\n" + builtInPlugins);
             }
--- a/jdk/test/tools/jlink/ResourcePoolTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/ResourcePoolTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -66,9 +66,7 @@
             String module = "/module" + (i / 10);
             String resourcePath = module + "/java/package" + i;
             byte[] bytes = resourcePath.getBytes();
-            input.add(ModuleEntry.create(module, resourcePath,
-                    ModuleEntry.Type.CLASS_OR_RESOURCE,
-                    new ByteArrayInputStream(bytes), bytes.length));
+            input.add(ModuleEntry.create(resourcePath, bytes));
         }
         ModulePool output = new ModulePoolImpl();
         ResourceVisitor visitor = new ResourceVisitor();
@@ -103,12 +101,11 @@
             switch (index) {
                 case 0:
                     ++amountAfter;
-                    return ModuleEntry.create(resource.getModule(), resource.getPath() + SUFFIX,
-                            resource.getType(), resource.stream(), resource.getLength());
+                    return ModuleEntry.create(resource.getPath() + SUFFIX,
+                            resource.getType(), resource.getBytes());
                 case 1:
                     ++amountAfter;
-                    return ModuleEntry.create(resource.getModule(), resource.getPath(),
-                            resource.getType(), resource.stream(), resource.getLength());
+                    return resource.create(resource.getBytes());
             }
             return null;
         }
@@ -132,9 +129,7 @@
         samples.add("javax/management/ObjectName");
         test(samples, (resources, module, path) -> {
             try {
-                resources.add(ModuleEntry.create(module, path,
-                        ModuleEntry.Type.CLASS_OR_RESOURCE,
-                        new ByteArrayInputStream(new byte[0]), 0));
+                resources.add(ModuleEntry.create(path, new byte[0]));
             } catch (Exception ex) {
                 throw new RuntimeException(ex);
             }
@@ -142,9 +137,7 @@
         test(samples, (resources, module, path) -> {
             try {
                 resources.add(ModulePoolImpl.
-                        newCompressedResource(ModuleEntry.create(module, path,
-                                ModuleEntry.Type.CLASS_OR_RESOURCE,
-                                new ByteArrayInputStream(new byte[0]), 0),
+                        newCompressedResource(ModuleEntry.create(path, new byte[0]),
                                 ByteBuffer.allocate(99), "bitcruncher", null,
                                 ((ModulePoolImpl)resources).getStringTable(), ByteOrder.nativeOrder()));
             } catch (Exception ex) {
@@ -203,20 +196,14 @@
 
     private void checkResourcesAfterCompression() throws Exception {
         ModulePoolImpl resources1 = new ModulePoolImpl();
-        ModuleEntry res1 = ModuleEntry.create("module1", "/module1/toto1",
-                ModuleEntry.Type.CLASS_OR_RESOURCE,
-                new ByteArrayInputStream(new byte[0]), 0);
-        ModuleEntry res2 = ModuleEntry.create("module2", "/module2/toto1",
-                ModuleEntry.Type.CLASS_OR_RESOURCE,
-                new ByteArrayInputStream(new byte[0]), 0);
+        ModuleEntry res1 = ModuleEntry.create("/module1/toto1", new byte[0]);
+        ModuleEntry res2 = ModuleEntry.create("/module2/toto1", new byte[0]);
         resources1.add(res1);
         resources1.add(res2);
 
         checkResources(resources1, res1, res2);
         ModulePool resources2 = new ModulePoolImpl();
-        ModuleEntry res3 = ModuleEntry.create("module2", "/module2/toto1",
-                ModuleEntry.Type.CLASS_OR_RESOURCE,
-                new ByteArrayInputStream(new byte[7]), 7);
+        ModuleEntry res3 = ModuleEntry.create("/module2/toto1", new byte[7]);
         resources2.add(res3);
         resources2.add(ModulePoolImpl.newCompressedResource(res1,
                 ByteBuffer.allocate(7), "zip", null, resources1.getStringTable(),
@@ -260,8 +247,7 @@
 
         ((ModulePoolImpl) resources).setReadOnly();
         try {
-            resources.add(ModuleEntry.create("module2",  "/module2/toto1",
-                    ModuleEntry.Type.CLASS_OR_RESOURCE, new ByteArrayInputStream(new byte[0]), 0));
+            resources.add(ModuleEntry.create("/module2/toto1", new byte[0]));
             throw new AssertionError("ModulePool is read-only, but an exception is not thrown");
         } catch (Exception ex) {
             // Expected
--- a/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -23,9 +23,7 @@
 package plugin;
 
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 import java.util.function.Function;
 import jdk.tools.jlink.plugin.ModuleEntry;
 import jdk.tools.jlink.plugin.ModulePool;
@@ -58,9 +56,7 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.PROCESSOR);
-        return Collections.unmodifiableSet(set);
+    public Category getType() {
+        return Category.PROCESSOR;
     }
 }
--- a/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java	Wed Jul 05 21:52:51 2017 +0200
@@ -26,9 +26,7 @@
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 import jdk.tools.jlink.plugin.ModuleEntry;
 import jdk.tools.jlink.plugin.ModulePool;
 import jdk.tools.jlink.plugin.TransformerPlugin;
@@ -63,13 +61,6 @@
     }
 
     @Override
-    public Set<Category> getType() {
-        Set<Category> set = new HashSet<>();
-        set.add(Category.TRANSFORMER);
-        return Collections.unmodifiableSet(set);
-    }
-
-    @Override
     public String getDescription() {
         return NAME + "-description";
     }
--- a/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -74,8 +74,8 @@
         fplug.configure(prop);
         ModulePoolImpl files = new ModulePoolImpl();
         ModulePoolImpl fresult = new ModulePoolImpl();
-        ModuleEntry f = ModuleEntry.create(module, "/" + module + "/" + sample,
-                ModuleEntry.Type.CONFIG, new ByteArrayInputStream(new byte[0]), 0);
+        ModuleEntry f = ModuleEntry.create("/" + module + "/" + sample,
+                ModuleEntry.Type.CONFIG, new byte[0]);
         files.add(f);
 
         fplug.visit(files, fresult);
--- a/jdk/test/tools/jlink/plugins/ExcludePluginTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/ExcludePluginTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -48,16 +48,16 @@
 
     public void test() throws Exception {
         check("**.jcov", "/num/toto.jcov", true);
-        check("**.jcov", "//toto.jcov", true);
+        check("**.jcov", "/toto.jcov/", true);
         check("**.jcov", "/toto.jcov/tutu/tata", false);
         check("/java.base/*.jcov", "/java.base/toto.jcov", true);
-        check("/java.base/toto.jcov", "t/java.base/iti.jcov", false);
+        check("/java.base/toto.jcov", "/tjava.base/iti.jcov", false);
         check("/java.base/*/toto.jcov", "/java.base/toto.jcov", false);
         check("/java.base/*/toto.jcov", "/java.base/tutu/toto.jcov", true);
         check("**/java.base/*/toto.jcov", "/tutu/java.base/tutu/toto.jcov", true);
         check("/META-INF/**", "/META-INF/services/  MyProvider ", true);
         check("/META-INF/**", "/META-INF/services/MyProvider", true);
-        check("**/META-INF", " /META-INF/services/MyProvider", false);
+        check("**/META-INF", "/ META-INF/services/MyProvider", false);
         check("**/META-INF/**", "/java.base//META-INF/services/MyProvider", true);
         check("/java.base/*/Toto$Titi.class", "/java.base/tutu/Toto$Titi.class", true);
         check("/**$**.class", "/java.base/tutu/Toto$Titi.class", true);
--- a/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/ExcludeVMPluginTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -165,11 +165,11 @@
         // Create a pool with jvm.cfg and the input paths.
         byte[] jvmcfgContent = jvmcfg.getBytes();
         ModulePool pool = new ModulePoolImpl();
-        pool.add(ModuleEntry.create("java.base", "/java.base/native/jvm.cfg",
-                ModuleEntry.Type.NATIVE_LIB, new ByteArrayInputStream(jvmcfgContent), jvmcfgContent.length));
+        pool.add(ModuleEntry.create("/java.base/native/jvm.cfg",
+                ModuleEntry.Type.NATIVE_LIB, jvmcfgContent));
         for (String in : input) {
-            pool.add(ModuleEntry.create("java.base", in,
-                    ModuleEntry.Type.NATIVE_LIB, new ByteArrayInputStream(new byte[0]), 0));
+            pool.add(ModuleEntry.create(in,
+                    ModuleEntry.Type.NATIVE_LIB, new byte[0]));
         }
         ModulePool out = new ModulePoolImpl();
 
--- a/jdk/test/tools/jlink/plugins/LastSorterTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/LastSorterTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -33,10 +33,8 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import jdk.tools.jlink.internal.ImagePluginConfiguration;
 import jdk.tools.jlink.internal.PluginRepository;
@@ -200,13 +198,6 @@
         }
 
         @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.TRANSFORMER);
-            return Collections.unmodifiableSet(set);
-        }
-
-        @Override
         public void configure(Map<String, String> config) {
             String arguments = config.get(name);
             this.starts = arguments;
--- a/jdk/test/tools/jlink/plugins/PluginOrderTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/PluginOrderTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -260,8 +260,8 @@
         }
 
         @Override
-        public Set<Category> getType() {
-            return Collections.singleton(category);
+        public Category getType() {
+            return category;
         }
 
         @Override
--- a/jdk/test/tools/jlink/plugins/PluginsNegativeTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/PluginsNegativeTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -32,10 +32,8 @@
 import java.lang.reflect.Layer;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import jdk.tools.jlink.internal.ImagePluginConfiguration;
 import jdk.tools.jlink.internal.PluginRepository;
@@ -138,13 +136,6 @@
         }
 
         @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.TRANSFORMER);
-            return Collections.unmodifiableSet(set);
-        }
-
-        @Override
         public String getDescription() {
             return null;
         }
--- a/jdk/test/tools/jlink/plugins/PrevisitorTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/PrevisitorTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -34,11 +34,9 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 import jdk.tools.jlink.internal.ImagePluginConfiguration;
@@ -160,12 +158,5 @@
                 }
             });
         }
-
-        @Override
-        public Set<Category> getType() {
-            Set<Category> set = new HashSet<>();
-            set.add(Category.TRANSFORMER);
-            return Collections.unmodifiableSet(set);
-        }
     }
 }
--- a/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java	Fri Jun 24 14:46:45 2016 +0200
+++ b/jdk/test/tools/jlink/plugins/StringSharingPluginTest.java	Wed Jul 05 21:52:51 2017 +0200
@@ -106,6 +106,9 @@
                     byte[] content = Files.readAllBytes(p);
                     String path = p.toString().replace('\\', '/');
                     path = path.substring("/modules".length());
+                    if (path.charAt(0) != '/') {
+                        path = "/" + path;
+                    }
                     ModuleEntry res = ModuleEntry.create(path, content);
                     resources.add(res);
                 } catch (Exception ex) {
--- a/make/Bundles.gmk	Fri Jun 24 14:46:45 2016 +0200
+++ b/make/Bundles.gmk	Wed Jul 05 21:52:51 2017 +0200
@@ -52,7 +52,7 @@
 SetupBundleFile = $(NamedParamsMacroTemplate)
 define SetupBundleFileBody
 
-  $1_RELATIVE_FILES := $$(patsubst $$($1_BASE_DIR)/%, ./%, $$($1_FILES))
+  $1_RELATIVE_FILES := $$(patsubst $$($1_BASE_DIR)/%, %, $$($1_FILES))
 
   ifneq ($$(filter %.tar.gz, $$($1_BUNDLE_NAME)), )
     $1_TYPE := tar.gz
@@ -71,7 +71,7 @@
 	$$(call MakeDir, $$(@D))
         ifneq ($$($1_SPECIAL_INCLUDES), )
 	  $$(foreach i, $$($1_SPECIAL_INCLUDES), \
-	      ($(CD) $$($1_BASE_DIR) && $(FIND) ./$$i \
+	      ($(CD) $$($1_BASE_DIR) && $(FIND) $$i \
 	          >> $(SUPPORT_OUTPUTDIR)/bundles/_$1_files ) ; )
         endif
         ifneq ($$($1_SUBDIR), )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/CreateHgtipFiles.gmk	Wed Jul 05 21:52:51 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.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+
+define SetupCreateHgtip
+
+  $$(strip $1)/$(HGTIP_FILENAME): FRC
+	$(HG) tip --repository $$(strip $1) --template '{node|short}\n' > $$@.tmp
+	if [ ! -f $$@ ] || [ "`$(CAT) $$@`" != "`$(CAT) $$@.tmp`" ]; then \
+	  $(MV) $$@.tmp $$@ ; \
+	else \
+	  $(RM) $$@.tmp ; \
+	fi
+
+  TARGETS += $$(strip $1)/$(HGTIP_FILENAME)
+
+endef
+
+# Only try to create the tips if finding an actual hg repository. This will be
+# false if building from a source bundle.
+$(foreach r, $(call FindAllReposAbs), \
+  $(if $(wildcard $r/.hg), $(eval $(call SetupCreateHgtip, $r))) \
+)
+
+all: $(TARGETS)
+
+FRC:
+
+.PHONY: all
--- a/make/GensrcModuleInfo.gmk	Fri Jun 24 14:46:45 2016 +0200
+++ b/make/GensrcModuleInfo.gmk	Wed Jul 05 21:52:51 2017 +0200
@@ -95,6 +95,7 @@
       $(strip $(wildcard $(addsuffix $(subst .,/,/$(strip $1)), \
           $(MODULE_CLASSES_DIRS) \
           $(addsuffix /$(MODULE), $(IMPORT_MODULES_CLASSES)) \
+          $(JDK_OUTPUTDIR)/modules/$(MODULE) \
       )))
 
   # Convert the modification lines into arguments for the modification tool.
--- a/make/Javadoc.gmk	Fri Jun 24 14:46:45 2016 +0200
+++ b/make/Javadoc.gmk	Wed Jul 05 21:52:51 2017 +0200
@@ -463,7 +463,7 @@
 DOCLETAPI_HEADER := <strong>Doclet API</strong>
 DOCLETAPI_BOTTOM := $(call CommonTrademarkBottom,$(DOCLETAPI_FIRST_COPYRIGHT_YEAR))
 DOCLETAPI_GROUPNAME := Packages
-DOCLETAPI_REGEXP := jdk.javadoc.doclet.*
+DOCLETAPI_REGEXP := jdk.javadoc.doclet*
 # DOCLETAPI_PKGS is located in NON_CORE_PKGS.gmk
 
 # The index.html, options, and packages files
--- a/make/Main.gmk	Fri Jun 24 14:46:45 2016 +0200
+++ b/make/Main.gmk	Wed Jul 05 21:52:51 2017 +0200
@@ -301,13 +301,16 @@
 ################################################################################
 # Images targets
 
-# Stores the tips for each repository. This file is be used when constructing the jdk image and can be
-# used to track the exact sources used to build that image.
+# Stores the tips for each repository. This file is be used when constructing
+# the jdk image and can be used to track the exact sources used to build that
+# image.
 source-tips: $(SUPPORT_OUTPUTDIR)/source_tips
 $(SUPPORT_OUTPUTDIR)/source_tips: FRC
 	$(call MakeDir, $(@D))
-	@$(RM) $@
-	@$(call GetSourceTips)
+	$(call GetSourceTips)
+
+create-hgtip-files:
+	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f CreateHgtipFiles.gmk)
 
 BOOTCYCLE_TARGET := product-images
 bootcycle-images:
@@ -337,8 +340,8 @@
 mac-bundles-jdk:
 	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f MacBundles.gmk)
 
-ALL_TARGETS += source-tips bootcycle-images zip-security zip-source \
-    jrtfs-jar jimages profiles mac-bundles-jdk
+ALL_TARGETS += source-tips create-hgtip-files bootcycle-images zip-security \
+     zip-source jrtfs-jar jimages profiles mac-bundles-jdk
 
 ################################################################################
 # Docs targets
--- a/make/common/MakeBase.gmk	Fri Jun 24 14:46:45 2016 +0200
+++ b/make/common/MakeBase.gmk	Wed Jul 05 21:52:51 2017 +0200
@@ -335,25 +335,27 @@
 ################################################################################
 # The source tips can come from the Mercurial repository, or in the files
 # $(HGTIP_FILENAME) which contains the tip but is also positioned in the same
-# directory as the original $(HGDIR) directory.
-# These should not be := assignments, only used from the root Makefile.
-HG_VERSION = $(shell $(HG) version 2> /dev/null)
-HG_DIRECTORY=.hg
-HGTIP_FILENAME=.hgtip
-HG_SEARCH = ./REPO ./*/REPO ./*/*/REPO ./*/*/*/REPO
-REPO_LIST = $(patsubst ./%,%,$(patsubst %/,%,$(sort $(dir \
-    $(shell $(CD) $(SRC_ROOT) ; \
-        $(LS) -d $(HG_SEARCH:%/REPO=%/$(HG_DIRECTORY)) \
-            $(HG_SEARCH:%/REPO=%/$(HGTIP_FILENAME)) \
-        2> /dev/null)))))
+# directory as the original .hg directory. The hgtip files are created in
+# CreateHgtipFiles.gmk.
+HGTIP_FILENAME := .hgtip
+FindAllReposAbs = \
+    $(strip $(sort $(dir $(filter-out $(SRC_ROOT)/build/%, $(wildcard \
+        $(addprefix $(SRC_ROOT)/, \
+            .hg */.hg */*/.hg */*/.hg */*/*/.hg \
+            .hgtip */.hgtip */*/.hgtip */*/.hgtip */*/*/.hgtip \
+        ) \
+    )))))
+
+FindAllReposRel = \
+    $(strip $(subst $(SRC_ROOT)/,.,$(patsubst $(SRC_ROOT)/%/, %, $(FindAllReposAbs))))
 
 # Emit the repo:tip pairs to $@, but only if they changed since last time
 define GetSourceTips
 	$(CD) $(SRC_ROOT) ; \
-	for i in $(REPO_LIST) IGNORE ; do \
+	for i in $(FindAllReposRel) IGNORE ; do \
 	  if [ "$${i}" = "IGNORE" ] ; then \
 	    continue; \
-	  elif [ -d $${i}/$(HG_DIRECTORY) -a "$(HG_VERSION)" != "" ] ; then \
+	  elif [ -d $${i}/.hg -a "$(HG)" != "" ] ; then \
 	    $(PRINTF) " %s:%s" \
 	        "$${i}" `$(HG) tip --repository $${i} --template '{node|short}\n'` ; \
 	  elif [ -f $${i}/$(HGTIP_FILENAME) ] ; then \
@@ -369,12 +371,6 @@
 	fi
 endef
 
-# Create the HGTIP_FILENAME file. Called from closed/make/SourceBundles.gmk
-define CreateHgTip
-	$(HG) tip --repository $1 --template '{node|short}\n' > $1/$(HGTIP_FILENAME); \
-	$(ECHO) $1/$(HGTIP_FILENAME)
-endef
-
 ################################################################################
 
 define SetupLogging
--- a/make/common/NON_CORE_PKGS.gmk	Fri Jun 24 14:46:45 2016 +0200
+++ b/make/common/NON_CORE_PKGS.gmk	Wed Jul 05 21:52:51 2017 +0200
@@ -69,7 +69,8 @@
 OLD_DOCLETAPI_PKGS = com.sun.javadoc
 
 DOCLETAPI_PKGS = jdk.javadoc.doclet \
-    jdk.javadoc.doclet.taglet
+    jdk.javadoc.doclet.taglet \
+    jdk.javadoc.doclets
 
 TAGLETAPI_FILE = com/sun/tools/doclets/Taglet.java