changeset 11562:c892d81d7bba

Merge
author prr
date Tue, 03 Mar 2015 08:49:13 -0800
parents c020e5199fa8 bdb66e8883e2
children 3b5ddf7e5003 f7352b8a3cbf
files make/lib/SoundLibraries.gmk src/java.base/share/classes/sun/security/acl/AclEntryImpl.java src/java.base/share/classes/sun/security/acl/AclImpl.java src/java.base/share/classes/sun/security/acl/AllPermissionsImpl.java src/java.base/share/classes/sun/security/acl/GroupImpl.java src/java.base/share/classes/sun/security/acl/OwnerImpl.java src/java.base/share/classes/sun/security/acl/PermissionImpl.java src/java.base/share/classes/sun/security/acl/PrincipalImpl.java src/java.base/share/classes/sun/security/acl/WorldGroupImpl.java src/java.desktop/share/native/libjsound/SoundDefs.h src/jdk.charsets/share/classes/sun/nio/cs/ext/EUC_TW.java test/com/sun/management/OperatingSystemMXBean/GetTotalSwapSpaceSize.java test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java test/sun/security/acl/PermissionImpl/PermissionEqualsHashCode.java
diffstat 138 files changed, 6765 insertions(+), 3778 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Mon Feb 23 10:47:32 2015 -0800
+++ b/.hgtags	Tue Mar 03 08:49:13 2015 -0800
@@ -294,3 +294,4 @@
 541a8cef4e0d54c3e4b52a98c6af3c31e2096669 jdk9-b49
 f6b8edd397ee463be208fee27517c99101293267 jdk9-b50
 a0dad230aeb3b0d5cfd5b0715029e48d50573f8c jdk9-b51
+607ea68032cd4a4cf2c7a7a41fcb39602d6a75e2 jdk9-b52
--- a/make/Tools.gmk	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/Tools.gmk	Tue Mar 03 08:49:13 2015 -0800
@@ -180,6 +180,8 @@
       OBJECT_DIR := $(BUILDTOOLS_OUTPUTDIR)/objs/fix_empty_sec_hdr_flags, \
       OUTPUT_DIR := $(BUILDTOOLS_OUTPUTDIR)/bin, \
       PROGRAM := fix_empty_sec_hdr_flags))
+
+  BUILD_TOOLS_JDK += $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS)
 endif
 
 $(BUILD_TOOLS_JDK): $(BUILD_INTERIM_JIMAGE) $(COPY_JIMAGE_SERVICE_PROVIDER)
@@ -189,4 +191,3 @@
 all: java-tools
 
 endif # _TOOLS_GMK
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/data/charsetmapping/IBM1166.c2b	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,1 @@
+0x15	U+0085
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/data/charsetmapping/IBM1166.map	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,256 @@
+0x00	U+0000
+0x01	U+0001
+0x02	U+0002
+0x03	U+0003
+0x04	U+009c
+0x05	U+0009
+0x06	U+0086
+0x07	U+007f
+0x08	U+0097
+0x09	U+008d
+0x0a	U+008e
+0x0b	U+000b
+0x0c	U+000c
+0x0d	U+000d
+0x0e	U+000e
+0x0f	U+000f
+0x10	U+0010
+0x11	U+0011
+0x12	U+0012
+0x13	U+0013
+0x14	U+009d
+0x15	U+000a
+0x16	U+0008
+0x17	U+0087
+0x18	U+0018
+0x19	U+0019
+0x1a	U+0092
+0x1b	U+008f
+0x1c	U+001c
+0x1d	U+001d
+0x1e	U+001e
+0x1f	U+001f
+0x20	U+0080
+0x21	U+0081
+0x22	U+0082
+0x23	U+0083
+0x24	U+0084
+0x25	U+000a
+0x26	U+0017
+0x27	U+001b
+0x28	U+0088
+0x29	U+0089
+0x2a	U+008a
+0x2b	U+008b
+0x2c	U+008c
+0x2d	U+0005
+0x2e	U+0006
+0x2f	U+0007
+0x30	U+0090
+0x31	U+0091
+0x32	U+0016
+0x33	U+0093
+0x34	U+0094
+0x35	U+0095
+0x36	U+0096
+0x37	U+0004
+0x38	U+0098
+0x39	U+0099
+0x3a	U+009a
+0x3b	U+009b
+0x3c	U+0014
+0x3d	U+0015
+0x3e	U+009e
+0x3f	U+001a
+0x40	U+0020
+0x41	U+00a0
+0x42	U+04d9
+0x43	U+0493
+0x44	U+0451
+0x45	U+0454
+0x46	U+0455
+0x47	U+0456
+0x48	U+049b
+0x49	U+0458
+0x4a	U+005b
+0x4b	U+002e
+0x4c	U+003c
+0x4d	U+0028
+0x4e	U+002b
+0x4f	U+0021
+0x50	U+0026
+0x51	U+04a3
+0x52	U+04e9
+0x53	U+04b1
+0x54	U+04af
+0x55	U+045e
+0x56	U+04bb
+0x57	U+042a
+0x58	U+2116
+0x59	U+04d8
+0x5a	U+005d
+0x5b	U+0024
+0x5c	U+002a
+0x5d	U+0029
+0x5e	U+003b
+0x5f	U+005e
+0x60	U+002d
+0x61	U+002f
+0x62	U+0492
+0x63	U+0401
+0x64	U+0404
+0x65	U+0405
+0x66	U+0406
+0x67	U+049a
+0x68	U+0408
+0x69	U+04a2
+0x6a	U+007c
+0x6b	U+002c
+0x6c	U+0025
+0x6d	U+005f
+0x6e	U+003e
+0x6f	U+003f
+0x70	U+04e8
+0x71	U+04b0
+0x72	U+04ae
+0x73	U+00ad
+0x74	U+040e
+0x75	U+04ba
+0x76	U+044e
+0x77	U+0430
+0x78	U+0431
+0x79	U+0060
+0x7a	U+003a
+0x7b	U+0023
+0x7c	U+0040
+0x7d	U+0027
+0x7e	U+003d
+0x7f	U+0022
+0x80	U+0446
+0x81	U+0061
+0x82	U+0062
+0x83	U+0063
+0x84	U+0064
+0x85	U+0065
+0x86	U+0066
+0x87	U+0067
+0x88	U+0068
+0x89	U+0069
+0x8a	U+0434
+0x8b	U+0435
+0x8c	U+0444
+0x8d	U+0433
+0x8e	U+0445
+0x8f	U+0438
+0x90	U+0439
+0x91	U+006a
+0x92	U+006b
+0x93	U+006c
+0x94	U+006d
+0x95	U+006e
+0x96	U+006f
+0x97	U+0070
+0x98	U+0071
+0x99	U+0072
+0x9a	U+043a
+0x9b	U+043b
+0x9c	U+043c
+0x9d	U+043d
+0x9e	U+043e
+0x9f	U+043f
+0xa0	U+044f
+0xa1	U+007e
+0xa2	U+0073
+0xa3	U+0074
+0xa4	U+0075
+0xa5	U+0076
+0xa6	U+0077
+0xa7	U+0078
+0xa8	U+0079
+0xa9	U+007a
+0xaa	U+0440
+0xab	U+0441
+0xac	U+0442
+0xad	U+0443
+0xae	U+0436
+0xaf	U+0432
+0xb0	U+044c
+0xb1	U+044b
+0xb2	U+0437
+0xb3	U+0448
+0xb4	U+044d
+0xb5	U+0449
+0xb6	U+0447
+0xb7	U+044a
+0xb8	U+042e
+0xb9	U+0410
+0xba	U+0411
+0xbb	U+0426
+0xbc	U+0414
+0xbd	U+0415
+0xbe	U+0424
+0xbf	U+0413
+0xc0	U+007b
+0xc1	U+0041
+0xc2	U+0042
+0xc3	U+0043
+0xc4	U+0044
+0xc5	U+0045
+0xc6	U+0046
+0xc7	U+0047
+0xc8	U+0048
+0xc9	U+0049
+0xca	U+0425
+0xcb	U+0418
+0xcc	U+0419
+0xcd	U+041a
+0xce	U+041b
+0xcf	U+041c
+0xd0	U+007d
+0xd1	U+004a
+0xd2	U+004b
+0xd3	U+004c
+0xd4	U+004d
+0xd5	U+004e
+0xd6	U+004f
+0xd7	U+0050
+0xd8	U+0051
+0xd9	U+0052
+0xda	U+041d
+0xdb	U+041e
+0xdc	U+041f
+0xdd	U+042f
+0xde	U+0420
+0xdf	U+0421
+0xe0	U+005c
+0xe1	U+20ac
+0xe2	U+0053
+0xe3	U+0054
+0xe4	U+0055
+0xe5	U+0056
+0xe6	U+0057
+0xe7	U+0058
+0xe8	U+0059
+0xe9	U+005a
+0xea	U+0422
+0xeb	U+0423
+0xec	U+0416
+0xed	U+0412
+0xee	U+042c
+0xef	U+042b
+0xf0	U+0030
+0xf1	U+0031
+0xf2	U+0032
+0xf3	U+0033
+0xf4	U+0034
+0xf5	U+0035
+0xf6	U+0036
+0xf7	U+0037
+0xf8	U+0038
+0xf9	U+0039
+0xfa	U+0417
+0xfb	U+0428
+0xfc	U+042d
+0xfd	U+0429
+0xfe	U+0427
+0xff	U+009f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/data/charsetmapping/IBM1166.nr	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,1 @@
+0x25	U+000a
--- a/make/data/charsetmapping/charsets	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/data/charsetmapping/charsets	Tue Mar 03 08:49:13 2015 -0800
@@ -503,7 +503,7 @@
 
 charset x-EUC-TW EUC_TW
     package sun.nio.cs.ext
-    type    source
+    type    template
     alias   euc_tw               # JDK historical
     alias   euctw
     alias   cns11643
@@ -1660,6 +1660,16 @@
     alias   EBCDIC-JP-kana
     alias   290
 
+charset x-IBM1166 IBM1166
+    package sun.nio.cs.ext
+    type    sbcs
+    hisname Cp1166
+    ascii   false
+    alias   cp1166
+    alias   ibm1166
+    alias   ibm-1166
+    alias   1166
+
 charset x-IBM300 IBM300
     package sun.nio.cs.ext
     type    dbcsonly
@@ -1816,3 +1826,17 @@
     ascii   false
     minmax  0x21 0x7e 0x21 0x7e
     internal true               # "internal implementation
+
+########################################################
+#
+# platform specific charsets, to be registered into spi
+##
+########################################################
+ 
+charset x-COMPOUND_TEXT COMPOUND_TEXT
+    package sun.nio.cs.ext
+    type    source
+    os      unix
+    alias   COMPOUND_TEXT       # JDK historical
+    alias   x11-compound_text
+    alias   x-compound-text
--- a/make/data/charsetmapping/list_old	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/data/charsetmapping/list_old	Tue Mar 03 08:49:13 2015 -0800
@@ -57,6 +57,7 @@
 IBM1147		IBM01147	Cp1147		false		sun.nio.cs.ext
 IBM1148		IBM01148	Cp1148		false		sun.nio.cs.ext
 IBM1149		IBM01149	Cp1149		false		sun.nio.cs.ext
+IBM1166		x-IBM1166	Cp1166		false		sun.nio.cs.ext
 IBM273		IBM273		Cp273		false		sun.nio.cs.ext
 IBM277		IBM277		Cp277		false		sun.nio.cs.ext
 IBM278		IBM278		Cp278		false		sun.nio.cs.ext
--- a/make/data/charsetmapping/stdcs-solaris	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/data/charsetmapping/stdcs-solaris	Tue Mar 03 08:49:13 2015 -0800
@@ -9,6 +9,7 @@
 EUC_JP
 EUC_JP_LINUX
 EUC_JP_Open
+EUC_TW
 GBK
 ISO_8859_11
 ISO_8859_3
--- a/make/gensrc/Gensrc-java.management.gmk	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/gensrc/Gensrc-java.management.gmk	Tue Mar 03 08:49:13 2015 -0800
@@ -25,6 +25,9 @@
 
 include GensrcCommon.gmk
 
+# Hook to include the corresponding custom file, if present.
+$(eval $(call IncludeCustomExtension, jdk, gensrc/Gensrc-java.management.gmk))
+
 ################################################################################
 
 include GensrcProperties.gmk
--- a/make/gensrc/Gensrc-jdk.charsets.gmk	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/gensrc/Gensrc-jdk.charsets.gmk	Tue Mar 03 08:49:13 2015 -0800
@@ -50,7 +50,9 @@
 	$(TOOL_CHARSETMAPPING) $(CHARSET_DATA_DIR) $(CHARSET_GENSRC_JAVA_DIR_CS) \
 	    extcs charsets  $(CHARSET_STANDARD_OS) \
 	    $(CHARSET_EXTENDED_JAVA_TEMPLATES) \
-	    $(CHARSET_EXTENDED_JAVA_DIR) $(LOG_INFO)
+	    $(CHARSET_EXTENDED_JAVA_DIR) \
+	    $(CHARSET_COPYRIGHT_HEADER) \
+	    $(LOG_INFO)
 	$(TOUCH) '$@'
 
 $(CHARSET_DONE_CS)-hkscs: $(CHARSET_COPYRIGHT_HEADER)/HKSCS.java \
--- a/make/gensrc/GensrcCharsetMapping.gmk	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/gensrc/GensrcCharsetMapping.gmk	Tue Mar 03 08:49:13 2015 -0800
@@ -32,6 +32,7 @@
 CHARSET_EXTSRC_DIR := $(JDK_TOPDIR)/src/jdk.charsets/share/classes/sun/nio/cs/ext
 CHARSET_GENSRC_JAVA_DIR_BASE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/nio/cs
 CHARSET_DONE_BASE := $(CHARSET_GENSRC_JAVA_DIR_BASE)/_the.charsetmapping
+CHARSET_COPYRIGHT_HEADER := $(JDK_TOPDIR)/make/src/classes/build/tools/charsetmapping
 CHARSET_TEMPLATES := \
     $(CHARSET_DATA_DIR)/SingleByte-X.java.template \
     $(CHARSET_DATA_DIR)/DoubleByte-X.java.template
@@ -46,7 +47,9 @@
 	$(MKDIR) -p $(@D)
 	$(TOOL_CHARSETMAPPING) $(CHARSET_DATA_DIR) $(CHARSET_GENSRC_JAVA_DIR_BASE) \
 	    stdcs charsets $(CHARSET_STANDARD_OS) \
-	    $(CHARSET_STANDARD_JAVA_TEMPLATES) $(CHARSET_EXTSRC_DIR) $(LOG_INFO)
+	    $(CHARSET_STANDARD_JAVA_TEMPLATES) $(CHARSET_EXTSRC_DIR) \
+	    $(CHARSET_COPYRIGHT_HEADER) \
+            $(LOG_INFO)
 	$(TOUCH) '$@'
 
 GENSRC_JAVA_BASE += $(CHARSET_DONE_BASE)-stdcs
--- a/make/lib/SoundLibraries.gmk	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/lib/SoundLibraries.gmk	Tue Mar 03 08:49:13 2015 -0800
@@ -113,6 +113,10 @@
   LIBJSOUND_SRC_FILES += $(LIBJSOUND_DAUDIOFILES)
 endif # OPENJDK_TARGET_OS solaris
 
+
+  ifeq ($(OPENJDK_TARGET_CPU), aarch64)
+       LIBJSOUND_CFLAGS += -DX_ARCH=X_AARCH64
+  endif
 LIBJSOUND_CFLAGS += -DEXTRA_SOUND_JNI_LIBS='"$(EXTRA_SOUND_JNI_LIBS)"'
 
 $(eval $(call SetupNativeCompilation,BUILD_LIBJSOUND, \
--- a/make/src/classes/build/tools/charsetmapping/Charset.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/src/classes/build/tools/charsetmapping/Charset.java	Tue Mar 03 08:49:13 2015 -0800
@@ -31,6 +31,7 @@
     String   csName;
     String   hisName;
     String   type;
+    String   os;
     boolean  isASCII;
     int      b1Min;
     int      b1Max;
--- a/make/src/classes/build/tools/charsetmapping/EUC_TW.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/src/classes/build/tools/charsetmapping/EUC_TW.java	Tue Mar 03 08:49:13 2015 -0800
@@ -80,12 +80,12 @@
 
     private static Pattern euctw = Pattern.compile("(?:8ea)?(\\p{XDigit}++)\\s++(\\p{XDigit}++)?\\s*+.*");
 
-    static void genClass(String args[]) throws Exception
+    static void genClass(String pkg, String args[]) throws Exception
     {
         InputStream is = new FileInputStream(new File(args[0], "euc_tw.map"));
         PrintStream ps = new PrintStream(new File(args[1], "EUC_TWMapping.java"),
                                          "ISO-8859-1");
-        String copyright = getCopyright(new File(args[3]));
+        String copyright = getCopyright(new File(args[7], "EUC_TW.java"));
 
 
         // ranges of byte1 and byte2, something should come from a "config" file
@@ -128,7 +128,7 @@
 
             out.format(copyright);
             out.format("%n// -- This file was mechanically generated: Do not edit! -- //%n");
-            out.format("package sun.nio.cs.ext;%n%n");
+            out.format("package %s;%n%n", pkg);
             out.format("class EUC_TWMapping {%n%n");
 
             // boundaries
--- a/make/src/classes/build/tools/charsetmapping/HKSCS.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/src/classes/build/tools/charsetmapping/HKSCS.java	Tue Mar 03 08:49:13 2015 -0800
@@ -42,7 +42,7 @@
     private static Pattern hkscs =
         Pattern.compile("(?:0x)?+(\\p{XDigit}++)\\s++(?:0x|U\\+)?+(\\p{XDigit}++)?\\s*+(?:0x|U\\+)?(\\p{XDigit}++)?\\s*+.*");
 
-    static void genClass2008(String srcDir, String dstDir, String pkgName)
+    static void genClass2008(String srcDir, String dstDir, String pkgName, File copyright)
         throws Exception
     {
         // hkscs2008
@@ -53,10 +53,11 @@
                   pkgName,
                   "HKSCSMapping",
                   true,
-                  "");
+                  getCopyright(copyright));
+
     }
 
-    static void genClassXP(String srcDir, String dstDir, String pkgName)
+    static void genClassXP(String srcDir, String dstDir, String pkgName, File copyright)
         throws Exception
     {
         genClass0(new FileInputStream(new File(srcDir, "HKSCS_XP.map")),
@@ -66,7 +67,7 @@
                   pkgName,
                   "HKSCS_XPMapping",
                   false,
-                  "");
+                  getCopyright(copyright));
     }
 
     static void genClass2001(String args[]) throws Exception {
--- a/make/src/classes/build/tools/charsetmapping/Main.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/src/classes/build/tools/charsetmapping/Main.java	Tue Mar 03 08:49:13 2015 -0800
@@ -41,6 +41,7 @@
         int OS       = 4;
         int TEMPLATE = 5;
         int EXT_SRC  = 6;
+        int COPYRIGHT_SRC  = 7;
 
         if (args.length < 3 ) {
             System.out.println("Usage: java -jar charsetmapping.jar src dst spiType charsets os [template]");
@@ -54,6 +55,7 @@
             String[] osStdcs = getOSStdCSList(new File(args[SRC_DIR], args[OS]));
             boolean hasBig5_HKSCS = false;
             boolean hasMS950_HKSCS_XP = false;
+            boolean hasEUC_TW = false;
             for (String name : osStdcs) {
                 Charset cs = charsets.get(name);
                 if (cs != null) {
@@ -63,6 +65,8 @@
                     hasBig5_HKSCS = true;
                 } else if (name.equals("MS950_HKSCS_XP")) {
                     hasMS950_HKSCS_XP = true;
+                } else if (name.equals("EUC_TW")) {
+                    hasEUC_TW = true;
                 }
             }
             for (Charset cs : charsets.values()) {
@@ -89,19 +93,28 @@
                 }
             }
             // provider StandardCharsets.java / ExtendedCharsets.java
-            SPI.genClass(args[TYPE], charsets, args[SRC_DIR], args[DST_DIR], args[TEMPLATE]);
+            SPI.genClass(args[TYPE], charsets,
+                         args[SRC_DIR], args[DST_DIR],
+                         args[TEMPLATE],
+                         args[OS].endsWith("windows") ? "windows" : "unix");
 
             // HKSCSMapping2008/XP.java goes together with Big5/MS950XP_HKSCS
             if (isStandard && hasBig5_HKSCS || isExtended && !hasBig5_HKSCS) {
                 HKSCS.genClass2008(args[SRC_DIR], args[DST_DIR],
-                                   isStandard ? "sun.nio.cs" : "sun.nio.cs.ext");
+                                   isStandard ? "sun.nio.cs" : "sun.nio.cs.ext",
+                                   new File(args[COPYRIGHT_SRC], "HKSCS.java"));
             }
             if (isStandard && hasMS950_HKSCS_XP || isExtended && !hasMS950_HKSCS_XP) {
                 HKSCS.genClassXP(args[SRC_DIR], args[DST_DIR],
-                                 isStandard ? "sun.nio.cs" : "sun.nio.cs.ext");
+                                 isStandard ? "sun.nio.cs" : "sun.nio.cs.ext",
+                                 new File(args[COPYRIGHT_SRC], "HKSCS.java"));
             }
-        } else if ("euctw".equals(args[TYPE])) {
-            EUC_TW.genClass(args);
+            if (isStandard && hasEUC_TW) {
+                EUC_TW.genClass("sun.nio.cs", args);
+            }
+            if (!isStandard && !hasEUC_TW) {
+                EUC_TW.genClass("sun.nio.cs.ext", args);
+            }
         } else if ("sjis0213".equals(args[TYPE])) {
             JIS0213.genClass(args);
         } else if ("hkscs".equals(args[TYPE])) {
@@ -157,6 +170,9 @@
                     case "type":
                         cs.type = tokens[2];
                         break;
+                    case "os":
+                        cs.os = tokens[2];
+                        break;
                     case "hisname":
                         cs.hisName = tokens[2];
                         break;
--- a/make/src/classes/build/tools/charsetmapping/SPI.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/src/classes/build/tools/charsetmapping/SPI.java	Tue Mar 03 08:49:13 2015 -0800
@@ -33,8 +33,10 @@
 
 public class SPI {
 
-    public static void genClass(String type, LinkedHashMap<String, Charset> charsets,
-                                String srcDir, String dstDir, String template)
+    public static void genClass(String type,
+                                LinkedHashMap<String, Charset> charsets,
+                                String srcDir, String dstDir, String template,
+                                String os)
         throws Exception
     {
         try (Scanner s = new Scanner(new File(template));
@@ -50,7 +52,8 @@
                         charsets.values()
                                 .stream()
                                 .filter(cs -> cs.pkgName.equals("sun.nio.cs.ext") &&
-                                              !cs.isInternal)
+                                              !cs.isInternal &&
+                                              (cs.os == null || cs.os.equals(os)))
                                 .forEach( cs -> {
                             out.printf("        charset(\"%s\", \"%s\",%n", cs.csName, cs.clzName);
                             out.printf("                new String[] {%n");
--- a/make/src/classes/build/tools/module/boot.modules	Mon Feb 23 10:47:32 2015 -0800
+++ b/make/src/classes/build/tools/module/boot.modules	Tue Mar 03 08:49:13 2015 -0800
@@ -22,6 +22,7 @@
 jdk.hprof.agent
 jdk.httpserver
 jdk.jfr
+jdk.management.cmm
 jdk.naming.rmi
 jdk.sctp
 jdk.security.auth
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/test/JtregNative.gmk	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+################################################################################
+# This file builds the native component of the JTReg tests for JDK.
+# It also covers the test-image part, where the built files are copied to the
+# test image.
+################################################################################
+
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+include TestFilesCompilation.gmk
+
+################################################################################
+# Targets for building the native tests themselves.
+################################################################################
+
+# Add more directories here when needed.
+BUILD_JDK_JTREG_NATIVE_SRC := \
+    $(JDK_TOPDIR)/test/native_sanity \
+    #
+
+BUILD_JDK_JTREG_OUTPUT_DIR := $(BUILD_OUTPUT)/support/test/jdk/jtreg/native
+
+BUILD_JDK_JTREG_IMAGE_DIR := $(TEST_IMAGE_DIR)/jdk/jtreg
+
+$(eval $(call SetupTestFilesCompilation, BUILD_JDK_JTREG_LIBRARIES, \
+    TYPE := LIBRARY, \
+    SOURCE_DIRS := $(BUILD_JDK_JTREG_NATIVE_SRC), \
+    OUTPUT_DIR := $(BUILD_JDK_JTREG_OUTPUT_DIR), \
+))
+
+$(eval $(call SetupTestFilesCompilation, BUILD_JDK_JTREG_EXECUTABLES, \
+    TYPE := PROGRAM, \
+    SOURCE_DIRS := $(BUILD_JDK_JTREG_NATIVE_SRC), \
+    OUTPUT_DIR := $(BUILD_JDK_JTREG_OUTPUT_DIR), \
+))
+
+build-test-jdk-jtreg-native: $(BUILD_JDK_JTREG_LIBRARIES) $(BUILD_JDK_JTREG_EXECUTABLES)
+
+
+################################################################################
+# Targets for building test-image.
+################################################################################
+
+# Copy to jdk jtreg test image
+$(eval $(call SetupCopyFiles,COPY_JDK_JTREG_NATIVE, \
+    SRC := $(BUILD_JDK_JTREG_OUTPUT_DIR), \
+    DEST := $(TEST_IMAGE_DIR)/jdk/jtreg/native, \
+    FILES := $(BUILD_JDK_JTREG_LIBRARIES) $(BUILD_JDK_JTREG_EXECUTABLES), \
+    FLATTEN := true))
+
+test-image-jdk-jtreg-native: $(COPY_JDK_JTREG_NATIVE)
+
+all: build-test-jdk-jtreg-native
+test-image: test-image-jdk-jtreg-native
+
+.PHONY: default all build-test-jdk-jtreg-native test-image-jdk-jtreg-native test-image
--- a/src/java.base/share/classes/java/io/ObjectInputStream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/io/ObjectInputStream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -40,6 +40,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import static java.io.ObjectStreamClass.processQueue;
+import sun.misc.Unsafe;
 import sun.reflect.misc.ReflectUtil;
 
 /**
@@ -375,6 +376,7 @@
             }
             if (depth == 0) {
                 vlist.doCallbacks();
+                freeze();
             }
             return obj;
         } finally {
@@ -465,6 +467,7 @@
             }
             if (depth == 0) {
                 vlist.doCallbacks();
+                freeze();
             }
             return obj;
         } finally {
@@ -2357,6 +2360,26 @@
         }
     }
 
+    private static final Unsafe UNSAFE = Unsafe.getUnsafe();
+
+    /**
+     * Performs a "freeze" action, required to adhere to final field semantics.
+     *
+     * <p> This method can be called unconditionally before returning the graph,
+     * from the topmost readObject call, since it is expected that the
+     * additional cost of the freeze action is negligible compared to
+     * reconstituting even the most simple graph.
+     *
+     * <p> Nested calls to readObject do not issue freeze actions because the
+     * sub-graph returned from a nested call is not guaranteed to be fully
+     * initialized yet (possible cycles).
+     */
+    private void freeze() {
+        // Issue a StoreStore|StoreLoad fence, which is at least sufficient
+        // to provide final-freeze semantics.
+        UNSAFE.storeFence();
+    }
+
     /**
      * Input stream with two modes: in default mode, inputs data written in the
      * same format as DataOutputStream; in "block data" mode, inputs data
--- a/src/java.base/share/classes/java/lang/Class.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/Class.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1063,16 +1063,24 @@
                 parameterClasses[i] = toClass(parameterTypes[i]);
 
             // Perform access check
-            Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
+            final Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
             enclosingCandidate.checkMemberAccess(Member.DECLARED,
                                                  Reflection.getCallerClass(), true);
+            // Client is ok to access declared methods but j.l.Class might not be.
+            Method[] candidates = AccessController.doPrivileged(
+                    new PrivilegedAction<Method[]>() {
+                        @Override
+                        public Method[] run() {
+                            return enclosingCandidate.getDeclaredMethods();
+                        }
+                    });
             /*
              * Loop over all declared methods; match method name,
              * number of and type of parameters, *and* return
              * type.  Matching return type is also necessary
              * because of covariant returns, etc.
              */
-            for(Method m: enclosingCandidate.getDeclaredMethods()) {
+            for(Method m: candidates) {
                 if (m.getName().equals(enclosingInfo.getName()) ) {
                     Class<?>[] candidateParamClasses = m.getParameterTypes();
                     if (candidateParamClasses.length == parameterClasses.length) {
@@ -1215,14 +1223,22 @@
                 parameterClasses[i] = toClass(parameterTypes[i]);
 
             // Perform access check
-            Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
+            final Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
             enclosingCandidate.checkMemberAccess(Member.DECLARED,
                                                  Reflection.getCallerClass(), true);
+            // Client is ok to access declared methods but j.l.Class might not be.
+            Constructor<?>[] candidates = AccessController.doPrivileged(
+                    new PrivilegedAction<Constructor<?>[]>() {
+                        @Override
+                        public Constructor<?>[] run() {
+                            return enclosingCandidate.getDeclaredConstructors();
+                        }
+                    });
             /*
              * Loop over all declared constructors; match number
              * of and type of parameters.
              */
-            for(Constructor<?> c: enclosingCandidate.getDeclaredConstructors()) {
+            for(Constructor<?> c: candidates) {
                 Class<?>[] candidateParamClasses = c.getParameterTypes();
                 if (candidateParamClasses.length == parameterClasses.length) {
                     boolean matches = true;
--- a/src/java.base/share/classes/java/lang/FunctionalInterface.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/FunctionalInterface.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -60,6 +60,7 @@
  * @jls 4.3.2. The Class Object
  * @jls 9.8 Functional Interfaces
  * @jls 9.4.3 Interface Method Body
+ * @jls 9.6.4.9 @FunctionalInterface
  * @since 1.8
  */
 @Documented
--- a/src/java.base/share/classes/java/lang/Override.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/Override.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -43,7 +43,9 @@
  *
  * @author  Peter von der Ah&eacute;
  * @author  Joshua Bloch
- * @jls 9.6.1.4 @Override
+ * @jls 8.4.8 Inheritance, Overriding, and Hiding
+ * @jls 9.4.1 Inheritance and Overriding
+ * @jls 9.6.4.4 @Override
  * @since 1.5
  */
 @Target(ElementType.METHOD)
--- a/src/java.base/share/classes/java/lang/SafeVarargs.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/SafeVarargs.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -85,7 +85,7 @@
  * @since 1.7
  * @jls 4.7 Reifiable Types
  * @jls 8.4.1 Formal Parameters
- * @jls 9.6.3.7 @SafeVarargs
+ * @jls 9.6.4.7 @SafeVarargs
  */
 @Documented
 @Retention(RetentionPolicy.RUNTIME)
--- a/src/java.base/share/classes/java/lang/SuppressWarnings.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/SuppressWarnings.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,7 +47,7 @@
  * @jls 4.12.2 Variables of Reference Type
  * @jls 5.1.9 Unchecked Conversion
  * @jls 5.5.2 Checked Casts and Unchecked Casts
- * @jls 9.6.3.5 @SuppressWarnings
+ * @jls 9.6.4.5 @SuppressWarnings
  */
 @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
 @Retention(RetentionPolicy.SOURCE)
--- a/src/java.base/share/classes/java/lang/annotation/Inherited.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/annotation/Inherited.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,7 @@
  *
  * @author  Joshua Bloch
  * @since 1.5
- * @jls 9.6.3.3 @Inherited
+ * @jls 9.6.4.3 @Inherited
  */
 @Documented
 @Retention(RetentionPolicy.RUNTIME)
--- a/src/java.base/share/classes/java/lang/annotation/Repeatable.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/annotation/Repeatable.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,8 +33,8 @@
  * type</em> for the repeatable annotation type.
  *
  * @since 1.8
- * @jls 9.6 Annotation Types
- * @jls 9.7 Annotations
+ * @jls 9.6.3 Repeatable Annotation Types
+ * @jls 9.7.5 Multiple Annotations of the Same Type
  */
 @Documented
 @Retention(RetentionPolicy.RUNTIME)
--- a/src/java.base/share/classes/java/lang/annotation/Retention.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/annotation/Retention.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,7 @@
  *
  * @author  Joshua Bloch
  * @since 1.5
- * @jls 9.6.3.2 @Retention
+ * @jls 9.6.4.2 @Retention
  */
 @Documented
 @Retention(RetentionPolicy.RUNTIME)
--- a/src/java.base/share/classes/java/lang/annotation/Target.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/annotation/Target.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -72,6 +72,7 @@
  * @since 1.5
  * @jls 9.6.4.1 @Target
  * @jls 9.7.4 Where Annotations May Appear
+ * @jls 9.7.5 Multiple Annotations of the Same Type
  */
 @Documented
 @Retention(RetentionPolicy.RUNTIME)
--- a/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java	Tue Mar 03 08:49:13 2015 -0800
@@ -436,7 +436,7 @@
     }
 
     private MethodType bindArgumentType(BoundMethodHandle mh, int pos, BasicType bt) {
-        assert(mh.form == lambdaForm);
+        assert(mh.form.uncustomize() == lambdaForm);
         assert(mh.form.names[1+pos].type == bt);
         assert(BasicType.basicType(mh.type().parameterType(pos)) == bt);
         return mh.type().dropParameterTypes(pos, pos+1);
--- a/src/java.base/share/classes/java/lang/reflect/Constructor.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/reflect/Constructor.java	Tue Mar 03 08:49:13 2015 -0800
@@ -296,7 +296,8 @@
      * constructor has default (package) access.
      *
      * @return a string describing this {@code Constructor}
-     * @jls 8.8.3. Constructor Modifiers
+     * @jls 8.8.3 Constructor Modifiers
+     * @jls 8.9.2 Enum Body Declarations
      */
     public String toString() {
         return sharedToString(Modifier.constructorModifiers(),
@@ -342,7 +343,8 @@
      * include type parameters
      *
      * @since 1.5
-     * @jls 8.8.3. Constructor Modifiers
+     * @jls 8.8.3 Constructor Modifiers
+     * @jls 8.9.2 Enum Body Declarations
      */
     @Override
     public String toGenericString() {
--- a/src/java.base/share/classes/java/lang/reflect/Method.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/lang/reflect/Method.java	Tue Mar 03 08:49:13 2015 -0800
@@ -356,6 +356,8 @@
      * @return a string describing this {@code Method}
      *
      * @jls 8.4.3 Method Modifiers
+     * @jls 9.4   Method Declarations
+     * @jls 9.6.1 Annotation Type Elements
      */
     public String toString() {
         return sharedToString(Modifier.methodModifiers(),
@@ -409,6 +411,8 @@
      * @since 1.5
      *
      * @jls 8.4.3 Method Modifiers
+     * @jls 9.4   Method Declarations
+     * @jls 9.6.1 Annotation Type Elements
      */
     @Override
     public String toGenericString() {
--- a/src/java.base/share/classes/java/math/BigDecimal.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/math/BigDecimal.java	Tue Mar 03 08:49:13 2015 -0800
@@ -3740,8 +3740,8 @@
                 throw new ExceptionInInitializerError(ex);
             }
         }
-        static void setIntCompactVolatile(BigDecimal bd, long val) {
-            unsafe.putLongVolatile(bd, intCompactOffset, val);
+        static void setIntCompact(BigDecimal bd, long val) {
+            unsafe.putLong(bd, intCompactOffset, val);
         }
 
         static void setIntValVolatile(BigDecimal bd, BigInteger val) {
@@ -3765,7 +3765,7 @@
             throw new java.io.StreamCorruptedException(message);
         // [all values of scale are now allowed]
         }
-        UnsafeHolder.setIntCompactVolatile(this, compactValFor(intVal));
+        UnsafeHolder.setIntCompact(this, compactValFor(intVal));
     }
 
    /**
--- a/src/java.base/share/classes/java/math/BigInteger.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/math/BigInteger.java	Tue Mar 03 08:49:13 2015 -0800
@@ -4368,11 +4368,11 @@
         }
 
         static void putSign(BigInteger bi, int sign) {
-            unsafe.putIntVolatile(bi, signumOffset, sign);
+            unsafe.putInt(bi, signumOffset, sign);
         }
 
         static void putMag(BigInteger bi, int[] magnitude) {
-            unsafe.putObjectVolatile(bi, magOffset, magnitude);
+            unsafe.putObject(bi, magOffset, magnitude);
         }
     }
 
--- a/src/java.base/share/classes/java/net/SocksSocketImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/net/SocksSocketImpl.java	Tue Mar 03 08:49:13 2015 -0800
@@ -388,14 +388,13 @@
             }
             while (iProxy.hasNext()) {
                 p = iProxy.next();
-                if (p == null || p == Proxy.NO_PROXY) {
+                if (p == null || p.type() != Proxy.Type.SOCKS) {
                     super.connect(epoint, remainingMillis(deadlineMillis));
                     return;
                 }
-                if (p.type() != Proxy.Type.SOCKS)
-                    throw new SocketException("Unknown proxy type : " + p.type());
+
                 if (!(p.address() instanceof InetSocketAddress))
-                    throw new SocketException("Unknow address type for proxy: " + p);
+                    throw new SocketException("Unknown address type for proxy: " + p);
                 // Use getHostString() to avoid reverse lookups
                 server = ((InetSocketAddress) p.address()).getHostString();
                 serverPort = ((InetSocketAddress) p.address()).getPort();
@@ -707,13 +706,12 @@
             }
             while (iProxy.hasNext()) {
                 p = iProxy.next();
-                if (p == null || p == Proxy.NO_PROXY) {
+                if (p == null || p.type() != Proxy.Type.SOCKS) {
                     return;
                 }
-                if (p.type() != Proxy.Type.SOCKS)
-                    throw new SocketException("Unknown proxy type : " + p.type());
+
                 if (!(p.address() instanceof InetSocketAddress))
-                    throw new SocketException("Unknow address type for proxy: " + p);
+                    throw new SocketException("Unknown address type for proxy: " + p);
                 // Use getHostString() to avoid reverse lookups
                 server = ((InetSocketAddress) p.address()).getHostString();
                 serverPort = ((InetSocketAddress) p.address()).getPort();
--- a/src/java.base/share/classes/java/security/acl/Acl.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/security/acl/Acl.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -68,11 +68,7 @@
  *
  * The {@code  java.security.acl } package provides the
  * interfaces to the ACL and related data structures (ACL entries,
- * groups, permissions, etc.), and the {@code  sun.security.acl }
- * classes provide a default implementation of the interfaces. For
- * example, {@code  java.security.acl.Acl } provides the
- * interface to an ACL and the {@code  sun.security.acl.AclImpl }
- * class provides the default implementation of the interface.<p>
+ * groups, permissions, etc.).<p>
  *
  * The {@code  java.security.acl.Acl } interface extends the
  * {@code  java.security.acl.Owner } interface. The Owner
--- a/src/java.base/share/classes/java/time/Clock.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/time/Clock.java	Tue Mar 03 08:49:13 2015 -0800
@@ -155,7 +155,7 @@
      * @return a clock that uses the best available system clock in the UTC zone, not null
      */
     public static Clock systemUTC() {
-        return new SystemClock(ZoneOffset.UTC);
+        return SystemClock.UTC;
     }
 
     /**
@@ -198,6 +198,9 @@
      */
     public static Clock system(ZoneId zone) {
         Objects.requireNonNull(zone, "zone");
+        if (zone == ZoneOffset.UTC) {
+            return SystemClock.UTC;
+        }
         return new SystemClock(zone);
     }
 
@@ -451,6 +454,8 @@
         private static final long serialVersionUID = 6740630888130243051L;
         private static final long OFFSET_SEED =
                 System.currentTimeMillis()/1000 - 1024; // initial offest
+        static final SystemClock UTC = new SystemClock(ZoneOffset.UTC);
+
         private final ZoneId zone;
         // We don't actually need a volatile here.
         // We don't care if offset is set or read concurrently by multiple
--- a/src/java.base/share/classes/java/time/Instant.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/time/Instant.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1229,8 +1229,14 @@
      * @throws ArithmeticException if numeric overflow occurs
      */
     public long toEpochMilli() {
-        long millis = Math.multiplyExact(seconds, 1000);
-        return millis + nanos / 1000_000;
+        if (seconds < 0 && nanos > 0) {
+            long millis = Math.multiplyExact(seconds+1, 1000);
+            long adjustment = nanos / 1000_000 - 1000;
+            return millis + adjustment;
+        } else {
+            long millis = Math.multiplyExact(seconds, 1000);
+            return millis + nanos / 1000_000;
+        }
     }
 
     //-----------------------------------------------------------------------
--- a/src/java.base/share/classes/java/util/Arrays.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/Arrays.java	Tue Mar 03 08:49:13 2015 -0800
@@ -4685,6 +4685,14 @@
      * <p>If the generator function throws an exception, it is relayed to
      * the caller and the array is left in an indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, using a generator function to compute
+     * each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .forEach(i -> array[i] = generator.apply(i));
+     * }</pre>
+     *
      * @param <T> type of elements of the array
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
@@ -4706,6 +4714,15 @@
      * is thrown from {@code parallelSetAll} and the array is left in an
      * indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, in parallel, using a generator function
+     * to compute each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .parallel()
+     *          .forEach(i -> array[i] = generator.apply(i));
+     * }</pre>
+     *
      * @param <T> type of elements of the array
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
@@ -4725,6 +4742,14 @@
      * <p>If the generator function throws an exception, it is relayed to
      * the caller and the array is left in an indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, using a generator function to compute
+     * each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .forEach(i -> array[i] = generator.applyAsInt(i));
+     * }</pre>
+     *
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
      *        value for that position
@@ -4745,6 +4770,15 @@
      * is thrown from {@code parallelSetAll} and the array is left in an
      * indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, in parallel, using a generator function
+     * to compute each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .parallel()
+     *          .forEach(i -> array[i] = generator.applyAsInt(i));
+     * }</pre>
+     *
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
      * value for that position
@@ -4763,6 +4797,14 @@
      * <p>If the generator function throws an exception, it is relayed to
      * the caller and the array is left in an indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, using a generator function to compute
+     * each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .forEach(i -> array[i] = generator.applyAsLong(i));
+     * }</pre>
+     *
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
      *        value for that position
@@ -4783,6 +4825,15 @@
      * is thrown from {@code parallelSetAll} and the array is left in an
      * indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, in parallel, using a generator function
+     * to compute each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .parallel()
+     *          .forEach(i -> array[i] = generator.applyAsLong(i));
+     * }</pre>
+     *
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
      *        value for that position
@@ -4801,6 +4852,14 @@
      * <p>If the generator function throws an exception, it is relayed to
      * the caller and the array is left in an indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, using a generator function to compute
+     * each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .forEach(i -> array[i] = generator.applyAsDouble(i));
+     * }</pre>
+     *
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
      *        value for that position
@@ -4821,6 +4880,15 @@
      * is thrown from {@code parallelSetAll} and the array is left in an
      * indeterminate state.
      *
+     * @apiNote
+     * Setting a subrange of an array, in parallel, using a generator function
+     * to compute each element, can be written as follows:
+     * <pre>{@code
+     * IntStream.range(startInclusive, endExclusive)
+     *          .parallel()
+     *          .forEach(i -> array[i] = generator.applyAsDouble(i));
+     * }</pre>
+     *
      * @param array array to be initialized
      * @param generator a function accepting an index and producing the desired
      *        value for that position
--- a/src/java.base/share/classes/java/util/regex/Matcher.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/regex/Matcher.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,16 @@
 
 package java.util.regex;
 
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 /**
  * An engine that performs match operations on a {@linkplain java.lang.CharSequence
@@ -209,6 +218,11 @@
     boolean anchoringBounds = true;
 
     /**
+     * Number of times this matcher's state has been modified
+     */
+    int modCount;
+
+    /**
      * No default constructor.
      */
     Matcher() {
@@ -248,11 +262,76 @@
      * @since 1.5
      */
     public MatchResult toMatchResult() {
-        Matcher result = new Matcher(this.parentPattern, text.toString());
-        result.first = this.first;
-        result.last = this.last;
-        result.groups = this.groups.clone();
-        return result;
+        return toMatchResult(text.toString());
+    }
+
+    private MatchResult toMatchResult(String text) {
+        return new ImmutableMatchResult(this.first,
+                                        this.last,
+                                        groupCount(),
+                                        this.groups.clone(),
+                                        text);
+    }
+
+    private static class ImmutableMatchResult implements MatchResult {
+        private final int first;
+        private final int last;
+        private final int[] groups;
+        private final int groupCount;
+        private final String text;
+
+        ImmutableMatchResult(int first, int last, int groupCount,
+                             int groups[], String text)
+        {
+            this.first = first;
+            this.last = last;
+            this.groupCount = groupCount;
+            this.groups = groups;
+            this.text = text;
+        }
+
+        @Override
+        public int start() {
+            return first;
+        }
+
+        @Override
+        public int start(int group) {
+            if (group < 0 || group > groupCount)
+                throw new IndexOutOfBoundsException("No group " + group);
+            return groups[group * 2];
+        }
+
+        @Override
+        public int end() {
+            return last;
+        }
+
+        @Override
+        public int end(int group) {
+            if (group < 0 || group > groupCount)
+                throw new IndexOutOfBoundsException("No group " + group);
+            return groups[group * 2 + 1];
+        }
+
+        @Override
+        public int groupCount() {
+            return groupCount;
+        }
+
+        @Override
+        public String group() {
+            return group(0);
+        }
+
+        @Override
+        public String group(int group) {
+            if (group < 0 || group > groupCount)
+                throw new IndexOutOfBoundsException("No group " + group);
+            if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
+                return null;
+            return text.subSequence(groups[group * 2], groups[group * 2 + 1]).toString();
+        }
     }
 
     /**
@@ -284,6 +363,7 @@
             groups[i] = -1;
         for (int i = 0; i < locals.length; i++)
             locals[i] = -1;
+        modCount++;
         return this;
     }
 
@@ -308,6 +388,7 @@
         lastAppendPosition = 0;
         from = 0;
         to = getTextLength();
+        modCount++;
         return this;
     }
 
@@ -803,6 +884,7 @@
         // Append the match substitution
         sb.append(result);
         lastAppendPosition = last;
+        modCount++;
         return this;
     }
 
@@ -892,6 +974,7 @@
         // Append the match substitution
         sb.append(result);
         lastAppendPosition = last;
+        modCount++;
         return this;
     }
 
@@ -1078,6 +1161,183 @@
     }
 
     /**
+     * Replaces every subsequence of the input sequence that matches the
+     * pattern with the result of applying the given replacer function to the
+     * match result of this matcher corresponding to that subsequence.
+     * Exceptions thrown by the function are relayed to the caller.
+     *
+     * <p> This method first resets this matcher.  It then scans the input
+     * sequence looking for matches of the pattern.  Characters that are not
+     * part of any match are appended directly to the result string; each match
+     * is replaced in the result by the applying the replacer function that
+     * returns a replacement string.  Each replacement string may contain
+     * references to captured subsequences as in the {@link #appendReplacement
+     * appendReplacement} method.
+     *
+     * <p> Note that backslashes (<tt>\</tt>) and dollar signs (<tt>$</tt>) in
+     * a replacement string may cause the results to be different than if it
+     * were being treated as a literal replacement string. Dollar signs may be
+     * treated as references to captured subsequences as described above, and
+     * backslashes are used to escape literal characters in the replacement
+     * string.
+     *
+     * <p> Given the regular expression <tt>dog</tt>, the input
+     * <tt>"zzzdogzzzdogzzz"</tt>, and the function
+     * <tt>mr -> mr.group().toUpperCase()</tt>, an invocation of this method on
+     * a matcher for that expression would yield the string
+     * <tt>"zzzDOGzzzDOGzzz"</tt>.
+     *
+     * <p> Invoking this method changes this matcher's state.  If the matcher
+     * is to be used in further matching operations then it should first be
+     * reset.  </p>
+     *
+     * <p> The replacer function should not modify this matcher's state during
+     * replacement.  This method will, on a best-effort basis, throw a
+     * {@link java.util.ConcurrentModificationException} if such modification is
+     * detected.
+     *
+     * <p> The state of each match result passed to the replacer function is
+     * guaranteed to be constant only for the duration of the replacer function
+     * call and only if the replacer function does not modify this matcher's
+     * state.
+     *
+     * @implNote
+     * This implementation applies the replacer function to this matcher, which
+     * is an instance of {@code MatchResult}.
+     *
+     * @param  replacer
+     *         The function to be applied to the match result of this matcher
+     *         that returns a replacement string.
+     * @return  The string constructed by replacing each matching subsequence
+     *          with the result of applying the replacer function to that
+     *          matched subsequence, substituting captured subsequences as
+     *          needed.
+     * @throws NullPointerException if the replacer function is null
+     * @throws ConcurrentModificationException if it is detected, on a
+     *         best-effort basis, that the replacer function modified this
+     *         matcher's state
+     * @since 1.9
+     */
+    public String replaceAll(Function<MatchResult, String> replacer) {
+        Objects.requireNonNull(replacer);
+        reset();
+        boolean result = find();
+        if (result) {
+            StringBuilder sb = new StringBuilder();
+            do {
+                int ec = modCount;
+                String replacement =  replacer.apply(this);
+                if (ec != modCount)
+                    throw new ConcurrentModificationException();
+                appendReplacement(sb, replacement);
+                result = find();
+            } while (result);
+            appendTail(sb);
+            return sb.toString();
+        }
+        return text.toString();
+    }
+
+    /**
+     * Returns a stream of match results for each subsequence of the input
+     * sequence that matches the pattern.  The match results occur in the
+     * same order as the matching subsequences in the input sequence.
+     *
+     * <p> Each match result is produced as if by {@link #toMatchResult()}.
+     *
+     * <p> This method does not reset this matcher.  Matching starts on
+     * initiation of the terminal stream operation either at the beginning of
+     * this matcher's region, or, if the matcher has not since been reset, at
+     * the first character not matched by a previous match.
+     *
+     * <p> If the matcher is to be used for further matching operations after
+     * the terminal stream operation completes then it should be first reset.
+     *
+     * <p> This matcher's state should not be modified during execution of the
+     * returned stream's pipeline.  The returned stream's source
+     * {@code Spliterator} is <em>fail-fast</em> and will, on a best-effort
+     * basis, throw a {@link java.util.ConcurrentModificationException} if such
+     * modification is detected.
+     *
+     * @return a sequential stream of match results.
+     * @since 1.9
+     */
+    public Stream<MatchResult> results() {
+        class MatchResultIterator implements Iterator<MatchResult> {
+            // -ve for call to find, 0 for not found, 1 for found
+            int state = -1;
+            // State for concurrent modification checking
+            // -1 for uninitialized
+            int expectedCount = -1;
+            // The input sequence as a string, set once only after first find
+            // Avoids repeated conversion from CharSequence for each match
+            String textAsString;
+
+            @Override
+            public MatchResult next() {
+                if (expectedCount >= 0 && expectedCount != modCount)
+                    throw new ConcurrentModificationException();
+
+                if (!hasNext())
+                    throw new NoSuchElementException();
+
+                state = -1;
+                return toMatchResult(textAsString);
+            }
+
+            @Override
+            public boolean hasNext() {
+                if (state >= 0)
+                    return state == 1;
+
+                // Defer throwing ConcurrentModificationException to when next
+                // or forEachRemaining is called.  The is consistent with other
+                // fail-fast implementations.
+                if (expectedCount >= 0 && expectedCount != modCount)
+                    return true;
+
+                boolean found = find();
+                // Capture the input sequence as a string on first find
+                if (found && state < 0)
+                    textAsString = text.toString();
+                state = found ? 1 : 0;
+                expectedCount = modCount;
+                return found;
+            }
+
+            @Override
+            public void forEachRemaining(Consumer<? super MatchResult> action) {
+                if (expectedCount >= 0 && expectedCount != modCount)
+                    throw new ConcurrentModificationException();
+
+                int s = state;
+                if (s == 0)
+                    return;
+
+                // Set state to report no more elements on further operations
+                state = 0;
+                expectedCount = -1;
+
+                // Perform a first find if required
+                if (s < 0 && !find())
+                    return;
+
+                // Capture the input sequence as a string on first find
+                textAsString = text.toString();
+
+                do {
+                    int ec = modCount;
+                    action.accept(toMatchResult(textAsString));
+                    if (ec != modCount)
+                        throw new ConcurrentModificationException();
+                } while (find());
+            }
+        }
+        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
+                new MatchResultIterator(), Spliterator.ORDERED | Spliterator.NONNULL), false);
+    }
+
+    /**
      * Replaces the first subsequence of the input sequence that matches the
      * pattern with the given replacement string.
      *
@@ -1123,6 +1383,79 @@
     }
 
     /**
+     * Replaces the first subsequence of the input sequence that matches the
+     * pattern with the result of applying the given replacer function to the
+     * match result of this matcher corresponding to that subsequence.
+     * Exceptions thrown by the replace function are relayed to the caller.
+     *
+     * <p> This method first resets this matcher.  It then scans the input
+     * sequence looking for a match of the pattern.  Characters that are not
+     * part of the match are appended directly to the result string; the match
+     * is replaced in the result by the applying the replacer function that
+     * returns a replacement string.  The replacement string may contain
+     * references to captured subsequences as in the {@link #appendReplacement
+     * appendReplacement} method.
+     *
+     * <p>Note that backslashes (<tt>\</tt>) and dollar signs (<tt>$</tt>) in
+     * the replacement string may cause the results to be different than if it
+     * were being treated as a literal replacement string. Dollar signs may be
+     * treated as references to captured subsequences as described above, and
+     * backslashes are used to escape literal characters in the replacement
+     * string.
+     *
+     * <p> Given the regular expression <tt>dog</tt>, the input
+     * <tt>"zzzdogzzzdogzzz"</tt>, and the function
+     * <tt>mr -> mr.group().toUpperCase()</tt>, an invocation of this method on
+     * a matcher for that expression would yield the string
+     * <tt>"zzzDOGzzzdogzzz"</tt>.
+     *
+     * <p> Invoking this method changes this matcher's state.  If the matcher
+     * is to be used in further matching operations then it should first be
+     * reset.
+     *
+     * <p> The replacer function should not modify this matcher's state during
+     * replacement.  This method will, on a best-effort basis, throw a
+     * {@link java.util.ConcurrentModificationException} if such modification is
+     * detected.
+     *
+     * <p> The state of the match result passed to the replacer function is
+     * guaranteed to be constant only for the duration of the replacer function
+     * call and only if the replacer function does not modify this matcher's
+     * state.
+     *
+     * @implNote
+     * This implementation applies the replacer function to this matcher, which
+     * is an instance of {@code MatchResult}.
+     *
+     * @param  replacer
+     *         The function to be applied to the match result of this matcher
+     *         that returns a replacement string.
+     * @return  The string constructed by replacing the first matching
+     *          subsequence with the result of applying the replacer function to
+     *          the matched subsequence, substituting captured subsequences as
+     *          needed.
+     * @throws NullPointerException if the replacer function is null
+     * @throws ConcurrentModificationException if it is detected, on a
+     *         best-effort basis, that the replacer function modified this
+     *         matcher's state
+     * @since 1.9
+     */
+    public String replaceFirst(Function<MatchResult, String> replacer) {
+        Objects.requireNonNull(replacer);
+        reset();
+        if (!find())
+            return text.toString();
+        StringBuilder sb = new StringBuilder();
+        int ec = modCount;
+        String replacement = replacer.apply(this);
+        if (ec != modCount)
+            throw new ConcurrentModificationException();
+        appendReplacement(sb, replacement);
+        appendTail(sb);
+        return sb.toString();
+    }
+
+    /**
      * Sets the limits of this matcher's region. The region is the part of the
      * input sequence that will be searched to find a match. Invoking this
      * method resets the matcher, and then sets the region to start at the
@@ -1365,6 +1698,7 @@
         if (!result)
             this.first = -1;
         this.oldLast = this.last;
+        this.modCount++;
         return result;
     }
 
@@ -1387,6 +1721,7 @@
         if (!result)
             this.first = -1;
         this.oldLast = this.last;
+        this.modCount++;
         return result;
     }
 
--- a/src/java.base/share/classes/java/util/stream/Collectors.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/stream/Collectors.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -404,6 +404,54 @@
     }
 
     /**
+     * Adapts a {@code Collector} accepting elements of type {@code U} to one
+     * accepting elements of type {@code T} by applying a flat mapping function
+     * to each input element before accumulation.  The flat mapping function
+     * maps an input element to a {@link Stream stream} covering zero or more
+     * output elements that are then accumulated downstream.  Each mapped stream
+     * is {@link java.util.stream.BaseStream#close() closed} after its contents
+     * have been placed downstream.  (If a mapped stream is {@code null}
+     * an empty stream is used, instead.)
+     *
+     * @apiNote
+     * The {@code flatMapping()} collectors are most useful when used in a
+     * multi-level reduction, such as downstream of a {@code groupingBy} or
+     * {@code partitioningBy}.  For example, given a stream of
+     * {@code Order}, to accumulate the set of line items for each customer:
+     * <pre>{@code
+     *     Map<String, Set<LineItem>> itemsByCustomerName
+     *         = orders.stream().collect(groupingBy(Order::getCustomerName,
+     *                                              flatMapping(order -> order.getLineItems().stream(), toSet())));
+     * }</pre>
+     *
+     * @param <T> the type of the input elements
+     * @param <U> type of elements accepted by downstream collector
+     * @param <A> intermediate accumulation type of the downstream collector
+     * @param <R> result type of collector
+     * @param mapper a function to be applied to the input elements, which
+     * returns a stream of results
+     * @param downstream a collector which will receive the elements of the
+     * stream returned by mapper
+     * @return a collector which applies the mapping function to the input
+     * elements and provides the flat mapped results to the downstream collector
+     * @since 1.9
+     */
+    public static <T, U, A, R>
+    Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper,
+                                   Collector<? super U, A, R> downstream) {
+        BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
+        return new CollectorImpl<>(downstream.supplier(),
+                            (r, t) -> {
+                                try (Stream<? extends U> result = mapper.apply(t)) {
+                                    if (result != null)
+                                        result.sequential().forEach(u -> downstreamAccumulator.accept(r, u));
+                                }
+                            },
+                            downstream.combiner(), downstream.finisher(),
+                            downstream.characteristics());
+    }
+
+    /**
      * Adapts a {@code Collector} to perform an additional finishing
      * transformation.  For example, one could adapt the {@link #toList()}
      * collector to always produce an immutable list with:
--- a/src/java.base/share/classes/java/util/stream/DoubleStream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/stream/DoubleStream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -848,7 +848,7 @@
      * @implNote
      * Use caution when constructing streams from repeated concatenation.
      * Accessing an element of a deeply concatenated stream can result in deep
-     * call chains, or even {@code StackOverflowException}.
+     * call chains, or even {@code StackOverflowError}.
      *
      * @param a the first stream
      * @param b the second stream
--- a/src/java.base/share/classes/java/util/stream/IntStream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/stream/IntStream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -837,7 +837,7 @@
      * @implNote
      * Use caution when constructing streams from repeated concatenation.
      * Accessing an element of a deeply concatenated stream can result in deep
-     * call chains, or even {@code StackOverflowException}.
+     * call chains, or even {@code StackOverflowError}.
      *
      * @param a the first stream
      * @param b the second stream
--- a/src/java.base/share/classes/java/util/stream/LongStream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/stream/LongStream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -845,7 +845,7 @@
      * @implNote
      * Use caution when constructing streams from repeated concatenation.
      * Accessing an element of a deeply concatenated stream can result in deep
-     * call chains, or even {@code StackOverflowException}.
+     * call chains, or even {@code StackOverflowError}.
      *
      * @param a the first stream
      * @param b the second stream
--- a/src/java.base/share/classes/java/util/stream/Stream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/stream/Stream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1079,7 +1079,7 @@
      * @implNote
      * Use caution when constructing streams from repeated concatenation.
      * Accessing an element of a deeply concatenated stream can result in deep
-     * call chains, or even {@code StackOverflowException}.
+     * call chains, or even {@code StackOverflowError}.
      *
      * @param <T> The type of stream elements
      * @param a the first stream
--- a/src/java.base/share/classes/java/util/zip/ZipEntry.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/zip/ZipEntry.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -41,7 +41,9 @@
 class ZipEntry implements ZipConstants, Cloneable {
 
     String name;        // entry name
-    long time = -1;     // last modification time
+    long xdostime = -1; // last modification time (in extended DOS time,
+                        // where milliseconds lost in conversion might
+                        // be encoded into the upper half)
     FileTime mtime;     // last modification time, from extra field data
     FileTime atime;     // last access time, from extra field data
     FileTime ctime;     // creation time, from extra field data
@@ -64,6 +66,28 @@
     public static final int DEFLATED = 8;
 
     /**
+     * DOS time constant for representing timestamps before 1980.
+     */
+    static final long DOSTIME_BEFORE_1980 = (1 << 21) | (1 << 16);
+
+    /**
+     * Approximately 128 years, in milliseconds (ignoring leap years etc).
+     *
+     * This establish an approximate high-bound value for DOS times in
+     * milliseconds since epoch, used to enable an efficient but
+     * sufficient bounds check to avoid generating extended last modified
+     * time entries.
+     *
+     * Calculating the exact number is locale dependent, would require loading
+     * TimeZone data eagerly, and would make little practical sense. Since DOS
+     * times theoretically go to 2107 - with compatibility not guaranteed
+     * after 2099 - setting this to a time that is before but near 2099
+     * should be sufficient.
+     */
+    private static final long UPPER_DOSTIME_BOUND =
+            128L * 365 * 24 * 60 * 60 * 1000;
+
+    /**
      * Creates a new zip entry with the specified name.
      *
      * @param  name
@@ -93,7 +117,7 @@
     public ZipEntry(ZipEntry e) {
         Objects.requireNonNull(e, "entry");
         name = e.name;
-        time = e.time;
+        xdostime = e.xdostime;
         mtime = e.mtime;
         atime = e.atime;
         ctime = e.ctime;
@@ -137,8 +161,14 @@
      * @see #getLastModifiedTime()
      */
     public void setTime(long time) {
-        this.time = time;
-        this.mtime = null;
+        this.xdostime = javaToExtendedDosTime(time);
+        // Avoid setting the mtime field if time is in the valid
+        // range for a DOS time
+        if (xdostime != DOSTIME_BEFORE_1980 && time <= UPPER_DOSTIME_BOUND) {
+            this.mtime = null;
+        } else {
+            this.mtime = FileTime.from(time, TimeUnit.MILLISECONDS);
+        }
     }
 
     /**
@@ -158,7 +188,10 @@
      * @see #setLastModifiedTime(FileTime)
      */
     public long getTime() {
-        return time;
+        if (mtime != null) {
+            return mtime.toMillis();
+        }
+        return (xdostime != -1) ? extendedDosToJavaTime(xdostime) : -1;
     }
 
     /**
@@ -181,7 +214,7 @@
      */
     public ZipEntry setLastModifiedTime(FileTime time) {
         this.mtime = Objects.requireNonNull(time, "lastModifiedTime");
-        this.time = time.to(TimeUnit.MILLISECONDS);
+        this.xdostime = javaToExtendedDosTime(time.to(TimeUnit.MILLISECONDS));
         return this;
     }
 
@@ -204,9 +237,9 @@
     public FileTime getLastModifiedTime() {
         if (mtime != null)
             return mtime;
-        if (time == -1)
+        if (xdostime == -1)
             return null;
-        return FileTime.from(time, TimeUnit.MILLISECONDS);
+        return FileTime.from(getTime(), TimeUnit.MILLISECONDS);
     }
 
     /**
--- a/src/java.base/share/classes/java/util/zip/ZipFile.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/zip/ZipFile.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,7 +46,6 @@
 import java.util.stream.StreamSupport;
 
 import static java.util.zip.ZipConstants64.*;
-import static java.util.zip.ZipUtils.*;
 
 /**
  * This class is used to read entries from a zip file.
@@ -567,7 +566,7 @@
                 e.name = zc.toString(bname, bname.length);
             }
         }
-        e.time = dosToJavaTime(getEntryTime(jzentry));
+        e.xdostime = getEntryTime(jzentry);
         e.crc = getEntryCrc(jzentry);
         e.size = getEntrySize(jzentry);
         e.csize = getEntryCSize(jzentry);
--- a/src/java.base/share/classes/java/util/zip/ZipInputStream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/zip/ZipInputStream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -303,7 +303,7 @@
             throw new ZipException("encrypted ZIP entry not supported");
         }
         e.method = get16(tmpbuf, LOCHOW);
-        e.time = dosToJavaTime(get32(tmpbuf, LOCTIM));
+        e.xdostime = get32(tmpbuf, LOCTIM);
         if ((flag & 8) == 8) {
             /* "Data Descriptor" present */
             if (e.method != DEFLATED) {
--- a/src/java.base/share/classes/java/util/zip/ZipOutputStream.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/zip/ZipOutputStream.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -61,7 +61,6 @@
     private static class XEntry {
         final ZipEntry entry;
         final long offset;
-        long dostime;    // last modification time in msdos format
         public XEntry(ZipEntry entry, long offset) {
             this.entry = entry;
             this.offset = offset;
@@ -192,7 +191,7 @@
         if (current != null) {
             closeEntry();       // close previous entry
         }
-        if (e.time == -1) {
+        if (e.xdostime == -1) {
             // by default, do NOT use extended timestamps in extra
             // data, for now.
             e.setTime(System.currentTimeMillis());
@@ -389,18 +388,12 @@
         boolean hasZip64 = false;
         int elen = getExtraLen(e.extra);
 
-        // keep a copy of dostime for writeCEN(), otherwise the tz
-        // sensitive local time entries in loc and cen might be
-        // different if the default tz get changed during writeLOC()
-        // and writeCEN()
-        xentry.dostime = javaToDosTime(e.time);
-
         writeInt(LOCSIG);               // LOC header signature
         if ((flag & 8) == 8) {
             writeShort(version(e));     // version needed to extract
             writeShort(flag);           // general purpose bit flag
             writeShort(e.method);       // compression method
-            writeInt(xentry.dostime);   // last modification time
+            writeInt(e.xdostime);       // last modification time
             // store size, uncompressed size, and crc-32 in data descriptor
             // immediately following compressed entry data
             writeInt(0);
@@ -415,7 +408,7 @@
             }
             writeShort(flag);           // general purpose bit flag
             writeShort(e.method);       // compression method
-            writeInt(xentry.dostime);   // last modification time
+            writeInt(e.xdostime);       // last modification time
             writeInt(e.crc);            // crc-32
             if (hasZip64) {
                 writeInt(ZIP64_MAGICVAL);
@@ -522,9 +515,7 @@
         }
         writeShort(flag);           // general purpose bit flag
         writeShort(e.method);       // compression method
-        // use the copy in xentry, which has been converted
-        // from e.time in writeLOC()
-        writeInt(xentry.dostime);   // last modification time
+        writeInt(e.xdostime);       // last modification time
         writeInt(e.crc);            // crc-32
         writeInt(csize);            // compressed size
         writeInt(size);             // uncompressed size
--- a/src/java.base/share/classes/java/util/zip/ZipUtils.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/java/util/zip/ZipUtils.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,9 +29,6 @@
 import java.util.Date;
 import java.util.concurrent.TimeUnit;
 
-import static java.util.zip.ZipConstants.*;
-import static java.util.zip.ZipConstants64.*;
-
 class ZipUtils {
 
     // used to adjust values between Windows and java epoch
@@ -69,7 +66,7 @@
     /**
      * Converts DOS time to Java time (number of milliseconds since epoch).
      */
-    public static long dosToJavaTime(long dtime) {
+    private static long dosToJavaTime(long dtime) {
         @SuppressWarnings("deprecation") // Use of date constructor.
         Date d = new Date((int)(((dtime >> 25) & 0x7f) + 80),
                           (int)(((dtime >> 21) & 0x0f) - 1),
@@ -81,14 +78,26 @@
     }
 
     /**
+     * Converts extended DOS time to Java time, where up to 1999 milliseconds
+     * might be encoded into the upper half of the returned long.
+     *
+     * @param xdostime the extended DOS time value
+     * @return milliseconds since epoch
+     */
+    public static long extendedDosToJavaTime(long xdostime) {
+        long time = dosToJavaTime(xdostime);
+        return time + (xdostime >> 32);
+    }
+
+    /**
      * Converts Java time to DOS time.
      */
     @SuppressWarnings("deprecation") // Use of date methods
-    public static long javaToDosTime(long time) {
+    private static long javaToDosTime(long time) {
         Date d = new Date(time);
         int year = d.getYear() + 1900;
         if (year < 1980) {
-            return (1 << 21) | (1 << 16);
+            return ZipEntry.DOSTIME_BEFORE_1980;
         }
         return (year - 1980) << 25 | (d.getMonth() + 1) << 21 |
                d.getDate() << 16 | d.getHours() << 11 | d.getMinutes() << 5 |
@@ -96,6 +105,23 @@
     }
 
     /**
+     * Converts Java time to DOS time, encoding any milliseconds lost
+     * in the conversion into the upper half of the returned long.
+     *
+     * @param time milliseconds since epoch
+     * @return DOS time with 2s remainder encoded into upper half
+     */
+    public static long javaToExtendedDosTime(long time) {
+        if (time < 0) {
+            return ZipEntry.DOSTIME_BEFORE_1980;
+        }
+        long dostime = javaToDosTime(time);
+        return (dostime != ZipEntry.DOSTIME_BEFORE_1980)
+                ? dostime + ((time % 2000) << 32)
+                : ZipEntry.DOSTIME_BEFORE_1980;
+    }
+
+    /**
      * Fetches unsigned 16-bit value from byte array at specified offset.
      * The bytes are assumed to be in Intel (little-endian) byte order.
      */
--- a/src/java.base/share/classes/sun/nio/ch/SocketAdaptor.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/sun/nio/ch/SocketAdaptor.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -321,12 +321,9 @@
     }
 
     public void sendUrgentData(int data) throws IOException {
-        synchronized (sc.blockingLock()) {
-            if (!sc.isBlocking())
-                throw new IllegalBlockingModeException();
-            int n = sc.sendOutOfBandData((byte)data);
-            assert n == 1;
-        }
+        int n = sc.sendOutOfBandData((byte) data);
+        if (n == 0)
+            throw new IOException("Socket buffer full");
     }
 
     public void setOOBInline(boolean on) throws SocketException {
--- a/src/java.base/share/classes/sun/security/acl/AclEntryImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package sun.security.acl;
-
-import java.util.*;
-import java.security.Principal;
-import java.security.acl.*;
-
-/**
- * This is a class that describes one entry that associates users
- * or groups with permissions in the ACL.
- * The entry may be used as a way of granting or denying permissions.
- * @author      Satish Dharmaraj
- */
-public class AclEntryImpl implements AclEntry {
-    private Principal user = null;
-    private Vector<Permission> permissionSet = new Vector<>(10, 10);
-    private boolean negative = false;
-
-    /**
-     * Construct an ACL entry that associates a user with permissions
-     * in the ACL.
-     * @param user The user that is associated with this entry.
-     */
-    public AclEntryImpl(Principal user) {
-        this.user = user;
-    }
-
-    /**
-     * Construct a null ACL entry
-     */
-    public AclEntryImpl() {
-    }
-
-    /**
-     * Sets the principal in the entity. If a group or a
-     * principal had already been set, a false value is
-     * returned, otherwise a true value is returned.
-     * @param user The user that is associated with this entry.
-     * @return true if the principal is set, false if there is
-     * one already.
-     */
-    public boolean setPrincipal(Principal user) {
-        if (this.user != null)
-          return false;
-        this.user = user;
-        return true;
-    }
-
-    /**
-     * This method sets the ACL to have negative permissions.
-     * That is the user or group is denied the permission set
-     * specified in the entry.
-     */
-    public void setNegativePermissions() {
-        negative = true;
-    }
-
-    /**
-     * Returns true if this is a negative ACL.
-     */
-    public boolean isNegative() {
-        return negative;
-    }
-
-    /**
-     * A principal or a group can be associated with multiple
-     * permissions. This method adds a permission to the ACL entry.
-     * @param permission The permission to be associated with
-     * the principal or the group in the entry.
-     * @return true if the permission was added, false if the
-     * permission was already part of the permission set.
-     */
-    public boolean addPermission(Permission permission) {
-
-        if (permissionSet.contains(permission))
-          return false;
-
-        permissionSet.addElement(permission);
-
-        return true;
-    }
-
-    /**
-     * The method disassociates the permission from the Principal
-     * or the Group in this ACL entry.
-     * @param permission The permission to be disassociated with
-     * the principal or the group in the entry.
-     * @return true if the permission is removed, false if the
-     * permission is not part of the permission set.
-     */
-    public boolean removePermission(Permission permission) {
-        return permissionSet.removeElement(permission);
-    }
-
-    /**
-     * Checks if the passed permission is part of the allowed
-     * permission set in this entry.
-     * @param permission The permission that has to be part of
-     * the permission set in the entry.
-     * @return true if the permission passed is part of the
-     * permission set in the entry, false otherwise.
-     */
-    public boolean checkPermission(Permission permission) {
-        return permissionSet.contains(permission);
-    }
-
-    /**
-     * return an enumeration of the permissions in this ACL entry.
-     */
-    public Enumeration<Permission> permissions() {
-        return permissionSet.elements();
-    }
-
-    /**
-     * Return a string representation of  the contents of the ACL entry.
-     */
-    public String toString() {
-        StringBuffer s = new StringBuffer();
-        if (negative)
-          s.append("-");
-        else
-          s.append("+");
-        if (user instanceof Group)
-            s.append("Group.");
-        else
-            s.append("User.");
-        s.append(user + "=");
-        Enumeration<Permission> e = permissions();
-        while(e.hasMoreElements()) {
-            Permission p = e.nextElement();
-            s.append(p);
-            if (e.hasMoreElements())
-                s.append(",");
-        }
-        return new String(s);
-    }
-
-    /**
-     * Clones an AclEntry.
-     */
-    @SuppressWarnings("unchecked") // Safe casts assuming clone() works correctly
-    public synchronized Object clone() {
-        AclEntryImpl cloned;
-        cloned = new AclEntryImpl(user);
-        cloned.permissionSet = (Vector<Permission>) permissionSet.clone();
-        cloned.negative = negative;
-        return cloned;
-    }
-
-    /**
-     * Return the Principal associated in this ACL entry.
-     * The method returns null if the entry uses a group
-     * instead of a principal.
-     */
-    public Principal getPrincipal() {
-        return user;
-    }
-}
--- a/src/java.base/share/classes/sun/security/acl/AclImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,408 +0,0 @@
-/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.io.*;
-import java.util.*;
-import java.security.Principal;
-import java.security.acl.*;
-
-/**
- * An Access Control List (ACL) is encapsulated by this class.
- * @author      Satish Dharmaraj
- */
-public class AclImpl extends OwnerImpl implements Acl {
-    //
-    // Maintain four tables. one each for positive and negative
-    // ACLs. One each depending on whether the entity is a group
-    // or principal.
-    //
-    private Hashtable<Principal, AclEntry> allowedUsersTable =
-                                        new Hashtable<>(23);
-    private Hashtable<Principal, AclEntry> allowedGroupsTable =
-                                        new Hashtable<>(23);
-    private Hashtable<Principal, AclEntry> deniedUsersTable =
-                                        new Hashtable<>(23);
-    private Hashtable<Principal, AclEntry> deniedGroupsTable =
-                                        new Hashtable<>(23);
-    private String aclName = null;
-    private Vector<Permission> zeroSet = new Vector<>(1,1);
-
-
-    /**
-     * Constructor for creating an empty ACL.
-     */
-    public AclImpl(Principal owner, String name) {
-        super(owner);
-        try {
-            setName(owner, name);
-        } catch (Exception e) {}
-    }
-
-    /**
-     * Sets the name of the ACL.
-     * @param caller the principal who is invoking this method.
-     * @param name the name of the ACL.
-     * @exception NotOwnerException if the caller principal is
-     * not on the owners list of the Acl.
-     */
-    public void setName(Principal caller, String name)
-      throws NotOwnerException
-    {
-        if (!isOwner(caller))
-            throw new NotOwnerException();
-
-        aclName = name;
-    }
-
-    /**
-     * Returns the name of the ACL.
-     * @return the name of the ACL.
-     */
-    public String getName() {
-        return aclName;
-    }
-
-    /**
-     * Adds an ACL entry to this ACL. An entry associates a
-     * group or a principal with a set of permissions. Each
-     * user or group can have one positive ACL entry and one
-     * negative ACL entry. If there is one of the type (negative
-     * or positive) already in the table, a false value is returned.
-     * The caller principal must be a part of the owners list of
-     * the ACL in order to invoke this method.
-     * @param caller the principal who is invoking this method.
-     * @param entry the ACL entry that must be added to the ACL.
-     * @return true on success, false if the entry is already present.
-     * @exception NotOwnerException if the caller principal
-     * is not on the owners list of the Acl.
-     */
-    public synchronized boolean addEntry(Principal caller, AclEntry entry)
-      throws NotOwnerException
-    {
-        if (!isOwner(caller))
-            throw new NotOwnerException();
-
-        Hashtable<Principal, AclEntry> aclTable = findTable(entry);
-        Principal key = entry.getPrincipal();
-
-        if (aclTable.get(key) != null)
-            return false;
-
-        aclTable.put(key, entry);
-        return true;
-    }
-
-    /**
-     * Removes an ACL entry from this ACL.
-     * The caller principal must be a part of the owners list of the ACL
-     * in order to invoke this method.
-     * @param caller the principal who is invoking this method.
-     * @param entry the ACL entry that must be removed from the ACL.
-     * @return true on success, false if the entry is not part of the ACL.
-     * @exception NotOwnerException if the caller principal is not
-     * the owners list of the Acl.
-     */
-    public synchronized boolean removeEntry(Principal caller, AclEntry entry)
-      throws NotOwnerException
-    {
-        if (!isOwner(caller))
-            throw new NotOwnerException();
-
-        Hashtable<Principal, AclEntry> aclTable = findTable(entry);
-        Principal key = entry.getPrincipal();
-
-        AclEntry o = aclTable.remove(key);
-        return (o != null);
-    }
-
-    /**
-     * This method returns the set of allowed permissions for the
-     * specified principal. This set of allowed permissions is calculated
-     * as follows:
-     *
-     * If there is no entry for a group or a principal an empty permission
-     * set is assumed.
-     *
-     * The group positive permission set is the union of all
-     * the positive permissions of each group that the individual belongs to.
-     * The group negative permission set is the union of all
-     * the negative permissions of each group that the individual belongs to.
-     * If there is a specific permission that occurs in both
-     * the postive permission set and the negative permission set,
-     * it is removed from both. The group positive and negatoive permission
-     * sets are calculated.
-     *
-     * The individial positive permission set and the individual negative
-     * permission set is then calculated. Again abscence of an entry means
-     * the empty set.
-     *
-     * The set of permissions granted to the principal is then calculated using
-     * the simple rule: Individual permissions always override the Group permissions.
-     * Specifically, individual negative permission set (specific
-     * denial of permissions) overrides the group positive permission set.
-     * And the individual positive permission set override the group negative
-     * permission set.
-     *
-     * @param user the principal for which the ACL entry is returned.
-     * @return The resulting permission set that the principal is allowed.
-     */
-    public synchronized Enumeration<Permission> getPermissions(Principal user) {
-
-        Enumeration<Permission> individualPositive;
-        Enumeration<Permission> individualNegative;
-        Enumeration<Permission> groupPositive;
-        Enumeration<Permission> groupNegative;
-
-        //
-        // canonicalize the sets. That is remove common permissions from
-        // positive and negative sets.
-        //
-        groupPositive =
-            subtract(getGroupPositive(user), getGroupNegative(user));
-        groupNegative  =
-            subtract(getGroupNegative(user), getGroupPositive(user));
-        individualPositive =
-            subtract(getIndividualPositive(user), getIndividualNegative(user));
-        individualNegative =
-            subtract(getIndividualNegative(user), getIndividualPositive(user));
-
-        //
-        // net positive permissions is individual positive permissions
-        // plus (group positive - individual negative).
-        //
-        Enumeration<Permission> temp1 =
-            subtract(groupPositive, individualNegative);
-        Enumeration<Permission> netPositive =
-            union(individualPositive, temp1);
-
-        // recalculate the enumeration since we lost it in performing the
-        // subtraction
-        //
-        individualPositive =
-            subtract(getIndividualPositive(user), getIndividualNegative(user));
-        individualNegative =
-            subtract(getIndividualNegative(user), getIndividualPositive(user));
-
-        //
-        // net negative permissions is individual negative permissions
-        // plus (group negative - individual positive).
-        //
-        temp1 = subtract(groupNegative, individualPositive);
-        Enumeration<Permission> netNegative = union(individualNegative, temp1);
-
-        return subtract(netPositive, netNegative);
-    }
-
-    /**
-     * This method checks whether or not the specified principal
-     * has the required permission. If permission is denied
-     * permission false is returned, a true value is returned otherwise.
-     * This method does not authenticate the principal. It presumes that
-     * the principal is a valid authenticated principal.
-     * @param principal the name of the authenticated principal
-     * @param permission the permission that the principal must have.
-     * @return true of the principal has the permission desired, false
-     * otherwise.
-     */
-    public boolean checkPermission(Principal principal, Permission permission)
-    {
-        Enumeration<Permission> permSet = getPermissions(principal);
-        while (permSet.hasMoreElements()) {
-            Permission p = permSet.nextElement();
-            if (p.equals(permission))
-              return true;
-        }
-        return false;
-    }
-
-    /**
-     * returns an enumeration of the entries in this ACL.
-     */
-    public synchronized Enumeration<AclEntry> entries() {
-        return new AclEnumerator(this,
-                                 allowedUsersTable, allowedGroupsTable,
-                                 deniedUsersTable, deniedGroupsTable);
-    }
-
-    /**
-     * return a stringified version of the
-     * ACL.
-     */
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        Enumeration<AclEntry> entries = entries();
-        while (entries.hasMoreElements()) {
-            AclEntry entry = entries.nextElement();
-            sb.append(entry.toString().trim());
-            sb.append("\n");
-        }
-
-        return sb.toString();
-    }
-
-    //
-    // Find the table that this entry belongs to. There are 4
-    // tables that are maintained. One each for postive and
-    // negative ACLs and one each for groups and users.
-    // This method figures out which
-    // table is the one that this AclEntry belongs to.
-    //
-    private Hashtable<Principal, AclEntry> findTable(AclEntry entry) {
-        Hashtable<Principal, AclEntry> aclTable = null;
-
-        Principal p = entry.getPrincipal();
-        if (p instanceof Group) {
-            if (entry.isNegative())
-                aclTable = deniedGroupsTable;
-            else
-                aclTable = allowedGroupsTable;
-        } else {
-            if (entry.isNegative())
-                aclTable = deniedUsersTable;
-            else
-                aclTable = allowedUsersTable;
-        }
-        return aclTable;
-    }
-
-    //
-    // returns the set e1 U e2.
-    //
-    private static Enumeration<Permission> union(Enumeration<Permission> e1,
-                Enumeration<Permission> e2) {
-        Vector<Permission> v = new Vector<>(20, 20);
-
-        while (e1.hasMoreElements())
-            v.addElement(e1.nextElement());
-
-        while (e2.hasMoreElements()) {
-            Permission o = e2.nextElement();
-            if (!v.contains(o))
-                v.addElement(o);
-        }
-
-        return v.elements();
-    }
-
-    //
-    // returns the set e1 - e2.
-    //
-    private Enumeration<Permission> subtract(Enumeration<Permission> e1,
-                Enumeration<Permission> e2) {
-        Vector<Permission> v = new Vector<>(20, 20);
-
-        while (e1.hasMoreElements())
-            v.addElement(e1.nextElement());
-
-        while (e2.hasMoreElements()) {
-            Permission o = e2.nextElement();
-            if (v.contains(o))
-                v.removeElement(o);
-        }
-
-        return v.elements();
-    }
-
-    private Enumeration<Permission> getGroupPositive(Principal user) {
-        Enumeration<Permission> groupPositive = zeroSet.elements();
-        Enumeration<Principal> e = allowedGroupsTable.keys();
-        while (e.hasMoreElements()) {
-            Group g = (Group)e.nextElement();
-            if (g.isMember(user)) {
-                AclEntry ae = allowedGroupsTable.get(g);
-                groupPositive = union(ae.permissions(), groupPositive);
-            }
-        }
-        return groupPositive;
-    }
-
-    private Enumeration<Permission> getGroupNegative(Principal user) {
-        Enumeration<Permission> groupNegative = zeroSet.elements();
-        Enumeration<Principal> e = deniedGroupsTable.keys();
-        while (e.hasMoreElements()) {
-            Group g = (Group)e.nextElement();
-            if (g.isMember(user)) {
-                AclEntry ae = deniedGroupsTable.get(g);
-                groupNegative = union(ae.permissions(), groupNegative);
-            }
-        }
-        return groupNegative;
-    }
-
-    private Enumeration<Permission> getIndividualPositive(Principal user) {
-        Enumeration<Permission> individualPositive = zeroSet.elements();
-        AclEntry ae = allowedUsersTable.get(user);
-        if (ae != null)
-            individualPositive = ae.permissions();
-        return individualPositive;
-    }
-
-    private Enumeration<Permission> getIndividualNegative(Principal user) {
-        Enumeration<Permission> individualNegative = zeroSet.elements();
-        AclEntry ae  = deniedUsersTable.get(user);
-        if (ae != null)
-            individualNegative = ae.permissions();
-        return individualNegative;
-    }
-}
-
-final class AclEnumerator implements Enumeration<AclEntry> {
-    Acl acl;
-    Enumeration<AclEntry> u1, u2, g1, g2;
-
-    AclEnumerator(Acl acl, Hashtable<?,AclEntry> u1, Hashtable<?,AclEntry> g1,
-                  Hashtable<?,AclEntry> u2, Hashtable<?,AclEntry> g2) {
-        this.acl = acl;
-        this.u1 = u1.elements();
-        this.u2 = u2.elements();
-        this.g1 = g1.elements();
-        this.g2 = g2.elements();
-    }
-
-    public boolean hasMoreElements() {
-        return (u1.hasMoreElements() ||
-                u2.hasMoreElements() ||
-                g1.hasMoreElements() ||
-                g2.hasMoreElements());
-    }
-
-    public AclEntry nextElement()
-    {
-        AclEntry o;
-        synchronized (acl) {
-            if (u1.hasMoreElements())
-                return u1.nextElement();
-            if (u2.hasMoreElements())
-                return u2.nextElement();
-            if (g1.hasMoreElements())
-                return g1.nextElement();
-            if (g2.hasMoreElements())
-                return g2.nextElement();
-        }
-        throw new NoSuchElementException("Acl Enumerator");
-    }
-}
--- a/src/java.base/share/classes/sun/security/acl/AllPermissionsImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 1996, 1997, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.security.Principal;
-import java.security.acl.*;
-
-/**
- * This class implements the principal interface for the set of all permissions.
- * @author Satish Dharmaraj
- */
-public class AllPermissionsImpl extends PermissionImpl {
-
-    public AllPermissionsImpl(String s) {
-        super(s);
-    }
-
-    /**
-     * This function returns true if the permission passed matches the permission represented in
-     * this interface.
-     * @param another The Permission object to compare with.
-     * @returns true always
-     */
-    public boolean equals(Permission another) {
-        return true;
-    }
-}
--- a/src/java.base/share/classes/sun/security/acl/GroupImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.util.*;
-import java.security.*;
-import java.security.acl.*;
-
-/**
- * This class implements a group of principals.
- * @author      Satish Dharmaraj
- */
-public class GroupImpl implements Group {
-    private Vector<Principal> groupMembers = new Vector<>(50, 100);
-    private String group;
-
-    /**
-     * Constructs a Group object with no members.
-     * @param groupName the name of the group
-     */
-    public GroupImpl(String groupName) {
-        this.group = groupName;
-    }
-
-    /**
-     * adds the specified member to the group.
-     * @param user The principal to add to the group.
-     * @return true if the member was added - false if the
-     * member could not be added.
-     */
-    public boolean addMember(Principal user) {
-        if (groupMembers.contains(user))
-          return false;
-
-        // do not allow groups to be added to itself.
-        if (group.equals(user.toString()))
-            throw new IllegalArgumentException();
-
-        groupMembers.addElement(user);
-        return true;
-    }
-
-    /**
-     * removes the specified member from the group.
-     * @param user The principal to remove from the group.
-     * @param true if the principal was removed false if
-     * the principal was not a member
-     */
-    public boolean removeMember(Principal user) {
-        return groupMembers.removeElement(user);
-    }
-
-    /**
-     * returns the enumeration of the members in the group.
-     */
-    public Enumeration<? extends Principal> members() {
-        return groupMembers.elements();
-    }
-
-    /**
-     * This function returns true if the group passed matches
-     * the group represented in this interface.
-     * @param another The group to compare this group to.
-     */
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof Group == false) {
-            return false;
-        }
-        Group another = (Group)obj;
-        return group.equals(another.toString());
-    }
-
-    // equals(Group) for compatibility
-    public boolean equals(Group another) {
-        return equals((Object)another);
-    }
-
-    /**
-     * Prints a stringified version of the group.
-     */
-    public String toString() {
-        return group;
-    }
-
-    /**
-     * return a hashcode for the principal.
-     */
-    public int hashCode() {
-        return group.hashCode();
-    }
-
-    /**
-     * returns true if the passed principal is a member of the group.
-     * @param member The principal whose membership must be checked for.
-     * @return true if the principal is a member of this group,
-     * false otherwise
-     */
-    public boolean isMember(Principal member) {
-
-        //
-        // if the member is part of the group (common case), return true.
-        // if not, recursively search depth first in the group looking for the
-        // principal.
-        //
-        if (groupMembers.contains(member)) {
-            return true;
-        } else {
-            Vector<Group> alreadySeen = new Vector<>(10);
-            return isMemberRecurse(member, alreadySeen);
-        }
-    }
-
-    /**
-     * return the name of the principal.
-     */
-    public String getName() {
-        return group;
-    }
-
-    //
-    // This function is the recursive search of groups for this
-    // implementation of the Group. The search proceeds building up
-    // a vector of already seen groups. Only new groups are considered,
-    // thereby avoiding loops.
-    //
-    boolean isMemberRecurse(Principal member, Vector<Group> alreadySeen) {
-        Enumeration<? extends Principal> e = members();
-        while (e.hasMoreElements()) {
-            boolean mem = false;
-            Principal p = (Principal) e.nextElement();
-
-            // if the member is in this collection, return true
-            if (p.equals(member)) {
-                return true;
-            } else if (p instanceof GroupImpl) {
-                //
-                // if not recurse if the group has not been checked already.
-                // Can call method in this package only if the object is an
-                // instance of this class. Otherwise call the method defined
-                // in the interface. (This can lead to a loop if a mixture of
-                // implementations form a loop, but we live with this improbable
-                // case rather than clutter the interface by forcing the
-                // implementation of this method.)
-                //
-                GroupImpl g = (GroupImpl) p;
-                alreadySeen.addElement(this);
-                if (!alreadySeen.contains(g))
-                  mem =  g.isMemberRecurse(member, alreadySeen);
-            } else if (p instanceof Group) {
-                Group g = (Group) p;
-                if (!alreadySeen.contains(g))
-                  mem = g.isMember(member);
-            }
-
-            if (mem)
-              return mem;
-        }
-        return false;
-    }
-}
--- a/src/java.base/share/classes/sun/security/acl/OwnerImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.util.*;
-import java.security.*;
-import java.security.acl.*;
-
-/**
- * Class implementing the Owner interface. The
- * initial owner principal is configured as
- * part of the constructor.
- * @author      Satish Dharmaraj
- */
-public class OwnerImpl implements Owner {
-    private Group ownerGroup;
-
-    public OwnerImpl(Principal owner) {
-        ownerGroup = new GroupImpl("AclOwners");
-        ownerGroup.addMember(owner);
-    }
-
-    /**
-     * Adds an owner. Owners can modify ACL contents and can disassociate
-     * ACLs from the objects they protect in the AclConfig interface.
-     * The caller principal must be a part of the owners list of the ACL in
-     * order to invoke this method. The initial owner is configured
-     * at ACL construction time.
-     * @param caller the principal who is invoking this method.
-     * @param owner The owner that should be added to the owners list.
-     * @return true if success, false if already an owner.
-     * @exception NotOwnerException if the caller principal is not on
-     * the owners list of the Acl.
-     */
-    public synchronized boolean addOwner(Principal caller, Principal owner)
-      throws NotOwnerException
-    {
-        if (!isOwner(caller))
-            throw new NotOwnerException();
-
-        ownerGroup.addMember(owner);
-        return false;
-    }
-
-    /**
-     * Delete owner. If this is the last owner in the ACL, an exception is
-     * raised.
-     * The caller principal must be a part of the owners list of the ACL in
-     * order to invoke this method.
-     * @param caller the principal who is invoking this method.
-     * @param owner The owner to be removed from the owners list.
-     * @return true if the owner is removed, false if the owner is not part
-     * of the owners list.
-     * @exception NotOwnerException if the caller principal is not on
-     * the owners list of the Acl.
-     * @exception LastOwnerException if there is only one owner left in the group, then
-     * deleteOwner would leave the ACL owner-less. This exception is raised in such a case.
-     */
-    public synchronized boolean deleteOwner(Principal caller, Principal owner)
-      throws NotOwnerException, LastOwnerException
-    {
-        if (!isOwner(caller))
-            throw new NotOwnerException();
-
-        Enumeration<? extends Principal> e = ownerGroup.members();
-        //
-        // check if there is atleast 2 members left.
-        //
-        Object o = e.nextElement();
-        if (e.hasMoreElements())
-            return ownerGroup.removeMember(owner);
-        else
-            throw new LastOwnerException();
-
-    }
-
-    /**
-     * returns if the given principal belongs to the owner list.
-     * @param owner The owner to check if part of the owners list
-     * @return true if the passed principal is in the owner list, false if not.
-     */
-    public synchronized boolean isOwner(Principal owner) {
-        return ownerGroup.isMember(owner);
-    }
-}
--- a/src/java.base/share/classes/sun/security/acl/PermissionImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.security.Principal;
-import java.security.acl.*;
-
-/**
- * The PermissionImpl class implements the permission
- * interface for permissions that are strings.
- * @author Satish Dharmaraj
- */
-public class PermissionImpl implements Permission {
-
-    private String permission;
-
-    /**
-     * Construct a permission object using a string.
-     * @param permission the stringified version of the permission.
-     */
-    public PermissionImpl(String permission) {
-        this.permission = permission;
-    }
-
-    /**
-     * This function returns true if the object passed matches the permission
-     * represented in this interface.
-     * @param another The Permission object to compare with.
-     * @return true if the Permission objects are equal, false otherwise
-     */
-    public boolean equals(Object another) {
-        if (another instanceof Permission) {
-            Permission p = (Permission) another;
-            return permission.equals(p.toString());
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Prints a stringified version of the permission.
-     * @return the string representation of the Permission.
-     */
-    public String toString() {
-        return permission;
-    }
-
-    /**
-     * Returns a hashcode for this PermissionImpl.
-     *
-     * @return a hashcode for this PermissionImpl.
-     */
-    public int hashCode() {
-        return toString().hashCode();
-    }
-
-}
--- a/src/java.base/share/classes/sun/security/acl/PrincipalImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.security.*;
-
-/**
- * This class implements the principal interface.
- *
- * @author      Satish Dharmaraj
- */
-public class PrincipalImpl implements Principal {
-
-    private String user;
-
-    /**
-     * Construct a principal from a string user name.
-     * @param user The string form of the principal name.
-     */
-    public PrincipalImpl(String user) {
-        this.user = user;
-    }
-
-    /**
-     * This function returns true if the object passed matches
-     * the principal represented in this implementation
-     * @param another the Principal to compare with.
-     * @return true if the Principal passed is the same as that
-     * encapsulated in this object, false otherwise
-     */
-    public boolean equals(Object another) {
-        if (another instanceof PrincipalImpl) {
-            PrincipalImpl p = (PrincipalImpl) another;
-            return user.equals(p.toString());
-        } else
-          return false;
-    }
-
-    /**
-     * Prints a stringified version of the principal.
-     */
-    public String toString() {
-        return user;
-    }
-
-    /**
-     * return a hashcode for the principal.
-     */
-    public int hashCode() {
-        return user.hashCode();
-    }
-
-    /**
-     * return the name of the principal.
-     */
-    public String getName() {
-        return user;
-    }
-
-}
--- a/src/java.base/share/classes/sun/security/acl/WorldGroupImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.acl;
-
-import java.security.*;
-
-/**
- * This class implements a group of principals.
- * @author Satish Dharmaraj
- */
-public class WorldGroupImpl extends GroupImpl {
-
-    public WorldGroupImpl(String s) {
-        super(s);
-    }
-
-    /**
-     * returns true for all passed principals
-     * @param member The principal whose membership must be checked in this Group.
-     * @return true always since this is the "world" group.
-     */
-    public boolean isMember(Principal member) {
-        return true;
-    }
-}
--- a/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Tue Mar 03 08:49:13 2015 -0800
@@ -3765,55 +3765,87 @@
         }
     }
 
+    // Add an extension into a CertificateExtensions, always using OID as key
+    private static void setExt(CertificateExtensions result, Extension ex)
+            throws IOException {
+        result.set(ex.getId(), ex);
+    }
+
     /**
      * Create X509v3 extensions from a string representation. Note that the
      * SubjectKeyIdentifierExtension will always be created non-critical besides
      * the extension requested in the <code>extstr</code> argument.
      *
-     * @param reqex the requested extensions, can be null, used for -gencert
-     * @param ext the original extensions, can be null, used for -selfcert
+     * @param requestedEx the requested extensions, can be null, used for -gencert
+     * @param existingEx the original extensions, can be null, used for -selfcert
      * @param extstrs -ext values, Read keytool doc
      * @param pkey the public key for the certificate
      * @param akey the public key for the authority (issuer)
      * @return the created CertificateExtensions
      */
     private CertificateExtensions createV3Extensions(
-            CertificateExtensions reqex,
-            CertificateExtensions ext,
+            CertificateExtensions requestedEx,
+            CertificateExtensions existingEx,
             List <String> extstrs,
             PublicKey pkey,
             PublicKey akey) throws Exception {
 
-        if (ext != null && reqex != null) {
+        // By design, inside a CertificateExtensions object, all known
+        // extensions uses name (say, "BasicConstraints") as key and
+        // a child Extension type (say, "BasicConstraintsExtension")
+        // as value, unknown extensions uses OID as key and bare
+        // Extension object as value. This works fine inside JDK.
+        //
+        // However, in keytool, there is no way to prevent people
+        // using OID in -ext, either as a new extension, or in a
+        // honored value. Thus here we (ab)use CertificateExtensions
+        // by always using OID as key and value can be of any type.
+
+        if (existingEx != null && requestedEx != null) {
             // This should not happen
             throw new Exception("One of request and original should be null.");
         }
-        if (ext == null) ext = new CertificateExtensions();
+        // A new extensions always using OID as key
+        CertificateExtensions result = new CertificateExtensions();
+        if (existingEx != null) {
+            for (Extension ex: existingEx.getAllExtensions()) {
+                setExt(result, ex);
+            }
+        }
         try {
             // name{:critical}{=value}
             // Honoring requested extensions
-            if (reqex != null) {
+            if (requestedEx != null) {
+                // The existing requestedEx might use names as keys,
+                // translate to all-OID first.
+                CertificateExtensions request2 = new CertificateExtensions();
+                for (sun.security.x509.Extension ex: requestedEx.getAllExtensions()) {
+                    request2.set(ex.getId(), ex);
+                }
                 for(String extstr: extstrs) {
                     if (extstr.toLowerCase(Locale.ENGLISH).startsWith("honored=")) {
                         List<String> list = Arrays.asList(
                                 extstr.toLowerCase(Locale.ENGLISH).substring(8).split(","));
                         // First check existence of "all"
                         if (list.contains("all")) {
-                            ext = reqex;    // we know ext was null
+                            for (Extension ex: request2.getAllExtensions()) {
+                                setExt(result, ex);
+                            }
                         }
                         // one by one for others
                         for (String item: list) {
                             if (item.equals("all")) continue;
 
                             // add or remove
-                            boolean add = true;
-                            // -1, unchanged, 0 crtical, 1 non-critical
+                            boolean add;
+                            // -1, unchanged, 0 critical, 1 non-critical
                             int action = -1;
                             String type = null;
                             if (item.startsWith("-")) {
                                 add = false;
                                 type = item.substring(1);
                             } else {
+                                add = true;
                                 int colonpos = item.indexOf(':');
                                 if (colonpos >= 0) {
                                     type = item.substring(0, colonpos);
@@ -3823,21 +3855,23 @@
                                         throw new Exception(rb.getString
                                             ("Illegal.value.") + item);
                                     }
+                                } else {
+                                    type = item;
                                 }
                             }
-                            String n = reqex.getNameByOid(findOidForExtName(type));
+                            String n = findOidForExtName(type).toString();
                             if (add) {
-                                Extension e = reqex.get(n);
+                                Extension e = request2.get(n);
                                 if (!e.isCritical() && action == 0
                                         || e.isCritical() && action == 1) {
                                     e = Extension.newExtension(
                                             e.getExtensionId(),
                                             !e.isCritical(),
                                             e.getExtensionValue());
-                                    ext.set(n, e);
                                 }
+                                setExt(result, e);
                             } else {
-                                ext.delete(n);
+                                result.delete(n);
                             }
                         }
                         break;
@@ -3899,8 +3933,7 @@
                                 }
                             }
                         }
-                        ext.set(BasicConstraintsExtension.NAME,
-                                new BasicConstraintsExtension(isCritical, isCA,
+                        setExt(result, new BasicConstraintsExtension(isCritical, isCA,
                                 pathLen));
                         break;
                     case 1:     // KU
@@ -3928,7 +3961,7 @@
                             KeyUsageExtension kue = new KeyUsageExtension(ok);
                             // The above KeyUsageExtension constructor does not
                             // allow isCritical value, so...
-                            ext.set(KeyUsageExtension.NAME, Extension.newExtension(
+                            setExt(result, Extension.newExtension(
                                     kue.getExtensionId(),
                                     isCritical,
                                     kue.getExtensionValue()));
@@ -3966,8 +3999,7 @@
                                     v.add(new ObjectIdentifier("1.3.6.1.5.5.7.3." + p));
                                 }
                             }
-                            ext.set(ExtendedKeyUsageExtension.NAME,
-                                    new ExtendedKeyUsageExtension(isCritical, v));
+                            setExt(result, new ExtendedKeyUsageExtension(isCritical, v));
                         } else {
                             throw new Exception(rb.getString
                                     ("Illegal.value.") + extstr);
@@ -3988,13 +4020,11 @@
                                 gnames.add(createGeneralName(t, v));
                             }
                             if (exttype == 3) {
-                                ext.set(SubjectAlternativeNameExtension.NAME,
-                                        new SubjectAlternativeNameExtension(
-                                            isCritical, gnames));
+                                setExt(result, new SubjectAlternativeNameExtension(
+                                        isCritical, gnames));
                             } else {
-                                ext.set(IssuerAlternativeNameExtension.NAME,
-                                        new IssuerAlternativeNameExtension(
-                                            isCritical, gnames));
+                                setExt(result, new IssuerAlternativeNameExtension(
+                                        isCritical, gnames));
                             }
                         } else {
                             throw new Exception(rb.getString
@@ -4044,11 +4074,9 @@
                                         oid, createGeneralName(t, v)));
                             }
                             if (exttype == 5) {
-                                ext.set(SubjectInfoAccessExtension.NAME,
-                                        new SubjectInfoAccessExtension(accessDescriptions));
+                                setExt(result, new SubjectInfoAccessExtension(accessDescriptions));
                             } else {
-                                ext.set(AuthorityInfoAccessExtension.NAME,
-                                        new AuthorityInfoAccessExtension(accessDescriptions));
+                                setExt(result, new AuthorityInfoAccessExtension(accessDescriptions));
                             }
                         } else {
                             throw new Exception(rb.getString
@@ -4068,10 +4096,9 @@
                                 String v = item.substring(colonpos+1);
                                 gnames.add(createGeneralName(t, v));
                             }
-                            ext.set(CRLDistributionPointsExtension.NAME,
-                                    new CRLDistributionPointsExtension(
-                                        isCritical, Collections.singletonList(
-                                        new DistributionPoint(gnames, null, null))));
+                            setExt(result, new CRLDistributionPointsExtension(
+                                    isCritical, Collections.singletonList(
+                                    new DistributionPoint(gnames, null, null))));
                         } else {
                             throw new Exception(rb.getString
                                     ("Illegal.value.") + extstr);
@@ -4109,7 +4136,7 @@
                         } else {
                             data = new byte[0];
                         }
-                        ext.set(oid.toString(), new Extension(oid, isCritical,
+                        setExt(result, new Extension(oid, isCritical,
                                 new DerValue(DerValue.tag_OctetString, data)
                                         .toByteArray()));
                         break;
@@ -4119,18 +4146,16 @@
                 }
             }
             // always non-critical
-            ext.set(SubjectKeyIdentifierExtension.NAME,
-                    new SubjectKeyIdentifierExtension(
-                        new KeyIdentifier(pkey).getIdentifier()));
+            setExt(result, new SubjectKeyIdentifierExtension(
+                    new KeyIdentifier(pkey).getIdentifier()));
             if (akey != null && !pkey.equals(akey)) {
-                ext.set(AuthorityKeyIdentifierExtension.NAME,
-                        new AuthorityKeyIdentifierExtension(
-                        new KeyIdentifier(akey), null, null));
+                setExt(result, new AuthorityKeyIdentifierExtension(
+                                new KeyIdentifier(akey), null, null));
             }
         } catch(IOException e) {
             throw new RuntimeException(e);
         }
-        return ext;
+        return result;
     }
 
     /**
--- a/src/java.base/share/classes/sun/security/util/Debug.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/sun/security/util/Debug.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -80,11 +80,13 @@
         System.err.println("jar           jar verification");
         System.err.println("logincontext  login context results");
         System.err.println("jca           JCA engine class debugging");
+        System.err.println("keystore      KeyStore debugging");
         System.err.println("policy        loading and granting");
         System.err.println("provider      security provider debugging");
         System.err.println("pkcs11        PKCS11 session manager debugging");
         System.err.println("pkcs11keystore");
         System.err.println("              PKCS11 KeyStore debugging");
+        System.err.println("pkcs12        PKCS12 KeyStore debugging");
         System.err.println("sunpkcs11     SunPKCS11 provider debugging");
         System.err.println("scl           permissions SecureClassLoader assigns");
         System.err.println("ts            timestamping");
@@ -114,6 +116,10 @@
         System.err.println("              KeyPairGenerator, KeyStore, Mac,");
         System.err.println("              MessageDigest, SecureRandom, Signature.");
         System.err.println();
+        System.err.println("The following can be used with certpath:");
+        System.err.println();
+        System.err.println("ocsp          dump the OCSP protocol exchanges");
+        System.err.println();
         System.err.println("Note: Separate multiple options with a comma");
         System.exit(0);
     }
--- a/src/java.base/share/classes/sun/util/logging/LoggingSupport.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/sun/util/logging/LoggingSupport.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,7 @@
 import java.lang.reflect.Field;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.util.Date;
+import java.time.ZonedDateTime;
 
 /**
  * Internal API to support JRE implementation to detect if the java.util.logging
@@ -145,6 +145,11 @@
         return proxy.getLevelValue(level);
     }
 
+    // Since JDK 9, logging uses java.time to get more precise time stamps.
+    // It is possible to configure the simple format to print nano seconds (.%1$tN)
+    // by specifying:
+    // java.util.logging.SimpleFormatter.format=%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s%n%4$s: %5$s%6$s%n
+    // in the logging configuration
     private static final String DEFAULT_FORMAT =
         "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%6$s%n";
 
@@ -171,7 +176,7 @@
         if (format != null) {
             try {
                 // validate the user-defined format string
-                String.format(format, new Date(), "", "", "", "", "");
+                String.format(format, ZonedDateTime.now(), "", "", "", "", "");
             } catch (IllegalArgumentException e) {
                 // illegal syntax; fall back to the default format
                 format = DEFAULT_FORMAT;
--- a/src/java.base/share/classes/sun/util/logging/PlatformLogger.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/classes/sun/util/logging/PlatformLogger.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,8 +32,11 @@
 import java.io.StringWriter;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import sun.misc.JavaLangAccess;
@@ -514,11 +517,9 @@
 
         private static final String formatString =
             LoggingSupport.getSimpleFormat(false); // don't check logging.properties
-
-        // minimize memory allocation
-        private Date date = new Date();
+        private final ZoneId zoneId = ZoneId.systemDefault();
         private synchronized String format(Level level, String msg, Throwable thrown) {
-            date.setTime(System.currentTimeMillis());
+            ZonedDateTime zdt = ZonedDateTime.now(zoneId);
             String throwable = "";
             if (thrown != null) {
                 StringWriter sw = new StringWriter();
@@ -530,7 +531,7 @@
             }
 
             return String.format(formatString,
-                                 date,
+                                 zdt,
                                  getCallerInfo(),
                                  name,
                                  level.name(),
--- a/src/java.base/share/native/libjava/VM.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/native/libjava/VM.c	Tue Mar 03 08:49:13 2015 -0800
@@ -23,11 +23,8 @@
  * questions.
  */
 
-#include <string.h>
-
 #include "jni.h"
 #include "jni_util.h"
-#include "jlong.h"
 #include "jvm.h"
 #include "jdk_util.h"
 
@@ -43,12 +40,8 @@
     return JVM_LatestUserDefinedLoader(env);
 }
 
-typedef void (JNICALL *GetJvmVersionInfo_fp)(JNIEnv*, jvm_version_info*, size_t);
-
 JNIEXPORT void JNICALL
 Java_sun_misc_VM_initialize(JNIEnv *env, jclass cls) {
-    GetJvmVersionInfo_fp func_p;
-
     if (!JDK_InitJvmHandle()) {
         JNU_ThrowInternalError(env, "Handle for JVM not found for symbol lookup");
         return;
@@ -61,15 +54,4 @@
     // introducing a Java_sun_misc_VM_getNanoTimeAdjustment  wrapper
     (*env)->RegisterNatives(env, cls,
                             methods, sizeof(methods)/sizeof(methods[0]));
-
-    func_p = (GetJvmVersionInfo_fp) JDK_FindJvmEntry("JVM_GetVersionInfo");
-     if (func_p != NULL) {
-        jvm_version_info info;
-
-        memset(&info, 0, sizeof(info));
-
-        /* obtain the JVM version info */
-        (*func_p)(env, &info, sizeof(info));
-    }
 }
-
--- a/src/java.base/share/native/libjli/java.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/share/native/libjli/java.c	Tue Mar 03 08:49:13 2015 -0800
@@ -651,9 +651,26 @@
 SetJvmEnvironment(int argc, char **argv) {
 
     static const char*  NMT_Env_Name    = "NMT_LEVEL_";
-
     int i;
     for (i = 0; i < argc; i++) {
+        char *arg = argv[i];
+        /*
+         * Since this must be a VM flag we stop processing once we see
+         * an argument the launcher would not have processed beyond (such
+         * as -version or -h), or an argument that indicates the following
+         * arguments are for the application (i.e. the main class name, or
+         * the -jar argument).
+         */
+        if ((i > 0 && *arg != '-')
+                || JLI_StrCmp(arg, "-version") == 0
+                || JLI_StrCmp(arg, "-fullversion") == 0
+                || JLI_StrCmp(arg, "-help") == 0
+                || JLI_StrCmp(arg, "-?") == 0
+                || JLI_StrCmp(arg, "-jar") == 0
+                || JLI_StrCmp(arg, "-X") == 0
+                ) {
+            return;
+        }
         /*
          * The following case checks for "-XX:NativeMemoryTracking=value".
          * If value is non null, an environmental variable set to this value
@@ -661,7 +678,6 @@
          * The argument is passed to the JVM, which will check validity.
          * The JVM is responsible for removing the env variable.
          */
-        char *arg = argv[i];
         if (JLI_StrCCmp(arg, "-XX:NativeMemoryTracking=") == 0) {
             int retval;
             // get what follows this parameter, include "="
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.base/unix/conf/aarch64/jvm.cfg	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,35 @@
+# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# 
+# List of JVMs that can be used as an option to java, javac, etc.
+# Order is important -- first in this list is the default JVM.
+# NOTE that this both this file and its format are UNSUPPORTED and
+# WILL GO AWAY in a future release.
+#
+# You may also select a JVM in an arbitrary location with the
+# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
+# and may not be available in a future release.
+#
+-server KNOWN
+-client IGNORE
--- a/src/java.base/unix/native/libnet/ExtendedOptionsImpl.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/unix/native/libnet/ExtendedOptionsImpl.c	Tue Mar 03 08:49:13 2015 -0800
@@ -88,6 +88,7 @@
     /* SocketFlow fields */
 
     c = (*env)->FindClass(env, "jdk/net/SocketFlow");
+    CHECK_NULL(c);
 
     /* status */
 
--- a/src/java.base/unix/native/libnio/ch/DatagramChannelImpl.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/unix/native/libnio/ch/DatagramChannelImpl.c	Tue Mar 03 08:49:13 2015 -0800
@@ -201,7 +201,7 @@
     }
     if (senderAddr == NULL) {
         jobject isa = NULL;
-        int port;
+        int port = 0;
         jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
         if (ia != NULL) {
             isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
--- a/src/java.base/unix/native/libnio/ch/ServerSocketChannelImpl.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/unix/native/libnio/ch/ServerSocketChannelImpl.c	Tue Mar 03 08:49:13 2015 -0800
@@ -84,7 +84,7 @@
     int alloc_len;
     jobject remote_ia = 0;
     jobject isa;
-    jint remote_port;
+    jint remote_port = 0;
 
     NET_AllocSockaddr(&sa, &alloc_len);
     if (sa == NULL) {
--- a/src/java.base/windows/native/libjava/TimeZone_md.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/windows/native/libjava/TimeZone_md.c	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -195,7 +195,7 @@
          * Vista uses the different key name.
          */
         if (ret != ERROR_SUCCESS) {
-          bufSize = sizeof(val);
+            bufSize = sizeof(val);
             ret = RegQueryValueExA(hKey, "DynamicDaylightTimeDisabled",
                                    NULL, &valueType, (LPBYTE) &val, &bufSize);
         }
@@ -510,18 +510,49 @@
         } else {
             std_timezone = matchJavaTZ(java_home_dir, result,
                                        winZoneName, winMapID);
+            if (std_timezone == NULL) {
+                std_timezone = getGMTOffsetID();
+            }
         }
     }
-
     return std_timezone;
 }
 
 /**
- * Returns a GMT-offset-based time zone ID. On Win32, it always return
- * NULL since the fall back is performed in getWinTimeZone().
+ * Returns a GMT-offset-based time zone ID.
  */
 char *
 getGMTOffsetID()
 {
-    return NULL;
+    LONG bias = 0;
+    LONG ret;
+    HANDLE hKey = NULL;
+    char zonename[32];
+
+    // Obtain the current GMT offset value of ActiveTimeBias.
+    ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_CURRENT_TZ_KEY, 0,
+                       KEY_READ, (PHKEY)&hKey);
+    if (ret == ERROR_SUCCESS) {
+        DWORD val;
+        DWORD bufSize = sizeof(val);
+        ULONG valueType = 0;
+        ret = RegQueryValueExA(hKey, "ActiveTimeBias",
+                               NULL, &valueType, (LPBYTE) &val, &bufSize);
+        if (ret == ERROR_SUCCESS) {
+            bias = (LONG) val;
+        }
+        (void) RegCloseKey(hKey);
+    }
+
+    // If we can't get the ActiveTimeBias value, use Bias of TimeZoneInformation.
+    // Note: Bias doesn't reflect current daylight saving.
+    if (ret != ERROR_SUCCESS) {
+        TIME_ZONE_INFORMATION tzi;
+        if (GetTimeZoneInformation(&tzi) != TIME_ZONE_ID_INVALID) {
+            bias = tzi.Bias;
+        }
+    }
+
+    customZoneName(bias, zonename);
+    return _strdup(zonename);
 }
--- a/src/java.base/windows/native/libjava/java_props_md.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/windows/native/libjava/java_props_md.c	Tue Mar 03 08:49:13 2015 -0800
@@ -188,6 +188,7 @@
             free(elems[index]);
         }
     } else {
+        free(ret);
         ret = NULL;
     }
 
--- a/src/java.base/windows/native/libnio/ch/FileDispatcherImpl.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.base/windows/native/libnio/ch/FileDispatcherImpl.c	Tue Mar 03 08:49:13 2015 -0800
@@ -325,17 +325,14 @@
 {
     BOOL result = 0;
     HANDLE h = (HANDLE)(handleval(env, fdo));
-    LARGE_INTEGER offset;
+    FILE_END_OF_FILE_INFO eofInfo;
 
-    offset.QuadPart = size;
-    result = SetFilePointerEx(h, offset, NULL, FILE_BEGIN);
-    if (result == 0) {
-        JNU_ThrowIOExceptionWithLastError(env, "Truncation failed");
-        return IOS_THROWN;
-    }
-
-    result = SetEndOfFile(h);
-    if (result == 0) {
+    eofInfo.EndOfFile.QuadPart = size;
+    result = SetFileInformationByHandle(h,
+                                        FileEndOfFileInfo,
+                                        &eofInfo,
+                                        sizeof(eofInfo));
+    if (result == FALSE) {
         JNU_ThrowIOExceptionWithLastError(env, "Truncation failed");
         return IOS_THROWN;
     }
--- a/src/java.desktop/share/native/libjsound/SoundDefs.h	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.desktop/share/native/libjsound/SoundDefs.h	Tue Mar 03 08:49:13 2015 -0800
@@ -34,6 +34,7 @@
 #define X_BSD           4
 #define X_MACOSX        5
 
+#define X_AARCH64       9
 // **********************************
 // Make sure you set X_PLATFORM defines correctly.
 // Everything depends upon this flag being setup correctly.
--- a/src/java.desktop/unix/classes/sun/awt/motif/X11CNS11643.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.desktop/unix/classes/sun/awt/motif/X11CNS11643.java	Tue Mar 03 08:49:13 2015 -0800
@@ -28,7 +28,8 @@
 import java.nio.CharBuffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.*;
-import sun.nio.cs.ext.EUC_TW;
+import sun.nio.cs.*;
+import sun.nio.cs.ext.*;
 
 public abstract class X11CNS11643 extends Charset {
     private final int plane;
--- a/src/java.logging/share/classes/java/util/logging/LogRecord.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.logging/share/classes/java/util/logging/LogRecord.java	Tue Mar 03 08:49:13 2015 -0800
@@ -24,10 +24,12 @@
  */
 
 package java.util.logging;
+import java.time.Instant;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.io.*;
+import java.time.Clock;
 
 import sun.misc.JavaLangAccess;
 import sun.misc.SharedSecrets;
@@ -88,55 +90,94 @@
     private static final ThreadLocal<Integer> threadIds = new ThreadLocal<>();
 
     /**
-     * @serial Logging message level
+     * Logging message level
      */
     private Level level;
 
     /**
-     * @serial Sequence number
+     * Sequence number
      */
     private long sequenceNumber;
 
     /**
-     * @serial Class that issued logging call
+     * Class that issued logging call
      */
     private String sourceClassName;
 
     /**
-     * @serial Method that issued logging call
+     * Method that issued logging call
      */
     private String sourceMethodName;
 
     /**
-     * @serial Non-localized raw message text
+     * Non-localized raw message text
      */
     private String message;
 
     /**
-     * @serial Thread ID for thread that issued logging call.
+     * Thread ID for thread that issued logging call.
      */
     private int threadID;
 
     /**
-     * @serial Event time in milliseconds since 1970
-     */
-    private long millis;
-
-    /**
-     * @serial The Throwable (if any) associated with log message
+     * The Throwable (if any) associated with log message
      */
     private Throwable thrown;
 
     /**
-     * @serial Name of the source Logger.
+     * Name of the source Logger.
      */
     private String loggerName;
 
     /**
-     * @serial Resource bundle name to localized log message.
+     * Resource bundle name to localized log message.
      */
     private String resourceBundleName;
 
+    /**
+     * Event time.
+     * @since 1.9
+     */
+    private Instant instant;
+
+    /**
+     * @serialField level Level Logging message level
+     * @serialField sequenceNumber long Sequence number
+     * @serialField sourceClassName String Class that issued logging call
+     * @serialField sourceMethodName String Method that issued logging call
+     * @serialField message String Non-localized raw message text
+     * @serialField threadID int Thread ID for thread that issued logging call
+     * @serialField millis long Truncated event time in milliseconds since 1970
+     *              - calculated as getInstant().toEpochMilli().
+     *               The event time instant can be reconstructed using
+     * <code>Instant.ofEpochSecond(millis/1000, (millis % 1000) * 1000_000 + nanoAdjustment)</code>
+     * @serialField nanoAdjustment int Nanoseconds adjustment to the millisecond of
+     *              event time - calculated as getInstant().getNano() % 1000_000
+     *               The event time instant can be reconstructed using
+     * <code>Instant.ofEpochSecond(millis/1000, (millis % 1000) * 1000_000 + nanoAdjustment)</code>
+     *              <p>
+     *              Since: 1.9
+     * @serialField thrown Throwable The Throwable (if any) associated with log
+     *              message
+     * @serialField loggerName String Name of the source Logger
+     * @serialField resourceBundleName String Resource bundle name to localized
+     *              log message
+     */
+    private static final ObjectStreamField[] serialPersistentFields =
+        new ObjectStreamField[] {
+            new ObjectStreamField("level", Level.class),
+            new ObjectStreamField("sequenceNumber", long.class),
+            new ObjectStreamField("sourceClassName", String.class),
+            new ObjectStreamField("sourceMethodName", String.class),
+            new ObjectStreamField("message", String.class),
+            new ObjectStreamField("threadID", int.class),
+            new ObjectStreamField("millis", long.class),
+            new ObjectStreamField("nanoAdjustment", int.class),
+            new ObjectStreamField("thrown", Throwable.class),
+            new ObjectStreamField("loggerName", String.class),
+            new ObjectStreamField("resourceBundleName", String.class),
+        };
+
     private transient boolean needToInferCaller;
     private transient Object parameters[];
     private transient ResourceBundle resourceBundle;
@@ -164,7 +205,10 @@
      * The sequence property will be initialized with a new unique value.
      * These sequence values are allocated in increasing order within a VM.
      * <p>
-     * The millis property will be initialized to the current time.
+     * Since JDK 1.9, the event time is represented by an {@link Instant}.
+     * The instant property will be initialized to the {@linkplain
+     * Instant#now() current instant}, using the best available
+     * {@linkplain Clock#systemUTC() clock} on the system.
      * <p>
      * The thread ID property will be initialized with a unique ID for
      * the current thread.
@@ -173,6 +217,7 @@
      *
      * @param level  a logging level value
      * @param msg  the raw non-localized logging message (may be null)
+     * @see java.time.Clock#systemUTC()
      */
     public LogRecord(Level level, String msg) {
         this.level = Objects.requireNonNull(level);
@@ -180,7 +225,7 @@
         // Assign a thread ID and a unique sequence number.
         sequenceNumber = globalSequenceNumber.getAndIncrement();
         threadID = defaultThreadID();
-        millis = System.currentTimeMillis();
+        instant = Instant.now();
         needToInferCaller = true;
    }
 
@@ -416,21 +461,63 @@
     }
 
     /**
-     * Get event time in milliseconds since 1970.
+     * Get truncated event time in milliseconds since 1970.
      *
-     * @return event time in millis since 1970
+     * @return truncated event time in millis since 1970
+     *
+     * @implSpec This is equivalent to calling
+     *      {@link #getInstant() getInstant().toEpochMilli()}.
+     *
+     * @deprecated To get the full nanosecond resolution event time,
+     *             use {@link #getInstant()}.
+     *
+     * @see #getInstant()
      */
+    @Deprecated
     public long getMillis() {
-        return millis;
+        return instant.toEpochMilli();
     }
 
     /**
      * Set event time.
      *
-     * @param millis event time in millis since 1970
+     * @param millis event time in millis since 1970.
+     *
+     * @implSpec This is equivalent to calling
+     *      {@link #setInstant(java.time.Instant)
+     *      setInstant(Instant.ofEpochMilli(millis))}.
+     *
+     * @deprecated To set event time with nanosecond resolution,
+     *             use {@link #setInstant(java.time.Instant)}.
+     *
+     * @see #setInstant(java.time.Instant)
      */
+    @Deprecated
     public void setMillis(long millis) {
-        this.millis = millis;
+        this.instant = Instant.ofEpochMilli(millis);
+    }
+
+    /**
+     * Gets the instant that the event occurred.
+     *
+     * @return the instant that the event occurred.
+     *
+     * @since 1.9
+     */
+    public Instant getInstant() {
+        return instant;
+    }
+
+    /**
+     * Sets the instant that the event occurred.
+     *
+     * @param instant the instant that the event occurred.
+     *
+     * @throws NullPointerException if {@code instant} is null.
+     * @since 1.9
+     */
+    public void setInstant(Instant instant) {
+        this.instant = Objects.requireNonNull(instant);
     }
 
     /**
@@ -457,7 +544,7 @@
     private static final long serialVersionUID = 5372048053134512534L;
 
     /**
-     * @serialData Default fields, followed by a two byte version number
+     * @serialData Serialized fields, followed by a two byte version number
      * (major byte, followed by minor byte), followed by information on
      * the log record parameter array.  If there is no parameter array,
      * then -1 is written.  If there is a parameter array (possible of zero
@@ -467,8 +554,20 @@
      * is written.
      */
     private void writeObject(ObjectOutputStream out) throws IOException {
-        // We have to call defaultWriteObject first.
-        out.defaultWriteObject();
+        // We have to write serialized fields first.
+        ObjectOutputStream.PutField pf = out.putFields();
+        pf.put("level", level);
+        pf.put("sequenceNumber", sequenceNumber);
+        pf.put("sourceClassName", sourceClassName);
+        pf.put("sourceMethodName", sourceMethodName);
+        pf.put("message", message);
+        pf.put("threadID", threadID);
+        pf.put("millis", instant.toEpochMilli());
+        pf.put("nanoAdjustment", instant.getNano() % 1000_000);
+        pf.put("thrown", thrown);
+        pf.put("loggerName", loggerName);
+        pf.put("resourceBundleName", resourceBundleName);
+        out.writeFields();
 
         // Write our version number.
         out.writeByte(1);
@@ -486,8 +585,21 @@
 
     private void readObject(ObjectInputStream in)
                         throws IOException, ClassNotFoundException {
-        // We have to call defaultReadObject first.
-        in.defaultReadObject();
+        // We have to read serialized fields first.
+        ObjectInputStream.GetField gf = in.readFields();
+        level = (Level) gf.get("level", null);
+        sequenceNumber = gf.get("sequenceNumber", 0L);
+        sourceClassName = (String) gf.get("sourceClassName", null);
+        sourceMethodName = (String) gf.get("sourceMethodName", null);
+        message = (String) gf.get("message", null);
+        threadID = gf.get("threadID", 0);
+        long millis = gf.get("millis", 0L);
+        int nanoOfMilli = gf.get("nanoAdjustment", 0);
+        instant = Instant.ofEpochSecond(
+            millis / 1000L, (millis % 1000L) * 1000_000L + nanoOfMilli);
+        thrown = (Throwable) gf.get("thrown", null);
+        loggerName = (String) gf.get("loggerName", null);
+        resourceBundleName = (String) gf.get("resourceBundleName", null);
 
         // Read version number.
         byte major = in.readByte();
--- a/src/java.logging/share/classes/java/util/logging/SimpleFormatter.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.logging/share/classes/java/util/logging/SimpleFormatter.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,8 +27,9 @@
 package java.util.logging;
 
 import java.io.*;
-import java.text.*;
-import java.util.Date;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import sun.util.logging.LoggingSupport;
 
 /**
@@ -59,8 +60,8 @@
 public class SimpleFormatter extends Formatter {
 
     // format string for printing the log record
-    private static final String format = LoggingSupport.getSimpleFormat();
-    private final Date dat = new Date();
+    private final String format = LoggingSupport.getSimpleFormat();
+    private final ZoneId zoneId = ZoneId.systemDefault();
 
     /**
      * Format the given LogRecord.
@@ -79,8 +80,9 @@
      *     java.util.Formatter} format string specified in the
      *     {@code java.util.logging.SimpleFormatter.format} property
      *     or the default format.</li>
-     * <li>{@code date} - a {@link Date} object representing
-     *     {@linkplain LogRecord#getMillis event time} of the log record.</li>
+     * <li>{@code date} - a {@link ZonedDateTime} object representing
+     *     {@linkplain LogRecord#getInstant() event time} of the log record
+     *      in the {@link ZoneId#systemDefault()} system time zone.</li>
      * <li>{@code source} - a string representing the caller, if available;
      *     otherwise, the logger's name.</li>
      * <li>{@code logger} - the logger's name.</li>
@@ -129,6 +131,16 @@
      *     Mar 22, 2011 1:11:31 PM MyClass fatal
      *     SEVERE: several message with an exception
      *     </pre></li>
+     * <li> {@code java.util.logging.SimpleFormatter.format="%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s%n%4$s: %5$s%6$s%n"}
+     *      <p>Since JDK 1.9, {@code java.util.logging} uses {@link
+     *         java.time.Clock#systemUTC() java.time} to create more precise time
+     *         stamps.
+     *         The format above can be used to add a {@code .%1$tN} to the
+     *         date/time formatting so that nanoseconds will also be printed:
+     *     <pre>
+     *     Feb 06, 2015 5:33:10.279216000 PM example.Main main
+     *     INFO: This is a test
+     *     </pre></li>
      * </ul>
      * <p>This method can also be overridden in a subclass.
      * It is recommended to use the {@link Formatter#formatMessage}
@@ -137,8 +149,10 @@
      * @param record the log record to be formatted.
      * @return a formatted log record
      */
+    @Override
     public synchronized String format(LogRecord record) {
-        dat.setTime(record.getMillis());
+        ZonedDateTime zdt = ZonedDateTime.ofInstant(
+                record.getInstant(), zoneId);
         String source;
         if (record.getSourceClassName() != null) {
             source = record.getSourceClassName();
@@ -159,7 +173,7 @@
             throwable = sw.toString();
         }
         return String.format(format,
-                             dat,
+                             zdt,
                              source,
                              record.getLoggerName(),
                              record.getLevel().getLocalizedLevelName(),
--- a/src/java.logging/share/classes/java/util/logging/XMLFormatter.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.logging/share/classes/java/util/logging/XMLFormatter.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,9 @@
 
 package java.util.logging;
 
-import java.io.*;
 import java.nio.charset.Charset;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -40,11 +41,70 @@
  * but it is recommended that it normally be used with UTF-8.  The
  * character encoding can be set on the output Handler.
  *
+ * @implSpec Since JDK 1.9, instances of {@linkplain LogRecord} contain
+ * an {@link LogRecord#getInstant() Instant} which can have nanoseconds below
+ * the millisecond resolution.
+ * The DTD specification has been updated to allow for an optional
+ * {@code <nanos>} element. By default, the XMLFormatter will compute the
+ * nanosecond adjustment below the millisecond resolution (using
+ * {@code LogRecord.getInstant().getNano() % 1000_000}) - and if this is not 0,
+ * this adjustment value will be printed in the new {@code <nanos>} element.
+ * The event instant can then be reconstructed using
+ * {@code Instant.ofEpochSecond(millis/1000L, (millis % 1000L) * 1000_000L + nanos)}
+ * where {@code millis} and {@code nanos} represent the numbers serialized in
+ * the {@code <millis>} and {@code <nanos>} elements, respectively.
+ * <br>
+ * The {@code <date>} element will now contain the whole instant as formatted
+ * by the {@link DateTimeFormatter#ISO_INSTANT DateTimeFormatter.ISO_INSTANT}
+ * formatter.
+ * <p>
+ * For compatibility with old parsers, XMLFormatters can
+ * be configured to revert to the old format by specifying a
+ * {@code <xml-formatter-fully-qualified-class-name>.useInstant = false}
+ * {@linkplain LogManager#getProperty(java.lang.String) property} in the
+ * logging configuration. When {@code useInstant} is {@code false}, the old
+ * formatting will be preserved. When {@code useInstant} is {@code true}
+ * (the default), the {@code <nanos>} element will be printed and the
+ * {@code <date>} element will contain the {@linkplain
+ * DateTimeFormatter#ISO_INSTANT formatted} instant.
+ * <p>
+ * For instance, in order to configure plain instances of XMLFormatter to omit
+ * the new {@code <nano>} element,
+ * {@code java.util.logging.XMLFormatter.useInstant = false} can be specified
+ * in the logging configuration.
+ *
  * @since 1.4
  */
 
 public class XMLFormatter extends Formatter {
-    private LogManager manager = LogManager.getLogManager();
+    private final LogManager manager = LogManager.getLogManager();
+    private final boolean useInstant;
+
+    /**
+     * Creates a new instance of XMLFormatter.
+     *
+     * @implSpec
+     *    Since JDK 1.9, the XMLFormatter will print out the record {@linkplain
+     *    LogRecord#getInstant() event time} as an Instant. This instant
+     *    has the best resolution available on the system. The {@code <date>}
+     *    element will contain the instant as formatted by the {@link
+     *    DateTimeFormatter#ISO_INSTANT}.
+     *    In addition, an optional {@code <nanos>} element containing a
+     *    nanosecond adjustment will be printed if the instant contains some
+     *    nanoseconds below the millisecond resolution.
+     *    <p>
+     *    This new behavior can be turned off, and the old formatting restored,
+     *    by specifying a property in the {@linkplain
+     *    LogManager#getProperty(java.lang.String) logging configuration}.
+     *    If {@code LogManager.getLogManager().getProperty(
+     *    this.getClass().getName()+".useInstant")} is {@code "false"} or
+     *    {@code "0"}, the old formatting will be restored.
+     */
+    public XMLFormatter() {
+        useInstant = (manager == null)
+            || manager.getBooleanProperty(
+                    this.getClass().getName()+".useInstant", true);
+    }
 
     // Append a two digit number.
     private void a2(StringBuilder sb, int x) {
@@ -102,18 +162,35 @@
      * @param record the log record to be formatted.
      * @return a formatted log record
      */
+    @Override
     public String format(LogRecord record) {
         StringBuilder sb = new StringBuilder(500);
         sb.append("<record>\n");
 
+        final Instant instant = record.getInstant();
+
         sb.append("  <date>");
-        appendISO8601(sb, record.getMillis());
+        if (useInstant) {
+            // If useInstant is true - we will print the instant in the
+            // date field, using the ISO_INSTANT formatter.
+            DateTimeFormatter.ISO_INSTANT.formatTo(instant, sb);
+        } else {
+            // If useInstant is false - we will keep the 'old' formating
+            appendISO8601(sb, instant.toEpochMilli());
+        }
         sb.append("</date>\n");
 
         sb.append("  <millis>");
-        sb.append(record.getMillis());
+        sb.append(instant.toEpochMilli());
         sb.append("</millis>\n");
 
+        final int nanoAdjustment = instant.getNano() % 1000_000;
+        if (useInstant && nanoAdjustment != 0) {
+            sb.append("  <nanos>");
+            sb.append(nanoAdjustment);
+            sb.append("</nanos>\n");
+        }
+
         sb.append("  <sequence>");
         sb.append(record.getSequenceNumber());
         sb.append("</sequence>\n");
@@ -223,6 +300,7 @@
      * @param   h  The target handler (can be null)
      * @return  a valid XML string
      */
+    @Override
     public String getHead(Handler h) {
         StringBuilder sb = new StringBuilder();
         String encoding;
@@ -251,6 +329,7 @@
         sb.append(encoding);
         sb.append("\"");
         sb.append(" standalone=\"no\"?>\n");
+
         sb.append("<!DOCTYPE log SYSTEM \"logger.dtd\">\n");
         sb.append("<log>\n");
         return sb.toString();
@@ -262,6 +341,7 @@
      * @param   h  The target handler (can be null)
      * @return  a valid XML string
      */
+    @Override
     public String getTail(Handler h) {
         return "</log>\n";
     }
--- a/src/java.management/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.management/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java	Tue Mar 03 08:49:13 2015 -0800
@@ -45,7 +45,7 @@
  * All methods throw a {@code NullPointerException} if any input argument is
  * {@code null} unless it's stated otherwise.
  *
- * @see ManagementFactory#getPlatformMXBeans(Class)
+ * @see java.lang.management.ManagementFactory#getPlatformMXBeans(Class)
  */
 @jdk.Exported
 public interface HotSpotDiagnosticMXBean extends PlatformManagedObject {
--- a/src/java.management/share/classes/java/lang/management/ThreadInfo.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.management/share/classes/java/lang/management/ThreadInfo.java	Tue Mar 03 08:49:13 2015 -0800
@@ -31,12 +31,13 @@
 import static java.lang.Thread.State.*;
 
 /**
- * Thread information. <tt>ThreadInfo</tt> contains the information
+ * Thread information. {@code ThreadInfo} contains the information
  * about a thread including:
  * <h3>General thread information</h3>
  * <ul>
  *   <li>Thread ID.</li>
  *   <li>Name of the thread.</li>
+ *   <li>Whether a thread is a daemon thread</li>
  * </ul>
  *
  * <h3>Execution information</h3>
@@ -57,6 +58,7 @@
  *   <li>List of object monitors locked by the thread.</li>
  *   <li>List of <a href="LockInfo.html#OwnableSynchronizer">
  *       ownable synchronizers</a> locked by the thread.</li>
+ *   <li>Thread priority</li>
  * </ul>
  *
  * <h4><a name="SyncStats">Synchronization Statistics</a></h4>
@@ -78,7 +80,7 @@
  * the system, not for synchronization control.
  *
  * <h4>MXBean Mapping</h4>
- * <tt>ThreadInfo</tt> is mapped to a {@link CompositeData CompositeData}
+ * {@code ThreadInfo} is mapped to a {@link CompositeData CompositeData}
  * with attributes as specified in
  * the {@link #from from} method.
  *
@@ -100,9 +102,11 @@
     private String       lockName;
     private long         lockOwnerId;
     private String       lockOwnerName;
+    private boolean      daemon;
     private boolean      inNative;
     private boolean      suspended;
     private Thread.State threadState;
+    private int          priority;
     private StackTraceElement[] stackTrace;
     private MonitorInfo[]       lockedMonitors;
     private LockInfo[]          lockedSynchronizers;
@@ -229,6 +233,8 @@
         this.blockedTime = blockedTime;
         this.waitedCount = waitedCount;
         this.waitedTime = waitedTime;
+        this.daemon = t.isDaemon();
+        this.priority = t.getPriority();
 
         if (lockObj == null) {
             this.lock = null;
@@ -256,7 +262,7 @@
     }
 
     /*
-     * Constructs a <tt>ThreadInfo</tt> object from a
+     * Constructs a {@code ThreadInfo} object from a
      * {@link CompositeData CompositeData}.
      */
     private ThreadInfo(CompositeData cd) {
@@ -277,7 +283,7 @@
         stackTrace = ticd.stackTrace();
 
         // 6.0 attributes
-        if (ticd.isCurrentVersion()) {
+        if (ticd.hasV6()) {
             lock = ticd.lockInfo();
             lockedMonitors = ticd.lockedMonitors();
             lockedSynchronizers = ticd.lockedSynchronizers();
@@ -300,10 +306,20 @@
             lockedMonitors = EMPTY_MONITORS;
             lockedSynchronizers = EMPTY_SYNCS;
         }
+
+        // 9.0 attributes
+        if (ticd.isCurrentVersion()) {
+            daemon = ticd.isDaemon();
+            priority = ticd.getPriority();
+        } else {
+            // Not ideal, but unclear what else we can do.
+            daemon = false;
+            priority = Thread.NORM_PRIORITY;
+        }
     }
 
     /**
-     * Returns the ID of the thread associated with this <tt>ThreadInfo</tt>.
+     * Returns the ID of the thread associated with this {@code ThreadInfo}.
      *
      * @return the ID of the associated thread.
      */
@@ -312,7 +328,7 @@
     }
 
     /**
-     * Returns the name of the thread associated with this <tt>ThreadInfo</tt>.
+     * Returns the name of the thread associated with this {@code ThreadInfo}.
      *
      * @return the name of the associated thread.
      */
@@ -321,9 +337,9 @@
     }
 
     /**
-     * Returns the state of the thread associated with this <tt>ThreadInfo</tt>.
+     * Returns the state of the thread associated with this {@code ThreadInfo}.
      *
-     * @return <tt>Thread.State</tt> of the associated thread.
+     * @return {@code Thread.State} of the associated thread.
      */
     public Thread.State getThreadState() {
          return threadState;
@@ -331,13 +347,13 @@
 
     /**
      * Returns the approximate accumulated elapsed time (in milliseconds)
-     * that the thread associated with this <tt>ThreadInfo</tt>
+     * that the thread associated with this {@code ThreadInfo}
      * has blocked to enter or reenter a monitor
      * since thread contention monitoring is enabled.
      * I.e. the total accumulated time the thread has been in the
      * {@link java.lang.Thread.State#BLOCKED BLOCKED} state since thread
      * contention monitoring was last enabled.
-     * This method returns <tt>-1</tt> if thread contention monitoring
+     * This method returns {@code -1} if thread contention monitoring
      * is disabled.
      *
      * <p>The Java virtual machine may measure the time with a high
@@ -345,8 +361,8 @@
      * the thread contention monitoring is reenabled.
      *
      * @return the approximate accumulated elapsed time in milliseconds
-     * that a thread entered the <tt>BLOCKED</tt> state;
-     * <tt>-1</tt> if thread contention monitoring is disabled.
+     * that a thread entered the {@code BLOCKED} state;
+     * {@code -1} if thread contention monitoring is disabled.
      *
      * @throws java.lang.UnsupportedOperationException if the Java
      * virtual machine does not support this operation.
@@ -360,13 +376,13 @@
 
     /**
      * Returns the total number of times that
-     * the thread associated with this <tt>ThreadInfo</tt>
+     * the thread associated with this {@code ThreadInfo}
      * blocked to enter or reenter a monitor.
      * I.e. the number of times a thread has been in the
      * {@link java.lang.Thread.State#BLOCKED BLOCKED} state.
      *
      * @return the total number of times that the thread
-     * entered the <tt>BLOCKED</tt> state.
+     * entered the {@code BLOCKED} state.
      */
     public long getBlockedCount() {
         return blockedCount;
@@ -374,14 +390,14 @@
 
     /**
      * Returns the approximate accumulated elapsed time (in milliseconds)
-     * that the thread associated with this <tt>ThreadInfo</tt>
+     * that the thread associated with this {@code ThreadInfo}
      * has waited for notification
      * since thread contention monitoring is enabled.
      * I.e. the total accumulated time the thread has been in the
      * {@link java.lang.Thread.State#WAITING WAITING}
      * or {@link java.lang.Thread.State#TIMED_WAITING TIMED_WAITING} state
      * since thread contention monitoring is enabled.
-     * This method returns <tt>-1</tt> if thread contention monitoring
+     * This method returns {@code -1} if thread contention monitoring
      * is disabled.
      *
      * <p>The Java virtual machine may measure the time with a high
@@ -389,9 +405,9 @@
      * the thread contention monitoring is reenabled.
      *
      * @return the approximate accumulated elapsed time in milliseconds
-     * that a thread has been in the <tt>WAITING</tt> or
-     * <tt>TIMED_WAITING</tt> state;
-     * <tt>-1</tt> if thread contention monitoring is disabled.
+     * that a thread has been in the {@code WAITING} or
+     * {@code TIMED_WAITING} state;
+     * {@code -1} if thread contention monitoring is disabled.
      *
      * @throws java.lang.UnsupportedOperationException if the Java
      * virtual machine does not support this operation.
@@ -405,29 +421,29 @@
 
     /**
      * Returns the total number of times that
-     * the thread associated with this <tt>ThreadInfo</tt>
+     * the thread associated with this {@code ThreadInfo}
      * waited for notification.
      * I.e. the number of times that a thread has been
      * in the {@link java.lang.Thread.State#WAITING WAITING}
      * or {@link java.lang.Thread.State#TIMED_WAITING TIMED_WAITING} state.
      *
      * @return the total number of times that the thread
-     * was in the <tt>WAITING</tt> or <tt>TIMED_WAITING</tt> state.
+     * was in the {@code WAITING} or {@code TIMED_WAITING} state.
      */
     public long getWaitedCount() {
         return waitedCount;
     }
 
     /**
-     * Returns the <tt>LockInfo</tt> of an object for which
-     * the thread associated with this <tt>ThreadInfo</tt>
+     * Returns the {@code LockInfo} of an object for which
+     * the thread associated with this {@code ThreadInfo}
      * is blocked waiting.
      * A thread can be blocked waiting for one of the following:
      * <ul>
      * <li>an object monitor to be acquired for entering or reentering
      *     a synchronization block/method.
      *     <br>The thread is in the {@link java.lang.Thread.State#BLOCKED BLOCKED}
-     *     state waiting to enter the <tt>synchronized</tt> statement
+     *     state waiting to enter the {@code synchronized} statement
      *     or method.
      *     </li>
      * <li>an object monitor to be notified by another thread.
@@ -448,11 +464,11 @@
      *     or a {@link java.util.concurrent.locks.Condition Condition}.</li>
      * </ul>
      *
-     * <p>This method returns <tt>null</tt> if the thread is not in any of
+     * <p>This method returns {@code null} if the thread is not in any of
      * the above conditions.
      *
-     * @return <tt>LockInfo</tt> of an object for which the thread
-     *         is blocked waiting if any; <tt>null</tt> otherwise.
+     * @return {@code LockInfo} of an object for which the thread
+     *         is blocked waiting if any; {@code null} otherwise.
      * @since 1.6
      */
     public LockInfo getLockInfo() {
@@ -462,19 +478,19 @@
     /**
      * Returns the {@link LockInfo#toString string representation}
      * of an object for which the thread associated with this
-     * <tt>ThreadInfo</tt> is blocked waiting.
+     * {@code ThreadInfo} is blocked waiting.
      * This method is equivalent to calling:
      * <blockquote>
      * <pre>
      * getLockInfo().toString()
      * </pre></blockquote>
      *
-     * <p>This method will return <tt>null</tt> if this thread is not blocked
+     * <p>This method will return {@code null} if this thread is not blocked
      * waiting for any object or if the object is not owned by any thread.
      *
      * @return the string representation of the object on which
      * the thread is blocked if any;
-     * <tt>null</tt> otherwise.
+     * {@code null} otherwise.
      *
      * @see #getLockInfo
      */
@@ -484,14 +500,14 @@
 
     /**
      * Returns the ID of the thread which owns the object
-     * for which the thread associated with this <tt>ThreadInfo</tt>
+     * for which the thread associated with this {@code ThreadInfo}
      * is blocked waiting.
-     * This method will return <tt>-1</tt> if this thread is not blocked
+     * This method will return {@code -1} if this thread is not blocked
      * waiting for any object or if the object is not owned by any thread.
      *
      * @return the thread ID of the owner thread of the object
      * this thread is blocked on;
-     * <tt>-1</tt> if this thread is not blocked
+     * {@code -1} if this thread is not blocked
      * or if the object is not owned by any thread.
      *
      * @see #getLockInfo
@@ -502,14 +518,14 @@
 
     /**
      * Returns the name of the thread which owns the object
-     * for which the thread associated with this <tt>ThreadInfo</tt>
+     * for which the thread associated with this {@code ThreadInfo}
      * is blocked waiting.
-     * This method will return <tt>null</tt> if this thread is not blocked
+     * This method will return {@code null} if this thread is not blocked
      * waiting for any object or if the object is not owned by any thread.
      *
      * @return the name of the thread that owns the object
      * this thread is blocked on;
-     * <tt>null</tt> if this thread is not blocked
+     * {@code null} if this thread is not blocked
      * or if the object is not owned by any thread.
      *
      * @see #getLockInfo
@@ -520,7 +536,7 @@
 
     /**
      * Returns the stack trace of the thread
-     * associated with this <tt>ThreadInfo</tt>.
+     * associated with this {@code ThreadInfo}.
      * If no stack trace was requested for this thread info, this method
      * will return a zero-length array.
      * If the returned array is of non-zero length then the first element of
@@ -532,42 +548,67 @@
      * <p>Some Java virtual machines may, under some circumstances, omit one
      * or more stack frames from the stack trace.  In the extreme case,
      * a virtual machine that has no stack trace information concerning
-     * the thread associated with this <tt>ThreadInfo</tt>
+     * the thread associated with this {@code ThreadInfo}
      * is permitted to return a zero-length array from this method.
      *
-     * @return an array of <tt>StackTraceElement</tt> objects of the thread.
+     * @return an array of {@code StackTraceElement} objects of the thread.
      */
     public StackTraceElement[] getStackTrace() {
         return stackTrace;
     }
 
     /**
-     * Tests if the thread associated with this <tt>ThreadInfo</tt>
-     * is suspended.  This method returns <tt>true</tt> if
+     * Tests if the thread associated with this {@code ThreadInfo}
+     * is suspended.  This method returns {@code true} if
      * {@link Thread#suspend} has been called.
      *
-     * @return <tt>true</tt> if the thread is suspended;
-     *         <tt>false</tt> otherwise.
+     * @return {@code true} if the thread is suspended;
+     *         {@code false} otherwise.
      */
     public boolean isSuspended() {
          return suspended;
     }
 
     /**
-     * Tests if the thread associated with this <tt>ThreadInfo</tt>
+     * Tests if the thread associated with this {@code ThreadInfo}
      * is executing native code via the Java Native Interface (JNI).
      * The JNI native code does not include
      * the virtual machine support code or the compiled native
      * code generated by the virtual machine.
      *
-     * @return <tt>true</tt> if the thread is executing native code;
-     *         <tt>false</tt> otherwise.
+     * @return {@code true} if the thread is executing native code;
+     *         {@code false} otherwise.
      */
     public boolean isInNative() {
          return inNative;
     }
 
     /**
+     * Tests if the thread associated with this {@code ThreadInfo} is
+     * a {@linkplain Thread#isDaemon daemon thread}.
+     *
+     * @return {@code true} if the thread is a daemon thread,
+     *         {@code false} otherwise.
+     * @see Thread#isDaemon
+     * @since 1.9
+     */
+    public boolean isDaemon() {
+         return daemon;
+    }
+
+    /**
+     * Returns the {@linkplain Thread#getPriority() thread priority} of the
+     * thread associated with this {@code ThreadInfo}.
+     *
+     * @return The priority of the thread associated with this
+     *         {@code ThreadInfo}.
+     * @since 1.9
+     */
+    public int getPriority() {
+         return priority;
+    }
+
+    /**
      * Returns a string representation of this thread info.
      * The format of this string depends on the implementation.
      * The returned string will typically include
@@ -580,6 +621,8 @@
      */
     public String toString() {
         StringBuilder sb = new StringBuilder("\"" + getThreadName() + "\"" +
+                                             (daemon ? " daemon" : "") +
+                                             " prio=" + priority +
                                              " Id=" + getThreadId() + " " +
                                              getThreadState());
         if (getLockName() != null) {
@@ -647,9 +690,9 @@
     private static final int MAX_FRAMES = 8;
 
     /**
-     * Returns a <tt>ThreadInfo</tt> object represented by the
-     * given <tt>CompositeData</tt>.
-     * The given <tt>CompositeData</tt> must contain the following attributes
+     * Returns a {@code ThreadInfo} object represented by the
+     * given {@code CompositeData}.
+     * The given {@code CompositeData} must contain the following attributes
      * unless otherwise specified below:
      * <blockquote>
      * <table border summary="The attributes and their types the given CompositeData contains">
@@ -659,67 +702,67 @@
      * </tr>
      * <tr>
      *   <td>threadId</td>
-     *   <td><tt>java.lang.Long</tt></td>
+     *   <td>{@code java.lang.Long}</td>
      * </tr>
      * <tr>
      *   <td>threadName</td>
-     *   <td><tt>java.lang.String</tt></td>
+     *   <td>{@code java.lang.String}</td>
      * </tr>
      * <tr>
      *   <td>threadState</td>
-     *   <td><tt>java.lang.String</tt></td>
+     *   <td>{@code java.lang.String}</td>
      * </tr>
      * <tr>
      *   <td>suspended</td>
-     *   <td><tt>java.lang.Boolean</tt></td>
+     *   <td>{@code java.lang.Boolean}</td>
      * </tr>
      * <tr>
      *   <td>inNative</td>
-     *   <td><tt>java.lang.Boolean</tt></td>
+     *   <td>{@code java.lang.Boolean}</td>
      * </tr>
      * <tr>
      *   <td>blockedCount</td>
-     *   <td><tt>java.lang.Long</tt></td>
+     *   <td>{@code java.lang.Long}</td>
      * </tr>
      * <tr>
      *   <td>blockedTime</td>
-     *   <td><tt>java.lang.Long</tt></td>
+     *   <td>{@code java.lang.Long}</td>
      * </tr>
      * <tr>
      *   <td>waitedCount</td>
-     *   <td><tt>java.lang.Long</tt></td>
+     *   <td>{@code java.lang.Long}</td>
      * </tr>
      * <tr>
      *   <td>waitedTime</td>
-     *   <td><tt>java.lang.Long</tt></td>
+     *   <td>{@code java.lang.Long}</td>
      * </tr>
      * <tr>
      *   <td>lockInfo</td>
-     *   <td><tt>javax.management.openmbean.CompositeData</tt>
+     *   <td>{@code javax.management.openmbean.CompositeData}
      *       - the mapped type for {@link LockInfo} as specified in the
      *         {@link LockInfo#from} method.
      *       <p>
-     *       If <tt>cd</tt> does not contain this attribute,
-     *       the <tt>LockInfo</tt> object will be constructed from
-     *       the value of the <tt>lockName</tt> attribute. </td>
+     *       If {@code cd} does not contain this attribute,
+     *       the {@code LockInfo} object will be constructed from
+     *       the value of the {@code lockName} attribute. </td>
      * </tr>
      * <tr>
      *   <td>lockName</td>
-     *   <td><tt>java.lang.String</tt></td>
+     *   <td>{@code java.lang.String}</td>
      * </tr>
      * <tr>
      *   <td>lockOwnerId</td>
-     *   <td><tt>java.lang.Long</tt></td>
+     *   <td>{@code java.lang.Long}</td>
      * </tr>
      * <tr>
      *   <td>lockOwnerName</td>
-     *   <td><tt>java.lang.String</tt></td>
+     *   <td>{@code java.lang.String}</td>
      * </tr>
      * <tr>
      *   <td><a name="StackTrace">stackTrace</a></td>
-     *   <td><tt>javax.management.openmbean.CompositeData[]</tt>
+     *   <td>{@code javax.management.openmbean.CompositeData[]}
      *       <p>
-     *       Each element is a <tt>CompositeData</tt> representing
+     *       Each element is a {@code CompositeData} representing
      *       StackTraceElement containing the following attributes:
      *       <blockquote>
      *       <table cellspacing=1 cellpadding=0 summary="The attributes and their types the given CompositeData contains">
@@ -729,23 +772,23 @@
      *       </tr>
      *       <tr>
      *         <td>className</td>
-     *         <td><tt>java.lang.String</tt></td>
+     *         <td>{@code java.lang.String}</td>
      *       </tr>
      *       <tr>
      *         <td>methodName</td>
-     *         <td><tt>java.lang.String</tt></td>
+     *         <td>{@code java.lang.String}</td>
      *       </tr>
      *       <tr>
      *         <td>fileName</td>
-     *         <td><tt>java.lang.String</tt></td>
+     *         <td>{@code java.lang.String}</td>
      *       </tr>
      *       <tr>
      *         <td>lineNumber</td>
-     *         <td><tt>java.lang.Integer</tt></td>
+     *         <td>{@code java.lang.Integer}</td>
      *       </tr>
      *       <tr>
      *         <td>nativeMethod</td>
-     *         <td><tt>java.lang.Boolean</tt></td>
+     *         <td>{@code java.lang.Boolean}</td>
      *       </tr>
      *       </table>
      *       </blockquote>
@@ -753,35 +796,43 @@
      * </tr>
      * <tr>
      *   <td>lockedMonitors</td>
-     *   <td><tt>javax.management.openmbean.CompositeData[]</tt>
+     *   <td>{@code javax.management.openmbean.CompositeData[]}
      *       whose element type is the mapped type for
      *       {@link MonitorInfo} as specified in the
      *       {@link MonitorInfo#from Monitor.from} method.
      *       <p>
-     *       If <tt>cd</tt> does not contain this attribute,
+     *       If {@code cd} does not contain this attribute,
      *       this attribute will be set to an empty array. </td>
      * </tr>
      * <tr>
      *   <td>lockedSynchronizers</td>
-     *   <td><tt>javax.management.openmbean.CompositeData[]</tt>
+     *   <td>{@code javax.management.openmbean.CompositeData[]}
      *       whose element type is the mapped type for
      *       {@link LockInfo} as specified in the {@link LockInfo#from} method.
      *       <p>
-     *       If <tt>cd</tt> does not contain this attribute,
+     *       If {@code cd} does not contain this attribute,
      *       this attribute will be set to an empty array. </td>
      * </tr>
+     * <tr>
+     *   <td>daemon</td>
+     *   <td>{@code java.lang.Boolean}</td>
+     * </tr>
+     * <tr>
+     *   <td>priority</td>
+     *   <td>{@code java.lang.Integer}</td>
+     * </tr>
      * </table>
      * </blockquote>
      *
-     * @param cd <tt>CompositeData</tt> representing a <tt>ThreadInfo</tt>
+     * @param cd {@code CompositeData} representing a {@code ThreadInfo}
      *
-     * @throws IllegalArgumentException if <tt>cd</tt> does not
-     *   represent a <tt>ThreadInfo</tt> with the attributes described
+     * @throws IllegalArgumentException if {@code cd} does not
+     *   represent a {@code ThreadInfo} with the attributes described
      *   above.
      *
-     * @return a <tt>ThreadInfo</tt> object represented
-     *         by <tt>cd</tt> if <tt>cd</tt> is not <tt>null</tt>;
-     *         <tt>null</tt> otherwise.
+     * @return a {@code ThreadInfo} object represented
+     *         by {@code cd} if {@code cd} is not {@code null};
+     *         {@code null} otherwise.
      */
     public static ThreadInfo from(CompositeData cd) {
         if (cd == null) {
@@ -798,12 +849,12 @@
     /**
      * Returns an array of {@link MonitorInfo} objects, each of which
      * represents an object monitor currently locked by the thread
-     * associated with this <tt>ThreadInfo</tt>.
+     * associated with this {@code ThreadInfo}.
      * If no locked monitor was requested for this thread info or
      * no monitor is locked by the thread, this method
      * will return a zero-length array.
      *
-     * @return an array of <tt>MonitorInfo</tt> objects representing
+     * @return an array of {@code MonitorInfo} objects representing
      *         the object monitors locked by the thread.
      *
      * @since 1.6
@@ -816,11 +867,11 @@
      * Returns an array of {@link LockInfo} objects, each of which
      * represents an <a href="LockInfo.html#OwnableSynchronizer">ownable
      * synchronizer</a> currently locked by the thread associated with
-     * this <tt>ThreadInfo</tt>.  If no locked synchronizer was
+     * this {@code ThreadInfo}.  If no locked synchronizer was
      * requested for this thread info or no synchronizer is locked by
      * the thread, this method will return a zero-length array.
      *
-     * @return an array of <tt>LockInfo</tt> objects representing
+     * @return an array of {@code LockInfo} objects representing
      *         the ownable synchronizers locked by the thread.
      *
      * @since 1.6
--- a/src/java.management/share/classes/sun/management/ThreadInfoCompositeData.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/java.management/share/classes/sun/management/ThreadInfoCompositeData.java	Tue Mar 03 08:49:13 2015 -0800
@@ -43,23 +43,30 @@
     private final ThreadInfo threadInfo;
     private final CompositeData cdata;
     private final boolean currentVersion;
+    private final boolean hasV6;
 
     private ThreadInfoCompositeData(ThreadInfo ti) {
         this.threadInfo = ti;
         this.currentVersion = true;
         this.cdata = null;
+        this.hasV6 = true;
     }
 
     private ThreadInfoCompositeData(CompositeData cd) {
         this.threadInfo = null;
         this.currentVersion = ThreadInfoCompositeData.isCurrentVersion(cd);
         this.cdata = cd;
+        this.hasV6 = ThreadInfoCompositeData.hasV6(cd);
     }
 
     public ThreadInfo getThreadInfo() {
         return threadInfo;
     }
 
+    public boolean hasV6() {
+        return hasV6;
+    }
+
     public boolean isCurrentVersion() {
         return currentVersion;
     }
@@ -124,6 +131,8 @@
                 threadInfo.isInNative(),
             lockedMonitorsData,
             lockedSyncsData,
+            threadInfo.isDaemon(),
+            threadInfo.getPriority(),
         };
 
         try {
@@ -151,6 +160,8 @@
     private static final String STACK_TRACE     = "stackTrace";
     private static final String SUSPENDED       = "suspended";
     private static final String IN_NATIVE       = "inNative";
+    private static final String DAEMON          = "daemon";
+    private static final String PRIORITY        = "priority";
     private static final String LOCKED_MONITORS = "lockedMonitors";
     private static final String LOCKED_SYNCS    = "lockedSynchronizers";
 
@@ -171,6 +182,8 @@
         IN_NATIVE,
         LOCKED_MONITORS,
         LOCKED_SYNCS,
+        DAEMON,
+        PRIORITY,
     };
 
     // New attributes added in 6.0 ThreadInfo
@@ -180,9 +193,16 @@
         LOCKED_SYNCS,
     };
 
+    private static final String[] threadInfoV9Attributes = {
+        DAEMON,
+        PRIORITY,
+    };
+
     // Current version of ThreadInfo
     private static final CompositeType threadInfoCompositeType;
     // Previous version of ThreadInfo
+    private static final CompositeType threadInfoV6CompositeType;
+    // Previous-previous version of ThreadInfo
     private static final CompositeType threadInfoV5CompositeType;
     private static final CompositeType lockInfoCompositeType;
     static {
@@ -193,7 +213,7 @@
             String[] itemNames =
                 threadInfoCompositeType.keySet().toArray(new String[0]);
             int numV5Attributes = threadInfoItemNames.length -
-                                      threadInfoV6Attributes.length;
+                threadInfoV6Attributes.length - threadInfoV9Attributes.length;
             String[] v5ItemNames = new String[numV5Attributes];
             String[] v5ItemDescs = new String[numV5Attributes];
             OpenType<?>[] v5ItemTypes = new OpenType<?>[numV5Attributes];
@@ -213,6 +233,31 @@
                                   v5ItemNames,
                                   v5ItemDescs,
                                   v5ItemTypes);
+
+
+            // Form a CompositeType for JDK 6.0 ThreadInfo version
+            int numV6Attributes = threadInfoItemNames.length -
+                                      threadInfoV9Attributes.length;
+            String[] v6ItemNames = new String[numV6Attributes];
+            String[] v6ItemDescs = new String[numV6Attributes];
+            OpenType<?>[] v6ItemTypes = new OpenType<?>[numV6Attributes];
+            i = 0;
+            for (String n : itemNames) {
+                if (isV5Attribute(n) || isV6Attribute(n)) {
+                    v6ItemNames[i] = n;
+                    v6ItemDescs[i] = threadInfoCompositeType.getDescription(n);
+                    v6ItemTypes[i] = threadInfoCompositeType.getType(n);
+                    i++;
+                }
+            }
+
+            threadInfoV6CompositeType =
+                new CompositeType("java.lang.management.ThreadInfo",
+                                  "Java SE 6 java.lang.management.ThreadInfo",
+                                  v6ItemNames,
+                                  v6ItemDescs,
+                                  v6ItemTypes);
+
         } catch (OpenDataException e) {
             // Should never reach here
             throw new AssertionError(e);
@@ -236,6 +281,20 @@
                 return false;
             }
         }
+        for (String n : threadInfoV9Attributes) {
+            if (itemName.equals(n)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static boolean isV6Attribute(String itemName) {
+        for (String n : threadInfoV9Attributes) {
+            if (itemName.equals(n)) {
+                return false;
+            }
+        }
         return true;
     }
 
@@ -247,6 +306,15 @@
         return isTypeMatched(threadInfoCompositeType, cd.getCompositeType());
     }
 
+    private static boolean hasV6(CompositeData cd) {
+        if (cd == null) {
+            throw new NullPointerException("Null CompositeData");
+        }
+
+        return isTypeMatched(threadInfoCompositeType, cd.getCompositeType()) ||
+               isTypeMatched(threadInfoV6CompositeType, cd.getCompositeType());
+     }
+
     public long threadId() {
         return getLong(cdata, THREAD_ID);
     }
@@ -304,6 +372,14 @@
         return getBoolean(cdata, IN_NATIVE);
     }
 
+    public boolean isDaemon() {
+        return getBoolean(cdata, DAEMON);
+    }
+
+    public int getPriority(){
+        return getInt(cdata, PRIORITY);
+    }
+
     public StackTraceElement[] stackTrace() {
         CompositeData[] stackTraceData =
             (CompositeData[]) cdata.get(STACK_TRACE);
@@ -368,9 +444,10 @@
         if (!isTypeMatched(threadInfoCompositeType, type)) {
             currentVersion = false;
             // check if cd is an older version
-            if (!isTypeMatched(threadInfoV5CompositeType, type)) {
-                throw new IllegalArgumentException(
-                    "Unexpected composite type for ThreadInfo");
+            if (!isTypeMatched(threadInfoV5CompositeType, type) &&
+                !isTypeMatched(threadInfoV6CompositeType, type)) {
+              throw new IllegalArgumentException(
+                  "Unexpected composite type for ThreadInfo");
             }
         }
 
--- a/src/jdk.attach/share/classes/com/sun/tools/attach/AttachOperationFailedException.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.attach/share/classes/com/sun/tools/attach/AttachOperationFailedException.java	Tue Mar 03 08:49:13 2015 -0800
@@ -46,7 +46,7 @@
      * Constructs an <code>AttachOperationFailedException</code> with
      * the specified detail message.
      *
-     * @param   s   the detail message.
+     * @param message the detail message.
      */
     public AttachOperationFailedException(String message) {
         super(message);
--- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/EUC_TW.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,546 +0,0 @@
-/*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.nio.cs.ext;
-
-import java.io.*;
-import java.nio.CharBuffer;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CoderResult;
-import java.util.Arrays;
-import sun.nio.cs.HistoricallyNamedCharset;
-import static sun.nio.cs.CharsetMapping.*;
-
-public class EUC_TW extends Charset implements HistoricallyNamedCharset
-{
-    private static final int SS2 = 0x8E;
-
-    /*
-       (1) EUC_TW
-       Second byte of EUC_TW for cs2 is in range of
-       0xA1-0xB0 for plane 1-16. According to CJKV /163,
-       plane1 is coded in both cs1 and cs2. This impl
-       however does not decode the codepoints of plane1
-       in cs2, so only p2-p7 and p15 are supported in cs2.
-
-       Plane2  0xA2;
-       Plane3  0xA3;
-       Plane4  0xA4;
-       Plane5  0xA5;
-       Plane6  0xA6;
-       Plane7  0xA7;
-       Plane15 0xAF;
-
-       (2) Mapping
-       The fact that all supplementary characters encoded in EUC_TW are
-       in 0x2xxxx range gives us the room to optimize the data tables.
-
-       Decoding:
-       (1) save the lower 16-bit value of all codepoints of b->c mapping
-           in a String array table  String[plane] b2c.
-       (2) save "codepoint is supplementary" info (one bit) in a
-           byte[] b2cIsSupp, so 8 codepoints (same codepoint value, different
-           plane No) share one byte.
-
-       Encoding:
-       (1)c->b mappings are stored in
-          char[]c2b/char[]c2bIndex
-          char[]c2bSupp/char[]c2bIndexsupp  (indexed by lower 16-bit
-       (2)byte[] c2bPlane stores the "plane info" of each euc-tw codepoints,
-          BMP and Supp share the low/high 4 bits of one byte.
-
-       Mapping tables are stored separated in EUC_TWMapping, which
-       is generated by tool.
-     */
-
-    public EUC_TW() {
-        super("x-EUC-TW", ExtendedCharsets.aliasesFor("x-EUC-TW"));
-    }
-
-    public String historicalName() {
-        return "EUC_TW";
-    }
-
-    public boolean contains(Charset cs) {
-        return ((cs.name().equals("US-ASCII"))
-                || (cs instanceof EUC_TW));
-    }
-
-    public CharsetDecoder newDecoder() {
-        return new Decoder(this);
-    }
-
-    public CharsetEncoder newEncoder() {
-        return new Encoder(this);
-    }
-
-    public static class Decoder extends CharsetDecoder {
-        public Decoder(Charset cs) {
-            super(cs, 2.0f, 2.0f);
-        }
-
-        char[] c1 = new char[1];
-        char[] c2 = new char[2];
-        public char[] toUnicode(int b1, int b2, int p) {
-            return decode(b1, b2, p, c1, c2);
-        }
-
-        static final String[] b2c =  EUC_TWMapping.b2c;
-        static final int b1Min    =  EUC_TWMapping.b1Min;
-        static final int b1Max    =  EUC_TWMapping.b1Max;
-        static final int b2Min    =  EUC_TWMapping.b2Min;
-        static final int b2Max    =  EUC_TWMapping.b2Max;
-        static final int dbSegSize = b2Max - b2Min + 1;
-        static final byte[] b2cIsSupp;
-
-        // adjust from cns planeNo to the plane index of b2c
-        static final byte[] cnspToIndex = new byte[0x100];
-        static {
-            Arrays.fill(cnspToIndex, (byte)-1);
-            cnspToIndex[0xa2] = 1; cnspToIndex[0xa3] = 2; cnspToIndex[0xa4] = 3;
-            cnspToIndex[0xa5] = 4; cnspToIndex[0xa6] = 5; cnspToIndex[0xa7] = 6;
-            cnspToIndex[0xaf] = 7;
-        }
-
-        //static final BitSet b2cIsSupp;
-        static {
-            String b2cIsSuppStr = EUC_TWMapping.b2cIsSuppStr;
-            // work on a local copy is much faster than operate
-            // directly on b2cIsSupp
-            byte[] flag = new byte[b2cIsSuppStr.length() << 1];
-            int off = 0;
-            for (int i = 0; i < b2cIsSuppStr.length(); i++) {
-                char c = b2cIsSuppStr.charAt(i);
-                flag[off++] = (byte)(c >> 8);
-                flag[off++] = (byte)(c & 0xff);
-            }
-            b2cIsSupp = flag;
-        }
-
-        static boolean isLegalDB(int b) {
-           return b >= b1Min && b <= b1Max;
-        }
-
-        static char[] decode(int b1, int b2, int p, char[] c1, char[] c2)
-        {
-            if (b1 < b1Min || b1 > b1Max || b2 < b2Min || b2 > b2Max)
-                return null;
-            int index = (b1 - b1Min) * dbSegSize + b2 - b2Min;
-            char c = b2c[p].charAt(index);
-            if (c == UNMAPPABLE_DECODING)
-                return null;
-            if ((b2cIsSupp[index] & (1 << p)) == 0) {
-                c1[0] = c;
-                return c1;
-            } else {
-                c2[0] = Character.highSurrogate(0x20000 + c);
-                c2[1] = Character.lowSurrogate(0x20000 + c);
-                return c2;
-            }
-        }
-
-        private CoderResult decodeArrayLoop(ByteBuffer src,
-                                            CharBuffer dst)
-        {
-            byte[] sa = src.array();
-            int sp = src.arrayOffset() + src.position();
-            int sl = src.arrayOffset() + src.limit();
-
-            char[] da = dst.array();
-            int dp = dst.arrayOffset() + dst.position();
-            int dl = dst.arrayOffset() + dst.limit();
-            try {
-                while (sp < sl) {
-                    int byte1 = sa[sp] & 0xff;
-                    if (byte1 == SS2) { // Codeset 2  G2
-                        if ( sl - sp < 4)
-                            return CoderResult.UNDERFLOW;
-                        int cnsPlane = cnspToIndex[sa[sp + 1] & 0xff];
-                        if (cnsPlane < 0)
-                            return CoderResult.malformedForLength(2);
-                        byte1 = sa[sp + 2] & 0xff;
-                        int byte2 = sa[sp + 3] & 0xff;
-                        char[] cc = toUnicode(byte1, byte2, cnsPlane);
-                        if (cc == null) {
-                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
-                                return CoderResult.malformedForLength(4);
-                            return CoderResult.unmappableForLength(4);
-                        }
-                        if (dl - dp < cc.length)
-                            return CoderResult.OVERFLOW;
-                        if (cc.length == 1) {
-                            da[dp++] = cc[0];
-                        } else {
-                            da[dp++] = cc[0];
-                            da[dp++] = cc[1];
-                        }
-                        sp += 4;
-                    } else if (byte1 < 0x80) {  // ASCII      G0
-                        if (dl - dp < 1)
-                           return CoderResult.OVERFLOW;
-                        da[dp++] = (char) byte1;
-                        sp++;
-                    } else {                    // Codeset 1  G1
-                        if ( sl - sp < 2)
-                            return CoderResult.UNDERFLOW;
-                        int byte2 = sa[sp + 1] & 0xff;
-                        char[] cc = toUnicode(byte1, byte2, 0);
-                        if (cc == null) {
-                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
-                                return CoderResult.malformedForLength(1);
-                            return CoderResult.unmappableForLength(2);
-                        }
-                        if (dl - dp < 1)
-                            return CoderResult.OVERFLOW;
-                        da[dp++] = cc[0];
-                        sp += 2;
-                    }
-                }
-                return CoderResult.UNDERFLOW;
-            } finally {
-                src.position(sp - src.arrayOffset());
-                dst.position(dp - dst.arrayOffset());
-            }
-        }
-
-        private CoderResult decodeBufferLoop(ByteBuffer src,
-                                             CharBuffer dst)
-        {
-            int mark = src.position();
-            try {
-                while (src.hasRemaining()) {
-                    int byte1 = src.get() & 0xff;
-                    if (byte1 == SS2) {            // Codeset 2  G2
-                        if ( src.remaining() < 3)
-                            return CoderResult.UNDERFLOW;
-                        int cnsPlane = cnspToIndex[src.get() & 0xff];
-                        if (cnsPlane < 0)
-                            return CoderResult.malformedForLength(2);
-                        byte1 = src.get() & 0xff;
-                        int byte2 = src.get() & 0xff;
-                        char[] cc = toUnicode(byte1, byte2, cnsPlane);
-                        if (cc == null) {
-                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
-                                return CoderResult.malformedForLength(4);
-                            return CoderResult.unmappableForLength(4);
-                        }
-                        if (dst.remaining() < cc.length)
-                            return CoderResult.OVERFLOW;
-                        if (cc.length == 1) {
-                            dst.put(cc[0]);
-                        } else {
-                            dst.put(cc[0]);
-                            dst.put(cc[1]);
-                        }
-                        mark += 4;
-                    } else if (byte1 < 0x80) {        // ASCII      G0
-                        if (!dst.hasRemaining())
-                           return CoderResult.OVERFLOW;
-                        dst.put((char) byte1);
-                        mark++;
-                    } else {                          // Codeset 1  G1
-                        if (!src.hasRemaining())
-                            return CoderResult.UNDERFLOW;
-                        int byte2 = src.get() & 0xff;
-                        char[] cc = toUnicode(byte1, byte2, 0);
-                        if (cc == null) {
-                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
-                                return CoderResult.malformedForLength(1);
-                            return CoderResult.unmappableForLength(2);
-                        }
-                        if (!dst.hasRemaining())
-                            return CoderResult.OVERFLOW;
-                        dst.put(cc[0]);
-                        mark +=2;
-                    }
-               }
-               return CoderResult.UNDERFLOW;
-            } finally {
-                src.position(mark);
-            }
-        }
-
-        protected CoderResult decodeLoop(ByteBuffer src, CharBuffer dst)
-        {
-            if (src.hasArray() && dst.hasArray())
-                return decodeArrayLoop(src, dst);
-            else
-                return decodeBufferLoop(src, dst);
-        }
-    }
-
-    public static class Encoder extends CharsetEncoder {
-        private byte[] bb = new byte[4];
-
-        public Encoder(Charset cs) {
-            super(cs, 4.0f, 4.0f);
-        }
-
-        public boolean canEncode(char c) {
-            return (c <= '\u007f' || toEUC(c, bb) != -1);
-        }
-
-        public boolean canEncode(CharSequence cs) {
-            int i = 0;
-            while (i < cs.length()) {
-                char c = cs.charAt(i++);
-                if (Character.isHighSurrogate(c)) {
-                    if (i == cs.length())
-                        return false;
-                    char low = cs.charAt(i++);
-                    if (!Character.isLowSurrogate(low) || toEUC(c, low, bb) == -1)
-                        return false;
-                } else if (!canEncode(c)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        public int toEUC(char hi, char low, byte[] bb) {
-            return encode(hi, low, bb);
-        }
-
-        public int toEUC(char c, byte[] bb) {
-            return encode(c, bb);
-        }
-
-        private CoderResult encodeArrayLoop(CharBuffer src,
-                                            ByteBuffer dst)
-        {
-            char[] sa = src.array();
-            int sp = src.arrayOffset() + src.position();
-            int sl = src.arrayOffset() + src.limit();
-
-            byte[] da = dst.array();
-            int dp = dst.arrayOffset() + dst.position();
-            int dl = dst.arrayOffset() + dst.limit();
-
-            int inSize;
-            int outSize;
-
-            try {
-                while (sp < sl) {
-                    char c = sa[sp];
-                    inSize = 1;
-                    if (c < 0x80) {  // ASCII
-                        bb[0] = (byte)c;
-                        outSize = 1;
-                    } else {
-                        outSize = toEUC(c, bb);
-                        if (outSize == -1) {
-                            // to check surrogates only after BMP failed
-                            // has the benefit of improving the BMP encoding
-                            // 10% faster, with the price of the slowdown of
-                            // supplementary character encoding. given the use
-                            // of supplementary characters is really rare, this
-                            // is something worth doing.
-                            if (Character.isHighSurrogate(c)) {
-                                if ((sp + 1) == sl)
-                                    return CoderResult.UNDERFLOW;
-                                if (!Character.isLowSurrogate(sa[sp + 1]))
-                                    return CoderResult.malformedForLength(1);
-                                outSize = toEUC(c, sa[sp+1], bb);
-                                    inSize = 2;
-                            } else if (Character.isLowSurrogate(c)) {
-                                return CoderResult.malformedForLength(1);
-                            }
-                        }
-                    }
-                    if (outSize == -1)
-                        return CoderResult.unmappableForLength(inSize);
-                    if ( dl - dp < outSize)
-                        return CoderResult.OVERFLOW;
-                    for (int i = 0; i < outSize; i++)
-                        da[dp++] = bb[i];
-                    sp  += inSize;
-                }
-                return CoderResult.UNDERFLOW;
-            } finally {
-                src.position(sp - src.arrayOffset());
-                dst.position(dp - dst.arrayOffset());
-            }
-        }
-
-        private CoderResult encodeBufferLoop(CharBuffer src,
-                                             ByteBuffer dst)
-        {
-            int outSize;
-            int inSize;
-            int mark = src.position();
-
-            try {
-                while (src.hasRemaining()) {
-                    inSize = 1;
-                    char c = src.get();
-                    if (c < 0x80) {   // ASCII
-                        outSize = 1;
-                        bb[0] = (byte)c;
-                    } else {
-                        outSize = toEUC(c, bb);
-                        if (outSize == -1) {
-                            if (Character.isHighSurrogate(c)) {
-                                if (!src.hasRemaining())
-                                    return CoderResult.UNDERFLOW;
-                                char c2 = src.get();
-                                if (!Character.isLowSurrogate(c2))
-                                    return CoderResult.malformedForLength(1);
-                                outSize = toEUC(c, c2, bb);
-                                inSize = 2;
-                            } else if (Character.isLowSurrogate(c)) {
-                                return CoderResult.malformedForLength(1);
-                            }
-                        }
-                    }
-                    if (outSize == -1)
-                        return CoderResult.unmappableForLength(inSize);
-                    if (dst.remaining() < outSize)
-                        return CoderResult.OVERFLOW;
-                    for (int i = 0; i < outSize; i++)
-                        dst.put(bb[i]);
-                    mark += inSize;
-                }
-                return CoderResult.UNDERFLOW;
-            } finally {
-                src.position(mark);
-            }
-        }
-
-        protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst)
-        {
-            if (src.hasArray() && dst.hasArray())
-                return encodeArrayLoop(src, dst);
-            else
-                return encodeBufferLoop(src, dst);
-        }
-
-        static int encode(char hi, char low, byte[] bb) {
-            int c = Character.toCodePoint(hi, low);
-            if ((c & 0xf0000) != 0x20000)
-                return -1;
-            c -= 0x20000;
-            int index = c2bSuppIndex[c >> 8];
-            if (index  == UNMAPPABLE_ENCODING)
-                return -1;
-            index = index + (c & 0xff);
-            int db = c2bSupp[index];
-            if (db == UNMAPPABLE_ENCODING)
-                return -1;
-            int p = (c2bPlane[index] >> 4) & 0xf;
-            bb[0] = (byte)SS2;
-            bb[1] = (byte)(0xa0 | p);
-            bb[2] = (byte)(db >> 8);
-            bb[3] = (byte)db;
-            return 4;
-        }
-
-        static int encode(char c, byte[] bb) {
-            int index = c2bIndex[c >> 8];
-            if (index  == UNMAPPABLE_ENCODING)
-                return -1;
-            index = index + (c & 0xff);
-            int db = c2b[index];
-            if (db == UNMAPPABLE_ENCODING)
-                return -1;
-            int p = c2bPlane[index] & 0xf;
-            if (p == 0) {
-                bb[0] = (byte)(db >> 8);
-                bb[1] = (byte)db;
-                return 2;
-            } else {
-                bb[0] = (byte)SS2;
-                bb[1] = (byte)(0xa0 | p);
-                bb[2] = (byte)(db >> 8);
-                bb[3] = (byte)db;
-                return 4;
-            }
-        }
-
-        static final char[] c2b;
-        static final char[] c2bIndex;
-        static final char[] c2bSupp;
-        static final char[] c2bSuppIndex;
-        static final byte[] c2bPlane;
-        static {
-            int b1Min    =  Decoder.b1Min;
-            int b1Max    =  Decoder.b1Max;
-            int b2Min    =  Decoder.b2Min;
-            int b2Max    =  Decoder.b2Max;
-            int dbSegSize = Decoder.dbSegSize;
-            String[] b2c = Decoder.b2c;
-            byte[] b2cIsSupp = Decoder.b2cIsSupp;
-
-            c2bIndex = EUC_TWMapping.c2bIndex;
-            c2bSuppIndex = EUC_TWMapping.c2bSuppIndex;
-            char[] c2b0 = new char[EUC_TWMapping.C2BSIZE];
-            char[] c2bSupp0 = new char[EUC_TWMapping.C2BSUPPSIZE];
-            byte[] c2bPlane0 = new byte[Math.max(EUC_TWMapping.C2BSIZE,
-                                                 EUC_TWMapping.C2BSUPPSIZE)];
-
-            Arrays.fill(c2b0, (char)UNMAPPABLE_ENCODING);
-            Arrays.fill(c2bSupp0, (char)UNMAPPABLE_ENCODING);
-
-            for (int p = 0; p < b2c.length; p++) {
-                String db = b2c[p];
-                /*
-                   adjust the "plane" from 0..7 to 0, 2, 3, 4, 5, 6, 7, 0xf,
-                   which helps balance between footprint (to save the plane
-                   info in 4 bits) and runtime performance (to require only
-                   one operation "0xa0 | plane" to encode the plane byte)
-                */
-                int plane = p;
-                if (plane == 7)
-                    plane = 0xf;
-                else if (plane != 0)
-                    plane = p + 1;
-
-                int off = 0;
-                for (int b1 = b1Min; b1 <= b1Max; b1++) {
-                    for (int b2 = b2Min; b2 <= b2Max; b2++) {
-                        char c = db.charAt(off);
-                        if (c != UNMAPPABLE_DECODING) {
-                            if ((b2cIsSupp[off] & (1 << p)) != 0) {
-                                int index = c2bSuppIndex[c >> 8] + (c&0xff);
-                                c2bSupp0[index] = (char)((b1 << 8) + b2);
-                                c2bPlane0[index] |= (byte)(plane << 4);
-                            } else {
-                                int index = c2bIndex[c >> 8] + (c&0xff);
-                                c2b0[index] = (char)((b1 << 8) + b2);
-                                c2bPlane0[index] |= (byte)plane;
-                            }
-                        }
-                        off++;
-                    }
-                }
-            }
-            c2b = c2b0;
-            c2bSupp = c2bSupp0;
-            c2bPlane = c2bPlane0;
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/EUC_TW.java.template	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,546 @@
+/*
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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 $PACKAGE$;
+
+import java.io.*;
+import java.nio.CharBuffer;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+import java.util.Arrays;
+import sun.nio.cs.HistoricallyNamedCharset;
+import static sun.nio.cs.CharsetMapping.*;
+
+public class EUC_TW extends Charset implements HistoricallyNamedCharset
+{
+    private static final int SS2 = 0x8E;
+
+    /*
+       (1) EUC_TW
+       Second byte of EUC_TW for cs2 is in range of
+       0xA1-0xB0 for plane 1-16. According to CJKV /163,
+       plane1 is coded in both cs1 and cs2. This impl
+       however does not decode the codepoints of plane1
+       in cs2, so only p2-p7 and p15 are supported in cs2.
+
+       Plane2  0xA2;
+       Plane3  0xA3;
+       Plane4  0xA4;
+       Plane5  0xA5;
+       Plane6  0xA6;
+       Plane7  0xA7;
+       Plane15 0xAF;
+
+       (2) Mapping
+       The fact that all supplementary characters encoded in EUC_TW are
+       in 0x2xxxx range gives us the room to optimize the data tables.
+
+       Decoding:
+       (1) save the lower 16-bit value of all codepoints of b->c mapping
+           in a String array table  String[plane] b2c.
+       (2) save "codepoint is supplementary" info (one bit) in a
+           byte[] b2cIsSupp, so 8 codepoints (same codepoint value, different
+           plane No) share one byte.
+
+       Encoding:
+       (1)c->b mappings are stored in
+          char[]c2b/char[]c2bIndex
+          char[]c2bSupp/char[]c2bIndexsupp  (indexed by lower 16-bit
+       (2)byte[] c2bPlane stores the "plane info" of each euc-tw codepoints,
+          BMP and Supp share the low/high 4 bits of one byte.
+
+       Mapping tables are stored separated in EUC_TWMapping, which
+       is generated by tool.
+     */
+
+    public EUC_TW() {
+        super("x-EUC-TW", $ALIASES$);
+    }
+
+    public String historicalName() {
+        return "EUC_TW";
+    }
+
+    public boolean contains(Charset cs) {
+        return ((cs.name().equals("US-ASCII"))
+                || (cs instanceof EUC_TW));
+    }
+
+    public CharsetDecoder newDecoder() {
+        return new Decoder(this);
+    }
+
+    public CharsetEncoder newEncoder() {
+        return new Encoder(this);
+    }
+
+    public static class Decoder extends CharsetDecoder {
+        public Decoder(Charset cs) {
+            super(cs, 2.0f, 2.0f);
+        }
+
+        char[] c1 = new char[1];
+        char[] c2 = new char[2];
+        public char[] toUnicode(int b1, int b2, int p) {
+            return decode(b1, b2, p, c1, c2);
+        }
+
+        static final String[] b2c =  EUC_TWMapping.b2c;
+        static final int b1Min    =  EUC_TWMapping.b1Min;
+        static final int b1Max    =  EUC_TWMapping.b1Max;
+        static final int b2Min    =  EUC_TWMapping.b2Min;
+        static final int b2Max    =  EUC_TWMapping.b2Max;
+        static final int dbSegSize = b2Max - b2Min + 1;
+        static final byte[] b2cIsSupp;
+
+        // adjust from cns planeNo to the plane index of b2c
+        static final byte[] cnspToIndex = new byte[0x100];
+        static {
+            Arrays.fill(cnspToIndex, (byte)-1);
+            cnspToIndex[0xa2] = 1; cnspToIndex[0xa3] = 2; cnspToIndex[0xa4] = 3;
+            cnspToIndex[0xa5] = 4; cnspToIndex[0xa6] = 5; cnspToIndex[0xa7] = 6;
+            cnspToIndex[0xaf] = 7;
+        }
+
+        //static final BitSet b2cIsSupp;
+        static {
+            String b2cIsSuppStr = EUC_TWMapping.b2cIsSuppStr;
+            // work on a local copy is much faster than operate
+            // directly on b2cIsSupp
+            byte[] flag = new byte[b2cIsSuppStr.length() << 1];
+            int off = 0;
+            for (int i = 0; i < b2cIsSuppStr.length(); i++) {
+                char c = b2cIsSuppStr.charAt(i);
+                flag[off++] = (byte)(c >> 8);
+                flag[off++] = (byte)(c & 0xff);
+            }
+            b2cIsSupp = flag;
+        }
+
+        static boolean isLegalDB(int b) {
+           return b >= b1Min && b <= b1Max;
+        }
+
+        static char[] decode(int b1, int b2, int p, char[] c1, char[] c2)
+        {
+            if (b1 < b1Min || b1 > b1Max || b2 < b2Min || b2 > b2Max)
+                return null;
+            int index = (b1 - b1Min) * dbSegSize + b2 - b2Min;
+            char c = b2c[p].charAt(index);
+            if (c == UNMAPPABLE_DECODING)
+                return null;
+            if ((b2cIsSupp[index] & (1 << p)) == 0) {
+                c1[0] = c;
+                return c1;
+            } else {
+                c2[0] = Character.highSurrogate(0x20000 + c);
+                c2[1] = Character.lowSurrogate(0x20000 + c);
+                return c2;
+            }
+        }
+
+        private CoderResult decodeArrayLoop(ByteBuffer src,
+                                            CharBuffer dst)
+        {
+            byte[] sa = src.array();
+            int sp = src.arrayOffset() + src.position();
+            int sl = src.arrayOffset() + src.limit();
+
+            char[] da = dst.array();
+            int dp = dst.arrayOffset() + dst.position();
+            int dl = dst.arrayOffset() + dst.limit();
+            try {
+                while (sp < sl) {
+                    int byte1 = sa[sp] & 0xff;
+                    if (byte1 == SS2) { // Codeset 2  G2
+                        if ( sl - sp < 4)
+                            return CoderResult.UNDERFLOW;
+                        int cnsPlane = cnspToIndex[sa[sp + 1] & 0xff];
+                        if (cnsPlane < 0)
+                            return CoderResult.malformedForLength(2);
+                        byte1 = sa[sp + 2] & 0xff;
+                        int byte2 = sa[sp + 3] & 0xff;
+                        char[] cc = toUnicode(byte1, byte2, cnsPlane);
+                        if (cc == null) {
+                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
+                                return CoderResult.malformedForLength(4);
+                            return CoderResult.unmappableForLength(4);
+                        }
+                        if (dl - dp < cc.length)
+                            return CoderResult.OVERFLOW;
+                        if (cc.length == 1) {
+                            da[dp++] = cc[0];
+                        } else {
+                            da[dp++] = cc[0];
+                            da[dp++] = cc[1];
+                        }
+                        sp += 4;
+                    } else if (byte1 < 0x80) {  // ASCII      G0
+                        if (dl - dp < 1)
+                           return CoderResult.OVERFLOW;
+                        da[dp++] = (char) byte1;
+                        sp++;
+                    } else {                    // Codeset 1  G1
+                        if ( sl - sp < 2)
+                            return CoderResult.UNDERFLOW;
+                        int byte2 = sa[sp + 1] & 0xff;
+                        char[] cc = toUnicode(byte1, byte2, 0);
+                        if (cc == null) {
+                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
+                                return CoderResult.malformedForLength(1);
+                            return CoderResult.unmappableForLength(2);
+                        }
+                        if (dl - dp < 1)
+                            return CoderResult.OVERFLOW;
+                        da[dp++] = cc[0];
+                        sp += 2;
+                    }
+                }
+                return CoderResult.UNDERFLOW;
+            } finally {
+                src.position(sp - src.arrayOffset());
+                dst.position(dp - dst.arrayOffset());
+            }
+        }
+
+        private CoderResult decodeBufferLoop(ByteBuffer src,
+                                             CharBuffer dst)
+        {
+            int mark = src.position();
+            try {
+                while (src.hasRemaining()) {
+                    int byte1 = src.get() & 0xff;
+                    if (byte1 == SS2) {            // Codeset 2  G2
+                        if ( src.remaining() < 3)
+                            return CoderResult.UNDERFLOW;
+                        int cnsPlane = cnspToIndex[src.get() & 0xff];
+                        if (cnsPlane < 0)
+                            return CoderResult.malformedForLength(2);
+                        byte1 = src.get() & 0xff;
+                        int byte2 = src.get() & 0xff;
+                        char[] cc = toUnicode(byte1, byte2, cnsPlane);
+                        if (cc == null) {
+                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
+                                return CoderResult.malformedForLength(4);
+                            return CoderResult.unmappableForLength(4);
+                        }
+                        if (dst.remaining() < cc.length)
+                            return CoderResult.OVERFLOW;
+                        if (cc.length == 1) {
+                            dst.put(cc[0]);
+                        } else {
+                            dst.put(cc[0]);
+                            dst.put(cc[1]);
+                        }
+                        mark += 4;
+                    } else if (byte1 < 0x80) {        // ASCII      G0
+                        if (!dst.hasRemaining())
+                           return CoderResult.OVERFLOW;
+                        dst.put((char) byte1);
+                        mark++;
+                    } else {                          // Codeset 1  G1
+                        if (!src.hasRemaining())
+                            return CoderResult.UNDERFLOW;
+                        int byte2 = src.get() & 0xff;
+                        char[] cc = toUnicode(byte1, byte2, 0);
+                        if (cc == null) {
+                            if (!isLegalDB(byte1) || !isLegalDB(byte2))
+                                return CoderResult.malformedForLength(1);
+                            return CoderResult.unmappableForLength(2);
+                        }
+                        if (!dst.hasRemaining())
+                            return CoderResult.OVERFLOW;
+                        dst.put(cc[0]);
+                        mark +=2;
+                    }
+               }
+               return CoderResult.UNDERFLOW;
+            } finally {
+                src.position(mark);
+            }
+        }
+
+        protected CoderResult decodeLoop(ByteBuffer src, CharBuffer dst)
+        {
+            if (src.hasArray() && dst.hasArray())
+                return decodeArrayLoop(src, dst);
+            else
+                return decodeBufferLoop(src, dst);
+        }
+    }
+
+    public static class Encoder extends CharsetEncoder {
+        private byte[] bb = new byte[4];
+
+        public Encoder(Charset cs) {
+            super(cs, 4.0f, 4.0f);
+        }
+
+        public boolean canEncode(char c) {
+            return (c <= '\u007f' || toEUC(c, bb) != -1);
+        }
+
+        public boolean canEncode(CharSequence cs) {
+            int i = 0;
+            while (i < cs.length()) {
+                char c = cs.charAt(i++);
+                if (Character.isHighSurrogate(c)) {
+                    if (i == cs.length())
+                        return false;
+                    char low = cs.charAt(i++);
+                    if (!Character.isLowSurrogate(low) || toEUC(c, low, bb) == -1)
+                        return false;
+                } else if (!canEncode(c)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public int toEUC(char hi, char low, byte[] bb) {
+            return encode(hi, low, bb);
+        }
+
+        public int toEUC(char c, byte[] bb) {
+            return encode(c, bb);
+        }
+
+        private CoderResult encodeArrayLoop(CharBuffer src,
+                                            ByteBuffer dst)
+        {
+            char[] sa = src.array();
+            int sp = src.arrayOffset() + src.position();
+            int sl = src.arrayOffset() + src.limit();
+
+            byte[] da = dst.array();
+            int dp = dst.arrayOffset() + dst.position();
+            int dl = dst.arrayOffset() + dst.limit();
+
+            int inSize;
+            int outSize;
+
+            try {
+                while (sp < sl) {
+                    char c = sa[sp];
+                    inSize = 1;
+                    if (c < 0x80) {  // ASCII
+                        bb[0] = (byte)c;
+                        outSize = 1;
+                    } else {
+                        outSize = toEUC(c, bb);
+                        if (outSize == -1) {
+                            // to check surrogates only after BMP failed
+                            // has the benefit of improving the BMP encoding
+                            // 10% faster, with the price of the slowdown of
+                            // supplementary character encoding. given the use
+                            // of supplementary characters is really rare, this
+                            // is something worth doing.
+                            if (Character.isHighSurrogate(c)) {
+                                if ((sp + 1) == sl)
+                                    return CoderResult.UNDERFLOW;
+                                if (!Character.isLowSurrogate(sa[sp + 1]))
+                                    return CoderResult.malformedForLength(1);
+                                outSize = toEUC(c, sa[sp+1], bb);
+                                    inSize = 2;
+                            } else if (Character.isLowSurrogate(c)) {
+                                return CoderResult.malformedForLength(1);
+                            }
+                        }
+                    }
+                    if (outSize == -1)
+                        return CoderResult.unmappableForLength(inSize);
+                    if ( dl - dp < outSize)
+                        return CoderResult.OVERFLOW;
+                    for (int i = 0; i < outSize; i++)
+                        da[dp++] = bb[i];
+                    sp  += inSize;
+                }
+                return CoderResult.UNDERFLOW;
+            } finally {
+                src.position(sp - src.arrayOffset());
+                dst.position(dp - dst.arrayOffset());
+            }
+        }
+
+        private CoderResult encodeBufferLoop(CharBuffer src,
+                                             ByteBuffer dst)
+        {
+            int outSize;
+            int inSize;
+            int mark = src.position();
+
+            try {
+                while (src.hasRemaining()) {
+                    inSize = 1;
+                    char c = src.get();
+                    if (c < 0x80) {   // ASCII
+                        outSize = 1;
+                        bb[0] = (byte)c;
+                    } else {
+                        outSize = toEUC(c, bb);
+                        if (outSize == -1) {
+                            if (Character.isHighSurrogate(c)) {
+                                if (!src.hasRemaining())
+                                    return CoderResult.UNDERFLOW;
+                                char c2 = src.get();
+                                if (!Character.isLowSurrogate(c2))
+                                    return CoderResult.malformedForLength(1);
+                                outSize = toEUC(c, c2, bb);
+                                inSize = 2;
+                            } else if (Character.isLowSurrogate(c)) {
+                                return CoderResult.malformedForLength(1);
+                            }
+                        }
+                    }
+                    if (outSize == -1)
+                        return CoderResult.unmappableForLength(inSize);
+                    if (dst.remaining() < outSize)
+                        return CoderResult.OVERFLOW;
+                    for (int i = 0; i < outSize; i++)
+                        dst.put(bb[i]);
+                    mark += inSize;
+                }
+                return CoderResult.UNDERFLOW;
+            } finally {
+                src.position(mark);
+            }
+        }
+
+        protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst)
+        {
+            if (src.hasArray() && dst.hasArray())
+                return encodeArrayLoop(src, dst);
+            else
+                return encodeBufferLoop(src, dst);
+        }
+
+        static int encode(char hi, char low, byte[] bb) {
+            int c = Character.toCodePoint(hi, low);
+            if ((c & 0xf0000) != 0x20000)
+                return -1;
+            c -= 0x20000;
+            int index = c2bSuppIndex[c >> 8];
+            if (index  == UNMAPPABLE_ENCODING)
+                return -1;
+            index = index + (c & 0xff);
+            int db = c2bSupp[index];
+            if (db == UNMAPPABLE_ENCODING)
+                return -1;
+            int p = (c2bPlane[index] >> 4) & 0xf;
+            bb[0] = (byte)SS2;
+            bb[1] = (byte)(0xa0 | p);
+            bb[2] = (byte)(db >> 8);
+            bb[3] = (byte)db;
+            return 4;
+        }
+
+        static int encode(char c, byte[] bb) {
+            int index = c2bIndex[c >> 8];
+            if (index  == UNMAPPABLE_ENCODING)
+                return -1;
+            index = index + (c & 0xff);
+            int db = c2b[index];
+            if (db == UNMAPPABLE_ENCODING)
+                return -1;
+            int p = c2bPlane[index] & 0xf;
+            if (p == 0) {
+                bb[0] = (byte)(db >> 8);
+                bb[1] = (byte)db;
+                return 2;
+            } else {
+                bb[0] = (byte)SS2;
+                bb[1] = (byte)(0xa0 | p);
+                bb[2] = (byte)(db >> 8);
+                bb[3] = (byte)db;
+                return 4;
+            }
+        }
+
+        static final char[] c2b;
+        static final char[] c2bIndex;
+        static final char[] c2bSupp;
+        static final char[] c2bSuppIndex;
+        static final byte[] c2bPlane;
+        static {
+            int b1Min    =  Decoder.b1Min;
+            int b1Max    =  Decoder.b1Max;
+            int b2Min    =  Decoder.b2Min;
+            int b2Max    =  Decoder.b2Max;
+            int dbSegSize = Decoder.dbSegSize;
+            String[] b2c = Decoder.b2c;
+            byte[] b2cIsSupp = Decoder.b2cIsSupp;
+
+            c2bIndex = EUC_TWMapping.c2bIndex;
+            c2bSuppIndex = EUC_TWMapping.c2bSuppIndex;
+            char[] c2b0 = new char[EUC_TWMapping.C2BSIZE];
+            char[] c2bSupp0 = new char[EUC_TWMapping.C2BSUPPSIZE];
+            byte[] c2bPlane0 = new byte[Math.max(EUC_TWMapping.C2BSIZE,
+                                                 EUC_TWMapping.C2BSUPPSIZE)];
+
+            Arrays.fill(c2b0, (char)UNMAPPABLE_ENCODING);
+            Arrays.fill(c2bSupp0, (char)UNMAPPABLE_ENCODING);
+
+            for (int p = 0; p < b2c.length; p++) {
+                String db = b2c[p];
+                /*
+                   adjust the "plane" from 0..7 to 0, 2, 3, 4, 5, 6, 7, 0xf,
+                   which helps balance between footprint (to save the plane
+                   info in 4 bits) and runtime performance (to require only
+                   one operation "0xa0 | plane" to encode the plane byte)
+                */
+                int plane = p;
+                if (plane == 7)
+                    plane = 0xf;
+                else if (plane != 0)
+                    plane = p + 1;
+
+                int off = 0;
+                for (int b1 = b1Min; b1 <= b1Max; b1++) {
+                    for (int b2 = b2Min; b2 <= b2Max; b2++) {
+                        char c = db.charAt(off);
+                        if (c != UNMAPPABLE_DECODING) {
+                            if ((b2cIsSupp[off] & (1 << p)) != 0) {
+                                int index = c2bSuppIndex[c >> 8] + (c&0xff);
+                                c2bSupp0[index] = (char)((b1 << 8) + b2);
+                                c2bPlane0[index] |= (byte)(plane << 4);
+                            } else {
+                                int index = c2bIndex[c >> 8] + (c&0xff);
+                                c2b0[index] = (char)((b1 << 8) + b2);
+                                c2bPlane0[index] |= (byte)plane;
+                            }
+                        }
+                        off++;
+                    }
+                }
+            }
+            c2b = c2b0;
+            c2bSupp = c2bSupp0;
+            c2bPlane = c2bPlane0;
+        }
+    }
+}
--- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/ExtendedCharsets.java.template	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/ExtendedCharsets.java.template	Tue Mar 03 08:49:13 2015 -0800
@@ -222,16 +222,6 @@
 
             }
         }
-        String osName = getProperty("os.name");
-        if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName)
-               || osName.contains("OS X")) {
-            charset("x-COMPOUND_TEXT", "COMPOUND_TEXT",
-                    new String[] {
-                        "COMPOUND_TEXT",        // JDK historical
-                        "x11-compound_text",
-                        "x-compound-text"
-                    });
-        }
         initialized = true;
     }
 
--- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/ISO2022_CN_CNS.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/ISO2022_CN_CNS.java	Tue Mar 03 08:49:13 2015 -0800
@@ -35,6 +35,7 @@
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CoderResult;
 import sun.nio.cs.HistoricallyNamedCharset;
+import sun.nio.cs.*;
 
 public class ISO2022_CN_CNS extends ISO2022 implements HistoricallyNamedCharset
 {
--- a/src/jdk.httpserver/share/classes/com/sun/net/httpserver/HttpExchange.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.httpserver/share/classes/com/sun/net/httpserver/HttpExchange.java	Tue Mar 03 08:49:13 2015 -0800
@@ -31,7 +31,6 @@
 import java.net.*;
 import javax.net.ssl.*;
 import java.util.*;
-import sun.net.www.MessageHeader;
 
 /**
  * This class encapsulates a HTTP request received and a
--- a/src/jdk.httpserver/share/classes/sun/net/httpserver/AuthFilter.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/AuthFilter.java	Tue Mar 03 08:49:13 2015 -0800
@@ -29,7 +29,6 @@
 import java.io.*;
 import java.nio.*;
 import java.nio.channels.*;
-import sun.net.www.MessageHeader;
 import java.util.*;
 import javax.security.auth.*;
 import javax.security.auth.callback.*;
--- a/src/jdk.httpserver/share/classes/sun/net/httpserver/HttpExchangeImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/HttpExchangeImpl.java	Tue Mar 03 08:49:13 2015 -0800
@@ -31,7 +31,6 @@
 import java.net.*;
 import javax.net.ssl.*;
 import java.util.*;
-import sun.net.www.MessageHeader;
 import com.sun.net.httpserver.*;
 import com.sun.net.httpserver.spi.*;
 
--- a/src/jdk.httpserver/share/classes/sun/net/httpserver/HttpsExchangeImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/HttpsExchangeImpl.java	Tue Mar 03 08:49:13 2015 -0800
@@ -31,7 +31,6 @@
 import java.net.*;
 import javax.net.ssl.*;
 import java.util.*;
-import sun.net.www.MessageHeader;
 import com.sun.net.httpserver.*;
 import com.sun.net.httpserver.spi.*;
 
--- a/src/jdk.jdi/share/classes/com/sun/jdi/InterfaceType.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.jdi/share/classes/com/sun/jdi/InterfaceType.java	Tue Mar 03 08:49:13 2015 -0800
@@ -145,7 +145,7 @@
      * not be done from the client's event handler thread.
      * <p>
      * The resumption of other threads during the invocation can be prevented
-     * by specifying the {@link #INVOKE_SINGLE_THREADED}
+     * by specifying the {@link ClassType#INVOKE_SINGLE_THREADED}
      * bit flag in the <code>options</code> argument; however,
      * there is no protection against or recovery from the deadlocks
      * described above, so this option should be used with great caution.
--- a/src/jdk.jdi/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.jdi/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -282,6 +282,7 @@
          * implemented interface
          */
         ReferenceTypeImpl declType = (ReferenceTypeImpl)method.declaringType();
+
         if (!declType.isAssignableFrom(this)) {
             throw new IllegalArgumentException("Invalid method");
         }
@@ -311,7 +312,7 @@
         /*
          * For nonvirtual invokes, method must have a body
          */
-        if ((options & INVOKE_NONVIRTUAL) != 0) {
+        if (isNonVirtual(options)) {
             if (method.isAbstract()) {
                 throw new IllegalArgumentException("Abstract method");
             }
@@ -323,7 +324,7 @@
          * method argument types.
          */
         ClassTypeImpl invokedClass;
-        if ((options & INVOKE_NONVIRTUAL) != 0) {
+        if (isNonVirtual(options)) {
             // No overrides in non-virtual invokes
             invokedClass = clazz;
         } else {
@@ -348,7 +349,7 @@
         /*
          * Only default methods allowed for nonvirtual invokes
          */
-        if (!method.isDefault()) {
+        if (isNonVirtual(options) && !method.isDefault()) {
             throw new IllegalArgumentException("Not a default method");
         }
     }
@@ -383,6 +384,7 @@
                                      IncompatibleThreadStateException,
                                      InvocationException,
                                      ClassNotLoadedException {
+
         validateMirror(threadIntf);
         validateMirror(methodIntf);
         validateMirrorsOrNulls(origArguments);
@@ -624,4 +626,8 @@
     byte typeValueKey() {
         return JDWP.Tag.OBJECT;
     }
+
+    private static boolean isNonVirtual(int options) {
+        return (options & INVOKE_NONVIRTUAL) != 0;
+    }
 }
--- a/src/jdk.sctp/unix/native/libsctp/SctpNet.c	Mon Feb 23 10:47:32 2015 -0800
+++ b/src/jdk.sctp/unix/native/libsctp/SctpNet.c	Tue Mar 03 08:49:13 2015 -0800
@@ -431,7 +431,7 @@
     paddr = addr_buf;
     for (i=0; i<addrCount; i++) {
         jobject ia, isa = NULL;
-        int port;
+        int port = 0;
         sap = (struct sockaddr*)addr_buf;
         ia = NET_SockaddrToInetAddress(env, sap, &port);
         if (ia != NULL)
@@ -543,6 +543,7 @@
     void *arg;
     int arglen;
 
+    memset((char *) &linger, 0, sizeof(linger));
     if (mapSocketOption(opt, &klevel, &kopt) < 0) {
         JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                                      "Unsupported socket option");
@@ -600,7 +601,7 @@
   (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) {
     struct sctp_setprim prim;
     struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr;
-    int sap_len;
+    int sap_len = sizeof(sap);
 
     if (NET_InetAddressToSockaddr(env, iaObj, port, sap,
                                   &sap_len, JNI_TRUE) != 0) {
@@ -625,7 +626,7 @@
    jobject iaObj, jint port, jboolean preferIPv6) {
     struct sctp_setpeerprim prim;
     struct sockaddr* sap = (struct sockaddr*)&prim.sspp_addr;
-    int sap_len;
+    int sap_len = sizeof(sap);
 
     if (NET_InetAddressToSockaddr(env, iaObj, port, sap,
                                   &sap_len, preferIPv6) != 0) {
--- a/test/Makefile	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/Makefile	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -112,6 +112,19 @@
   JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS)
 endif
 
+# jtreg -nativepath <dir>
+#
+# Local make tests will be TEST_IMAGE_DIR and JPRT with jprt.use.reg.test.bundle=true
+# should be JPRT_TESTNATIVE_PATH
+ifdef TEST_IMAGE_DIR
+  TESTNATIVE_DIR = $(TEST_IMAGE_DIR)
+else ifdef JPRT_TESTNATIVE_PATH
+  TESTNATIVE_DIR = $(JPRT_TESTNATIVE_PATH)
+endif
+ifdef TESTNATIVE_DIR
+  JTREG_NATIVE_PATH = -nativepath:$(shell $(GETMIXEDPATH) "$(TESTNATIVE_DIR)/jdk/jtreg/native")
+endif
+
 # Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results)
 ifdef JPRT_ARCHIVE_BUNDLE
   ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE)
@@ -313,6 +326,7 @@
               -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport")  \
               -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork")    \
               -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)")                \
+              $(JTREG_NATIVE_PATH)                                           \
               $(JTREG_EXCLUSIONS)                                            \
               $(JTREG_TEST_OPTIONS)                                          \
               $(TEST_SELECTION)                                                    \
--- a/test/TEST.groups	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/TEST.groups	Tue Mar 03 08:49:13 2015 -0800
@@ -1,4 +1,4 @@
-#  Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#  Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
 #  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 #  This code is free software; you can redistribute it and/or modify it
@@ -168,6 +168,9 @@
 jdk_jdi = \
     com/sun/jdi
 
+jdk_native_sanity = \
+    native_sanity
+
 # java launcher specific tests, Note: do not include this group into any groups
 # that potentially could be included into a jprt test rule, as the complementary
 # closed  group includes awt SplashScreen and these tests may not run 
@@ -567,7 +570,6 @@
   javax/smartcardio \
   javax/sql/rowset \
   javax/xml/crypto \
-  sun/security/acl \
   sun/security/jgss \
   sun/security/krb5 \
   java/lang/annotation/AnnotationType/AnnotationTypeDeadlockTest.java \
--- a/test/com/sun/jdi/InterfaceMethodsTest.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/com/sun/jdi/InterfaceMethodsTest.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
 /**
  *  @test
  *  @bug 8031195
+ *  @bug 8071657
  *  @summary  JDI: Add support for static and default methods in interfaces
  *
  *  @run build TestScaffold VMConnection TargetListener TargetAdapter
@@ -38,6 +39,7 @@
     private static final int RESULT_A = 1;
     private static final int RESULT_B = 1;
     private static final int RESULT_TARGET = 1;
+
     static interface InterfaceA {
         static int staticMethodA() {
             System.out.println("-InterfaceA: static interface method A-");
@@ -202,6 +204,9 @@
 
         // try to invoke static method B on the instance
         testInvokePos(ifaceClass, ref, "staticMethodB", "()I", vm().mirrorOf(RESULT_A));
+
+        // try to invoke a virtual method
+        testInvokePos(ifaceClass, ref, "implementedMethod", "()I", vm().mirrorOf(RESULT_A), true);
     }
 
     private void testInterfaceB(ObjectReference ref) {
@@ -302,9 +307,14 @@
 
     private void testInvokePos(ReferenceType targetClass, ObjectReference ref, String methodName,
                                String methodSig, Value value) {
+        testInvokePos(targetClass, ref, methodName, methodSig, value, false);
+    }
+
+    private void testInvokePos(ReferenceType targetClass, ObjectReference ref, String methodName,
+                               String methodSig, Value value, boolean virtual) {
         logInvocation(ref, methodName, methodSig, targetClass);
         try {
-            invoke(targetClass, ref, methodName, methodSig, value);
+            invoke(targetClass, ref, methodName, methodSig, value, virtual);
             System.err.println("--- PASSED");
         } catch (Exception e) {
             System.err.println("--- FAILED");
@@ -314,9 +324,14 @@
 
     private void testInvokeNeg(ReferenceType targetClass, ObjectReference ref, String methodName,
                                String methodSig, Value value, String msg) {
+        testInvokeNeg(targetClass, ref, methodName, methodSig, value, msg, false);
+    }
+
+    private void testInvokeNeg(ReferenceType targetClass, ObjectReference ref, String methodName,
+                               String methodSig, Value value, String msg, boolean virtual) {
         logInvocation(ref, methodName, methodSig, targetClass);
         try {
-            invoke(targetClass, ref, methodName, methodSig, value);
+            invoke(targetClass, ref, methodName, methodSig, value, virtual);
             System.err.println("--- FAILED");
             failure("FAILED: " + msg);
         } catch (Exception e) {
@@ -326,7 +341,7 @@
     }
 
     private void invoke(ReferenceType targetClass, ObjectReference ref, String methodName,
-                        String methodSig, Value value)
+                        String methodSig, Value value, boolean virtual)
     throws Exception {
         Method method = getMethod(targetClass, methodName, methodSig);
         if (method == null) {
@@ -334,10 +349,15 @@
         }
 
         println("Invoking " + (method.isAbstract() ? "abstract " : " ") + "method: " + method);
+        println(method.declaringType().toString());
 
         Value returnValue = null;
         if (ref != null) {
-            returnValue = invokeInstance(ref, method);
+            if (virtual) {
+                returnValue = invokeVirtual(ref, method);
+            } else {
+                returnValue = invokeInstance(ref, method);
+            }
         } else {
             returnValue = invokeStatic(targetClass, method);
         }
@@ -362,6 +382,10 @@
         return ref.invokeMethod(mainThread, method, Collections.emptyList(), ObjectReference.INVOKE_NONVIRTUAL);
     }
 
+    private Value invokeVirtual(ObjectReference ref, Method method) throws Exception {
+        return ref.invokeMethod(mainThread, method, Collections.emptyList(), 0);
+    }
+
     private Value invokeStatic(ReferenceType refType, Method method) throws Exception {
         if (refType instanceof ClassType) {
             return ((ClassType)refType).invokeMethod(mainThread, method, Collections.emptyList(), ObjectReference.INVOKE_NONVIRTUAL);
--- a/test/com/sun/management/OperatingSystemMXBean/GetTotalSwapSpaceSize.java	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- *
- *
- * @bug     4858522
- * @summary Basic unit test of OperatingSystemMXBean.getTotalSwapSpaceSize()
- * @author  Steve Bohne
- */
-
-/*
- * This test tests the actual swap size on linux and solaris.
- * The correct value should be checked manually:
- * Solaris:
- *   1. In a shell, enter the command: "swap -l"
- *   2. The value (reported in blocks) is in the "blocks" column.
- * Linux:
- *   1. In a shell, enter the command: "cat /proc/meminfo"
- *   2. The value (reported in bytes) is in "Swap" entry, "total" column.
- * Windows NT/XP/2000:
- *   1. Run Start->Accessories->System Tools->System Information.
- *   2. The value (reported in Kbytes) is in the "Page File Space" entry
- * Windows 98/ME:
- *   Unknown.
- *
- * Usage: GetTotalSwapSpaceSize <expected swap size | "sanity-only"> [trace]
- */
-
-import com.sun.management.OperatingSystemMXBean;
-import java.lang.management.*;
-
-public class GetTotalSwapSpaceSize {
-
-    private static OperatingSystemMXBean mbean =
-        (com.sun.management.OperatingSystemMXBean)
-        ManagementFactory.getOperatingSystemMXBean();
-
-    // Careful with these values.
-    // Min size for pass dynamically determined below.
-    // zero if no swap space is configured.
-    private static long       min_size_for_pass = 0;
-    private static final long MAX_SIZE_FOR_PASS = Long.MAX_VALUE;
-
-    private static boolean trace = false;
-
-    public static void main(String args[]) throws Exception {
-        if (args.length > 1 && args[1].equals("trace")) {
-            trace = true;
-        }
-
-        long expected_swap_size = 0;
-
-        if (args.length < 1 || args.length > 2) {
-           throw new IllegalArgumentException("Unexpected number of args " + args.length);
-        }
-
-
-        long min_size = mbean.getFreeSwapSpaceSize();
-        if (min_size > 0) {
-            min_size_for_pass = min_size;
-        }
-
-        long size = mbean.getTotalSwapSpaceSize();
-
-        if (trace) {
-            System.out.println("Total swap space size in bytes: " + size);
-        }
-
-        if (!args[0].matches("sanity-only")) {
-            expected_swap_size = Long.parseLong(args[0]);
-            if (size != expected_swap_size) {
-                throw new RuntimeException("Expected total swap size      : " +
-                                           expected_swap_size +
-                                           " but getTotalSwapSpaceSize returned: " +
-                                           size);
-            }
-        }
-
-        if (size < min_size_for_pass || size > MAX_SIZE_FOR_PASS) {
-            throw new RuntimeException("Total swap space size " +
-                                       "illegal value: " + size + " bytes " +
-                                       "(MIN = " + min_size_for_pass + "; " +
-                                       "MAX = " + MAX_SIZE_FOR_PASS + ")");
-        }
-
-        System.out.println("Test passed.");
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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     4858522
+ * @summary Basic unit test of OperatingSystemMXBean.getTotalSwapSpaceSize()
+ *
+ * @library /lib/testlibrary
+ * @build TestTotalSwap jdk.testlibrary.*
+ * @run main TestTotalSwap
+ *
+ * @author  Steve Bohne
+ * @author  Jaroslav Bachorik
+ */
+
+/*
+ * This test tests the actual swap size on linux and solaris.
+ * The correct value should be checked manually:
+ * Solaris:
+ *   1. In a shell, enter the command: "swap -l"
+ *   2. The value (reported in blocks) is in the "blocks" column.
+ * Linux:
+ *   1. In a shell, enter the command: "cat /proc/meminfo"
+ *   2. The value (reported in bytes) is in "Swap" entry, "total" column.
+ * Windows NT/XP/2000:
+ *   1. Run Start->Accessories->System Tools->System Information.
+ *   2. The value (reported in Kbytes) is in the "Page File Space" entry
+ * Windows 98/ME:
+ *   Unknown.
+ *
+ * Usage: GetTotalSwapSpaceSize <expected swap size | "sanity-only"> [trace]
+ */
+
+import com.sun.management.OperatingSystemMXBean;
+import java.lang.management.*;
+
+import jdk.testlibrary.OSInfo;
+import jdk.testlibrary.ProcessTools;
+import jdk.testlibrary.OutputAnalyzer;
+
+public class TestTotalSwap {
+
+    private static final OperatingSystemMXBean mbean =
+        (com.sun.management.OperatingSystemMXBean)
+        ManagementFactory.getOperatingSystemMXBean();
+
+    // Careful with these values.
+    // Min size for pass dynamically determined below.
+    // zero if no swap space is configured.
+    private static long       min_size_for_pass = 0;
+    private static final long MAX_SIZE_FOR_PASS = Long.MAX_VALUE;
+
+    public static void main(String args[]) throws Throwable {
+
+        long expected_swap_size = getSwapSizeFromOs();
+
+        long min_size = mbean.getFreeSwapSpaceSize();
+        if (min_size > 0) {
+            min_size_for_pass = min_size;
+        }
+
+        long size = mbean.getTotalSwapSpaceSize();
+
+        System.out.println("Total swap space size in bytes: " + size);
+
+        if (expected_swap_size > -1) {
+            if (size != expected_swap_size) {
+                throw new RuntimeException("Expected total swap size      : " +
+                                           expected_swap_size +
+                                           " but getTotalSwapSpaceSize returned: " +
+                                           size);
+            }
+        }
+
+        // sanity check
+        if (size < min_size_for_pass || size > MAX_SIZE_FOR_PASS) {
+            throw new RuntimeException("Total swap space size " +
+                                       "illegal value: " + size + " bytes " +
+                                       "(MIN = " + min_size_for_pass + "; " +
+                                       "MAX = " + MAX_SIZE_FOR_PASS + ")");
+        }
+
+        System.out.println("Test passed.");
+    }
+
+    private static long getSwapSizeFromOs() throws Throwable {
+        OSInfo.OSType os = OSInfo.getOSType();
+
+        switch (os) {
+            // total       used       free     shared    buffers     cached
+            // Mem:    16533540864 13638467584 2895073280  534040576 1630248960 6236909568
+            // -/+ buffers/cache: 5771309056 10762231808
+            // Swap:   15999168512          0 15999168512
+
+            case LINUX: {
+                String swapSizeStr = ProcessTools.executeCommand("free", "-b")
+                                        .firstMatch("Swap:\\s+([0-9]+)\\s+.*", 1);
+                return Long.parseLong(swapSizeStr);
+            }
+            case SOLARIS: {
+                // swapfile             dev   swaplo blocks   free
+                // /dev/dsk/c0t0d0s1   136,1      16 1638608 1600528
+                OutputAnalyzer out= ProcessTools.executeCommand(
+                    "/usr/sbin/swap",
+                    "-l"
+                );
+
+                long swapSize = 0;
+
+                for (String line : out.asLines()) {
+                    if (line.contains("swapfile")) continue;
+
+                    String[] vals = line.split("\\s+");
+                    if (vals.length == 5) {
+                        swapSize += Long.parseLong(vals[3]) * 512; // size is reported in 512b blocks
+                    }
+                }
+
+                return swapSize;
+            }
+            case MACOSX: {
+                // total = 8192.00M used = 7471.11M free = 720.89M (encrypted)
+                String swapSizeStr = ProcessTools.executeCommand(
+                    "/usr/sbin/sysctl",
+                    "-n",
+                    "vm.swapusage"
+                ).firstMatch("total\\s+=\\s+([0-9]+(\\.[0-9]+)?[Mm]?).*", 1);
+                if (swapSizeStr.toLowerCase().endsWith("m")) {
+                    swapSizeStr = swapSizeStr.substring(0, swapSizeStr.length() - 1);
+                    return (long)(Double.parseDouble(swapSizeStr) * 1024 * 1024); // size in MB
+                }
+                return (long)(Double.parseDouble(swapSizeStr) * 1024 * 1024);
+            }
+            default: {
+                System.err.println("Unsupported operating system: " + os);
+            }
+        }
+
+        return -1;
+    }
+}
--- a/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh	Mon Feb 23 10:47:32 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-#
-# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# 
-# @test
-# @summary  Tests MM getTotalSwapSpaceSize() api.
-# @author   Swamy V
-# @bug      6252770
-#
-# @run build GetTotalSwapSpaceSize
-# @run shell TestTotalSwap.sh
-#
-
-#
-# This test tests the actual swap size on linux and solaris.
-# On windows this is just a sanity check and correct size should
-# be checked manually:
-#
-# Windows NT/XP/2000:
-#   1. Run Start->Accessories->System Tools->System Information.
-#   2. The value (reported in Kbytes) is in the "Page File Space" entry
-# Windows 98/ME:
-#   Unknown.
-#
-
-
-#set -x
-
-#Set appropriate jdk
-#
-
-if [ ! -z "${TESTJAVA}" ] ; then
-     jdk="$TESTJAVA"
-else
-     echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test."
-     exit 1
-fi
-
-runOne()
-{
-   echo "runOne $@"
-   $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@  || exit 3
-}
-
-solaris_swap_size()
-{
-   total_swap=0
-   for i in `/usr/sbin/swap -l |  awk  '{print $4}' | grep -v blocks`
-   do
-      # swap -l returns size in blocks of 512 bytes.
-      total_swap=`expr $i \* 512 + $total_swap`
-   done
-}
-
-# Test GetTotalSwapSpaceSize if we are running on Unix
-total_swap=0
-case `uname -s` in
-     SunOS )
-       solaris_swap_size
-       runOne GetTotalSwapSpaceSize $total_swap 
-       ;;
-     Linux )
-       total_swap=`free -b | grep -i swap | awk '{print $2}'`
-       runOne GetTotalSwapSpaceSize $total_swap 
-       ;;
-     Darwin )
-       # $ sysctl -n vm.swapusage 
-       # total = 8192.00M  used = 7471.11M  free = 720.89M  (encrypted)
-       swap=`/usr/sbin/sysctl -n vm.swapusage | awk '{ print $3 }' | awk -F . '{ print $1 }'` || exit 2
-       total_swap=`expr $swap \* 1024 \* 1024` || exit 2
-       runOne GetTotalSwapSpaceSize $total_swap
-       ;;
-    * )
-       runOne GetTotalSwapSpaceSize "sanity-only"
-       ;;
-esac
-
-exit 0
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/lang/Class/getEnclosingConstructor/EnclosingConstructorWithSecurityManager.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8014678
+ * @run main EnclosingConstructorWithSecurityManager
+ * @run main/othervm EnclosingConstructorWithSecurityManager "WithSecurityManager"
+ */
+
+public class EnclosingConstructorWithSecurityManager {
+    public static void main(String[] args) {
+        if (args.length == 1) {
+            System.setSecurityManager(new SecurityManager());
+        }
+
+        new Inner();
+        Inner.theInner.getEnclosingConstructor();
+    }
+
+    public static class Inner {
+        public static Class<?> theInner;
+
+        public Inner() {
+            Object o = new Object() {
+            };
+            Inner.theInner = o.getClass();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/lang/Class/getEnclosingMethod/EnclosingMethodWithSecurityManager.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8014678
+ * @run main EnclosingMethodWithSecurityManager
+ * @run main/othervm EnclosingMethodWithSecurityManager "WithSecurityManager"
+ */
+
+public class EnclosingMethodWithSecurityManager {
+    public static void main(String[] args) {
+        if (args.length == 1) {
+            System.setSecurityManager(new SecurityManager());
+        }
+
+        new Inner().setTheInner();
+        Inner.theInner.getEnclosingMethod();
+    }
+
+    public static class Inner {
+        public static Class<?> theInner;
+
+        public void setTheInner() {
+            Object o = new Object() {
+            };
+            Inner.theInner = o.getClass();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/lang/invoke/CustomizedLambdaFormTest.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang.invoke;
+
+/* @test
+ * @summary Assertion in LambdaFormEditor.bindArgumentType is too strong
+ *
+ * @run main/bootclasspath -esa java.lang.invoke.CustomizedLambdaFormTest
+ */
+public class CustomizedLambdaFormTest {
+
+    static void testExtendCustomizedBMH() throws Exception {
+        // Construct BMH
+        MethodHandle mh = MethodHandles.Lookup.IMPL_LOOKUP.findVirtual(String.class, "concat",
+                MethodType.methodType(String.class, String.class))
+                .bindTo("a");
+        mh.customize();
+        mh.bindTo("b"); // Try to extend customized BMH
+    }
+
+    public static void main(String[] args) throws Throwable {
+        testExtendCustomizedBMH();
+    }
+}
--- a/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,6 +32,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Predicate;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -235,8 +236,23 @@
                                   .filter(s -> s.startsWith("WARNING: Exception"))
                                   .count(),
                      2, "show error each capture");
-        // dumpLong/com/example/nosense/nosense
-        assertEquals(Files.walk(Paths.get("dumpLong")).count(), 5, "Two lambda captured failed to log");
+        // dumpLong/com/example/nonsense/nonsense
+        Path dumpPath = Paths.get("dumpLong/com/example/nonsense");
+        Predicate<Path> filter = p -> p.getParent() == null || dumpPath.startsWith(p) || p.startsWith(dumpPath);
+        boolean debug = true;
+        if (debug) {
+           Files.walk(Paths.get("dumpLong"))
+                .forEachOrdered(p -> {
+                    if (filter.test(p)) {
+                        System.out.println("accepted: " + p.toString());
+                    } else {
+                        System.out.println("filetered out: " + p.toString());
+                    }
+                 });
+        }
+        assertEquals(Files.walk(Paths.get("dumpLong"))
+                .filter(filter)
+                .count(), 5, "Two lambda captured failed to log");
         tr.assertZero("Should still return 0");
     }
 }
--- a/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java	Tue Mar 03 08:49:13 2015 -0800
@@ -147,6 +147,11 @@
                info.getLockOwnerName() + " expected = " +
                values[LOCK_OWNER_NAME]);
         }
+        if (!values[DAEMON].equals(info.isDaemon())) {
+            throw new RuntimeException("Daemon = " +
+               info.isDaemon() + " expected = " +
+               values[DAEMON]);
+        }
 
         checkStackTrace(info.getStackTrace());
 
@@ -258,8 +263,11 @@
     private static final int SUSPENDED       = 11;
     private static final int IN_NATIVE       = 12;
     private static final int NUM_V5_ATTS     = 13;
-    // JDK 6.0 ThreadInfo attribtues
+    // JDK 6.0 ThreadInfo attributes
     private static final int LOCK_INFO       = 13;
+    // JDK 9.0 ThreadInfo attributes
+    private static final int DAEMON          = 14;
+    private static final int PRIORITY        = 15;
 
     private static final String[] validItemNames = {
         "threadId",
@@ -276,6 +284,8 @@
         "suspended",
         "inNative",
         "lockInfo",
+        "daemon",
+        "priority",
     };
 
     private static OpenType[] validItemTypes = {
@@ -293,6 +303,8 @@
         SimpleType.BOOLEAN,
         SimpleType.BOOLEAN,
         null,  // CompositeType for LockInfo
+        SimpleType.BOOLEAN,
+        SimpleType.INTEGER,
     };
 
     private static Object[] values = {
@@ -310,6 +322,8 @@
         new Boolean(false),
         new Boolean(false),
         null, // To be initialized to lockInfoCD
+        new Boolean(false),
+        Thread.NORM_PRIORITY,
     };
 
     private static final String[] steItemNames = {
@@ -381,6 +395,8 @@
         "suspended",
         "inNative",
         "lockInfo",
+        "daemon",
+        "priority",
     };
     private static final OpenType[] badItemTypes = {
         SimpleType.LONG,
@@ -397,6 +413,8 @@
         SimpleType.BOOLEAN,
         SimpleType.BOOLEAN,
         SimpleType.LONG,  // bad type
+        SimpleType.BOOLEAN,
+        SimpleType.INTEGER,
     };
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/lang/management/ThreadMXBean/ThreadDaemonTest.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.lang.management.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.*;
+
+/*
+ * @test
+ * @bug     6588467
+ * @summary Basic test of ThreadInfo.isDaemon
+ * @author  Jeremy Manson
+ */
+public class ThreadDaemonTest {
+
+    public static void main(String[] args) throws Exception {
+        final int NUM_THREADS = 20;
+        final String THREAD_PREFIX = "ThreadDaemonTest-";
+
+        final CountDownLatch started = new CountDownLatch(NUM_THREADS);
+        final CountDownLatch finished = new CountDownLatch(1);
+        final AtomicReference<Exception> fail = new AtomicReference<>(null);
+
+        Thread[] allThreads = new Thread[NUM_THREADS];
+        ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
+        Random rand = new Random();
+
+        for (int i = 0; i < NUM_THREADS; i++) {
+            allThreads[i] = new Thread(new Runnable() {
+                    public void run() {
+                        try {
+                            started.countDown();
+                            finished.await();
+                        } catch (InterruptedException e) {
+                            fail.set(new Exception(
+                                "Unexpected InterruptedException"));
+                        }
+                    }
+                }, THREAD_PREFIX + i);
+            allThreads[i].setDaemon(rand.nextBoolean());
+            allThreads[i].start();
+        }
+
+        started.await();
+        try {
+            ThreadInfo[] allThreadInfos = mbean.dumpAllThreads(false, false);
+            int count = 0;
+            for (int i = 0; i < allThreadInfos.length; i++) {
+                String threadName = allThreadInfos[i].getThreadName();
+                if (threadName.startsWith(THREAD_PREFIX)) {
+                    count++;
+                    String[] nameAndNumber = threadName.split("-");
+                    int threadNum = Integer.parseInt(nameAndNumber[1]);
+                    if (allThreads[threadNum].isDaemon() !=
+                        allThreadInfos[i].isDaemon()) {
+                        throw new RuntimeException(
+                            allThreads[threadNum] + " is not like " +
+                            allThreadInfos[i] + ". TEST FAILED.");
+                    }
+                }
+            }
+            if (count != NUM_THREADS) {
+                throw new RuntimeException("Wrong number of threads examined");
+            }
+        }
+        finally { finished.countDown(); }
+
+        for (int i = 0; i < NUM_THREADS; i++) {
+            allThreads[i].join();
+        }
+        if (fail.get() != null) {
+            throw fail.get();
+        }
+    }
+}
--- a/test/java/lang/management/ThreadMXBean/ThreadDump.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/lang/management/ThreadMXBean/ThreadDump.java	Tue Mar 03 08:49:13 2015 -0800
@@ -34,6 +34,7 @@
 
     public static void printThreadInfo(ThreadInfo ti) {
         StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" +
+                                             (ti.isDaemon() ? " daemon" : "") +
                                              " Id=" + ti.getThreadId() +
                                              " in " + ti.getThreadState());
         if (ti.getLockName() != null) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/net/Socks/BadProxySelector.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7178362
+ * @run main/othervm BadProxySelector
+ */
+
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.ServerSocket;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.io.*;
+
+public class BadProxySelector {
+    public static void main(String[] args) throws Exception {
+        ProxySelector.setDefault(new HTTPProxySelector());
+        try (ServerSocket ss = new ServerSocket(0);
+             Socket s1 = new Socket(ss.getInetAddress(), ss.getLocalPort());
+             Socket s2 = ss.accept()) {
+        }
+
+       ProxySelector.setDefault(new NullHTTPProxySelector());
+        try (ServerSocket ss = new ServerSocket(0);
+             Socket s1 = new Socket(ss.getInetAddress(), ss.getLocalPort());
+             Socket s2 = ss.accept()) {
+        }
+    }
+
+    // always returns bogus HTTP proxies
+    private static class HTTPProxySelector extends ProxySelector {
+        @Override
+        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
+
+        @Override
+        public List<Proxy> select(URI uri) {
+            List<Proxy> proxies = new ArrayList<>();
+            proxies.add(new Proxy(Proxy.Type.HTTP,
+                                  new InetSocketAddress("localhost", 0)));
+            proxies.add(new Proxy(Proxy.Type.HTTP,
+                                  new InetSocketAddress("localhost", 0)));
+            return proxies;
+        }
+    }
+
+    private static class NullHTTPProxySelector extends ProxySelector {
+        @Override
+        public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
+
+        @Override
+        public List<Proxy> select(URI uri) {
+            List<Proxy> proxies = new ArrayList<>();
+            proxies.add(null);
+            proxies.add(new Proxy(Proxy.Type.HTTP,
+                                  new InetSocketAddress("localhost", 0)));
+            return proxies;
+        }
+    }
+}
--- a/test/java/nio/channels/SocketChannel/OutOfBand.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/nio/channels/SocketChannel/OutOfBand.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -58,8 +58,6 @@
             test1(sc1, sc2);
             test2(sc1, sc2);
             test3(sc1, sc2);
-            test4(sc1);
-
         } finally {
             if (sc1 != null) sc1.close();
             if (sc2 != null) sc2.close();
@@ -175,17 +173,4 @@
 
         thr.join();
     }
-
-    static void test4(SocketChannel sc) throws IOException {
-        boolean blocking = sc.isBlocking();
-        sc.configureBlocking(false);
-        try {
-            sc.socket().sendUrgentData(0);
-            throw new RuntimeException("IllegalBlockingModeException expected");
-        } catch (IllegalBlockingModeException x) {
-            // expected
-        } finally {
-            sc.configureBlocking(blocking);
-        }
-    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/nio/channels/SocketChannel/SendUrgentData.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8071599
+ * @run main/othervm SendUrgentData
+ * @run main/othervm SendUrgentData -inline
+ * @summary Test sending of urgent data.
+ */
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+
+public class SendUrgentData {
+
+    /**
+     * The arguments may be one of the following:
+     * <ol>
+     * <li>-server</li>
+     * <li>-client host port [-inline]</li>
+     * <li>[-inline]</li>
+     * </ol>
+     * The first option creates a standalone server, the second a standalone
+     * client, and the third a self-contained server-client pair on the
+     * local host.
+     *
+     * @param args
+     * @throws Exception
+     */
+    public static void main(String[] args) throws Exception {
+
+        ServerSocketChannelThread serverThread
+                = new ServerSocketChannelThread("SendUrgentDataServer");
+        serverThread.start();
+        boolean b = serverThread.isAlive();
+
+        String host = null;
+        int port = 0;
+        boolean inline = false;
+        if (args.length > 0 && args[0].equals("-server")) {
+            System.out.println(serverThread.getAddress());
+            Thread.currentThread().suspend();
+        } else {
+            if (args.length > 0 && args[0].equals("-client")) {
+                host = args[1];
+                port = Integer.parseInt(args[2]);
+                if (args.length > 3) {
+                    inline = args[2].equals("-inline");
+                }
+            } else {
+                host = "localhost";
+                port = serverThread.getAddress().getPort();
+                if (args.length > 0) {
+                    inline = args[0].equals("-inline");
+                }
+            }
+        }
+
+        System.out.println("OOB Inline : "+inline);
+
+        SocketAddress sa = new InetSocketAddress(host, port);
+
+        try (SocketChannel sc = SocketChannel.open(sa)) {
+            sc.configureBlocking(false);
+            sc.socket().setOOBInline(inline);
+
+            sc.socket().sendUrgentData(0);
+            System.out.println("wrote 1 OOB byte");
+
+            ByteBuffer bb = ByteBuffer.wrap(new byte[100 * 1000]);
+
+            int blocked = 0;
+            long total = 0;
+
+            int n;
+            do {
+                n = sc.write(bb);
+                if (n == 0) {
+                    System.out.println("blocked, wrote " + total + " so far");
+                    if (++blocked == 10) {
+                        break;
+                    }
+                    Thread.sleep(100);
+                } else {
+                    total += n;
+                    bb.rewind();
+                }
+            } while (n > 0);
+
+            long attempted = 0;
+            while (attempted < total) {
+                bb.rewind();
+                n = sc.write(bb);
+                System.out.println("wrote " + n + " normal bytes");
+                attempted += bb.capacity();
+
+                String osName = System.getProperty("os.name").toLowerCase();
+
+                try {
+                    sc.socket().sendUrgentData(0);
+                } catch (IOException ex) {
+                    if (osName.contains("linux")) {
+                        if (!ex.getMessage().contains("Socket buffer full")) {
+                            throw new RuntimeException("Unexpected message", ex);
+                        }
+                    } else if (osName.contains("os x") || osName.contains("mac")) {
+                        if (!ex.getMessage().equals("No buffer space available")) {
+                            throw new RuntimeException("Unexpected message", ex);
+                        }
+                    } else if (osName.contains("windows")) {
+                        if (!(ex instanceof SocketException)) {
+                            throw new RuntimeException("Unexpected exception", ex);
+                        } else if (!ex.getMessage().contains("Resource temporarily unavailable")) {
+                            throw new RuntimeException("Unexpected message", ex);
+                        }
+                    } else {
+                        throw new RuntimeException("Unexpected IOException", ex);
+                    }
+                }
+
+                try {
+                    Thread.sleep(100);
+                } catch (InterruptedException ex) {
+                    // don't want to fail on this so just print trace and break
+                    ex.printStackTrace();
+                    break;
+                }
+            }
+        } finally {
+            serverThread.close();
+        }
+    }
+
+    static class ServerSocketChannelThread extends Thread {
+
+        private ServerSocketChannel ssc;
+
+        private ServerSocketChannelThread(String name) {
+            super(name);
+            try {
+                ssc = ServerSocketChannel.open();
+                ssc.bind(new InetSocketAddress((0)));
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+
+        public void run() {
+            while (ssc.isOpen()) {
+                try {
+                    Thread.sleep(100);
+                } catch (InterruptedException ex) {
+                    throw new RuntimeException(ex);
+                }
+            }
+            try {
+                ssc.close();
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+            System.out.println("ServerSocketChannelThread exiting ...");
+        }
+
+        public InetSocketAddress getAddress() throws IOException {
+            if (ssc == null) {
+                throw new IllegalStateException("ServerSocketChannel not created");
+            }
+
+            return (InetSocketAddress) ssc.getLocalAddress();
+        }
+
+        public void close() {
+            try {
+                ssc.close();
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+}
--- a/test/java/nio/charset/Charset/NIOCharsetAvailabilityTest.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/nio/charset/Charset/NIOCharsetAvailabilityTest.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,41 +23,63 @@
 
 /*
  * @test
- * @bug 4777124 6920545 6911753
+ * @bug 4777124 6920545 6911753 8073924
  * @summary Verify that all Charset subclasses are available through the API
  */
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import java.net.URI;
 import java.nio.charset.Charset;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Collection;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Set;
-import java.util.Vector;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 public class NIOCharsetAvailabilityTest {
 
     public static void main(String[] args) throws Exception {
+
         // build the set of all Charset subclasses in the
         // two known charset implementation packages
-        Set charsets = new HashSet();
-        addCharsets(charsets, "sun.nio.cs");
-        addCharsets(charsets, "sun.nio.cs.ext");
-
+        FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
+        Set<Class> charsets =
+            Stream.concat(Files.walk(fs.getPath("/java.base/sun/nio/cs/")),
+                          Files.walk(fs.getPath("/jdk.charsets/sun/nio/cs/ext/")))
+                 .map( p -> p.subpath(1, p.getNameCount()).toString())
+                 .filter( s ->  s.indexOf("$") == -1 && s.endsWith(".class"))
+                 .map( s -> {
+                     try {
+                         return Class.forName(s.substring(0, s.length() - 6)
+                                               .replace('/', '.'));
+                     } catch (Exception x) {
+                         throw new RuntimeException(x);
+                     }
+                  })
+                 .filter( clz -> {
+                     Class superclazz = clz.getSuperclass();
+                     while (superclazz != null && !superclazz.equals(Object.class)) {
+                         if (superclazz.equals(Charset.class)) {
+                             return true;
+                         } else {
+                             superclazz = superclazz.getSuperclass();
+                         }
+                     }
+                     return false;
+                  })
+                 .collect(Collectors.toCollection(HashSet::new));
         // remove the charsets that the API says are available
-        Collection availableCharsets = Charset.availableCharsets().values();
-        Iterator iter = availableCharsets.iterator();
-        while (iter.hasNext()) {
-            charsets.remove(((Charset) iter.next()).getClass());
-        }
+        Charset.availableCharsets()
+               .values()
+               .stream()
+               .forEach(cs -> {
+                   if (!charsets.contains(cs.getClass())) {
+                       System.out.println(" missing -> " + cs.getClass());
+                   }
+                   charsets.remove(cs.getClass());
+                });
 
         // remove the known pseudo-charsets that serve only to implement
         // other charsets, but shouldn't be known to the public
@@ -76,146 +98,12 @@
             charsets.remove(Class.forName("sun.nio.cs.JIS_X_0208_Solaris"));
             charsets.remove(Class.forName("sun.nio.cs.JIS_X_0212_Solaris"));
         }
-
         // report the charsets that are implemented but not available
-        iter = charsets.iterator();
-        while (iter.hasNext()) {
-            System.out.println("Unused Charset subclass: " + ((Class) iter.next()).getName());
-        }
         if (charsets.size() > 0) {
+            charsets.stream()
+                    .forEach( clz ->
+                        System.out.println("Unused Charset subclass: " + clz));
             throw new RuntimeException();
         }
     }
-
-    private static Vector classPathSegments = new Vector();
-
-    private static void addCharsets(Set charsets, final String packageName)
-            throws Exception {
-
-        String classPath = AccessController.doPrivileged(
-             (PrivilegedAction<String>)() -> System.getProperty("sun.boot.class.path"));
-        String s = AccessController.doPrivileged(
-             (PrivilegedAction<String>)() -> System.getProperty("java.class.path"));
-
-        // Search combined system and application class path
-        if (s != null && s.length() != 0) {
-            classPath += File.pathSeparator + s;
-        }
-        while (classPath != null && classPath.length() != 0) {
-            int i = classPath.lastIndexOf(java.io.File.pathSeparatorChar);
-            String dir = classPath.substring(i + 1);
-            if (i == -1) {
-                classPath = null;
-            } else {
-                classPath = classPath.substring(0, i);
-            }
-            classPathSegments.insertElementAt(dir, 0);
-        }
-
-        String[] classList = (String[])
-            java.security.AccessController.doPrivileged(
-                                    new java.security.PrivilegedAction() {
-                public Object run() {
-                    return getClassList(packageName, "");
-                }
-            });
-
-        for (int i = 0; i < classList.length; i++) {
-            try {
-                Class clazz = Class.forName(packageName + "." + classList[i]);
-                Class superclazz = clazz.getSuperclass();
-                while (superclazz != null && !superclazz.equals(Object.class)) {
-                    if (superclazz.equals(Charset.class)) {
-                        charsets.add(clazz);
-                        break;
-                    } else {
-                        superclazz = superclazz.getSuperclass();
-                    }
-                }
-            } catch (ClassNotFoundException e) {
-            }
-        }
-    }
-
-    private static final char ZIPSEPARATOR = '/';
-
-    /**
-     * Walk through CLASSPATH and find class list from a package.
-     * The class names start with prefix string
-     * @param package name, class name prefix
-     * @return class list in an array of String
-     */
-    private static String[] getClassList(String pkgName, String prefix) {
-        Vector listBuffer = new Vector();
-        String packagePath = pkgName.replace('.', File.separatorChar)
-            + File.separatorChar;
-        String zipPackagePath = pkgName.replace('.', ZIPSEPARATOR)
-            + ZIPSEPARATOR;
-        for (int i = 0; i < classPathSegments.size(); i++){
-            String onePath = (String) classPathSegments.elementAt(i);
-            File f = new File(onePath);
-            if (!f.exists())
-                continue;
-            if (f.isFile())
-                scanFile(f, zipPackagePath, listBuffer, prefix);
-            else if (f.isDirectory()) {
-                String fullPath;
-                if (onePath.endsWith(File.separator))
-                    fullPath = onePath + packagePath;
-                else
-                    fullPath = onePath + File.separatorChar + packagePath;
-                File dir = new File(fullPath);
-                if (dir.exists() && dir.isDirectory())
-                    scanDir(dir, listBuffer, prefix);
-            }
-        }
-        String[] classNames = new String[listBuffer.size()];
-        listBuffer.copyInto(classNames);
-        return classNames;
-    }
-
-    private static void addClass (String className, Vector listBuffer, String prefix) {
-        if (className != null && className.startsWith(prefix)
-                    && !listBuffer.contains(className))
-            listBuffer.addElement(className);
-    }
-
-    private static String midString(String str, String pre, String suf) {
-        String midStr;
-        if (str.startsWith(pre) && str.endsWith(suf))
-            midStr = str.substring(pre.length(), str.length() - suf.length());
-        else
-            midStr = null;
-        return midStr;
-    }
-
-    private static void scanDir(File dir, Vector listBuffer, String prefix) {
-        String[] fileList = dir.list();
-        for (int i = 0; i < fileList.length; i++) {
-            addClass(midString(fileList[i], "", ".class"), listBuffer, prefix);
-        }
-    }
-
-    private static void scanFile(File f, String packagePath, Vector listBuffer,
-                String prefix) {
-        try {
-            ZipInputStream zipFile = new ZipInputStream(new FileInputStream(f));
-            ZipEntry entry;
-            while ((entry = zipFile.getNextEntry()) != null) {
-                String eName = entry.getName();
-                if (eName.startsWith(packagePath)) {
-                    if (eName.endsWith(".class")) {
-                        addClass(midString(eName, packagePath, ".class"),
-                                listBuffer, prefix);
-                    }
-                }
-            }
-        } catch (FileNotFoundException e) {
-            System.out.println("file not found:" + e);
-        } catch (IOException e) {
-            System.out.println("file IO Exception:" + e);
-        } catch (Exception e) {
-            System.out.println("Exception:" + e);
-        }
-    }
 }
--- a/test/java/nio/charset/Charset/RegisteredCharsets.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/nio/charset/Charset/RegisteredCharsets.java	Tue Mar 03 08:49:13 2015 -0800
@@ -22,7 +22,8 @@
  */
 
 /* @test
- * @bug 4473201 4696726 4652234 4482298 4784385 4966197 4267354 5015668 6911753
+ * @bug 4473201 4696726 4652234 4482298 4784385 4966197 4267354 5015668
+        6911753 8071447
  * @summary Check that registered charsets are actually registered
  */
 
@@ -135,6 +136,7 @@
                             "x-IBM1122",
                             "x-IBM1123",
                             "x-IBM1124",
+                            "x-IBM1166",
                             "x-IBM875",
                             "x-IBM921",
                             "x-IBM922",
@@ -863,6 +865,14 @@
                     "1124"
                 } );
 
+        aliasCheck("x-IBM1166" ,
+                new String[] {
+                    "cp1166", // JDK historical
+                    "ibm1166",
+                    "ibm-1166",
+                    "1166"
+                } );
+
         aliasCheck("IBM273" ,
                 new String[] {
                     "cp273", // JDK historical
--- a/test/java/nio/charset/RemovingSunIO/SunioAlias.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/nio/charset/RemovingSunIO/SunioAlias.java	Tue Mar 03 08:49:13 2015 -0800
@@ -675,6 +675,12 @@
         aliasTable.put("1124",                  "Cp1124");
 
         // MIBenum: ????
+        aliasTable.put("ibm1166",               "Cp1166");
+        aliasTable.put("ibm-1166",              "Cp1166");
+        aliasTable.put("cp1166",                "Cp1166");
+        aliasTable.put("1166",                  "Cp1166");
+
+        // MIBenum: ????
         aliasTable.put("ibm1381",               "Cp1381");        /* MDA */
         aliasTable.put("ibm-1381",              "Cp1381");        /* MDA */
         aliasTable.put("cp1381",                "Cp1381");        /* MDA */
--- a/test/java/time/test/java/time/TestClock_System.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/time/test/java/time/TestClock_System.java	Tue Mar 03 08:49:13 2015 -0800
@@ -66,8 +66,10 @@
 import java.time.Clock;
 import java.time.Instant;
 import java.time.ZoneId;
+import java.time.ZoneOffset;
 
 import org.testng.annotations.Test;
+import org.testng.annotations.DataProvider;
 
 /**
  * Test system clock.
@@ -76,6 +78,7 @@
 public class TestClock_System {
 
     private static final ZoneId PARIS = ZoneId.of("Europe/Paris");
+    private static final Clock systemUTC = Clock.systemUTC();
 
     public void test_withZone_same() {
         Clock test = Clock.system(PARIS);
@@ -90,6 +93,32 @@
     }
 
     //-----------------------------------------------------------------------
+    @DataProvider(name="sampleSystemUTC")
+    Object[][] provider_sampleSystemUTC() {
+        return new Object[][] {
+            {"Clock.systemUTC()#1",  Clock.systemUTC()},
+            {"Clock.systemUTC()#2",  Clock.systemUTC()},
+            {"Clock.system(ZoneOffset.UTC)#1",  Clock.system(ZoneOffset.UTC)},
+            {"Clock.system(ZoneOffset.UTC)#2",  Clock.system(ZoneOffset.UTC)}
+        };
+    }
+
+    // Test for 8073394
+    @Test(dataProvider="sampleSystemUTC")
+    public void test_systemUTC(String s, Clock clock) {
+        if (clock != systemUTC) {
+            throw new RuntimeException("Unexpected clock instance for " + s + ": "
+                + "\n\texpected: " + toString(systemUTC)
+                + "\n\tactual:   " + toString(clock));
+        }
+    }
+
+    private static String toString(Clock c) {
+        return c == null ? null :
+               c + " " + c.getClass().getName() + "@" + System.identityHashCode(c);
+    }
+
+    //-----------------------------------------------------------------------
 
     private static String formatTime(String prefix, Instant time) {
         return prefix + ": " + time + " - seconds: "
--- a/test/java/time/test/java/time/TestInstant.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/time/test/java/time/TestInstant.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -62,6 +62,8 @@
 import java.time.Instant;
 
 import org.testng.annotations.Test;
+import org.testng.annotations.DataProvider;
+import static org.testng.Assert.assertEquals;
 
 /**
  * Test Instant.
@@ -74,4 +76,24 @@
         assertImmutable(Instant.class);
     }
 
+    @DataProvider(name="sampleEpochMillis")
+    private Object[][] provider_sampleEpochMillis() {
+        return new Object[][] {
+            {"Long.MAX_VALUE", Long.MAX_VALUE},
+            {"Long.MAX_VALUE-1", Long.MAX_VALUE - 1},
+            {"1", 1L},
+            {"0", 0L},
+            {"-1", -1L},
+            {"Long.MIN_VALUE+1", Long.MIN_VALUE + 1},
+            {"Long.MIN_VALUE", Long.MIN_VALUE}
+        };
+    }
+
+    @Test(dataProvider="sampleEpochMillis")
+    public void test_epochMillis(String name, long millis) {
+        Instant t1 = Instant.ofEpochMilli(millis);
+        long m = t1.toEpochMilli();
+        assertEquals(millis, m, name);
+    }
+
 }
--- a/test/java/util/Arrays/TimSortStackSize2.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/util/Arrays/TimSortStackSize2.java	Tue Mar 03 08:49:13 2015 -0800
@@ -24,63 +24,59 @@
 /*
  * @test
  * @bug 8072909
- * @run main/othervm -Xmx385m TimSortStackSize2 67108864
- * not for regular execution on all platforms:
+ * @run main/othervm -Xms385m TimSortStackSize2 67108864
+ * @summary Test TimSort stack size on big arrays
+ * big tests not for regular execution on all platforms:
  * run main/othervm -Xmx8g TimSortStackSize2 1073741824
  * run main/othervm -Xmx16g TimSortStackSize2 2147483644
- * @summary Test TimSort stack size on big arrays
  */
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
+import java.util.function.Consumer;
 
 public class TimSortStackSize2 {
 
     public static void main(String[] args) {
         int lengthOfTest = Integer.parseInt(args[0]);
-        boolean passed = true;
-        try {
-            Integer [] a = new TimSortStackSize2(lengthOfTest).createArray();
-            long begin = System.nanoTime();
-            Arrays.sort(a, new Comparator<Object>() {
-                    @SuppressWarnings("unchecked")
-                    public int compare(Object first, Object second) {
-                        return ((Comparable<Object>)first).compareTo(second);
-                    }
-                });
-            long end = System.nanoTime();
-            System.out.println("TimSort: " + (end - begin));
-            a = null;
-        } catch (ArrayIndexOutOfBoundsException e){
-            System.out.println("TimSort broken:");
-            e.printStackTrace();
-            passed = false;
-        }
-
-        try {
-            Integer [] a = new TimSortStackSize2(lengthOfTest).createArray();
-            long begin = System.nanoTime();
-            Arrays.sort(a);
-            long end = System.nanoTime();
-            System.out.println("ComparableTimSort: " + (end - begin));
-            a = null;
-        } catch (ArrayIndexOutOfBoundsException e){
-            System.out.println("ComparableTimSort broken:");
-            e.printStackTrace();
-            passed = false;
-        }
+        boolean passed = doTest("TimSort", lengthOfTest,
+            (Integer [] a) -> Arrays.sort(a));
+        passed = doTest("ComparableTimSort", lengthOfTest, (Integer [] a) ->
+            Arrays.sort(a, (Object first, Object second) -> {
+                return ((Comparable<Object>)first).compareTo(second);
+            }))
+            && passed;
         if ( !passed ){
             throw new RuntimeException();
         }
     }
 
+    private static boolean doTest(final String msg, final int lengthOfTest,
+                                  final  Consumer<Integer[]> c){
+        Integer [] a = null;
+        try {
+            a = new TimSortStackSize2(lengthOfTest).createArray();
+            long begin = System.nanoTime();
+            c.accept(a);
+            long end = System.nanoTime();
+            System.out.println(msg + " OK. Time: " + (end - begin) + "ns");
+        } catch (ArrayIndexOutOfBoundsException e){
+            System.out.println(msg + " broken:");
+            e.printStackTrace();
+            return false;
+        } finally {
+            a = null;
+        }
+        return true;
+    }
+
     private static final int MIN_MERGE = 32;
     private final int minRun;
     private final int length;
     private final List<Long> runs = new ArrayList<Long>();
 
-    public TimSortStackSize2(int len) {
+    public TimSortStackSize2(final int len) {
         this.length = len;
         minRun = minRunLength(len);
         fillRunsJDKWorstCase();
@@ -106,24 +102,24 @@
      * @param X  The sum of the sequence that should be added to runs.
      */
     private void generateJDKWrongElem(long X) {
-        for(long newTotal; X >= 2*minRun+1; X = newTotal) {
+        for(long newTotal; X >= 2 * minRun + 1; X = newTotal) {
             //Default strategy
-            newTotal = X/2 + 1;
+            newTotal = X / 2 + 1;
             //Specialized strategies
-            if(3*minRun+3 <= X && X <= 4*minRun+1) {
+            if(3 * minRun + 3 <= X && X <= 4*minRun+1) {
                 // add x_1=MIN+1, x_2=MIN, x_3=X-newTotal  to runs
-                newTotal = 2*minRun+1;
-            } else if(5*minRun+5 <= X && X <= 6*minRun+5) {
+                newTotal = 2 * minRun + 1;
+            } else if (5 * minRun + 5 <= X && X <= 6 * minRun + 5) {
                 // add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=X-newTotal  to runs
-                newTotal = 3*minRun+3;
-            } else if(8*minRun+9 <= X && X <= 10*minRun+9) {
+                newTotal = 3 * minRun + 3;
+            } else if (8 * minRun + 9 <= X && X <= 10 * minRun + 9) {
                 // add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=X-newTotal  to runs
-                newTotal = 5*minRun+5;
-            } else if(13*minRun+15 <= X && X <= 16*minRun+17) {
+                newTotal = 5 * minRun + 5;
+            } else if (13 * minRun + 15 <= X && X <= 16 * minRun + 17) {
                 // add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=3MIN+4, x_6=X-newTotal  to runs
-                newTotal = 8*minRun+9;
+                newTotal = 8 * minRun + 9;
             }
-            runs.add(0, X-newTotal);
+            runs.add(0, X - newTotal);
         }
         runs.add(0, X);
     }
@@ -144,10 +140,10 @@
         long Y = minRun + 4;
         long X = minRun;
 
-        while(runningTotal+Y+X <= length) {
+        while (runningTotal + Y + X <= length) {
             runningTotal += X + Y;
             generateJDKWrongElem(X);
-            runs.add(0,Y);
+            runs.add(0, Y);
 
             // X_{i+1} = Y_i + x_{i,1} + 1, since runs.get(1) = x_{i,1}
             X = Y + runs.get(1) + 1;
@@ -156,21 +152,22 @@
             Y += X + 1;
         }
 
-        if(runningTotal + X <= length) {
+        if (runningTotal + X <= length) {
             runningTotal += X;
             generateJDKWrongElem(X);
         }
 
-        runs.add(length-runningTotal);
+        runs.add(length - runningTotal);
     }
 
-    private Integer[] createArray() {
-        Integer[] a = new Integer[length];
+    private Integer [] createArray() {
+        Integer [] a = new Integer[length];
         Arrays.fill(a, 0);
         int endRun = -1;
-        for(long len : runs)
-            a[endRun+=len] = 1;
-        a[length-1]=0;
+        for (long len : runs) {
+            a[endRun += len] = 1;
+        }
+        a[length - 1] = 0;
         return a;
     }
 
--- a/test/java/util/logging/FileHandlerLongLimit.java	Mon Feb 23 10:47:32 2015 -0800
+++ b/test/java/util/logging/FileHandlerLongLimit.java	Tue Mar 03 08:49:13 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -346,26 +346,29 @@
             assertEquals(0, getWritten(metered), "written");
 
             // now we're going to publish a series of log records
+            // we're using the same log record over and over to make
+            // sure we get the same amount of bytes.
             String msg = "this is at least 10 chars long";
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            LogRecord record = new LogRecord(Level.SEVERE, msg);
+            fh.publish(record);
             fh.flush();
             long w = getWritten(metered);
             long offset = getWritten(metered);
             System.out.println("first offset is:  " + offset);
 
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            fh.publish(record);
             fh.flush();
             offset = getWritten(metered) - w;
             w = getWritten(metered);
             System.out.println("second offset is: " + offset);
 
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            fh.publish(record);
             fh.flush();
             offset = getWritten(metered) - w;
             w = getWritten(metered);
             System.out.println("third offset is:  " + offset);
 
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            fh.publish(record);
             fh.flush();
             offset = getWritten(metered) - w;
             System.out.println("fourth offset is: " + offset);
@@ -377,7 +380,7 @@
 
             // publish one more log record. we should still be just beneath
             // the limit
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            fh.publish(record);
             fh.flush();
             assertEquals(w+offset, getWritten(metered), "written");
 
@@ -392,9 +395,9 @@
             // writing the first log record or just before writing the next
             // one. We publich two - so we're sure that the log must have
             // rotated.
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            fh.publish(record);
             fh.flush();
-            fh.publish(new LogRecord(Level.SEVERE, msg));
+            fh.publish(record);
             fh.flush();
 
             // Check that fh.meter is a different instance of MeteredStream.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/logging/HigherResolutionTimeStamps/LogRecordWithNanos.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+/**
+ * @test
+ * @bug 8072645
+ * @summary tests that LogRecord has nanos...
+ * @run main LogRecordWithNanos
+ * @author danielfuchs
+ */
+public class LogRecordWithNanos {
+
+    static final int MILLIS_IN_SECOND = 1000;
+    static final int NANOS_IN_MILLI = 1000_000;
+    static final int NANOS_IN_SECOND = 1000_000_000;
+
+    static final boolean verbose = false;
+
+    static final class TestAssertException extends RuntimeException {
+        TestAssertException(String msg) { super(msg); }
+    }
+
+    private static void assertEquals(long expected, long received, String msg) {
+        if (expected != received) {
+            throw new TestAssertException("Unexpected result for " + msg
+                    + ".\n\texpected: " + expected
+                    +  "\n\tactual:   " + received);
+        } else if (verbose) {
+            System.out.println("Got expected " + msg + ": " + received);
+        }
+    }
+
+    /**
+     * Serializes a log record, then deserializes it and check that both
+     * records match.
+     * @param record the log record to serialize & deserialize.
+     * @throws IOException Unexpected.
+     * @throws ClassNotFoundException  Unexpected.
+     */
+    public static void test(LogRecord record)
+            throws IOException, ClassNotFoundException {
+
+        // Format the given logRecord using the SimpleFormatter
+        SimpleFormatter formatter = new SimpleFormatter();
+        String str = formatter.format(record);
+
+        // Serialize the given LogRecord
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(record);
+        oos.flush();
+        oos.close();
+
+        // First checks that the log record can be deserialized
+        final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        final ObjectInputStream ois = new ObjectInputStream(bais);
+        final LogRecord record2 = (LogRecord)ois.readObject();
+
+        assertEquals(record.getMillis(), record2.getMillis(), "getMillis()");
+        assertEquals(record.getInstant().getEpochSecond(),
+                record2.getInstant().getEpochSecond(),
+                "getInstant().getEpochSecond()");
+        assertEquals(record.getInstant().getNano(),
+                record2.getInstant().getNano(),
+                "getInstant().getNano()");
+        assertEquals(record.getInstant().toEpochMilli(),
+                record2.getInstant().toEpochMilli(),
+                "getInstant().toEpochMilli()");
+        assertEquals(record.getMillis(),
+                record.getInstant().toEpochMilli(),
+                "getMillis()/getInstant().toEpochMilli()");
+        assertEquals(record2.getMillis(),
+                record2.getInstant().toEpochMilli(),
+                "getMillis()/getInstant().toEpochMilli()");
+        assertEquals((record.getMillis()%MILLIS_IN_SECOND)*NANOS_IN_MILLI
+                + (record.getInstant().getNano() % NANOS_IN_MILLI),
+                record.getInstant().getNano(),
+                "record.getMillis()%1000)*1000_000"
+                + " + record.getInstant().getNano()%1000_000 / getInstant().getNano()");
+        assertEquals((record2.getMillis()%MILLIS_IN_SECOND)*NANOS_IN_MILLI
+                + (record2.getInstant().getNano() % NANOS_IN_MILLI),
+                record2.getInstant().getNano(),
+                "record2.getMillis()%1000)*1000_000"
+                + " + record2.getInstant().getNano()%1000_000 / getInstant().getNano()");
+
+        // Format the deserialized LogRecord using the SimpleFormatter, and
+        // check that the string representation obtained matches the string
+        // representation of the original LogRecord
+        String str2 = formatter.format(record2);
+        if (!str.equals(str2))
+            throw new RuntimeException("Unexpected values in deserialized object:"
+                + "\n\tExpected:  " + str
+                + "\n\tRetrieved: "+str);
+
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        int count=0;
+        for (int i=0; i<1000; i++) {
+            LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
+            record.setLoggerName("test");
+            record.setParameters(new Object[] {System.getProperty("java.version")});
+            if (record.getInstant().getNano() % 1000_000 != 0) {
+                count++;
+            }
+            test(record);
+        }
+        if (count == 0) {
+            throw new RuntimeException("Expected at least one record to have nanos");
+        }
+        System.out.println(count + "/1000 records had nano adjustment.");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/logging/HigherResolutionTimeStamps/LogRecordWithNanosAPI.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.time.Instant;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+/**
+ * @test
+ * @bug 8072645
+ * @summary tests the new methods added to LogRecord.
+ * @run main LogRecordWithNanosAPI
+ * @author danielfuchs
+ */
+public class LogRecordWithNanosAPI {
+
+    static final int MILLIS_IN_SECOND = 1000;
+    static final int NANOS_IN_MILLI = 1000_000;
+    static final int NANOS_IN_SECOND = 1000_000_000;
+
+    static final boolean verbose = true;
+
+    static final class TestAssertException extends RuntimeException {
+        TestAssertException(String msg) { super(msg); }
+    }
+
+    private static void assertEquals(long expected, long received, String msg) {
+        if (expected != received) {
+            throw new TestAssertException("Unexpected result for " + msg
+                    + ".\n\texpected: " + expected
+                    +  "\n\tactual:   " + received);
+        } else if (verbose) {
+            System.out.println("Got expected " + msg + ": " + received);
+        }
+    }
+
+    private static void assertEquals(Object expected, Object received, String msg) {
+        if (!Objects.equals(expected, received)) {
+            throw new TestAssertException("Unexpected result for " + msg
+                    + ".\n\texpected: " + expected
+                    +  "\n\tactual:   " + received);
+        } else if (verbose) {
+            System.out.println("Got expected " + msg + ": " + received);
+        }
+    }
+
+    // The nano second fractional part of a second, contained in a time expressed
+    // as a number of millisecond from the epoch.
+    private static long nanoInSecondFromEpochMilli(long millis) {
+        return (((millis%MILLIS_IN_SECOND) + MILLIS_IN_SECOND)%MILLIS_IN_SECOND)*NANOS_IN_MILLI;
+    }
+
+    /**
+     * Serializes a log record, then deserializes it and check that both
+     * records match.
+     * @param record the log record to serialize & deserialize.
+     * @param hasExceedingNanos whether the record has a nano adjustment whose
+     *            value exceeds 1ms.
+     * @throws IOException Unexpected.
+     * @throws ClassNotFoundException  Unexpected.
+     */
+    public static void test(LogRecord record, boolean hasExceedingNanos)
+            throws IOException, ClassNotFoundException {
+
+        // Format the given logRecord using the SimpleFormatter
+        SimpleFormatter formatter = new SimpleFormatter();
+        String str = formatter.format(record);
+
+        // Serialize the given LogRecord
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(record);
+        oos.flush();
+        oos.close();
+
+        // First checks that the log record can be deserialized
+        final ByteArrayInputStream bais =
+                new ByteArrayInputStream(baos.toByteArray());
+        final ObjectInputStream ois = new ObjectInputStream(bais);
+        final LogRecord record2 = (LogRecord)ois.readObject();
+
+        assertEquals(record.getMillis(), record2.getMillis(), "getMillis()");
+        assertEquals(record.getInstant().getEpochSecond(),
+                record2.getInstant().getEpochSecond(),
+                "getInstant().getEpochSecond()");
+        assertEquals(record.getInstant().getNano(),
+                record2.getInstant().getNano(),
+                "getInstant().getNano()");
+        assertEquals(record.getInstant().toEpochMilli(),
+                record2.getInstant().toEpochMilli(),
+                "getInstant().toEpochMilli()");
+        long millis = record.getMillis();
+        millis = hasExceedingNanos
+                ? Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                        (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI
+                        + record.getInstant().getNano() % NANOS_IN_MILLI).toEpochMilli()
+                : millis;
+        assertEquals(millis, record.getInstant().toEpochMilli(),
+                "getMillis()/getInstant().toEpochMilli()");
+        millis = record2.getMillis();
+        millis = hasExceedingNanos
+                ? Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                        (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI
+                        + record2.getInstant().getNano() % NANOS_IN_MILLI).toEpochMilli()
+                : millis;
+        assertEquals(millis, record2.getInstant().toEpochMilli(),
+                "getMillis()/getInstant().toEpochMilli()");
+        long nanos = nanoInSecondFromEpochMilli(record.getMillis())
+                + record.getInstant().getNano() % NANOS_IN_MILLI;
+        assertEquals(nanos, record.getInstant().getNano(),
+                "nanoInSecondFromEpochMilli(record.getMillis())"
+                + " + record.getInstant().getNano() % NANOS_IN_MILLI /getInstant().getNano()");
+        nanos = nanoInSecondFromEpochMilli(record2.getMillis())
+                + record2.getInstant().getNano() % NANOS_IN_MILLI;
+        assertEquals(nanos, record2.getInstant().getNano(),
+                "nanoInSecondFromEpochMilli(record2.getMillis())"
+                + " + record2.getInstant().getNano() % NANOS_IN_MILLI /getInstant().getNano()");
+
+        // Format the deserialized LogRecord using the SimpleFormatter, and
+        // check that the string representation obtained matches the string
+        // representation of the original LogRecord
+        String str2 = formatter.format(record2);
+        if (!str.equals(str2))
+            throw new RuntimeException("Unexpected values in deserialized object:"
+                + "\n\tExpected:  " + str
+                + "\n\tRetrieved: "+str);
+
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        int count=0;
+        LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
+        record.setLoggerName("test");
+        record.setParameters(new Object[] {System.getProperty("java.version")});
+        final int nanos = record.getInstant().getNano() % NANOS_IN_MILLI;
+        final long millis = record.getMillis();
+        final Instant instant = record.getInstant();
+        if (millis != instant.toEpochMilli()) {
+            throw new RuntimeException("Unexpected millis: "
+                    + record.getMillis());
+        }
+        test(record, false);
+
+        // nano adjustment < 1ms (canonical case)
+        int newNanos = (nanos + 111111) % NANOS_IN_MILLI;
+        record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newNanos));
+        assertEquals(newNanos, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis, record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newNanos),
+                record.getInstant(), "record.getInstant()");
+        test(record, false);
+        assertEquals(newNanos, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis, record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newNanos),
+                record.getInstant(), "record.getInstant()");
+
+        // nano adjustment > 1ms - non canonical - should still work
+        int newExceedingNanos = 2111_111;
+        record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
+        assertEquals(newExceedingNanos % NANOS_IN_MILLI,
+                record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis + newExceedingNanos / NANOS_IN_MILLI,
+                record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
+                record.getInstant(), "record.getInstant()");
+        test(record, true);
+        assertEquals(newExceedingNanos % NANOS_IN_MILLI,
+                record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis  + newExceedingNanos / NANOS_IN_MILLI,
+                record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
+                record.getInstant(), "record.getInstant()");
+
+        // nano adjustement > 1s - non canonical - should still work
+        newExceedingNanos = 1111_111_111;
+        record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
+        assertEquals(newExceedingNanos % NANOS_IN_MILLI,
+                record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis  + newExceedingNanos / NANOS_IN_MILLI,
+                record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
+                record.getInstant(), "record.getInstant()");
+        test(record, true);
+        assertEquals(newExceedingNanos % NANOS_IN_MILLI,
+                record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis  + newExceedingNanos / NANOS_IN_MILLI,
+                record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
+                record.getInstant(), "record.getInstant()");
+
+        // nano adjustement < 0 - non canonical - should still work
+        newExceedingNanos = -1;
+        record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
+        assertEquals(newExceedingNanos + NANOS_IN_MILLI,
+                record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        assertEquals(millis -1, record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
+                record.getInstant(), "record.getInstant()");
+        test(record, true);
+        record.setInstant(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + newExceedingNanos));
+        assertEquals(millis -1, record.getMillis(), "record.getMillis()");
+        assertEquals(Instant.ofEpochSecond(millis/MILLIS_IN_SECOND,
+                (millis%MILLIS_IN_SECOND)*NANOS_IN_MILLI + newExceedingNanos),
+                record.getInstant(), "record.getInstant()");
+
+        // setMillis
+        record.setMillis(millis-1);
+        assertEquals(millis-1, record.getInstant().toEpochMilli(),
+                "record.getInstant().toEpochMilli()");
+        assertEquals(millis-1, record.getMillis(),
+                "record.getMillis()");
+        assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        test(record, false);
+        assertEquals(millis-1, record.getInstant().toEpochMilli(),
+                "record.getInstant().toEpochMilli()");
+        assertEquals(millis-1, record.getMillis(),
+                "record.getMillis()");
+        assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+
+        // setMillis to 0
+        record.setMillis(0);
+        assertEquals(0, record.getInstant().toEpochMilli(),
+                "record.getInstant().toEpochMilli()");
+        assertEquals(0, record.getMillis(),
+                "record.getMillis()");
+        assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        test(record, false);
+        assertEquals(0, record.getInstant().toEpochMilli(),
+                "record.getInstant().toEpochMilli()");
+        assertEquals(0, record.getMillis(),
+                "record.getMillis()");
+        assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+
+        // setMillis to -1
+        record.setMillis(-1);
+        assertEquals(-1, record.getInstant().toEpochMilli(),
+                "record.getInstant().toEpochMilli()");
+        assertEquals(-1, record.getMillis(),
+                "record.getMillis()");
+        assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+        test(record, false);
+        assertEquals(-1, record.getInstant().toEpochMilli(),
+                "record.getInstant().toEpochMilli()");
+        assertEquals(-1, record.getMillis(),
+                "record.getMillis()");
+        assertEquals(0, record.getInstant().getNano() % NANOS_IN_MILLI,
+                "record.getInstant().getNano() % NANOS_IN_MILLI");
+
+        try {
+            record.setInstant(null);
+        } catch (NullPointerException x) {
+            System.out.println("Got expected NPE when trying to call record.setInstant(null): " + x);
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/logging/HigherResolutionTimeStamps/SerializeLogRecord.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.time.ZoneId;
+import java.util.Base64;
+import java.util.Locale;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+/**
+ * @test
+ * @bug 8072645
+ * @summary tests the compatibility of LogRecord serial form between
+ *          JDK 8 and JDK 9. Ideally this test should be run on both platforms.
+ *          (It is designed to run on both).
+ * @run main/othervm SerializeLogRecord
+ * @author danielfuchs
+ */
+public class SerializeLogRecord {
+
+    /**
+     * Serializes a log record, encode the serialized bytes in base 64, and
+     * prints pseudo java code that can be cut and pasted into this test.
+     * @param record the log record to serialize, encode in base 64, and for
+     *               which test data will be generated.
+     * @return A string containing the generated pseudo java code.
+     * @throws IOException Unexpected.
+     * @throws ClassNotFoundException  Unexpected.
+     */
+    public static String generate(LogRecord record) throws IOException, ClassNotFoundException {
+
+        // Format the given logRecord using the SimpleFormatter
+        SimpleFormatter formatter = new SimpleFormatter();
+        String str = formatter.format(record);
+
+        // Serialize the given LogRecord
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(record);
+        oos.flush();
+        oos.close();
+
+        // Now we're going to perform a number of smoke tests before
+        // generating the Java pseudo code.
+        //
+        // First checks that the log record can be deserialized
+        final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        final ObjectInputStream ois = new ObjectInputStream(bais);
+        final LogRecord record2 = (LogRecord)ois.readObject();
+
+        // Format the deserialized LogRecord using the SimpleFormatter, and
+        // check that the string representation obtained matches the string
+        // representation of the original LogRecord
+        String str2 = formatter.format(record2);
+        if (!str.equals(str2)) throw new RuntimeException("Unexpected values in deserialized object:"
+                + "\n\tExpected:  " + str
+                + "\n\tRetrieved: "+str);
+
+        // Now get a Base64 string representation of the serialized bytes.
+        final String base64 = Base64.getEncoder().encodeToString(baos.toByteArray());
+
+        // Check that we can deserialize a log record from the Base64 string
+        // representation we just computed.
+        final ByteArrayInputStream bais2 = new ByteArrayInputStream(Base64.getDecoder().decode(base64));
+        final ObjectInputStream ois2 = new ObjectInputStream(bais2);
+        final LogRecord record3 = (LogRecord)ois2.readObject();
+
+        // Format the new deserialized LogRecord using the SimpleFormatter, and
+        // check that the string representation obtained matches the string
+        // representation of the original LogRecord
+        String str3 = formatter.format(record3);
+        if (!str.equals(str3)) throw new RuntimeException("Unexpected values in deserialized object:"
+                + "\n\tExpected:  " + str
+                + "\n\tRetrieved: "+str);
+        //System.out.println(base64);
+        //System.out.println();
+
+        // Generates the Java Pseudo code that can be cut & pasted into
+        // this test (see Jdk8SerializedLog and Jdk9SerializedLog below)
+        final StringBuilder sb = new StringBuilder();
+        sb.append("    /**").append('\n');
+        sb.append("     * Base64 encoded string for LogRecord object.").append('\n');
+        sb.append("     * Java version: ").append(System.getProperty("java.version")).append('\n');
+        sb.append("     **/").append('\n');
+        sb.append("    final String base64 = ").append("\n          ");
+        final int last = base64.length() - 1;
+        for (int i=0; i<base64.length();i++) {
+            if (i%64 == 0) sb.append("\"");
+            sb.append(base64.charAt(i));
+            if (i%64 == 63 || i == last) {
+                sb.append("\"");
+                if (i == last) sb.append(";\n");
+                else sb.append("\n        + ");
+            }
+        }
+        sb.append('\n');
+        sb.append("    /**").append('\n');
+        sb.append("     * SimpleFormatter output for LogRecord object.").append('\n');
+        sb.append("     * Java version: ").append(System.getProperty("java.version")).append('\n');
+        sb.append("     **/").append('\n');
+        sb.append("    final String str = ").append("\n          ");
+        sb.append("\"").append(str.replace("\n", "\\n")).append("\";\n");
+        return sb.toString();
+    }
+
+    /**
+     * An abstract class to test that a log record previously serialized on a
+     * different java version can be deserialized in the current java version.
+     * (see Jdk8SerializedLog and Jdk9SerializedLog below)
+     */
+    public static abstract class SerializedLog {
+        public abstract String getBase64();
+        public abstract String getString();
+
+        /**
+         * Deserializes the Base64 encoded string returned by {@link
+         * #getBase64()}, format the obtained LogRecord using a
+         * SimpleFormatter, and checks that the string representation obtained
+         * matches the original string representation returned by {@link
+         * #getString()}.
+         */
+        protected void dotest() {
+            try {
+                final String base64 = getBase64();
+                final ByteArrayInputStream bais =
+                        new ByteArrayInputStream(Base64.getDecoder().decode(base64));
+                final ObjectInputStream ois = new ObjectInputStream(bais);
+                final LogRecord record = (LogRecord)ois.readObject();
+                final SimpleFormatter formatter = new SimpleFormatter();
+                String expected = getString();
+                String str2 = formatter.format(record);
+                check(expected, str2);
+                System.out.println(str2);
+                System.out.println("PASSED: "+this.getClass().getName()+"\n");
+            } catch (IOException | ClassNotFoundException x) {
+                throw new RuntimeException(x);
+            }
+        }
+        /**
+         * Check that the actual String representation obtained matches the
+         * expected String representation.
+         * @param expected Expected String representation, as returned by
+         *                 {@link #getString()}.
+         * @param actual   Actual String representation obtained by formatting
+         *                 the LogRecord obtained by the deserialization of the
+         *                 bytes encoded in {@link #getBase64()}.
+         */
+        protected void check(String expected, String actual) {
+            if (!expected.equals(actual)) {
+                throw new RuntimeException(this.getClass().getName()
+                    + " - Unexpected values in deserialized object:"
+                    + "\n\tExpected:  " + expected
+                    + "\n\tRetrieved: "+ actual);
+            }
+        }
+    }
+
+    public static class Jdk8SerializedLog extends SerializedLog {
+
+        // Generated by generate() on JDK 8.
+        // --------------------------------
+        // BEGIN
+
+        /**
+         * Base64 encoded string for LogRecord object.
+         * Java version: 1.8.0_11
+         **/
+        final String base64 =
+              "rO0ABXNyABtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmRKjVk982lRlgMACkoA"
+            + "Bm1pbGxpc0oADnNlcXVlbmNlTnVtYmVySQAIdGhyZWFkSURMAAVsZXZlbHQAGUxq"
+            + "YXZhL3V0aWwvbG9nZ2luZy9MZXZlbDtMAApsb2dnZXJOYW1ldAASTGphdmEvbGFu"
+            + "Zy9TdHJpbmc7TAAHbWVzc2FnZXEAfgACTAAScmVzb3VyY2VCdW5kbGVOYW1lcQB+"
+            + "AAJMAA9zb3VyY2VDbGFzc05hbWVxAH4AAkwAEHNvdXJjZU1ldGhvZE5hbWVxAH4A"
+            + "AkwABnRocm93bnQAFUxqYXZhL2xhbmcvVGhyb3dhYmxlO3hwAAABSjUCgo0AAAAA"
+            + "AAAAAAAAAAFzcgAXamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWyOiHETUXM2kgIAA0kA"
+            + "BXZhbHVlTAAEbmFtZXEAfgACTAAScmVzb3VyY2VCdW5kbGVOYW1lcQB+AAJ4cAAA"
+            + "AyB0AARJTkZPdAAic3VuLnV0aWwubG9nZ2luZy5yZXNvdXJjZXMubG9nZ2luZ3QA"
+            + "BHRlc3R0ABFKYXZhIFZlcnNpb246IHswfXBwcHB3BgEAAAAAAXQACDEuOC4wXzEx"
+            + "eA==";
+
+        /**
+         * SimpleFormatter output for LogRecord object.
+         * Java version: 1.8.0_11
+         **/
+        final String str =
+              "Dec 10, 2014 4:22:44.621000000 PM test - INFO: Java Version: 1.8.0_11";
+              //                    ^^^
+              // Notice the milli second resolution above...
+
+        // END
+        // --------------------------------
+
+        @Override
+        public String getBase64() {
+            return base64;
+        }
+
+        @Override
+        public String getString() {
+            return str;
+        }
+
+        public static void test() {
+            new Jdk8SerializedLog().dotest();
+        }
+    }
+
+    public static class Jdk9SerializedLog extends SerializedLog {
+
+        // Generated by generate() on JDK 9.
+        // --------------------------------
+        // BEGIN
+
+        /**
+         * Base64 encoded string for LogRecord object.
+         * Java version: 1.9.0-internal
+         **/
+        final String base64 =
+              "rO0ABXNyABtqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmRKjVk982lRlgMAC0oA"
+            + "Bm1pbGxpc0kADm5hbm9BZGp1c3RtZW50SgAOc2VxdWVuY2VOdW1iZXJJAAh0aHJl"
+            + "YWRJREwABWxldmVsdAAZTGphdmEvdXRpbC9sb2dnaW5nL0xldmVsO0wACmxvZ2dl"
+            + "ck5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAdtZXNzYWdlcQB+AAJMABJyZXNv"
+            + "dXJjZUJ1bmRsZU5hbWVxAH4AAkwAD3NvdXJjZUNsYXNzTmFtZXEAfgACTAAQc291"
+            + "cmNlTWV0aG9kTmFtZXEAfgACTAAGdGhyb3dudAAVTGphdmEvbGFuZy9UaHJvd2Fi"
+            + "bGU7eHAAAAFLl3u6OAAOU/gAAAAAAAAAAAAAAAFzcgAXamF2YS51dGlsLmxvZ2dp"
+            + "bmcuTGV2ZWyOiHETUXM2kgIAA0kABXZhbHVlTAAEbmFtZXEAfgACTAAScmVzb3Vy"
+            + "Y2VCdW5kbGVOYW1lcQB+AAJ4cAAAAyB0AARJTkZPdAAic3VuLnV0aWwubG9nZ2lu"
+            + "Zy5yZXNvdXJjZXMubG9nZ2luZ3QABHRlc3R0ABFKYXZhIFZlcnNpb246IHswfXBw"
+            + "cHB3BgEAAAAAAXQADjEuOS4wLWludGVybmFseA==";
+
+        /**
+         * SimpleFormatter output for LogRecord object.
+         * Java version: 1.9.0-internal
+         **/
+        final String str =
+              "Feb 17, 2015 12:20:43.192939000 PM test - INFO: Java Version: 1.9.0-internal";
+              //                       ^^^
+              // Notice the micro second resolution above...
+
+        // END
+        // --------------------------------
+
+        @Override
+        public String getBase64() {
+            return base64;
+        }
+
+        @Override
+        public String getString() {
+            return str;
+        }
+
+        @Override
+        protected void check(String expected, String actual) {
+            if (System.getProperty("java.version").startsWith("1.8")) {
+                // If we are in JDK 8 and print a log record serialized in JDK 9,
+                // then we won't be able to print anything below the millisecond
+                // precision, since that hasn't been implemented in JDK 8.
+                // Therefore - we need to replace anything below millseconds by
+                // zeroes in the expected string (which was generated on JDK 9).
+                Pattern pattern = Pattern.compile("^"
+                        + "(.*\\.[0-9][0-9][0-9])" // group1: everything up to milliseconds
+                        + "([0-9][0-9][0-9][0-9][0-9][0-9])" // group 2: micros and nanos
+                        + "(.* - .*)$"); // group three: all the rest...
+                Matcher matcher = pattern.matcher(expected);
+                if (matcher.matches()) {
+                    expected = matcher.group(1) + "000000" + matcher.group(3);
+                }
+            }
+            super.check(expected, actual);
+        }
+
+        public static void test() {
+            new Jdk9SerializedLog().dotest();
+        }
+    }
+
+    public static void generate() {
+        try {
+            LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
+            record.setLoggerName("test");
+            record.setParameters(new Object[] {System.getProperty("java.version")});
+            System.out.println(generate(record));
+        } catch (IOException | ClassNotFoundException x) {
+            throw new RuntimeException(x);
+        }
+    }
+
+    static enum TestCase { GENERATE, TESTJDK8, TESTJDK9 };
+
+    public static void main(String[] args) {
+        // Set the locale and time zone to make sure we won't depend on the
+        // test env - in particular we don't want to depend on the
+        // time zone in which the test machine might be located.
+        // So we're gong to use Locale English and Time Zone UTC for this test.
+        // (Maybe that should be Locale.ROOT?)
+        Locale.setDefault(Locale.ENGLISH);
+        TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("UTC")));
+
+        // Set the format property to make sure we always have the nanos, and
+        // to make sure it's the same format than what we used when
+        // computing the formatted string for Jdk8SerializedLog and
+        // Jdk9SerializedLog above.
+        //
+        // If you change the formatting, then you will need to regenerate
+        // the data for Jdk8SerializedLog and Jdk9SerializedLog.
+        //
+        // To do that - just run this test on JDK 8, and cut & paste the
+        // pseudo code printed by generate() into Jdk8SerializedLog.
+        // Then run this test again on JDK 9, and cut & paste the
+        // pseudo code printed by generate() into Jdk9SerializedLog.
+        // [Note: you can pass GENERATE as single arg to main() to avoid
+        //        running the actual test]
+        // Finally run the test again to check that it still passes after
+        // your modifications.
+        //
+        System.setProperty("java.util.logging.SimpleFormatter.format",
+                "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s - %4$s: %5$s%6$s");
+
+        // If no args, then run everything....
+        if (args == null || args.length == 0) {
+            args = new String[] { "GENERATE", "TESTJDK8", "TESTJDK9" };
+        }
+
+        // Run the specified test case(s)
+        Stream.of(args).map(x -> TestCase.valueOf(x)).forEach((x) -> {
+            switch(x) {
+                case GENERATE: generate(); break;
+                case TESTJDK8: Jdk8SerializedLog.test(); break;
+                case TESTJDK9: Jdk9SerializedLog.test(); break;
+            }
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/logging/HigherResolutionTimeStamps/SimpleFormatterNanos.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+/**
+ * @test
+ * @bug 8072645
+ * @summary tests that SimpleFormatter can print out dates with the new
+ *                nanosecond precision.
+ * @run main/othervm SimpleFormatterNanos
+ * @author danielfuchs
+ */
+public class SimpleFormatterNanos {
+
+    static final int MILLIS_IN_SECOND = 1000;
+    static final int NANOS_IN_MILLI = 1000_000;
+    static final int NANOS_IN_MICRO = 1000;
+    static final int NANOS_IN_SECOND = 1000_000_000;
+
+    static final boolean verbose = true;
+
+    static final class TestAssertException extends RuntimeException {
+        TestAssertException(String msg) { super(msg); }
+    }
+
+    private static void assertEquals(long expected, long received, String msg) {
+        if (expected != received) {
+            throw new TestAssertException("Unexpected result for " + msg
+                    + ".\n\texpected: " + expected
+                    +  "\n\tactual:   " + received);
+        } else if (verbose) {
+            System.out.println("Got expected " + msg + ": " + received);
+        }
+    }
+
+    static int getNanoAdjustment(LogRecord record) {
+        return record.getInstant().getNano() % NANOS_IN_MILLI;
+    }
+    static void setNanoAdjustment(LogRecord record, int nanos) {
+        record.setInstant(Instant.ofEpochSecond(record.getInstant().getEpochSecond(),
+                (record.getInstant().getNano() / NANOS_IN_MILLI) * NANOS_IN_MILLI + nanos));
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        Locale.setDefault(Locale.ENGLISH);
+        LogRecord record = new LogRecord(Level.INFO, "Java Version: {0}");
+        record.setLoggerName("test");
+        record.setParameters(new Object[] {System.getProperty("java.version")});
+        int nanos = getNanoAdjustment(record);
+        long millis = record.getMillis();
+        // make sure we don't have leading zeros when printing below
+        // the second precision
+        if (millis % MILLIS_IN_SECOND < 100) millis = millis + 100;
+        // make sure we have some nanos
+        if (nanos % NANOS_IN_MICRO == 0) nanos = nanos + 999;
+        record.setMillis(millis);
+        setNanoAdjustment(record, nanos);
+        final Instant instant = record.getInstant();
+        if (nanos < 0) {
+            throw new RuntimeException("Unexpected negative nano adjustment: "
+                    + getNanoAdjustment(record));
+        }
+        if (nanos >= NANOS_IN_MILLI) {
+            throw new RuntimeException("Nano adjustment exceeds 1ms: "
+                    + getNanoAdjustment(record));
+        }
+        if (millis != record.getMillis()) {
+            throw new RuntimeException("Unexpected millis: " + millis + " != "
+                    + record.getMillis());
+        }
+        if (millis != record.getInstant().toEpochMilli()) {
+            throw new RuntimeException("Unexpected millis: "
+                    + record.getInstant().toEpochMilli());
+        }
+        ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
+        int zdtNanos = zdt.getNano();
+        long expectedNanos = (millis % MILLIS_IN_SECOND) * NANOS_IN_MILLI + nanos;
+        assertEquals(expectedNanos, instant.getNano(), "Instant.getNano()");
+        assertEquals(expectedNanos, zdtNanos, "ZonedDateTime.getNano()");
+        String match = "."+expectedNanos+" ";
+
+        System.out.println("Testing with default format...");
+
+        SimpleFormatter formatter = new SimpleFormatter();
+        String str = formatter.format(record);
+        if (str.contains(match)) {
+            throw new RuntimeException("SimpleFormatter.format()"
+                    + " string contains unexpected nanos: "
+                    + "\n\tdid not expect match for: '" + match + "'"
+                    + "\n\tin: " + str);
+        }
+
+        System.out.println("Nanos omitted as expected: no '"+match+"' in "+str);
+
+
+        System.out.println("Changing format to print nanos...");
+        System.setProperty("java.util.logging.SimpleFormatter.format",
+                "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tN %1$Tp %2$s%n%4$s: %5$s%6$s%n");
+
+        SimpleFormatter formatter2 = new SimpleFormatter();
+        str = formatter2.format(record);
+        if (!str.contains(match)) {
+            throw new RuntimeException("SimpleFormatter.format()"
+                    + " string does not contain expected nanos: "
+                    + "\n\texpected match for: '" + match + "'"
+                    + "\n\tin: " + str);
+        }
+        System.out.println("Found expected match for '"+match+"' in "+str);
+
+
+        System.out.println("Changing format to omit nanos...");
+        System.setProperty("java.util.logging.SimpleFormatter.format",
+                "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%6$s%n");
+
+        SimpleFormatter formatter3 = new SimpleFormatter();
+        str = formatter3.format(record);
+        String notMatch = match;
+        if (str.contains(notMatch)) {
+            throw new RuntimeException("SimpleFormatter.format()"
+                    + " string contains unexpected nanos: "
+                    + "\n\tdid not expect match for: '" + notMatch + "'"
+                    + "\n\tin: " + str);
+        }
+        System.out.println("Nanos omitted as expected: no '"+notMatch+"' in "+str);
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/util/logging/HigherResolutionTimeStamps/XmlFormatterNanos.java	Tue Mar 03 08:49:13 2015 -0800
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+import java.util.logging.XMLFormatter;
+
+/**
+ * @test
+ * @bug 8072645
+ * @summary tests that XmlFormatter will print out dates with the new
+ *                nanosecond precision.
+ * @run main/othervm XmlFormatterNanos
+ * @author danielfuchs
+ */
+public class XmlFormatterNanos {
+
+    static final int MILLIS_IN_SECOND = 1000;
+    static final int NANOS_IN_MILLI = 1000_000;
+    static final int NANOS_IN_MICRO = 1000;
+    static final int NANOS_IN_SECOND = 1000_000_000;
+
+    static final boolean verbose = true;
+
+    static final class TestAssertException extends RuntimeException {
+        TestAssertException(String msg) { super(msg); }
+    }
+
+    private static void assertEquals(long expected, long received, String msg) {
+        if (expected != received) {
+            throw new TestAssertException("Unexpected result for " + msg
+                    + ".\n\texpected: " + expected
+                    +  "\n\tactual:   " + received);
+        } else if (verbose) {
+            System.out.println("Got expected " + msg + ": " + received);
+        }
+    }
+
+    private static void assertEquals(Object expected, Object received, String msg) {
+        if (!Objects.equals(expected, received)) {
+            throw new TestAssertException("Unexpected result for " + msg
+                    + ".\n\texpected: " + expected
+                    +  "\n\tactual:   " + received);
+        } else if (verbose) {
+            System.out.println("Got expected " + msg + ": " + received);
+        }
+    }
+
+    static class CustomXMLFormatter extends XMLFormatter {}
+
+    static class Configuration {
+        final Properties propertyFile;
+        private Configuration(Properties properties) {
+            propertyFile = properties;
+        }
+        public Configuration apply() {
+            try {
+                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+                propertyFile.store(bytes, testName());
+                ByteArrayInputStream bais = new ByteArrayInputStream(bytes.toByteArray());
+                LogManager.getLogManager().readConfiguration(bais);
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+            return this;
+        }
+
+        public static String useInstantProperty(Class<?> type) {
+            return type.getName()+".useInstant";
+        }
+
+        public boolean useInstant(XMLFormatter formatter) {
+            return Boolean.parseBoolean(propertyFile.getProperty(
+                    formatter.getClass().getName()+".useInstant", "true"));
+        }
+
+        public String testName() {
+            return propertyFile.getProperty("test.name", "????");
+        }
+
+        public static Configuration of(Properties props) {
+            return new Configuration(props);
+        }
+
+        public static Configuration apply(Properties props) {
+            return of(props).apply();
+        }
+    }
+
+    final static List<Properties> properties;
+    static {
+        Properties props1 = new Properties();
+        props1.setProperty("test.name", "with XML nano element (default)");
+        Properties props2 = new Properties();
+        props2.setProperty("test.name", "with XML nano element (standard=true, custom=false)");
+        props2.setProperty(Configuration.useInstantProperty(XMLFormatter.class), "true");
+        props2.setProperty(Configuration.useInstantProperty(CustomXMLFormatter.class), "false");
+        Properties props3 = new Properties();
+        props3.setProperty("test.name", "with XML nano element (standard=false, custom=true)");
+        props3.setProperty(Configuration.useInstantProperty(XMLFormatter.class), "false");
+        props3.setProperty(Configuration.useInstantProperty(CustomXMLFormatter.class), "true");
+
+        properties = Collections.unmodifiableList(Arrays.asList(
+                    props1,
+                    props2));
+    }
+
+    public static void main(String[] args) throws Exception {
+        Locale.setDefault(Locale.ENGLISH);
+        properties.stream().forEach(XmlFormatterNanos::test);
+    }
+
+    static int getNanoAdjustment(LogRecord record) {
+        return record.getInstant().getNano() % NANOS_IN_MILLI;
+    }
+    static void setNanoAdjustment(LogRecord record, int nanos) {
+        record.setInstant(Instant.ofEpochSecond(record.getInstant().getEpochSecond(),
+                (record.getInstant().getNano() / NANOS_IN_MILLI) * NANOS_IN_MILLI + nanos));
+    }
+
+    public static void test(Properties props) {
+        Configuration conf = Configuration.apply(props);
+
+        LogRecord record = new LogRecord(Level.INFO, "Test Name: {0}");
+        record.setLoggerName("test");
+        record.setParameters(new Object[] {conf.testName()});
+        int nanos = record.getInstant().getNano() % NANOS_IN_MILLI;
+        long millis = record.getMillis();
+        // make sure we don't have leading zeros when printing below
+        // the second precision
+        if (millis % MILLIS_IN_SECOND < 100) millis = millis + 100;
+        // make sure we some nanos - and make sure we don't have
+        // trailing zeros
+        if (nanos % 10 == 0) nanos = nanos + 7;
+
+        record.setMillis(millis);
+        setNanoAdjustment(record, nanos);
+        final Instant instant = record.getInstant();
+        if (nanos < 0) {
+            throw new RuntimeException("Unexpected negative nano adjustment: "
+                    + getNanoAdjustment(record));
+        }