changeset 14036:d90622182bc6

Merge
author ddehaven
date Fri, 11 Mar 2016 09:16:55 -0800
parents 90594aa72401 07645a6edaf5
children ff3eb28f63c1
files src/java.desktop/macosx/native/libosx/CFileManager.m test/javax/swing/JScrollPane/8033000/bug8033000.java
diffstat 94 files changed, 3920 insertions(+), 1391 deletions(-) [+]
line wrap: on
line diff
--- a/make/mapfiles/libawt/mapfile-mawt-vers	Fri Mar 11 18:35:26 2016 +0530
+++ b/make/mapfiles/libawt/mapfile-mawt-vers	Fri Mar 11 09:16:55 2016 -0800
@@ -200,6 +200,7 @@
                 Java_sun_print_CUPSPrinter_initIDs;
                 Java_sun_print_CUPSPrinter_getCupsServer;
                 Java_sun_print_CUPSPrinter_getCupsPort;
+                Java_sun_print_CUPSPrinter_getCupsDefaultPrinter;
                 Java_sun_print_CUPSPrinter_canConnect;
                 Java_sun_print_CUPSPrinter_getMedia;
                 Java_sun_print_CUPSPrinter_getPageSizes;
--- a/make/mapfiles/libawt_headless/mapfile-vers	Fri Mar 11 18:35:26 2016 +0530
+++ b/make/mapfiles/libawt_headless/mapfile-vers	Fri Mar 11 09:16:55 2016 -0800
@@ -73,6 +73,7 @@
 		Java_sun_print_CUPSPrinter_initIDs;
 		Java_sun_print_CUPSPrinter_getCupsServer;
 		Java_sun_print_CUPSPrinter_getCupsPort;
+		Java_sun_print_CUPSPrinter_getCupsDefaultPrinter;
 		Java_sun_print_CUPSPrinter_canConnect;
 		Java_sun_print_CUPSPrinter_getMedia;
 		Java_sun_print_CUPSPrinter_getPageSizes;
--- a/make/mapfiles/libawt_xawt/mapfile-vers	Fri Mar 11 18:35:26 2016 +0530
+++ b/make/mapfiles/libawt_xawt/mapfile-vers	Fri Mar 11 09:16:55 2016 -0800
@@ -439,6 +439,7 @@
 	Java_sun_print_CUPSPrinter_initIDs;
 	Java_sun_print_CUPSPrinter_getCupsServer;
 	Java_sun_print_CUPSPrinter_getCupsPort;
+	Java_sun_print_CUPSPrinter_getCupsDefaultPrinter;
 	Java_sun_print_CUPSPrinter_canConnect;
 	Java_sun_print_CUPSPrinter_getMedia;
 	Java_sun_print_CUPSPrinter_getPageSizes;
--- a/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java	Fri Mar 11 09:16:55 2016 -0800
@@ -40,6 +40,7 @@
 
 import com.apple.laf.AquaUtils.RecyclableSingleton;
 import com.apple.laf.AquaInternalFrameBorderMetrics;
+import java.awt.geom.AffineTransform;
 
 public class AquaInternalFrameBorder implements Border, UIResource {
     private static final int kCloseButton = 0;
@@ -309,18 +310,40 @@
         return isInsideYButtonArea(i, y) && x >= startX && x <= endX;
     }
 
-    protected void paintTitleIcon(final Graphics g, final JInternalFrame frame, final int x, final int y) {
+    protected void paintTitleIcon(final Graphics g, final JInternalFrame frame,
+            final int x, final int y) {
+
         Icon icon = frame.getFrameIcon();
-        if (icon == null) icon = UIManager.getIcon("InternalFrame.icon");
-        if (icon == null) return;
-
-        // Resize to 16x16 if necessary.
-        if (icon instanceof ImageIcon && (icon.getIconWidth() > sMaxIconWidth || icon.getIconHeight() > sMaxIconHeight)) {
-            final Image img = ((ImageIcon)icon).getImage();
-            ((ImageIcon)icon).setImage(img.getScaledInstance(sMaxIconWidth, sMaxIconHeight, Image.SCALE_SMOOTH));
+        if (icon == null) {
+            icon = UIManager.getIcon("InternalFrame.icon");
         }
 
-        icon.paintIcon(frame, g, x, y);
+        if (icon == null) {
+            return;
+        }
+
+        if (icon.getIconWidth() > sMaxIconWidth
+                || icon.getIconHeight() > sMaxIconHeight) {
+            final Graphics2D g2 = (Graphics2D) g;
+            final AffineTransform savedAT = g2.getTransform();
+            double xScaleFactor = (double) sMaxIconWidth / icon.getIconWidth();
+            double yScaleFactor = (double) sMaxIconHeight / icon.getIconHeight();
+
+            //Coordinates are after a translation hence relative origin shifts
+            g2.translate(x, y);
+
+            //scaling factor is needed to scale while maintaining aspect ratio
+            double scaleMaintainAspectRatio = Math.min(xScaleFactor, yScaleFactor);
+
+            //minimum value is taken to set to a maximum Icon Dimension
+            g2.scale(scaleMaintainAspectRatio, scaleMaintainAspectRatio);
+
+            icon.paintIcon(frame, g2, 0, 0);
+            g2.setTransform(savedAT);
+
+        } else {
+            icon.paintIcon(frame, g, x, y);
+        }
     }
 
     protected int getIconWidth(final JInternalFrame frame) {
@@ -330,9 +353,7 @@
         if (icon == null) {
             icon = UIManager.getIcon("InternalFrame.icon");
         }
-
-        if (icon != null && icon instanceof ImageIcon) {
-            // Resize to 16x16 if necessary.
+        if (icon != null) {
             width = Math.min(icon.getIconWidth(), sMaxIconWidth);
         }
 
@@ -346,9 +367,7 @@
         if (icon == null) {
             icon = UIManager.getIcon("InternalFrame.icon");
         }
-
-        if (icon != null && icon instanceof ImageIcon) {
-            // Resize to 16x16 if necessary.
+        if (icon != null) {
             height = Math.min(icon.getIconHeight(), sMaxIconHeight);
         }
 
--- a/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderUI.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderUI.java	Fri Mar 11 09:16:55 2016 -0800
@@ -128,14 +128,17 @@
             // Modify the table "border" to draw smaller, and with the titles in the right position
             // and sort indicators, just like an NSSave/Open panel.
             final AquaTableHeaderBorder cellBorder = AquaTableHeaderBorder.getListHeaderBorder();
-            final boolean thisColumnSelected = localTable.getColumnModel().getColumn(column).getModelIndex() == sortColumn;
+            cellBorder.setSortOrder(AquaTableHeaderBorder.SORT_NONE);
 
-            cellBorder.setSelected(thisColumnSelected);
-            if (thisColumnSelected) {
-                cellBorder.setSortOrder(sortOrder);
-            } else {
-                cellBorder.setSortOrder(AquaTableHeaderBorder.SORT_NONE);
+            if (localTable != null) {
+                final boolean thisColumnSelected = localTable.getColumnModel().getColumn(column).getModelIndex() == sortColumn;
+
+                cellBorder.setSelected(thisColumnSelected);
+                if (thisColumnSelected) {
+                    cellBorder.setSortOrder(sortOrder);
+               }
             }
+
             setBorder(cellBorder);
             return this;
         }
--- a/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTEvent.m	Fri Mar 11 09:16:55 2016 -0800
@@ -134,7 +134,7 @@
     {0x3D, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
     {0x3E, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
     {0x3F, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED}, // the 'fn' key on PowerBooks
-    {0x40, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
+    {0x40, NO,  KL_STANDARD, java_awt_event_KeyEvent_VK_F17},
     {0x41, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_DECIMAL},
     {0x42, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
     {0x43, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_MULTIPLY},
@@ -149,8 +149,8 @@
     {0x4C, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_ENTER},
     {0x4D, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
     {0x4E, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_SUBTRACT},
-    {0x4F, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
-    {0x50, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
+    {0x4F, NO,  KL_STANDARD, java_awt_event_KeyEvent_VK_F18},
+    {0x50, NO,  KL_STANDARD, java_awt_event_KeyEvent_VK_F19},
     {0x51, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_EQUALS},
     {0x52, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD0},
     {0x53, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD1},
@@ -160,7 +160,7 @@
     {0x57, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD5},
     {0x58, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD6},
     {0x59, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD7},
-    {0x5A, NO,  KL_UNKNOWN,  java_awt_event_KeyEvent_VK_UNDEFINED},
+    {0x5A, NO,  KL_STANDARD, java_awt_event_KeyEvent_VK_F20},
     {0x5B, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD8},
     {0x5C, YES, KL_NUMPAD,   java_awt_event_KeyEvent_VK_NUMPAD9},
     {0x5D, YES, KL_STANDARD, java_awt_event_KeyEvent_VK_BACK_SLASH}, // This is a combo yen/backslash on JIS keyboards.
--- a/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -624,7 +624,8 @@
 {
     NSString *selectedText = [self accessibleSelectedText];
     NSAttributedString *styledText = [[NSAttributedString alloc] initWithString:selectedText];
-    NSData *rtfdData = [styledText RTFDFromRange:NSMakeRange(0, [styledText length]) documentAttributes:nil];
+    NSData *rtfdData = [styledText RTFDFromRange:NSMakeRange(0, [styledText length])
+                              documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType}];
     [styledText release];
     return rtfdData;
 }
@@ -681,7 +682,7 @@
     if ([[pboard types] containsObject:NSRTFDPboardType])
     {
         NSData *rtfdData = [pboard dataForType:NSRTFDPboardType];
-        NSAttributedString *styledText = [[NSAttributedString alloc] initWithRTFD:rtfdData documentAttributes:nil];
+        NSAttributedString *styledText = [[NSAttributedString alloc] initWithRTFD:rtfdData documentAttributes:NULL];
         NSString *text = [styledText string];
         [styledText release];
 
--- a/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -743,9 +743,10 @@
 JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {
     OSXAPP_SetJavaVM(vm);
 
-    // We need to let Foundation know that this is a multithreaded application, if it isn't already.
+    // We need to let Foundation know that this is a multithreaded application,
+    // if it isn't already.
     if (![NSThread isMultiThreaded]) {
-        [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil];
+        [[[[NSThread alloc] init] autorelease] start];
     }
 
     return JNI_VERSION_1_4;
--- a/src/java.desktop/macosx/native/libosx/CFileManager.m	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/macosx/native/libosx/CFileManager.m	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -213,25 +213,23 @@
  */
 
 JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1moveToTrash
-(JNIEnv *env, jclass clz, jstring url)
+(JNIEnv *env, jclass clz, jstring fileName)
 {
-        __block jboolean returnValue = JNI_FALSE;
+    __block BOOL returnValue = NO;
 JNF_COCOA_ENTER(env);
 
-    NSString *path = JNFNormalizedNSStringForPath(env, url);
+    NSString * path = JNFNormalizedNSStringForPath(env, fileName);
+    NSURL *url = [NSURL fileURLWithPath:path];
     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
-        NSInteger res = 0;
-        [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation
-                                                     source:[path stringByDeletingLastPathComponent]
-                                                destination:nil
-                                                      files:[NSArray arrayWithObject:[path lastPathComponent]]
-                                                        tag:&res];
-        returnValue = (res == 0);
+
+        returnValue  = [[NSFileManager defaultManager] trashItemAtURL:url
+                                                     resultingItemURL:nil
+                                                                error:nil];
     }];
 
 JNF_COCOA_EXIT(env);
 
-        return returnValue;
+        return returnValue ? JNI_TRUE: JNI_FALSE;
 }
 
 /*
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -86,16 +86,16 @@
 
     /**
      * Whether to write abbreviated JPEG streams (default == false).
-     * A subclass which sets this to <code>true</code> should also
+     * A subclass which sets this to {@code true} should also
      * initialized {@link #JPEGStreamMetadata}.
      */
     protected boolean writeAbbreviatedStream = false;
 
     /**
      * Stream metadata equivalent to a tables-only stream such as in
-     * the <code>JPEGTables</code>. Default value is <code>null</code>.
+     * the {@code JPEGTables}. Default value is {@code null}.
      * This should be set by any subclass which sets
-     * {@link writeAbbreviatedStream} to <code>true</code>.
+     * {@link writeAbbreviatedStream} to {@code true}.
      */
     protected IIOMetadata JPEGStreamMetadata = null;
 
@@ -108,15 +108,15 @@
     /**
      * Removes nonessential nodes from a JPEG native image metadata tree.
      * All nodes derived from JPEG marker segments other than DHT, DQT,
-     * SOF, SOS segments are removed unless <code>pruneTables</code> is
-     * <code>true</code> in which case the nodes derived from the DHT and
+     * SOF, SOS segments are removed unless {@code pruneTables} is
+     * {@code true} in which case the nodes derived from the DHT and
      * DQT marker segments are also removed.
      *
      * @param tree A <tt>javax_imageio_jpeg_image_1.0</tt> tree.
      * @param pruneTables Whether to prune Huffman and quantization tables.
-     * @throws NullPointerException if <code>tree</code> is
-     * <code>null</code>.
-     * @throws IllegalArgumentException if <code>tree</code> is not the root
+     * @throws NullPointerException if {@code tree} is
+     * {@code null}.
+     * @throws IllegalArgumentException if {@code tree} is not the root
      * of a JPEG native image metadata tree.
      */
     private static void pruneNodes(Node tree, boolean pruneTables) {
@@ -182,8 +182,8 @@
     }
 
     /**
-     * A <code>ByteArrayOutputStream</code> which allows writing to an
-     * <code>ImageOutputStream</code>.
+     * A {@code ByteArrayOutputStream} which allows writing to an
+     * {@code ImageOutputStream}.
      */
     private static class IIOByteArrayOutputStream extends ByteArrayOutputStream {
         IIOByteArrayOutputStream() {
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,39 +31,39 @@
 public abstract class TIFFColorConverter {
 
     /**
-     * Constructs an instance of a <code>TIFFColorConverter</code>.
+     * Constructs an instance of a {@code TIFFColorConverter}.
      */
     public TIFFColorConverter() {}
 
     /**
      * Converts an RGB triple into the native color space of this
      * TIFFColorConverter, and stores the result in the first three
-     * entries of the <code>result</code> array.
+     * entries of the {@code result} array.
      *
      * @param r the red value.
      * @param g the green value.
      * @param b the blue value.
-     * @param result an array of <code>float</code>s containing three elements.
-     * @throws NullPointerException if <code>result</code> is
-     * <code>null</code>.
+     * @param result an array of {@code float}s containing three elements.
+     * @throws NullPointerException if {@code result} is
+     * {@code null}.
      * @throws ArrayIndexOutOfBoundsException if
-     * <code>result.length&nbsp;&lt;&nbsp;3</code>.
+     * {@code result.length&nbsp;&lt;&nbsp;3}.
      */
     public abstract void fromRGB(float r, float g, float b, float[] result);
 
     /**
      * Converts  a   triple  in  the   native  color  space   of  this
      * TIFFColorConverter into an RGB triple, and stores the result in
-     * the first three entries of the <code>rgb</code> array.
+     * the first three entries of the {@code rgb} array.
      *
      * @param x0 the value of channel 0.
      * @param x1 the value of channel 1.
      * @param x2 the value of channel 2.
-     * @param rgb an array of <code>float</code>s containing three elements.
-     * @throws NullPointerException if <code>rgb</code> is
-     * <code>null</code>.
+     * @param rgb an array of {@code float}s containing three elements.
+     * @throws NullPointerException if {@code rgb} is
+     * {@code null}.
      * @throws ArrayIndexOutOfBoundsException if
-     * <code>rgb.length&nbsp;&lt;&nbsp;3</code>.
+     * {@code rgb.length&nbsp;&lt;&nbsp;3}.
      */
     public abstract void toRGB(float x0, float x1, float x2, float[] rgb);
 }
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFCompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFCompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,13 +35,13 @@
 public abstract class TIFFCompressor {
 
     /**
-     * The <code>ImageWriter</code> calling this
-     * <code>TIFFCompressor</code>.
+     * The {@code ImageWriter} calling this
+     * {@code TIFFCompressor}.
      */
     protected ImageWriter writer;
 
     /**
-     * The <code>IIOMetadata</code> object containing metadata for the
+     * The {@code IIOMetadata} object containing metadata for the
      * current image.
      */
     protected IIOMetadata metadata;
@@ -63,7 +63,7 @@
     protected boolean isCompressionLossless;
 
     /**
-     * The <code>ImageOutputStream</code> to be written.
+     * The {@code ImageOutputStream} to be written.
      */
     protected ImageOutputStream stream;
 
@@ -75,26 +75,26 @@
      * to provide the implementation of the compression algorithm of an
      * unsupported compression type.
      *
-     * <p>The parameters <code>compressionTagValue</code> and
-     * <code>isCompressionLossless</code> are provided to accomodate
+     * <p>The parameters {@code compressionTagValue} and
+     * {@code isCompressionLossless} are provided to accomodate
      * compression types which are unknown. A compression type is
      * "known" if it is either among those already supported by the
      * TIFF writer (see {@link TIFFImageWriteParam}), or is listed in
      * the TIFF 6.0 specification but not supported. If the compression
-     * type is unknown, the <code>compressionTagValue</code> and
-     * <code>isCompressionLossless</code> parameters are ignored.</p>
+     * type is unknown, the {@code compressionTagValue} and
+     * {@code isCompressionLossless} parameters are ignored.</p>
      *
      * @param compressionType The name of the compression type.
      * @param compressionTagValue The value to be assigned to the TIFF
      * <i>Compression</i> tag in the TIFF image metadata; ignored if
-     * <code>compressionType</code> is a known type.
+     * {@code compressionType} is a known type.
      * @param isCompressionLossless Whether the compression is lossless;
-     * ignored if <code>compressionType</code> is a known type.
+     * ignored if {@code compressionType} is a known type.
      *
-     * @throws NullPointerException if <code>compressionType</code> is
-     * <code>null</code>.
-     * @throws IllegalArgumentException if <code>compressionTagValue</code> is
-     * less <code>1</code>.
+     * @throws NullPointerException if {@code compressionType} is
+     * {@code null}.
+     * @throws IllegalArgumentException if {@code compressionTagValue} is
+     * less {@code 1}.
      */
     public TIFFCompressor(String compressionType,
                           int compressionTagValue,
@@ -163,9 +163,9 @@
     }
 
     /**
-     * Sets the <code>ImageOutputStream</code> to be written.
+     * Sets the {@code ImageOutputStream} to be written.
      *
-     * @param stream an <code>ImageOutputStream</code> to be written.
+     * @param stream an {@code ImageOutputStream} to be written.
      *
      * @see #getStream
      */
@@ -174,9 +174,9 @@
     }
 
     /**
-     * Returns the <code>ImageOutputStream</code> that will be written.
+     * Returns the {@code ImageOutputStream} that will be written.
      *
-     * @return an <code>ImageOutputStream</code>.
+     * @return an {@code ImageOutputStream}.
      *
      * @see #setStream(ImageOutputStream)
      */
@@ -185,9 +185,9 @@
     }
 
     /**
-     * Sets the value of the <code>writer</code> field.
+     * Sets the value of the {@code writer} field.
      *
-     * @param writer the current <code>ImageWriter</code>.
+     * @param writer the current {@code ImageWriter}.
      *
      * @see #getWriter()
      */
@@ -196,9 +196,9 @@
     }
 
     /**
-     * Returns the current <code>ImageWriter</code>.
+     * Returns the current {@code ImageWriter}.
      *
-     * @return an <code>ImageWriter</code>.
+     * @return an {@code ImageWriter}.
      *
      * @see #setWriter(ImageWriter)
      */
@@ -207,9 +207,9 @@
     }
 
     /**
-     * Sets the value of the <code>metadata</code> field.
+     * Sets the value of the {@code metadata} field.
      *
-     * @param metadata the <code>IIOMetadata</code> object for the
+     * @param metadata the {@code IIOMetadata} object for the
      * image being written.
      *
      * @see #getMetadata()
@@ -219,9 +219,9 @@
     }
 
     /**
-     * Returns the current <code>IIOMetadata</code> object.
+     * Returns the current {@code IIOMetadata} object.
      *
-     * @return the <code>IIOMetadata</code> object for the image being
+     * @return the {@code IIOMetadata} object for the image being
      * written.
      *
      * @see #setMetadata(IIOMetadata)
@@ -232,15 +232,15 @@
 
     /**
      * Encodes the supplied image data, writing to the currently set
-     * <code>ImageOutputStream</code>.
+     * {@code ImageOutputStream}.
      *
-     * @param b an array of <code>byte</code>s containing the packed
+     * @param b an array of {@code byte}s containing the packed
      * but uncompressed image data.
      * @param off the starting offset of the data to be written in the
-     * array <code>b</code>.
+     * array {@code b}.
      * @param width the width of the rectangle of pixels to be written.
      * @param height the height of the rectangle of pixels to be written.
-     * @param bitsPerSample an array of <code>int</code>s indicting
+     * @param bitsPerSample an array of {@code int}s indicting
      * the number of bits used to represent each image sample within
      * a pixel.
      * @param scanlineStride the number of bytes separating each
@@ -249,7 +249,7 @@
      * @return the number of bytes written.
      *
      * @throws IOException if the supplied data cannot be encoded by
-     * this <code>TIFFCompressor</code>, or if any I/O error occurs
+     * this {@code TIFFCompressor}, or if any I/O error occurs
      * during writing.
      */
     public abstract int encode(byte[] b, int off,
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -81,7 +81,7 @@
  *
  * <p> Decompressors may be written with various levels of complexity.
  * The most complex decompressors will override the
- * <code>decode</code> method, and will perform all the work of
+ * {@code decode} method, and will perform all the work of
  * decoding, subsampling, offsetting, clipping, and format conversion.
  * This approach may be the most efficient, since it is possible to
  * avoid the use of extra image buffers, and it may be possible to
@@ -89,35 +89,35 @@
  * the destination.
  *
  * <p> Less ambitious decompressors may override the
- * <code>decodeRaw</code> method, which is responsible for
+ * {@code decodeRaw} method, which is responsible for
  * decompressing the entire tile or strip into a byte array (or other
  * appropriate datatype).  The default implementation of
- * <code>decode</code> will perform all necessary setup of buffers,
- * call <code>decodeRaw</code> to perform the actual decoding, perform
+ * {@code decode} will perform all necessary setup of buffers,
+ * call {@code decodeRaw} to perform the actual decoding, perform
  * subsampling, and copy the results into the final destination image.
  * Where possible, it will pass the real image buffer to
- * <code>decodeRaw</code> in order to avoid making an extra copy.
+ * {@code decodeRaw} in order to avoid making an extra copy.
  *
  * <p> Slightly more ambitious decompressors may override
- * <code>decodeRaw</code>, but avoid writing pixels that will be
+ * {@code decodeRaw}, but avoid writing pixels that will be
  * discarded in the subsampling phase.
  */
 public abstract class TIFFDecompressor {
 
     /**
-     * The <code>ImageReader</code> calling this
-     * <code>TIFFDecompressor</code>.
+     * The {@code ImageReader} calling this
+     * {@code TIFFDecompressor}.
      */
     protected ImageReader reader;
 
     /**
-     * The <code>IIOMetadata</code> object containing metadata for the
+     * The {@code IIOMetadata} object containing metadata for the
      * current image.
      */
     protected IIOMetadata metadata;
 
     /**
-     * The value of the <code>PhotometricInterpretation</code> tag.
+     * The value of the {@code PhotometricInterpretation} tag.
      * Legal values are {@link
      * BaselineTIFFTagSet#PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO },
      * {@link
@@ -135,7 +135,7 @@
     protected int photometricInterpretation;
 
     /**
-     * The value of the <code>Compression</code> tag. Legal values are
+     * The value of the {@code Compression} tag. Legal values are
      * {@link BaselineTIFFTagSet#COMPRESSION_NONE}, {@link
      * BaselineTIFFTagSet#COMPRESSION_CCITT_RLE}, {@link
      * BaselineTIFFTagSet#COMPRESSION_CCITT_T_4}, {@link
@@ -151,23 +151,23 @@
     protected int compression;
 
     /**
-     * <code>true</code> if the image is encoded using separate planes.
+     * {@code true} if the image is encoded using separate planes.
      */
     protected boolean planar;
 
     /**
-     * The value of the <code>SamplesPerPixel</code> tag.
+     * The value of the {@code SamplesPerPixel} tag.
      */
     protected int samplesPerPixel;
 
     /**
-     * The value of the <code>BitsPerSample</code> tag.
+     * The value of the {@code BitsPerSample} tag.
      *
      */
     protected int[] bitsPerSample;
 
     /**
-     * The value of the <code>SampleFormat</code> tag.  Legal values
+     * The value of the {@code SampleFormat} tag.  Legal values
      * are {@link BaselineTIFFTagSet#SAMPLE_FORMAT_UNSIGNED_INTEGER},
      * {@link BaselineTIFFTagSet#SAMPLE_FORMAT_SIGNED_INTEGER}, {@link
      * BaselineTIFFTagSet#SAMPLE_FORMAT_FLOATING_POINT}, {@link
@@ -178,7 +178,7 @@
         new int[] {BaselineTIFFTagSet.SAMPLE_FORMAT_UNSIGNED_INTEGER};
 
     /**
-     * The value of the <code>ExtraSamples</code> tag.  Legal values
+     * The value of the {@code ExtraSamples} tag.  Legal values
      * are {@link BaselineTIFFTagSet#EXTRA_SAMPLES_UNSPECIFIED},
      * {@link BaselineTIFFTagSet#EXTRA_SAMPLES_ASSOCIATED_ALPHA},
      * {@link BaselineTIFFTagSet#EXTRA_SAMPLES_UNASSOCIATED_ALPHA},
@@ -187,7 +187,7 @@
     protected int[] extraSamples;
 
     /**
-     * The value of the <code>ColorMap</code> tag.
+     * The value of the {@code ColorMap} tag.
      *
      */
     protected char[] colorMap;
@@ -195,20 +195,20 @@
     // Region of input stream containing the data
 
     /**
-     * The <code>ImageInputStream</code> containing the TIFF source
+     * The {@code ImageInputStream} containing the TIFF source
      * data.
      */
     protected ImageInputStream stream;
 
     /**
-     * The offset in the source <code>ImageInputStream</code> of the
+     * The offset in the source {@code ImageInputStream} of the
      * start of the data to be decompressed.
      */
     protected long offset;
 
     /**
      * The number of bytes of data from the source
-     * <code>ImageInputStream</code> to be decompressed.
+     * {@code ImageInputStream} to be decompressed.
      */
     protected int byteCount;
 
@@ -244,15 +244,15 @@
     // Subsampling to be performed
 
     /**
-     * The source X offset used, along with <code>dstXOffset</code>
-     * and <code>subsampleX</code>, to map between horizontal source
+     * The source X offset used, along with {@code dstXOffset}
+     * and {@code subsampleX}, to map between horizontal source
      * and destination pixel coordinates.
      */
     protected int sourceXOffset;
 
     /**
      * The horizontal destination offset used, along with
-     * <code>sourceXOffset</code> and <code>subsampleX</code>, to map
+     * {@code sourceXOffset} and {@code subsampleX}, to map
      * between horizontal source and destination pixel coordinates.
      * See the comment for {@link #sourceXOffset sourceXOffset} for
      * the mapping equations.
@@ -260,15 +260,15 @@
     protected int dstXOffset;
 
     /**
-     * The source Y offset used, along with <code>dstYOffset</code>
-     * and <code>subsampleY</code>, to map between vertical source and
+     * The source Y offset used, along with {@code dstYOffset}
+     * and {@code subsampleY}, to map between vertical source and
      * destination pixel coordinates.
      */
     protected int sourceYOffset;
 
     /**
      * The vertical destination offset used, along with
-     * <code>sourceYOffset</code> and <code>subsampleY</code>, to map
+     * {@code sourceYOffset} and {@code subsampleY}, to map
      * between horizontal source and destination pixel coordinates.
      * See the comment for {@link #sourceYOffset sourceYOffset} for
      * the mapping equations.
@@ -305,7 +305,7 @@
     // Destination for decodeRaw
 
     /**
-     * A <code>BufferedImage</code> for the <code>decodeRaw</code>
+     * A {@code BufferedImage} for the {@code decodeRaw}
      * method to write into.
      */
     protected BufferedImage rawImage;
@@ -345,15 +345,15 @@
      * The X coordinate of the upper-left source pixel that will
      * actually be copied into the destination image, taking into
      * account all subsampling, offsetting, and clipping.  That is,
-     * the pixel at (<code>activeSrcMinX</code>,
-     * <code>activeSrcMinY</code>) is to be copied into the
-     * destination pixel at (<code>dstMinX</code>,
-     * <code>dstMinY</code>).
+     * the pixel at ({@code activeSrcMinX},
+     * {@code activeSrcMinY}) is to be copied into the
+     * destination pixel at ({@code dstMinX},
+     * {@code dstMinY}).
      *
      * <p> The pixels in the source region to be copied are
-     * those with X coordinates of the form <code>activeSrcMinX +
-     * k*subsampleX</code>, where <code>k</code> is an integer such
-     * that <code>0 &le; k &lt; dstWidth</code>.
+     * those with X coordinates of the form {@code activeSrcMinX +
+     * k*subsampleX}, where {@code k} is an integer such
+     * that {@code 0 &le; k &lt; dstWidth}.
      */
     protected int activeSrcMinX;
 
@@ -363,9 +363,9 @@
      * all subsampling, offsetting, and clipping.
      *
      * <p> The pixels in the source region to be copied are
-     * those with Y coordinates of the form <code>activeSrcMinY +
-     * k*subsampleY</code>, where <code>k</code> is an integer such
-     * that <code>0 &le; k &lt; dstHeight</code>.
+     * those with Y coordinates of the form {@code activeSrcMinY +
+     * k*subsampleY}, where {@code k} is an integer such
+     * that {@code 0 &le; k &lt; dstHeight}.
      */
     protected int activeSrcMinY;
 
@@ -375,7 +375,7 @@
      * susbampling, offsetting, and clipping.
      *
      * <p> The active source width will always be equal to
-     * <code>(dstWidth - 1)*subsampleX + 1</code>.
+     * {@code (dstWidth - 1)*subsampleX + 1}.
      */
     protected int activeSrcWidth;
 
@@ -385,13 +385,13 @@
      * susbampling, offsetting, and clipping.
      *
      * <p> The active source height will always be equal to
-     * <code>(dstHeight - 1)*subsampleY + 1</code>.
+     * {@code (dstHeight - 1)*subsampleY + 1}.
      */
     protected int activeSrcHeight;
 
     /**
-     * A <code>TIFFColorConverter</code> object describing the color space of
-     * the encoded pixel data, or <code>null</code>.
+     * A {@code TIFFColorConverter} object describing the color space of
+     * the encoded pixel data, or {@code null}.
      */
     protected TIFFColorConverter colorConverter;
 
@@ -420,13 +420,13 @@
     // to exactly those dest pixels that are present in the source region.
 
     /**
-     * Create a <code>PixelInterleavedSampleModel</code> for use in creating
-     * an <code>ImageTypeSpecifier</code>.  Its dimensions will be 1x1 and
+     * Create a {@code PixelInterleavedSampleModel} for use in creating
+     * an {@code ImageTypeSpecifier}.  Its dimensions will be 1x1 and
      * it will have ascending band offsets as {0, 1, 2, ..., numBands}.
      *
      * @param dataType The data type (DataBuffer.TYPE_*).
      * @param numBands The number of bands.
-     * @return A <code>PixelInterleavedSampleModel</code>.
+     * @return A {@code PixelInterleavedSampleModel}.
      */
     static SampleModel createInterleavedSM(int dataType,
                                            int numBands) {
@@ -443,8 +443,8 @@
     }
 
     /**
-     * Create a <code>ComponentColorModel</code> for use in creating
-     * an <code>ImageTypeSpecifier</code>.
+     * Create a {@code ComponentColorModel} for use in creating
+     * an {@code ImageTypeSpecifier}.
      */
     // This code was copied from javax.imageio.ImageTypeSpecifier.
     static ColorModel createComponentCM(ColorSpace colorSpace,
@@ -518,8 +518,8 @@
     }
 
     /**
-     * Return the number of bits occupied by <code>dataType</code>
-     * which must be one of the <code>DataBuffer</code> <code>TYPE</code>s.
+     * Return the number of bits occupied by {@code dataType}
+     * which must be one of the {@code DataBuffer} {@code TYPE}s.
      */
     private static int getDataTypeSize(int dataType) throws IIOException {
         int dataTypeSize = 0;
@@ -578,7 +578,7 @@
     }
 
     /**
-     * Determines whether the <code>DataBuffer</code> is filled without
+     * Determines whether the {@code DataBuffer} is filled without
      * any interspersed padding bits.
      */
     private static boolean isDataBufferBitContiguous(SampleModel sm)
@@ -678,8 +678,8 @@
     }
 
     /**
-     * Reformats bit-discontiguous data into the <code>DataBuffer</code>
-     * of the supplied <code>WritableRaster</code>.
+     * Reformats bit-discontiguous data into the {@code DataBuffer}
+     * of the supplied {@code WritableRaster}.
      */
     private static void reformatDiscontiguousData(byte[] buf,
                                                   int stride,
@@ -715,21 +715,21 @@
 
     /**
      * A utility method that returns an
-     * <code>ImageTypeSpecifier</code> suitable for decoding an image
+     * {@code ImageTypeSpecifier} suitable for decoding an image
      * with the given parameters.
      *
      * @param photometricInterpretation the value of the
-     * <code>PhotometricInterpretation</code> field.
-     * @param compression the value of the <code>Compression</code> field.
+     * {@code PhotometricInterpretation} field.
+     * @param compression the value of the {@code Compression} field.
      * @param samplesPerPixel the value of the
-     * <code>SamplesPerPixel</code> field.
-     * @param bitsPerSample the value of the <code>BitsPerSample</code> field.
-     * @param sampleFormat the value of the <code>SampleFormat</code> field.
-     * @param extraSamples the value of the <code>ExtraSamples</code> field.
-     * @param colorMap the value of the <code>ColorMap</code> field.
+     * {@code SamplesPerPixel} field.
+     * @param bitsPerSample the value of the {@code BitsPerSample} field.
+     * @param sampleFormat the value of the {@code SampleFormat} field.
+     * @param extraSamples the value of the {@code ExtraSamples} field.
+     * @param colorMap the value of the {@code ColorMap} field.
      *
-     * @return a suitable <code>ImageTypeSpecifier</code>, or
-     * <code>null</code> if it is not possible to create one.
+     * @return a suitable {@code ImageTypeSpecifier}, or
+     * {@code null} if it is not possible to create one.
      */
     public static ImageTypeSpecifier
         getRawImageTypeSpecifier(int photometricInterpretation,
@@ -1216,26 +1216,26 @@
     }
 
     /**
-     * Sets the value of the <code>reader</code> field.
+     * Sets the value of the {@code reader} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param reader the current <code>ImageReader</code>.
+     * @param reader the current {@code ImageReader}.
      */
     public void setReader(ImageReader reader) {
         this.reader = reader;
     }
 
     /**
-     * Sets the value of the <code>metadata</code> field.
+     * Sets the value of the {@code metadata} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param metadata the <code>IIOMetadata</code> object for the
+     * @param metadata the {@code IIOMetadata} object for the
      * image being read.
      */
     public void setMetadata(IIOMetadata metadata) {
@@ -1243,10 +1243,10 @@
     }
 
     /**
-     * Sets the value of the <code>photometricInterpretation</code>
+     * Sets the value of the {@code photometricInterpretation}
      * field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1258,9 +1258,9 @@
     }
 
     /**
-     * Sets the value of the <code>compression</code> field.
+     * Sets the value of the {@code compression} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1271,13 +1271,13 @@
     }
 
     /**
-     * Sets the value of the <code>planar</code> field.
+     * Sets the value of the {@code planar} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param planar <code>true</code> if the image to be decoded is
+     * @param planar {@code true} if the image to be decoded is
      * stored in planar format.
      */
     public void setPlanar(boolean planar) {
@@ -1285,9 +1285,9 @@
     }
 
     /**
-     * Sets the value of the <code>samplesPerPixel</code> field.
+     * Sets the value of the {@code samplesPerPixel} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1299,9 +1299,9 @@
     }
 
     /**
-     * Sets the value of the <code>bitsPerSample</code> field.
+     * Sets the value of the {@code bitsPerSample} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1314,9 +1314,9 @@
     }
 
     /**
-     * Sets the value of the <code>sampleFormat</code> field.
+     * Sets the value of the {@code sampleFormat} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1330,9 +1330,9 @@
     }
 
     /**
-     * Sets the value of the <code>extraSamples</code> field.
+     * Sets the value of the {@code extraSamples} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1346,14 +1346,14 @@
     }
 
     /**
-     * Sets the value of the <code>colorMap</code> field.
+     * Sets the value of the {@code colorMap} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
      * @param colorMap the color map to apply to the source data,
-     * as an array of <code>char</code>s.
+     * as an array of {@code char}s.
      */
     public void setColorMap(char[] colorMap) {
         this.colorMap = colorMap == null ?
@@ -1361,22 +1361,22 @@
     }
 
     /**
-     * Sets the value of the <code>stream</code> field.
+     * Sets the value of the {@code stream} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param stream the <code>ImageInputStream</code> to be read.
+     * @param stream the {@code ImageInputStream} to be read.
      */
     public void setStream(ImageInputStream stream) {
         this.stream = stream;
     }
 
     /**
-     * Sets the value of the <code>offset</code> field.
+     * Sets the value of the {@code offset} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1388,9 +1388,9 @@
     }
 
     /**
-     * Sets the value of the <code>byteCount</code> field.
+     * Sets the value of the {@code byteCount} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1403,9 +1403,9 @@
     // Region of the file image represented in the stream
 
     /**
-     * Sets the value of the <code>srcMinX</code> field.
+     * Sets the value of the {@code srcMinX} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1418,9 +1418,9 @@
     }
 
     /**
-     * Sets the value of the <code>srcMinY</code> field.
+     * Sets the value of the {@code srcMinY} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1433,9 +1433,9 @@
     }
 
     /**
-     * Sets the value of the <code>srcWidth</code> field.
+     * Sets the value of the {@code srcWidth} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1447,9 +1447,9 @@
     }
 
     /**
-     * Sets the value of the <code>srcHeight</code> field.
+     * Sets the value of the {@code srcHeight} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1463,9 +1463,9 @@
     // First source pixel to be read
 
     /**
-     * Sets the value of the <code>sourceXOffset</code> field.
+     * Sets the value of the {@code sourceXOffset} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1477,9 +1477,9 @@
     }
 
     /**
-     * Sets the value of the <code>dstXOffset</code> field.
+     * Sets the value of the {@code dstXOffset} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1491,9 +1491,9 @@
     }
 
     /**
-     * Sets the value of the <code>sourceYOffset</code>.
+     * Sets the value of the {@code sourceYOffset}.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1505,9 +1505,9 @@
     }
 
     /**
-     * Sets the value of the <code>dstYOffset</code> field.
+     * Sets the value of the {@code dstYOffset} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1521,15 +1521,15 @@
     // Subsampling to be performed
 
     /**
-     * Sets the value of the <code>subsampleX</code> field.
+     * Sets the value of the {@code subsampleX} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
      * @param subsampleX the horizontal subsampling factor.
      *
-     * @throws IllegalArgumentException if <code>subsampleX</code> is
+     * @throws IllegalArgumentException if {@code subsampleX} is
      * less than or equal to 0.
      */
     public void setSubsampleX(int subsampleX) {
@@ -1540,15 +1540,15 @@
     }
 
     /**
-     * Sets the value of the <code>subsampleY</code> field.
+     * Sets the value of the {@code subsampleY} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
      * @param subsampleY the vertical subsampling factor.
      *
-     * @throws IllegalArgumentException if <code>subsampleY</code> is
+     * @throws IllegalArgumentException if {@code subsampleY} is
      * less than or equal to 0.
      */
     public void setSubsampleY(int subsampleY) {
@@ -1561,13 +1561,13 @@
     // Band subsetting/rearrangement
 
     /**
-     * Sets the value of the <code>sourceBands</code> field.
+     * Sets the value of the {@code sourceBands} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param sourceBands an array of <code>int</code>s
+     * @param sourceBands an array of {@code int}s
      * specifying the source bands to be read.
      */
     public void setSourceBands(int[] sourceBands) {
@@ -1576,13 +1576,13 @@
     }
 
     /**
-     * Sets the value of the <code>destinationBands</code> field.
+     * Sets the value of the {@code destinationBands} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param destinationBands an array of <code>int</code>s
+     * @param destinationBands an array of {@code int}s
      * specifying the destination bands to be written.
      */
     public void setDestinationBands(int[] destinationBands) {
@@ -1593,22 +1593,22 @@
     // Destination image and region
 
     /**
-     * Sets the value of the <code>image</code> field.
+     * Sets the value of the {@code image} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
-     * @param image the destination <code>BufferedImage</code>.
+     * @param image the destination {@code BufferedImage}.
      */
     public void setImage(BufferedImage image) {
         this.image = image;
     }
 
     /**
-     * Sets the value of the <code>dstMinX</code> field.
+     * Sets the value of the {@code dstMinX} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1620,9 +1620,9 @@
     }
 
     /**
-     * Sets the value of the <code>dstMinY</code> field.
+     * Sets the value of the {@code dstMinY} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1634,9 +1634,9 @@
     }
 
     /**
-     * Sets the value of the <code>dstWidth</code> field.
+     * Sets the value of the {@code dstWidth} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1647,9 +1647,9 @@
     }
 
     /**
-     * Sets the value of the <code>dstHeight</code> field.
+     * Sets the value of the {@code dstHeight} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1662,9 +1662,9 @@
     // Active source region
 
     /**
-     * Sets the value of the <code>activeSrcMinX</code> field.
+     * Sets the value of the {@code activeSrcMinX} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1676,9 +1676,9 @@
     }
 
     /**
-     * Sets the value of the <code>activeSrcMinY</code> field.
+     * Sets the value of the {@code activeSrcMinY} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1690,9 +1690,9 @@
     }
 
     /**
-     * Sets the value of the <code>activeSrcWidth</code> field.
+     * Sets the value of the {@code activeSrcWidth} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1703,9 +1703,9 @@
     }
 
     /**
-     * Sets the value of the <code>activeSrcHeight</code> field.
+     * Sets the value of the {@code activeSrcHeight} field.
      *
-     * <p> If this method is called, the <code>beginDecoding</code>
+     * <p> If this method is called, the {@code beginDecoding}
      * method must be called prior to calling any of the decode
      * methods.
      *
@@ -1716,23 +1716,23 @@
     }
 
     /**
-     * Sets the <code>TIFFColorConverter</code> object describing the color
+     * Sets the {@code TIFFColorConverter} object describing the color
      * space of the encoded data in the input stream.  If no
-     * <code>TIFFColorConverter</code> is set, no conversion will be performed.
+     * {@code TIFFColorConverter} is set, no conversion will be performed.
      *
-     * @param colorConverter a <code>TIFFColorConverter</code> object, or
-     * <code>null</code>.
+     * @param colorConverter a {@code TIFFColorConverter} object, or
+     * {@code null}.
      */
     public void setColorConverter(TIFFColorConverter colorConverter) {
         this.colorConverter = colorConverter;
     }
 
     /**
-     * Returns an <code>ImageTypeSpecifier</code> describing an image
+     * Returns an {@code ImageTypeSpecifier} describing an image
      * whose underlying data array has the same format as the raw
      * source pixel data.
      *
-     * @return an <code>ImageTypeSpecifier</code>.
+     * @return an {@code ImageTypeSpecifier}.
      */
     public ImageTypeSpecifier getRawImageType() {
         ImageTypeSpecifier its =
@@ -1747,18 +1747,18 @@
     }
 
     /**
-     * Creates a <code>BufferedImage</code> whose underlying data
+     * Creates a {@code BufferedImage} whose underlying data
      * array will be suitable for holding the raw decoded output of
-     * the <code>decodeRaw</code> method.
+     * the {@code decodeRaw} method.
      *
      * <p> The default implementation calls
-     * <code>getRawImageType</code>, and calls the resulting
-     * <code>ImageTypeSpecifier</code>'s
-     * <code>createBufferedImage</code> method.
+     * {@code getRawImageType}, and calls the resulting
+     * {@code ImageTypeSpecifier}'s
+     * {@code createBufferedImage} method.
      *
-     * @return a <code>BufferedImage</code> whose underlying data
+     * @return a {@code BufferedImage} whose underlying data
      * array has the same format as the raw source pixel data, or
-     * <code>null</code> if it is not possible to create such an
+     * {@code null} if it is not possible to create such an
      * image.
      */
     public BufferedImage createRawImage() {
@@ -1811,22 +1811,22 @@
     }
 
     /**
-     * Decodes the source data into the provided <code>byte</code>
-     * array <code>b</code>, starting at the offset given by
-     * <code>dstOffset</code>.  Each pixel occupies
-     * <code>bitsPerPixel</code> bits, with no padding between pixels.
-     * Scanlines are separated by <code>scanlineStride</code>
-     * <code>byte</code>s.
+     * Decodes the source data into the provided {@code byte}
+     * array {@code b}, starting at the offset given by
+     * {@code dstOffset}.  Each pixel occupies
+     * {@code bitsPerPixel} bits, with no padding between pixels.
+     * Scanlines are separated by {@code scanlineStride}
+     * {@code byte}s.
      *
-     * @param b a <code>byte</code> array to be written.
-     * @param dstOffset the starting offset in <code>b</code> to be
+     * @param b a {@code byte} array to be written.
+     * @param dstOffset the starting offset in {@code b} to be
      * written.
      * @param bitsPerPixel the number of bits for each pixel.
-     * @param scanlineStride the number of <code>byte</code>s to
+     * @param scanlineStride the number of {@code byte}s to
      * advance between that starting pixels of each scanline.
      *
      * @throws IOException if an error occurs reading from the source
-     * <code>ImageInputStream</code>.
+     * {@code ImageInputStream}.
      */
     public abstract void decodeRaw(byte[] b,
                                    int dstOffset,
@@ -1834,25 +1834,25 @@
                                    int scanlineStride) throws IOException;
 
     /**
-     * Decodes the source data into the provided <code>short</code>
-     * array <code>s</code>, starting at the offset given by
-     * <code>dstOffset</code>.  Each pixel occupies
-     * <code>bitsPerPixel</code> bits, with no padding between pixels.
-     * Scanlines are separated by <code>scanlineStride</code>
-     * <code>short</code>s
+     * Decodes the source data into the provided {@code short}
+     * array {@code s}, starting at the offset given by
+     * {@code dstOffset}.  Each pixel occupies
+     * {@code bitsPerPixel} bits, with no padding between pixels.
+     * Scanlines are separated by {@code scanlineStride}
+     * {@code short}s
      *
-     * <p> The default implementation calls <code>decodeRaw(byte[] b,
-     * ...)</code> and copies the resulting data into <code>s</code>.
+     * <p> The default implementation calls {@code decodeRaw(byte[] b,
+     * ...)} and copies the resulting data into {@code s}.
      *
-     * @param s a <code>short</code> array to be written.
-     * @param dstOffset the starting offset in <code>s</code> to be
+     * @param s a {@code short} array to be written.
+     * @param dstOffset the starting offset in {@code s} to be
      * written.
      * @param bitsPerPixel the number of bits for each pixel.
-     * @param scanlineStride the number of <code>short</code>s to
+     * @param scanlineStride the number of {@code short}s to
      * advance between that starting pixels of each scanline.
      *
      * @throws IOException if an error occurs reading from the source
-     * <code>ImageInputStream</code>.
+     * {@code ImageInputStream}.
      */
     public void decodeRaw(short[] s,
                           int dstOffset,
@@ -1891,25 +1891,25 @@
     }
 
     /**
-     * Decodes the source data into the provided <code>int</code>
-     * array <code>i</code>, starting at the offset given by
-     * <code>dstOffset</code>.  Each pixel occupies
-     * <code>bitsPerPixel</code> bits, with no padding between pixels.
-     * Scanlines are separated by <code>scanlineStride</code>
-     * <code>int</code>s.
+     * Decodes the source data into the provided {@code int}
+     * array {@code i}, starting at the offset given by
+     * {@code dstOffset}.  Each pixel occupies
+     * {@code bitsPerPixel} bits, with no padding between pixels.
+     * Scanlines are separated by {@code scanlineStride}
+     * {@code int}s.
      *
-     * <p> The default implementation calls <code>decodeRaw(byte[] b,
-     * ...)</code> and copies the resulting data into <code>i</code>.
+     * <p> The default implementation calls {@code decodeRaw(byte[] b,
+     * ...)} and copies the resulting data into {@code i}.
      *
-     * @param i an <code>int</code> array to be written.
-     * @param dstOffset the starting offset in <code>i</code> to be
+     * @param i an {@code int} array to be written.
+     * @param dstOffset the starting offset in {@code i} to be
      * written.
      * @param bitsPerPixel the number of bits for each pixel.
-     * @param scanlineStride the number of <code>int</code>s to
+     * @param scanlineStride the number of {@code int}s to
      * advance between that starting pixels of each scanline.
      *
      * @throws IOException if an error occurs reading from the source
-     * <code>ImageInputStream</code>.
+     * {@code ImageInputStream}.
      */
     public void decodeRaw(int[] i,
                           int dstOffset,
@@ -1953,25 +1953,25 @@
     }
 
     /**
-     * Decodes the source data into the provided <code>float</code>
-     * array <code>f</code>, starting at the offset given by
-     * <code>dstOffset</code>.  Each pixel occupies
-     * <code>bitsPerPixel</code> bits, with no padding between pixels.
-     * Scanlines are separated by <code>scanlineStride</code>
-     * <code>float</code>s.
+     * Decodes the source data into the provided {@code float}
+     * array {@code f}, starting at the offset given by
+     * {@code dstOffset}.  Each pixel occupies
+     * {@code bitsPerPixel} bits, with no padding between pixels.
+     * Scanlines are separated by {@code scanlineStride}
+     * {@code float}s.
      *
-     * <p> The default implementation calls <code>decodeRaw(byte[] b,
-     * ...)</code> and copies the resulting data into <code>f</code>.
+     * <p> The default implementation calls {@code decodeRaw(byte[] b,
+     * ...)} and copies the resulting data into {@code f}.
      *
-     * @param f a <code>float</code> array to be written.
-     * @param dstOffset the starting offset in <code>f</code> to be
+     * @param f a {@code float} array to be written.
+     * @param dstOffset the starting offset in {@code f} to be
      * written.
      * @param bitsPerPixel the number of bits for each pixel.
-     * @param scanlineStride the number of <code>float</code>s to
+     * @param scanlineStride the number of {@code float}s to
      * advance between that starting pixels of each scanline.
      *
      * @throws IOException if an error occurs reading from the source
-     * <code>ImageInputStream</code>.
+     * {@code ImageInputStream}.
      */
     public void decodeRaw(float[] f,
                           int dstOffset,
@@ -2017,25 +2017,25 @@
     }
 
     /**
-     * Decodes the source data into the provided <code>double</code>
-     * array <code>f</code>, starting at the offset given by
-     * <code>dstOffset</code>.  Each pixel occupies
-     * <code>bitsPerPixel</code> bits, with no padding between pixels.
-     * Scanlines are separated by <code>scanlineStride</code>
-     * <code>double</code>s.
+     * Decodes the source data into the provided {@code double}
+     * array {@code f}, starting at the offset given by
+     * {@code dstOffset}.  Each pixel occupies
+     * {@code bitsPerPixel} bits, with no padding between pixels.
+     * Scanlines are separated by {@code scanlineStride}
+     * {@code double}s.
      *
-     * <p> The default implementation calls <code>decodeRaw(byte[] b,
-     * ...)</code> and copies the resulting data into <code>f</code>.
+     * <p> The default implementation calls {@code decodeRaw(byte[] b,
+     * ...)} and copies the resulting data into {@code f}.
      *
-     * @param f a <code>double</code> array to be written.
-     * @param dstOffset the starting offset in <code>f</code> to be
+     * @param f a {@code double} array to be written.
+     * @param dstOffset the starting offset in {@code f} to be
      * written.
      * @param bitsPerPixel the number of bits for each pixel.
-     * @param scanlineStride the number of <code>double</code>s to
+     * @param scanlineStride the number of {@code double}s to
      * advance between that starting pixels of each scanline.
      *
      * @throws IOException if an error occurs reading from the source
-     * <code>ImageInputStream</code>.
+     * {@code ImageInputStream}.
      */
     public void decodeRaw(double[] d,
                           int dstOffset,
@@ -2104,16 +2104,16 @@
 
     /**
      * This routine is called prior to a sequence of calls to the
-     * <code>decode</code> method, in order to allow any necessary
+     * {@code decode} method, in order to allow any necessary
      * tables or other structures to be initialized based on metadata
      * values.  This routine is guaranteed to be called any time the
      * metadata values have changed.
      *
      * <p> The default implementation computes tables used by the
-     * <code>decode</code> method to rescale components to different
+     * {@code decode} method to rescale components to different
      * bit depths.  Thus, if this method is overridden, it is
-     * important for the subclass method to call <code>super()</code>,
-     * unless it overrides <code>decode</code> as well.
+     * important for the subclass method to call {@code super()},
+     * unless it overrides {@code decode} as well.
      */
     public void beginDecoding() {
         // Note: This method assumes that sourceBands, destinationBands,
@@ -2242,35 +2242,35 @@
 
     /**
      * Decodes the input bit stream (located in the
-     * <code>ImageInputStream</code> <code>stream</code>, at offset
-     * <code>offset</code>, and continuing for <code>byteCount</code>
-     * bytes) into the output <code>BufferedImage</code>
-     * <code>image</code>.
+     * {@code ImageInputStream} {@code stream}, at offset
+     * {@code offset}, and continuing for {@code byteCount}
+     * bytes) into the output {@code BufferedImage}
+     * {@code image}.
      *
      * <p> The default implementation analyzes the destination image
      * to determine if it is suitable as the destination for the
-     * <code>decodeRaw</code> method.  If not, a suitable image is
-     * created.  Next, <code>decodeRaw</code> is called to perform the
+     * {@code decodeRaw} method.  If not, a suitable image is
+     * created.  Next, {@code decodeRaw} is called to perform the
      * actual decoding, and the results are copied into the
      * destination image if necessary.  Subsampling and offsetting are
      * performed automatically.
      *
      * <p> The precise responsibilities of this routine are as
      * follows.  The input bit stream is defined by the instance
-     * variables <code>stream</code>, <code>offset</code>, and
-     * <code>byteCount</code>.  These bits contain the data for the
-     * region of the source image defined by <code>srcMinX</code>,
-     * <code>srcMinY</code>, <code>srcWidth</code>, and
-     * <code>srcHeight</code>.
+     * variables {@code stream}, {@code offset}, and
+     * {@code byteCount}.  These bits contain the data for the
+     * region of the source image defined by {@code srcMinX},
+     * {@code srcMinY}, {@code srcWidth}, and
+     * {@code srcHeight}.
      *
      * <p> The source data is required to be subsampling, starting at
-     * the <code>sourceXOffset</code>th column and including
-     * every <code>subsampleX</code>th pixel thereafter (and similarly
-     * for <code>sourceYOffset</code> and
-     * <code>subsampleY</code>).
+     * the {@code sourceXOffset}th column and including
+     * every {@code subsampleX}th pixel thereafter (and similarly
+     * for {@code sourceYOffset} and
+     * {@code subsampleY}).
      *
      * <p> Pixels are copied into the destination with an addition shift of
-     * (<code>dstXOffset</code>, <code>dstYOffset</code>).  The complete
+     * ({@code dstXOffset}, {@code dstYOffset}).  The complete
      * set of formulas relating the source and destination coordinate spaces
      * are:
      *
@@ -2279,9 +2279,9 @@
      * dy = (sy - sourceYOffset)/subsampleY + dstYOffset;
      * </pre>
      *
-     * Only source pixels such that <code>(sx - sourceXOffset) %
-     * subsampleX == 0</code> and <code>(sy - sourceYOffset) %
-     * subsampleY == 0</code> are copied.
+     * Only source pixels such that {@code (sx - sourceXOffset) %
+     * subsampleX == 0} and {@code (sy - sourceYOffset) %
+     * subsampleY == 0} are copied.
      *
      * <p> The inverse mapping, from destination to source coordinates,
      * is one-to-one:
@@ -2292,9 +2292,9 @@
      * </pre>
      *
      * <p> The region of the destination image to be updated is given
-     * by the instance variables <code>dstMinX</code>,
-     * <code>dstMinY</code>, <code>dstWidth</code>, and
-     * <code>dstHeight</code>.
+     * by the instance variables {@code dstMinX},
+     * {@code dstMinY}, {@code dstWidth}, and
+     * {@code dstHeight}.
      *
      * <p> It is possible that not all of the source data being read
      * will contribute to the destination image.  For example, the
@@ -2303,32 +2303,32 @@
      * convenience, the bounds of the active source region (that is,
      * the region of the strip or tile being read that actually
      * contributes to the destination image, taking clipping into
-     * account) are available as <code>activeSrcMinX</code>,
-     * <code>activeSrcMinY</code>, <code>activeSrcWidth</code> and
-     * <code>activeSrcHeight</code>.  Thus, the source pixel at
-     * (<code>activeSrcMinX</code>, <code>activeSrcMinY</code>) will
-     * map to the destination pixel (<code>dstMinX</code>,
-     * <code>dstMinY</code>).
+     * account) are available as {@code activeSrcMinX},
+     * {@code activeSrcMinY}, {@code activeSrcWidth} and
+     * {@code activeSrcHeight}.  Thus, the source pixel at
+     * ({@code activeSrcMinX}, {@code activeSrcMinY}) will
+     * map to the destination pixel ({@code dstMinX},
+     * {@code dstMinY}).
      *
      * <p> The sequence of source bands given by
-     * <code>sourceBands</code> are to be copied into the sequence of
+     * {@code sourceBands} are to be copied into the sequence of
      * bands in the destination given by
-     * <code>destinationBands</code>.
+     * {@code destinationBands}.
      *
      * <p> Some standard tag information is provided the instance
-     * variables <code>photometricInterpretation</code>,
-     * <code>compression</code>, <code>samplesPerPixel</code>,
-     * <code>bitsPerSample</code>, <code>sampleFormat</code>,
-     * <code>extraSamples</code>, and <code>colorMap</code>.
+     * variables {@code photometricInterpretation},
+     * {@code compression}, {@code samplesPerPixel},
+     * {@code bitsPerSample}, {@code sampleFormat},
+     * {@code extraSamples}, and {@code colorMap}.
      *
      * <p> In practice, unless there is a significant performance
      * advantage to be gained by overriding this routine, most users
      * will prefer to use the default implementation of this routine,
-     * and instead override the <code>decodeRaw</code> and/or
-     * <code>getRawImageType</code> methods.
+     * and instead override the {@code decodeRaw} and/or
+     * {@code getRawImageType} methods.
      *
      * @exception IOException if an error occurs in
-     * <code>decodeRaw</code>.
+     * {@code decodeRaw}.
      */
     public void decode() throws IOException {
         byte[] byteData = null;
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFExifJPEGCompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFExifJPEGCompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,7 @@
 import javax.imageio.plugins.tiff.BaselineTIFFTagSet;
 
 /**
- * A <code>TIFFCompressor</code> for the JPEG variant of Exif.
+ * A {@code TIFFCompressor} for the JPEG variant of Exif.
  */
 public class TIFFExifJPEGCompressor extends TIFFBaseJPEGCompressor {
     public TIFFExifJPEGCompressor(ImageWriteParam param) {
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFFaxCompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFFaxCompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -232,12 +232,12 @@
     }
 
     /**
-     * Sets the value of the <code>metadata</code> field.
+     * Sets the value of the {@code metadata} field.
      *
      * <p> The implementation in this class also sets local options
      * from the FILL_ORDER field if it exists.</p>
      *
-     * @param metadata the <code>IIOMetadata</code> object for the
+     * @param metadata the {@code IIOMetadata} object for the
      * image being written.
      *
      * @see #getMetadata()
@@ -253,8 +253,8 @@
     }
 
     /**
-     * Return min of <code>maxOffset</code> or offset of first pixel
-     * different from pixel at <code>bitOffset</code>.
+     * Return min of {@code maxOffset} or offset of first pixel
+     * different from pixel at {@code bitOffset}.
      */
     public int nextState(byte[] data,
                           int    base,
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFFieldNode.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFFieldNode.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,12 +34,12 @@
 import javax.imageio.plugins.tiff.TIFFTagSet;
 
 /**
- * The <code>Node</code> representation of a <code>TIFFField</code>
+ * The {@code Node} representation of a {@code TIFFField}
  * wherein the child node is procedural rather than buffered.
  */
 public class TIFFFieldNode extends IIOMetadataNode {
     private static String getNodeName(TIFFField f) {
-        return f.getData() instanceof TIFFDirectory ?
+        return (f.hasDirectory() || f.getData() instanceof TIFFDirectory) ?
             "TIFFIFD" : "TIFFField";
     }
 
@@ -52,7 +52,8 @@
     public TIFFFieldNode(TIFFField field) {
         super(getNodeName(field));
 
-        isIFD = field.getData() instanceof TIFFDirectory;
+        isIFD = field.hasDirectory() ||
+            field.getData() instanceof TIFFDirectory;
 
         this.field = field;
 
@@ -68,7 +69,8 @@
                 setAttribute("parentTagName", tagName);
             }
 
-            TIFFDirectory dir = (TIFFDirectory)field.getData();
+            TIFFDirectory dir = field.hasDirectory() ?
+                field.getDirectory() : (TIFFDirectory)field.getData();
             TIFFTagSet[] tagSets = dir.getTagSets();
             if(tagSets != null) {
                 StringBuilder tagSetNames = new StringBuilder();
@@ -90,7 +92,8 @@
         if(isInitialized) return;
 
         if(isIFD) {
-            TIFFDirectory dir = (TIFFDirectory)field.getData();
+            TIFFDirectory dir = field.hasDirectory() ?
+                field.getDirectory() : (TIFFDirectory)field.getData();
             TIFFField[] fields = dir.getTIFFFields();
             if(fields != null) {
                 TIFFTagSet[] tagSets = dir.getTagSets();
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -153,7 +153,7 @@
     }
 
     /**
-     * Returns an <code>Iterator</code> over the TIFF fields. The
+     * Returns an {@code Iterator} over the TIFF fields. The
      * traversal is in the order of increasing tag number.
      */
     // Note: the sort is guaranteed for low fields by the use of an
@@ -164,7 +164,7 @@
     }
 
     /**
-     * Read the value of a field. The <code>data</code> parameter should be
+     * Read the value of a field. The {@code data} parameter should be
      * an array of length 1 of Object.
      *
      * @param stream the input stream
@@ -762,8 +762,8 @@
     }
 
     /**
-     * Returns a <code>TIFFIFD</code> wherein all fields from the
-     * <code>BaselineTIFFTagSet</code> are copied by value and all other
+     * Returns a {@code TIFFIFD} wherein all fields from the
+     * {@code BaselineTIFFTagSet} are copied by value and all other
      * fields copied by reference.
      */
     public TIFFIFD getShallowClone() {
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1620,8 +1620,8 @@
     }
 
     /**
-     * Returns a <code>TIFFImageMetadata</code> wherein all fields in the
-     * root IFD from the <code>BaselineTIFFTagSet</code> are copied by value
+     * Returns a {@code TIFFImageMetadata} wherein all fields in the
+     * root IFD from the {@code BaselineTIFFTagSet} are copied by value
      * and all other fields copied by reference.
      */
     public TIFFImageMetadata getShallowClone() {
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -83,7 +83,7 @@
     // Metadata for image at 'currIndex', or null.
     private TIFFImageMetadata imageMetadata = null;
 
-    // A <code>List</code> of <code>Long</code>s indicating the stream
+    // A {@code List} of {@code Long}s indicating the stream
     // positions of the start of the IFD for each image.  Entries
     // are added as needed.
     private List<Long> imageStartPosition = new ArrayList<Long>();
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriteParam.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriteParam.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -122,11 +122,11 @@
  * quality value is passed directly to the JPEG writer plug-in which
  * interprets it in the usual way.</p>
  *
- * <p> The <code>canWriteTiles</code> and
- * <code>canWriteCompressed</code> methods will return
- * <code>true</code>; the <code>canOffsetTiles</code> and
- * <code>canWriteProgressive</code> methods will return
- * <code>false</code>.</p>
+ * <p> The {@code canWriteTiles} and
+ * {@code canWriteCompressed} methods will return
+ * {@code true}; the {@code canOffsetTiles} and
+ * {@code canWriteProgressive} methods will return
+ * {@code false}.</p>
  *
  * <p> If tiles are being written, then each of their dimensions will be
  * rounded to the nearest multiple of 16 per the TIFF specification. If
@@ -140,10 +140,10 @@
 public class TIFFImageWriteParam extends ImageWriteParam {
 
     /**
-     * Constructs a <code>TIFFImageWriteParam</code> instance
-     * for a given <code>Locale</code>.
+     * Constructs a {@code TIFFImageWriteParam} instance
+     * for a given {@code Locale}.
      *
-     * @param locale the <code>Locale</code> for which messages
+     * @param locale the {@code Locale} for which messages
      * should be localized.
      */
     public TIFFImageWriteParam(Locale locale) {
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -221,11 +221,11 @@
      * relative to a given tile grid layout specified by its X offset
      * and tile width.
      *
-     * <p> If <code>tileWidth < 0</code>, the results of this method
-     * are undefined.  If <code>tileWidth == 0</code>, an
-     * <code>ArithmeticException</code> will be thrown.
+     * <p> If {@code tileWidth < 0}, the results of this method
+     * are undefined.  If {@code tileWidth == 0}, an
+     * {@code ArithmeticException} will be thrown.
      *
-     * @throws ArithmeticException  If <code>tileWidth == 0</code>.
+     * @throws ArithmeticException  If {@code tileWidth == 0}.
      */
     public static int XToTileX(int x, int tileGridXOffset, int tileWidth) {
         x -= tileGridXOffset;
@@ -240,11 +240,11 @@
      * relative to a given tile grid layout specified by its Y offset
      * and tile height.
      *
-     * <p> If <code>tileHeight < 0</code>, the results of this method
-     * are undefined.  If <code>tileHeight == 0</code>, an
-     * <code>ArithmeticException</code> will be thrown.
+     * <p> If {@code tileHeight < 0}, the results of this method
+     * are undefined.  If {@code tileHeight == 0}, an
+     * {@code ArithmeticException} will be thrown.
      *
-     * @throws ArithmeticException  If <code>tileHeight == 0</code>.
+     * @throws ArithmeticException  If {@code tileHeight == 0}.
      */
     public static int YToTileY(int y, int tileGridYOffset, int tileHeight) {
         y -= tileGridYOffset;
@@ -424,17 +424,17 @@
     }
 
     /**
-     * Converts a standard <code>javax_imageio_1.0</code> tree to a
-     * <code>TIFFImageMetadata</code> object.
+     * Converts a standard {@code javax_imageio_1.0} tree to a
+     * {@code TIFFImageMetadata} object.
      *
      * @param inData The metadata object.
-     * @return a <code>TIFFImageMetadata</code> or <code>null</code> if
-     * the standard tree derived from the input object is <code>null</code>.
-     * @throws IllegalArgumentException if <code>inData</code> is
-     * <code>null</code>.
-     * @throws IllegalArgumentException if <code>inData</code> does not support
+     * @return a {@code TIFFImageMetadata} or {@code null} if
+     * the standard tree derived from the input object is {@code null}.
+     * @throws IllegalArgumentException if {@code inData} is
+     * {@code null}.
+     * @throws IllegalArgumentException if {@code inData} does not support
      * the standard metadata format.
-     * @throws IIOInvalidTreeException if <code>inData</code> generates an
+     * @throws IIOInvalidTreeException if {@code inData} generates an
      * invalid standard metadata tree.
      */
     private TIFFImageMetadata convertStandardImageMetadata(IIOMetadata inData)
@@ -463,15 +463,15 @@
 
     /**
      * Converts a native
-     * <code>javax_imageio_tiff_image_1.0</code> tree to a
-     * <code>TIFFImageMetadata</code> object.
+     * {@code javax_imageio_tiff_image_1.0} tree to a
+     * {@code TIFFImageMetadata} object.
      *
      * @param inData The metadata object.
-     * @return a <code>TIFFImageMetadata</code> or <code>null</code> if
-     * the native tree derived from the input object is <code>null</code>.
-     * @throws IllegalArgumentException if <code>inData</code> is
-     * <code>null</code> or does not support the native metadata format.
-     * @throws IIOInvalidTreeException if <code>inData</code> generates an
+     * @return a {@code TIFFImageMetadata} or {@code null} if
+     * the native tree derived from the input object is {@code null}.
+     * @throws IllegalArgumentException if {@code inData} is
+     * {@code null} or does not support the native metadata format.
+     * @throws IIOInvalidTreeException if {@code inData} generates an
      * invalid native metadata tree.
      */
     private TIFFImageMetadata convertNativeImageMetadata(IIOMetadata inData)
@@ -504,8 +504,8 @@
      * as needed. The destination image dimensions are provided as parameters
      * because these might differ from those of the source due to subsampling.
      *
-     * @param cm The <code>ColorModel</code> of the image being written.
-     * @param sm The <code>SampleModel</code> of the image being written.
+     * @param cm The {@code ColorModel} of the image being written.
+     * @param sm The {@code SampleModel} of the image being written.
      * @param destWidth The width of the written image after subsampling.
      * @param destHeight The height of the written image after subsampling.
      */
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFJPEGCompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFJPEGCompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -102,14 +102,14 @@
     }
 
     /**
-     * Sets the value of the <code>metadata</code> field.
+     * Sets the value of the {@code metadata} field.
      *
      * <p>The implementation in this class also adds the TIFF fields
      * JPEGTables, YCbCrSubSampling, YCbCrPositioning, and
      * ReferenceBlackWhite superseding any prior settings of those
      * fields.</p>
      *
-     * @param metadata the <code>IIOMetadata</code> object for the
+     * @param metadata the {@code IIOMetadata} object for the
      * image being written.
      *
      * @see #getMetadata()
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFLZWDecompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFLZWDecompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -245,7 +245,7 @@
     }
 
     /**
-     * Append <code>newString</code> to the end of <code>oldString</code>.
+     * Append {@code newString} to the end of {@code oldString}.
      */
     public byte[] composeString(byte oldString[], byte newString) {
         int length = oldString.length;
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFLZWUtil.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFLZWUtil.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -188,7 +188,7 @@
     }
 
     /**
-     * Append <code>newString</code> to the end of <code>oldString</code>.
+     * Append {@code newString} to the end of {@code oldString}.
      */
     public byte[] composeString(byte oldString[], byte newString) {
         int length = oldString.length;
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFNullDecompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFNullDecompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,16 +34,16 @@
      */
     private boolean isReadActiveOnly = false;
 
-    /** The original value of <code>srcMinX</code>. */
+    /** The original value of {@code srcMinX}. */
     private int originalSrcMinX;
 
-    /** The original value of <code>srcMinY</code>. */
+    /** The original value of {@code srcMinY}. */
     private int originalSrcMinY;
 
-    /** The original value of <code>srcWidth</code>. */
+    /** The original value of {@code srcWidth}. */
     private int originalSrcWidth;
 
-    /** The original value of <code>srcHeight</code>. */
+    /** The original value of {@code srcHeight}. */
     private int originalSrcHeight;
 
     public TIFFNullDecompressor() {}
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFOldJPEGDecompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFOldJPEGDecompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,7 +34,7 @@
 import javax.imageio.plugins.tiff.TIFFField;
 
 /**
- * <code>TIFFDecompressor</code> for "Old JPEG" compression.
+ * {@code TIFFDecompressor} for "Old JPEG" compression.
  */
 public class TIFFOldJPEGDecompressor extends TIFFJPEGDecompressor {
 
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFRLECompressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFRLECompressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,8 +42,8 @@
      * CCITT RLE (Run Lenth Encoding).
      *
      * @param data        The row of data to compress.
-     * @param rowOffset   Starting index in <code>data</code>.
-     * @param colOffset   Bit offset within first <code>data[rowOffset]</code>.
+     * @param rowOffset   Starting index in {@code data}.
+     * @param colOffset   Bit offset within first {@code data[rowOffset]}.
      * @param rowLength   Number of bits in the row.
      * @param compData    The compressed data.
      *
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFRenderedImage.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFRenderedImage.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -85,15 +85,15 @@
     }
 
     /**
-     * Creates a copy of <code>param</code>. The source subsampling and
+     * Creates a copy of {@code param}. The source subsampling and
      * and bands settings and the destination bands and offset settings
-     * are copied. If <code>param</code> is a <code>TIFFImageReadParam</code>
-     * then the <code>TIFFDecompressor</code> and
-     * <code>TIFFColorConverter</code> settings are also copied; otherwise
-     * they are explicitly set to <code>null</code>.
+     * are copied. If {@code param} is a {@code TIFFImageReadParam}
+     * then the {@code TIFFDecompressor} and
+     * {@code TIFFColorConverter} settings are also copied; otherwise
+     * they are explicitly set to {@code null}.
      *
      * @param param the parameters to be copied.
-     * @param copyTagSets whether the <code>TIFFTagSet</code> settings
+     * @param copyTagSets whether the {@code TIFFTagSet} settings
      * should be copied if set.
      * @return copied parameters.
      */
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFT4Compressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFT4Compressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -41,13 +41,13 @@
     }
 
     /**
-     * Sets the value of the <code>metadata</code> field.
+     * Sets the value of the {@code metadata} field.
      *
      * <p> The implementation in this class also sets local options
      * from the T4_OPTIONS field if it exists, and if it doesn't, adds
      * it with default values.</p>
      *
-     * @param metadata the <code>IIOMetadata</code> object for the
+     * @param metadata the {@code IIOMetadata} object for the
      * image being written.
      *
      * @see #getMetadata()
@@ -86,7 +86,7 @@
      * @param isEOLAligned Whether EOL bit sequences should be padded.
      * @param data         The row of data to compress.
      * @param lineStride   Byte step between the same sample in different rows.
-     * @param colOffset    Bit offset within first <code>data[rowOffset]</code>.
+     * @param colOffset    Bit offset within first {@code data[rowOffset]}.
      * @param width        Number of bits in the row.
      * @param height       Number of rows in the buffer.
      * @param compData     The compressed data.
--- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFT6Compressor.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFT6Compressor.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,7 @@
      *
      * @param data        The row of data to compress.
      * @param lineStride  Byte step between the same sample in different rows.
-     * @param colOffset   Bit offset within first <code>data[rowOffset]</code>.
+     * @param colOffset   Bit offset within first {@code data[rowOffset]}.
      * @param width       Number of bits in the row.
      * @param height      Number of rows in the buffer.
      * @param compData    The compressed data.
--- a/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,11 +26,11 @@
 package com.sun.media.sound;
 
 import java.io.DataInputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
 import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioFileFormat.Type;
 import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.UnsupportedAudioFileException;
@@ -49,11 +49,6 @@
             throws UnsupportedAudioFileException, IOException {
         DataInputStream dis = new DataInputStream(stream);
 
-        // assumes a stream at the beginning of the file which has already
-        // passed the magic number test...
-        // leaves the input stream at the beginning of the audio data
-        int fileRead = 0;
-        int dataLength = 0;
         AudioFormat format = null;
 
         // Read the magic number
@@ -65,9 +60,9 @@
             throw new UnsupportedAudioFileException("not an AIFF file");
         }
 
+        int frameLength = 0;
         int length = dis.readInt();
         int iffType = dis.readInt();
-        fileRead += 12;
 
         int totallength;
         if(length <= 0 ) {
@@ -91,7 +86,6 @@
             // Read the chunk name
             int chunkName = dis.readInt();
             int chunkLen = dis.readInt();
-            fileRead += 8;
 
             int chunkRead = 0;
 
@@ -112,7 +106,13 @@
                 if (channels <= 0) {
                     throw new UnsupportedAudioFileException("Invalid number of channels");
                 }
-                dis.readInt(); // numSampleFrames
+                frameLength = dis.readInt(); // numSampleFrames
+                if (frameLength < 0) {
+                    // AiffFileFormat uses int, unlike AIS which uses long
+                    //TODO this (negative) value should be passed as long to AIS
+                    frameLength = AudioSystem.NOT_SPECIFIED;
+                }
+
                 int sampleSizeInBits = dis.readUnsignedShort();
                 if (sampleSizeInBits < 1 || sampleSizeInBits > 32) {
                     throw new UnsupportedAudioFileException("Invalid AIFF/COMM sampleSize");
@@ -149,38 +149,17 @@
                 break;
             case AiffFileFormat.SSND_MAGIC:
                 // Data chunk.
-                // we are getting *weird* numbers for chunkLen sometimes;
-                // this really should be the size of the data chunk....
-                int dataOffset = dis.readInt();
-                int blocksize = dis.readInt();
+                int dataOffset = dis.readInt(); // for now unused in javasound
+                int blocksize = dis.readInt();  // for now unused in javasound
                 chunkRead += 8;
-
-                // okay, now we are done reading the header.  we need to set the size
-                // of the data segment.  we know that sometimes the value we get for
-                // the chunksize is absurd.  this is the best i can think of:if the
-                // value seems okay, use it.  otherwise, we get our value of
-                // length by assuming that everything left is the data segment;
-                // its length should be our original length (for all AIFF data chunks)
-                // minus what we've read so far.
-                // $$kk: we should be able to get length for the data chunk right after
-                // we find "SSND."  however, some aiff files give *weird* numbers.  what
-                // is going on??
-
-                if (chunkLen < length) {
-                    dataLength = chunkLen - chunkRead;
-                } else {
-                    // $$kk: 11.03.98: this seems dangerous!
-                    dataLength = length - (fileRead + chunkRead);
-                }
                 ssndFound = true;
                 break;
             } // switch
-            fileRead += chunkRead;
             // skip the remainder of this chunk
             if (!ssndFound) {
                 int toSkip = chunkLen - chunkRead;
                 if (toSkip > 0) {
-                    fileRead += dis.skipBytes(toSkip);
+                    dis.skipBytes(toSkip);
                 }
             }
         } // while
@@ -188,36 +167,12 @@
         if (format == null) {
             throw new UnsupportedAudioFileException("missing COMM chunk");
         }
-        AudioFileFormat.Type type = aifc?AudioFileFormat.Type.AIFC:AudioFileFormat.Type.AIFF;
+        Type type = aifc ? Type.AIFC : Type.AIFF;
 
-        return new AiffFileFormat(type, totallength, format, dataLength / format.getFrameSize());
+        return new AiffFileFormat(type, totallength, format, frameLength);
     }
 
     // HELPER METHODS
-    /** write_ieee_extended(DataOutputStream dos, double f) throws IOException {
-     * Extended precision IEEE floating-point conversion routine.
-     * @argument DataOutputStream
-     * @argument double
-     * @return void
-     * @exception IOException
-     */
-    private void write_ieee_extended(DataOutputStream dos, double f) throws IOException {
-
-        int exponent = 16398;
-        double highMantissa = f;
-
-        // For now write the integer portion of f
-        // $$jb: 03.30.99: stay in synch with JMF on this!!!!
-        while (highMantissa < 44000) {
-            highMantissa *= 2;
-            exponent--;
-        }
-        dos.writeShort(exponent);
-        dos.writeInt( ((int) highMantissa) << 16);
-        dos.writeInt(0); // low Mantissa
-    }
-
-
     /**
      * read_ieee_extended
      * Extended precision IEEE floating-point conversion routine.
--- a/src/java.desktop/share/classes/com/sun/media/sound/AiffFileWriter.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/media/sound/AiffFileWriter.java	Fri Mar 11 09:16:55 2016 -0800
@@ -59,7 +59,6 @@
         super(new AudioFileFormat.Type[]{AudioFileFormat.Type.AIFF});
     }
 
-
     // METHODS TO IMPLEMENT AudioFileWriter
 
     @Override
@@ -83,7 +82,6 @@
         return new AudioFileFormat.Type[0];
     }
 
-
     @Override
     public int write(AudioInputStream stream, AudioFileFormat.Type fileType, OutputStream out) throws IOException {
         Objects.requireNonNull(stream);
@@ -102,11 +100,9 @@
             throw new IOException("stream length not specified");
         }
 
-        int bytesWritten = writeAiffFile(stream, aiffFileFormat, out);
-        return bytesWritten;
+        return writeAiffFile(stream, aiffFileFormat, out);
     }
 
-
     @Override
     public int write(AudioInputStream stream, AudioFileFormat.Type fileType, File out) throws IOException {
         Objects.requireNonNull(stream);
@@ -129,12 +125,15 @@
 
             // $$kk: 10.22.99: jan: please either implement this or throw an exception!
             // $$fb: 2001-07-13: done. Fixes Bug 4479981
-            int ssndBlockSize           = (aiffFileFormat.getFormat().getChannels() * aiffFileFormat.getFormat().getSampleSizeInBits());
+            int channels = aiffFileFormat.getFormat().getChannels();
+            int sampleSize = aiffFileFormat.getFormat().getSampleSizeInBits();
+            int ssndBlockSize = channels * ((sampleSize + 7) / 8);
 
             int aiffLength=bytesWritten;
             int ssndChunkSize=aiffLength-aiffFileFormat.getHeaderSize()+16;
             long dataSize=ssndChunkSize-16;
-            int numFrames=(int) (dataSize*8/ssndBlockSize);
+            //TODO possibly incorrect round
+            int numFrames = (int) (dataSize / ssndBlockSize);
 
             RandomAccessFile raf=new RandomAccessFile(out, "rw");
             // skip FORM magic
@@ -173,12 +172,7 @@
         AudioFormat streamFormat = stream.getFormat();
         AudioFormat.Encoding streamEncoding = streamFormat.getEncoding();
 
-
-        float sampleRate;
         int sampleSizeInBits;
-        int channels;
-        int frameSize;
-        float frameRate;
         int fileSize;
         boolean convert8to16 = false;
 
@@ -235,7 +229,6 @@
         return fileFormat;
     }
 
-
     private int writeAiffFile(InputStream in, AiffFileFormat aiffFileFormat, OutputStream out) throws IOException {
 
         int bytesRead = 0;
@@ -275,25 +268,20 @@
         AudioFormat.Encoding encoding = null;
 
         //$$fb a little bit nicer handling of constants
-
-        //int headerSize          = 54;
         int headerSize          = aiffFileFormat.getHeaderSize();
-
         //int fverChunkSize       = 0;
         int fverChunkSize       = aiffFileFormat.getFverChunkSize();
-        //int commChunkSize       = 26;
         int commChunkSize       = aiffFileFormat.getCommChunkSize();
         int aiffLength          = -1;
         int ssndChunkSize       = -1;
-        //int ssndOffset                        = headerSize - 16;
         int ssndOffset                  = aiffFileFormat.getSsndChunkOffset();
         short channels = (short) format.getChannels();
         short sampleSize = (short) format.getSampleSizeInBits();
-        int ssndBlockSize               = (channels * sampleSize);
-        int numFrames                   = aiffFileFormat.getFrameLength();
-        long dataSize            = -1;
+        int ssndBlockSize = channels * ((sampleSize + 7) / 8);
+        int numFrames = aiffFileFormat.getFrameLength();
+        long dataSize = -1;
         if( numFrames != AudioSystem.NOT_SPECIFIED) {
-            dataSize = (long) numFrames * ssndBlockSize / 8;
+            dataSize = (long) numFrames * ssndBlockSize;
             ssndChunkSize = (int)dataSize + 16;
             aiffLength = (int)dataSize+headerSize;
         }
@@ -403,9 +391,6 @@
 
     }
 
-
-
-
     // HELPER METHODS
 
     private static final int DOUBLE_MANTISSA_LENGTH = 52;
@@ -452,6 +437,4 @@
         dos.writeShort(extendedBits79To64);
         dos.writeLong(extendedBits63To0);
     }
-
-
 }
--- a/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java	Fri Mar 11 09:16:55 2016 -0800
@@ -255,16 +255,17 @@
     public AudioInputStream getAudioInputStream(final InputStream stream)
             throws UnsupportedAudioFileException, IOException {
 
-        AudioFileFormat format = getAudioFileFormat(stream);
+        final AudioFileFormat format = getAudioFileFormat(stream);
         // we've got everything, the stream is supported and it is at the
         // beginning of the header, so find the data chunk again and return an
         // AudioInputStream
-        RIFFReader riffiterator = new RIFFReader(stream);
+        final RIFFReader riffiterator = new RIFFReader(stream);
         while (riffiterator.hasNextChunk()) {
             RIFFReader chunk = riffiterator.nextChunk();
             if (chunk.getFormat().equals("data")) {
-                return new AudioInputStream(chunk, format.getFormat(), chunk
-                        .getSize());
+                final AudioFormat af = format.getFormat();
+                final long length = chunk.getSize() / af.getFrameSize();
+                return new AudioInputStream(chunk, af, length);
             }
         }
         throw new UnsupportedAudioFileException();
--- a/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileReader.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/com/sun/media/sound/WaveFloatFileReader.java	Fri Mar 11 09:16:55 2016 -0800
@@ -95,16 +95,17 @@
     public AudioInputStream getAudioInputStream(final InputStream stream)
             throws UnsupportedAudioFileException, IOException {
 
-        AudioFileFormat format = getAudioFileFormat(stream);
+        final AudioFileFormat format = getAudioFileFormat(stream);
         // we've got everything, the stream is supported and it is at the
         // beginning of the header, so find the data chunk again and return an
         // AudioInputStream
-        RIFFReader riffiterator = new RIFFReader(stream);
+        final RIFFReader riffiterator = new RIFFReader(stream);
         while (riffiterator.hasNextChunk()) {
             RIFFReader chunk = riffiterator.nextChunk();
             if (chunk.getFormat().equals("data")) {
-                return new AudioInputStream(chunk, format.getFormat(),
-                        chunk.getSize());
+                final AudioFormat af = format.getFormat();
+                final long length = chunk.getSize() / af.getFrameSize();
+                return new AudioInputStream(chunk, af, length);
             }
         }
         throw new UnsupportedAudioFileException();
--- a/src/java.desktop/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java	Fri Mar 11 09:16:55 2016 -0800
@@ -231,7 +231,9 @@
             // Before all the checks below we first see if it's an FTP provider or a focus cycle root.
             // If it's the case just go down cycle (if it's set to "implicit").
             Component comp = getComponentDownCycle(aComponent, FORWARD_TRAVERSAL);
-            if (comp != null) {
+            // Check if aComponent is focus-cycle-root's default Component, i.e.
+            // focus cycle root & focus-cycle-root's default Component is same.
+            if (comp != null && comp != aComponent) {
                 return comp;
             }
 
--- a/src/java.desktop/share/classes/java/beans/EventHandler.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/java/beans/EventHandler.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -526,8 +526,11 @@
      * @throws NullPointerException if {@code listenerInterface} is null
      * @throws NullPointerException if {@code target} is null
      * @throws NullPointerException if {@code action} is null
-     *
+     * @throws IllegalArgumentException if creating a Proxy for
+     *         {@code listenerInterface} fails for any of the restrictions
+     *         specified by {@link Proxy#newProxyInstance}
      * @see #create(Class, Object, String, String)
+     * @see Proxy#newProxyInstance
      */
     public static <T> T create(Class<T> listenerInterface,
                                Object target, String action)
@@ -584,8 +587,11 @@
      * @throws NullPointerException if {@code listenerInterface} is null
      * @throws NullPointerException if {@code target} is null
      * @throws NullPointerException if {@code action} is null
-     *
+     * @throws IllegalArgumentException if creating a Proxy for
+     *         {@code listenerInterface} fails for any of the restrictions
+     *         specified by {@link Proxy#newProxyInstance}
      * @see #create(Class, Object, String, String, String)
+     * @see Proxy#newProxyInstance
      */
     public static <T> T create(Class<T> listenerInterface,
                                Object target, String action,
@@ -675,8 +681,11 @@
      * @throws NullPointerException if {@code listenerInterface} is null
      * @throws NullPointerException if {@code target} is null
      * @throws NullPointerException if {@code action} is null
-     *
+     * @throws IllegalArgumentException if creating a Proxy for
+     *         {@code listenerInterface} fails for any of the restrictions
+     *         specified by {@link Proxy#newProxyInstance}
      * @see EventHandler
+     * @see Proxy#newProxyInstance
      */
     public static <T> T create(Class<T> listenerInterface,
                                Object target, String action,
--- a/src/java.desktop/share/classes/java/beans/SimpleBeanInfo.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/java/beans/SimpleBeanInfo.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,8 @@
 
 import java.awt.Image;
 import java.awt.Toolkit;
-import java.io.InputStream;
+import java.awt.image.ImageProducer;
+import java.net.URL;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
@@ -171,19 +172,24 @@
     }
 
     /**
-     * This is a utility method to help in loading icon images.
-     * It takes the name of a resource file associated with the
-     * current object's class file and loads an image object
-     * from that file.  Typically images will be GIFs.
+     * This is a utility method to help in loading icon images. It takes the
+     * name of a resource file associated with the current object's class file
+     * and loads an image object from that file. Typically images will be GIFs.
      *
-     * @param resourceName  A pathname relative to the directory
-     *          holding the class file of the current class.  For example,
-     *          "wombat.gif".
-     * @return  an image object.  May be null if the load failed.
+     * @param  resourceName A pathname relative to the directory holding the
+     *         class file of the current class. For example, "wombat.gif".
+     * @return an image object or null if the resource is not found or the
+     *         resource could not be loaded as an Image
      */
     public Image loadImage(final String resourceName) {
-        try (InputStream in = getClass().getResourceAsStream(resourceName)) {
-            return Toolkit.getDefaultToolkit().createImage(in.readAllBytes());
+        try {
+            final URL url = getClass().getResource(resourceName);
+            if (url != null) {
+                final ImageProducer ip = (ImageProducer) url.getContent();
+                if (ip != null) {
+                    return Toolkit.getDefaultToolkit().createImage(ip);
+                }
+            }
         } catch (final Exception ignored) {
         }
         return null;
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/BaselineTIFFTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/BaselineTIFFTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -2175,9 +2175,9 @@
     }
 
     /**
-     * Returns a shared instance of a <code>BaselineTIFFTagSet</code>.
+     * Returns a shared instance of a {@code BaselineTIFFTagSet}.
      *
-     * @return a <code>BaselineTIFFTagSet</code> instance.
+     * @return a {@code BaselineTIFFTagSet} instance.
      */
     public synchronized static BaselineTIFFTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifGPSTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifGPSTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -51,7 +51,7 @@
     /**
      * A value to be used with the "GPSVersionID" tag to indicate GPS version
      * 2.2.  The value equals the US-ASCII encoding of the byte array
-     * <code>{'2', '2', '0', '0'}</code>.
+     * {@code {'2', '2', '0', '0'}}.
      *
      * @see #TAG_GPS_VERSION_ID
      */
@@ -711,9 +711,9 @@
     }
 
     /**
-     * Returns a shared instance of an <code>ExifGPSTagSet</code>.
+     * Returns a shared instance of an {@code ExifGPSTagSet}.
      *
-     * @return an <code>ExifGPSTagSet</code> instance.
+     * @return an {@code ExifGPSTagSet} instance.
      */
     public synchronized static ExifGPSTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifInteroperabilityTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifInteroperabilityTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -88,9 +88,9 @@
 
     /**
      * Returns the shared instance of
-     * <code>ExifInteroperabilityTagSet</code>.
+     * {@code ExifInteroperabilityTagSet}.
      *
-     * @return the <code>ExifInteroperabilityTagSet</code> instance.
+     * @return the {@code ExifInteroperabilityTagSet} instance.
      */
     public synchronized static ExifInteroperabilityTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifParentTIFFTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifParentTIFFTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -80,9 +80,9 @@
     }
 
     /**
-     * Returns a shared instance of an <code>ExifParentTIFFTagSet</code>.
+     * Returns a shared instance of an {@code ExifParentTIFFTagSet}.
      *
-     * @return an <code>ExifParentTIFFTagSet</code> instance.
+     * @return an {@code ExifParentTIFFTagSet} instance.
      */
     public synchronized static ExifParentTIFFTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifTIFFTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/ExifTIFFTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,7 @@
  * standard for annotating images used by most digital camera
  * manufacturers.  The Exif specification may be found at
  * <a href="http://www.exif.org/Exif2-2.PDF">
- * <code>http://www.exif.org/Exif2-2.PDF</code>
+ * {@code http://www.exif.org/Exif2-2.PDF}
  * </a>.
  *
  * <p> The definitions of the data types referenced by the field
@@ -67,7 +67,7 @@
     /**
      * A value to be used with the "ExifVersion" tag to indicate Exif version
      * 2.1.  The value equals the US-ASCII encoding of the byte array
-     * <code>{'0', '2', '1', '0'}</code>.
+     * {@code {'0', '2', '1', '0'}}.
      *
      * @see #TAG_EXIF_VERSION
      */
@@ -78,7 +78,7 @@
     /**
      * A value to be used with the "ExifVersion" tag to indicate Exif version
      * 2.2.  The value equals the US-ASCII encoding of the byte array
-     * <code>{'0', '2', '2', '0'}</code>.
+     * {@code {'0', '2', '2', '0'}}.
      *
      * @see #TAG_EXIF_VERSION
      */
@@ -94,7 +94,7 @@
 
     /**
      * A tag indicating the color space information (type SHORT).  The
-     * legal values are given by the <code>COLOR_SPACE_*</code>
+     * legal values are given by the {@code COLOR_SPACE_*}
      * constants.
      *
      * @see #COLOR_SPACE_SRGB
@@ -1256,7 +1256,7 @@
     static class ExifVersion extends TIFFTag {
 
         public ExifVersion() {
-            super("Exifversion",
+            super("ExifVersion",
                   TAG_EXIF_VERSION,
                   1 << TIFFTag.TIFF_UNDEFINED,
                   4);
@@ -1992,9 +1992,9 @@
     }
 
     /**
-     * Returns a shared instance of an <code>ExifTIFFTagSet</code>.
+     * Returns a shared instance of an {@code ExifTIFFTagSet}.
      *
-     * @return an <code>ExifTIFFTagSet</code> instance.
+     * @return an {@code ExifTIFFTagSet} instance.
      */
     public synchronized static ExifTIFFTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/FaxTIFFTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/FaxTIFFTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -131,9 +131,9 @@
     }
 
     /**
-     * Returns a shared instance of a <code>FaxTIFFTagSet</code>.
+     * Returns a shared instance of a {@code FaxTIFFTagSet}.
      *
-     * @return a <code>FaxTIFFTagSet</code> instance.
+     * @return a {@code FaxTIFFTagSet} instance.
      */
     public synchronized static FaxTIFFTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/GeoTIFFTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/GeoTIFFTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,7 +32,7 @@
  * standard for annotating georeferenced or geocoded raster imagery.
  * The GeoTIFF specification may be found at <a
  * href="http://www.remotesensing.org/geotiff/spec/geotiffhome.html">
- * <code>http://www.remotesensing.org/geotiff/spec/geotiffhome.html</code>
+ * {@code http://www.remotesensing.org/geotiff/spec/geotiffhome.html}
  * </a>. This class does <i>not</i> handle the <i>GeoKey</i>s referenced
  * from a <i>GeoKeyDirectoryTag</i> as those are not TIFF tags per se.
  *
@@ -63,7 +63,7 @@
     /** A tag used to store the <i>GeoKey</i> directory. */
     public static final int TAG_GEO_KEY_DIRECTORY = 34735;
 
-    /** A tag used to store all <code>double</code>-values <i>GeoKey</i>s. */
+    /** A tag used to store all {@code double}-values <i>GeoKey</i>s. */
     public static final int TAG_GEO_DOUBLE_PARAMS = 34736;
 
     /** A tag used to store all ASCII-values <i>GeoKey</i>s. */
@@ -97,7 +97,7 @@
 
     static class GeoKeyDirectory extends TIFFTag {
         public GeoKeyDirectory() {
-            super("GeoKeyDirectory",
+            super("GeoKeyDirectoryTag",
                   TAG_GEO_KEY_DIRECTORY,
                   1 << TIFFTag.TIFF_SHORT);
         }
@@ -105,7 +105,7 @@
 
     static class GeoDoubleParams extends TIFFTag {
         public GeoDoubleParams() {
-            super("GeoDoubleParams",
+            super("GeoDoubleParamsTag",
                   TAG_GEO_DOUBLE_PARAMS,
                   1 << TIFFTag.TIFF_DOUBLE);
         }
@@ -113,7 +113,7 @@
 
     static class GeoAsciiParams extends TIFFTag {
         public GeoAsciiParams() {
-            super("GeoAsciiParams",
+            super("GeoAsciiParamsTag",
                   TAG_GEO_ASCII_PARAMS,
                   1 << TIFFTag.TIFF_ASCII);
         }
@@ -137,9 +137,9 @@
     }
 
     /**
-     * Returns a shared instance of a <code>GeoTIFFTagSet</code>.
+     * Returns a shared instance of a {@code GeoTIFFTagSet}.
      *
-     * @return a <code>GeoTIFFTagSet</code> instance.
+     * @return a {@code GeoTIFFTagSet} instance.
      */
     public synchronized static GeoTIFFTagSet getInstance() {
         if (theInstance == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -41,58 +41,58 @@
  * image metadata. A TIFF image metadata tree represents an Image File
  * Directory (IFD) from a TIFF 6.0 stream. An IFD consists of a number of
  * IFD Entries each of which associates an identifying tag number with
- * a compatible value. A <code>TIFFDirectory</code> instance corresponds
+ * a compatible value. A {@code TIFFDirectory} instance corresponds
  * to an IFD and contains a set of {@link TIFFField}s each of which
  * corresponds to an IFD Entry in the IFD.
  *
- * <p>When reading, a <code>TIFFDirectory</code> may be created by passing
+ * <p>When reading, a {@code TIFFDirectory} may be created by passing
  * the value returned by {@link javax.imageio.ImageReader#getImageMetadata
  * ImageReader.getImageMetadata()} to {@link #createFromMetadata
  * createFromMetadata()}. The {@link TIFFField}s in the directory may then
  * be obtained using the accessor methods provided in this class.</p>
  *
  * <p>When writing, an {@link IIOMetadata} object for use by one of the
- * <code>write()</code> methods of {@link javax.imageio.ImageWriter} may be
- * created from a <code>TIFFDirectory</code> by {@link #getAsMetadata()}.
- * The <code>TIFFDirectory</code> itself may be created by construction or
- * from the <code>IIOMetadata</code> object returned by
+ * {@code write()} methods of {@link javax.imageio.ImageWriter} may be
+ * created from a {@code TIFFDirectory} by {@link #getAsMetadata()}.
+ * The {@code TIFFDirectory} itself may be created by construction or
+ * from the {@code IIOMetadata} object returned by
  * {@link javax.imageio.ImageWriter#getDefaultImageMetadata
- * ImageWriter.getDefaultImageMetadata()}. The <code>TIFFField</code>s in the
+ * ImageWriter.getDefaultImageMetadata()}. The {@code TIFFField}s in the
  * directory may be set using the mutator methods provided in this class.</p>
  *
- * <p>A <code>TIFFDirectory</code> is aware of the tag numbers in the
+ * <p>A {@code TIFFDirectory} is aware of the tag numbers in the
  * group of {@link TIFFTagSet}s associated with it. When
- * a <code>TIFFDirectory</code> is created from a native image metadata
+ * a {@code TIFFDirectory} is created from a native image metadata
  * object, these tag sets are derived from the <tt>tagSets</tt> attribute
  * of the <tt>TIFFIFD</tt> node.</p>
  *
- * <p>A <code>TIFFDirectory</code> might also have a parent {@link TIFFTag}.
+ * <p>A {@code TIFFDirectory} might also have a parent {@link TIFFTag}.
  * This will occur if the directory represents an IFD other than the root
  * IFD of the image. The parent tag is the tag of the IFD Entry which is a
- * pointer to the IFD represented by this <code>TIFFDirectory</code>. The
- * {@link TIFFTag#isIFDPointer} method of this parent <code>TIFFTag</code>
- * must return <code>true</code>.  When a <code>TIFFDirectory</code> is
+ * pointer to the IFD represented by this {@code TIFFDirectory}. The
+ * {@link TIFFTag#isIFDPointer} method of this parent {@code TIFFTag}
+ * must return {@code true}.  When a {@code TIFFDirectory} is
  * created from a native image metadata object, the parent tag set is set
  * from the <tt>parentTagName</tt> attribute of the corresponding
- * <tt>TIFFIFD</tt> node. Note that a <code>TIFFDirectory</code> instance
- * which has a non-<code>null</code> parent tag will be contained in the
- * data field of a <code>TIFFField</code> instance which has a tag field
+ * <tt>TIFFIFD</tt> node. Note that a {@code TIFFDirectory} instance
+ * which has a non-{@code null} parent tag will be contained in the
+ * data field of a {@code TIFFField} instance which has a tag field
  * equal to the contained directory's parent tag.</p>
  *
- * <p>As an example consider an Exif image. The <code>TIFFDirectory</code>
+ * <p>As an example consider an Exif image. The {@code TIFFDirectory}
  * instance corresponding to the Exif IFD in the Exif stream would have parent
  * tag {@link ExifParentTIFFTagSet#TAG_EXIF_IFD_POINTER TAG_EXIF_IFD_POINTER}
  * and would include {@link ExifTIFFTagSet} in its group of known tag sets.
- * The <code>TIFFDirectory</code> corresponding to this Exif IFD will be
- * contained in the data field of a <code>TIFFField</code> which will in turn
- * be contained in the <code>TIFFDirectory</code> corresponding to the primary
- * IFD of the Exif image which will itself have a <code>null</code>-valued
+ * The {@code TIFFDirectory} corresponding to this Exif IFD will be
+ * contained in the data field of a {@code TIFFField} which will in turn
+ * be contained in the {@code TIFFDirectory} corresponding to the primary
+ * IFD of the Exif image which will itself have a {@code null}-valued
  * parent tag.</p>
  *
  * <p><b>Note that this implementation is not synchronized. </b>If multiple
- * threads use a <code>TIFFDirectory</code> instance concurrently, and at
+ * threads use a {@code TIFFDirectory} instance concurrently, and at
  * least one of the threads modifies the directory, for example, by adding
- * or removing <code>TIFFField</code>s or <code>TIFFTagSet</code>s, it
+ * or removing {@code TIFFField}s or {@code TIFFTagSet}s, it
  * <i>must</i> be synchronized externally.</p>
  *
  * @since 9
@@ -107,10 +107,10 @@
     private static final int MAX_LOW_FIELD_TAG_NUM =
         BaselineTIFFTagSet.TAG_REFERENCE_BLACK_WHITE;
 
-    /** The <code>TIFFTagSets</code> associated with this directory. */
+    /** The {@code TIFFTagSets} associated with this directory. */
     private List<TIFFTagSet> tagSets;
 
-    /** The parent <code>TIFFTag</code> of this directory. */
+    /** The parent {@code TIFFTag} of this directory. */
     private TIFFTag parentTag;
 
     /**
@@ -123,13 +123,13 @@
     private int numLowFields = 0;
 
     /**
-     * A mapping of <code>Integer</code> tag numbers to <code>TIFFField</code>s
+     * A mapping of {@code Integer} tag numbers to {@code TIFFField}s
      * for fields which are not low tag numbered.
      */
     private Map<Integer,TIFFField> highFields = new TreeMap<Integer,TIFFField>();
 
     /**
-     * Creates a <code>TIFFDirectory</code> instance from the contents of
+     * Creates a {@code TIFFDirectory} instance from the contents of
      * an image metadata object. The supplied object must support an image
      * metadata format supported by the TIFF {@link javax.imageio.ImageWriter}
      * plug-in. This will usually be either the TIFF native image metadata
@@ -139,12 +139,12 @@
      * @param tiffImageMetadata A metadata object which supports a compatible
      * image metadata format.
      *
-     * @return A <code>TIFFDirectory</code> populated from the contents of
+     * @return A {@code TIFFDirectory} populated from the contents of
      * the supplied metadata object.
      *
-     * @throws NullPointerException if <code>tiffImageMetadata</code>
-     * is <code>null</code>.
-     * @throws IllegalArgumentException if <code>tiffImageMetadata</code>
+     * @throws NullPointerException if {@code tiffImageMetadata}
+     * is {@code null}.
+     * @throws IllegalArgumentException if {@code tiffImageMetadata}
      * does not support a compatible image metadata format.
      * @throws IIOInvalidTreeException if the supplied metadata object
      * cannot be parsed.
@@ -204,7 +204,7 @@
     }
 
     /**
-     * Converts a <code>TIFFDirectory</code> to a <code>TIFFIFD</code>.
+     * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
      */
     private static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
         if(dir instanceof TIFFIFD) {
@@ -219,27 +219,39 @@
             TIFFField f = fields[i];
             TIFFTag tag = f.getTag();
             if(tag.isIFDPointer()) {
-                TIFFDirectory subIFD =
-                    getDirectoryAsIFD((TIFFDirectory)f.getData());
-                f = new TIFFField(tag, f.getType(), (long)f.getCount(), subIFD);
+                TIFFDirectory subDir = null;
+                if (f.hasDirectory()) {
+                    subDir = f.getDirectory();
+                } else if (f.getData() instanceof TIFFDirectory) {
+                    subDir = (TIFFDirectory)f.getData();
+                }
+                if (subDir != null) {
+                    TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
+                    f = new TIFFField(tag, f.getType(), (long)f.getCount(),
+                                      subIFD);
+                } else {
+                    f = null;
+                }
             }
-            ifd.addTIFFField(f);
+            if (f != null) {
+                ifd.addTIFFField(f);
+            }
         }
 
         return ifd;
     }
 
     /**
-     * Constructs a <code>TIFFDirectory</code> which is aware of a given
+     * Constructs a {@code TIFFDirectory} which is aware of a given
      * group of {@link TIFFTagSet}s. An optional parent {@link TIFFTag}
      * may also be specified.
      *
-     * @param tagSets The <code>TIFFTagSets</code> associated with this
+     * @param tagSets The {@code TIFFTagSets} associated with this
      * directory.
-     * @param parentTag The parent <code>TIFFTag</code> of this directory;
-     * may be <code>null</code>.
-     * @throws NullPointerException if <code>tagSets</code> is
-     * <code>null</code>.
+     * @param parentTag The parent {@code TIFFTag} of this directory;
+     * may be {@code null}.
+     * @throws NullPointerException if {@code tagSets} is
+     * {@code null}.
      */
     public TIFFDirectory(TIFFTagSet[] tagSets, TIFFTag parentTag) {
         if(tagSets == null) {
@@ -256,8 +268,8 @@
     /**
      * Returns the {@link TIFFTagSet}s of which this directory is aware.
      *
-     * @return The <code>TIFFTagSet</code>s associated with this
-     * <code>TIFFDirectory</code>.
+     * @return The {@code TIFFTagSet}s associated with this
+     * {@code TIFFDirectory}.
      */
     public TIFFTagSet[] getTagSets() {
         return tagSets.toArray(new TIFFTagSet[tagSets.size()]);
@@ -267,9 +279,9 @@
      * Adds an element to the group of {@link TIFFTagSet}s of which this
      * directory is aware.
      *
-     * @param tagSet The <code>TIFFTagSet</code> to add.
-     * @throws NullPointerException if <code>tagSet</code> is
-     * <code>null</code>.
+     * @param tagSet The {@code TIFFTagSet} to add.
+     * @throws NullPointerException if {@code tagSet} is
+     * {@code null}.
      */
     public void addTagSet(TIFFTagSet tagSet) {
         if(tagSet == null) {
@@ -285,9 +297,9 @@
      * Removes an element from the group of {@link TIFFTagSet}s of which this
      * directory is aware.
      *
-     * @param tagSet The <code>TIFFTagSet</code> to remove.
-     * @throws NullPointerException if <code>tagSet</code> is
-     * <code>null</code>.
+     * @param tagSet The {@code TIFFTagSet} to remove.
+     * @throws NullPointerException if {@code tagSet} is
+     * {@code null}.
      */
     public void removeTagSet(TIFFTagSet tagSet) {
         if(tagSet == null) {
@@ -301,10 +313,10 @@
 
     /**
      * Returns the parent {@link TIFFTag} of this directory if one
-     * has been defined or <code>null</code> otherwise.
+     * has been defined or {@code null} otherwise.
      *
-     * @return The parent <code>TIFFTag</code> of this
-     * <code>TIFFDiectory</code> or <code>null</code>.
+     * @return The parent {@code TIFFTag} of this
+     * {@code TIFFDiectory} or {@code null}.
      */
     public TIFFTag getParentTag() {
         return parentTag;
@@ -312,12 +324,12 @@
 
     /**
      * Returns the {@link TIFFTag} which has tag number equal to
-     * <code>tagNumber</code> or <code>null</code> if no such tag
+     * {@code tagNumber} or {@code null} if no such tag
      * exists in the {@link TIFFTagSet}s associated with this
      * directory.
      *
      * @param tagNumber The tag number of interest.
-     * @return The corresponding <code>TIFFTag</code> or <code>null</code>.
+     * @return The corresponding {@code TIFFTag} or {@code null}.
      */
     public TIFFTag getTag(int tagNumber) {
         return TIFFIFD.getTag(tagNumber, tagSets);
@@ -326,8 +338,8 @@
     /**
      * Returns the number of {@link TIFFField}s in this directory.
      *
-     * @return The number of <code>TIFFField</code>s in this
-     * <code>TIFFDirectory</code>.
+     * @return The number of {@code TIFFField}s in this
+     * {@code TIFFDirectory}.
      */
     public int getNumTIFFFields() {
         return numLowFields + highFields.size();
@@ -339,7 +351,7 @@
      *
      * @param tagNumber The tag number.
      * @return Whether a {@link TIFFTag} with tag number equal to
-     * <code>tagNumber</code> is present in this <code>TIFFDirectory</code>.
+     * {@code tagNumber} is present in this {@code TIFFDirectory}.
      */
     public boolean containsTIFFField(int tagNumber) {
         return (tagNumber >= 0 && tagNumber <= MAX_LOW_FIELD_TAG_NUM &&
@@ -351,7 +363,7 @@
      * Adds a TIFF field to the directory.
      *
      * @param f The field to add.
-     * @throws NullPointerException if <code>f</code> is <code>null</code>.
+     * @throws NullPointerException if {@code f} is {@code null}.
      */
     public void addTIFFField(TIFFField f) {
         if(f == null) {
@@ -372,8 +384,8 @@
      * Retrieves a TIFF field from the directory.
      *
      * @param tagNumber The tag number of the tag associated with the field.
-     * @return A <code>TIFFField</code> with the requested tag number of
-     * <code>null</code> if no such field is present.
+     * @return A {@code TIFFField} with the requested tag number of
+     * {@code null} if no such field is present.
      */
     public TIFFField getTIFFField(int tagNumber) {
         TIFFField f;
@@ -444,7 +456,7 @@
      * Converts the directory to a metadata object.
      *
      * @return A metadata instance initialized from the contents of this
-     * <code>TIFFDirectory</code>.
+     * {@code TIFFDirectory}.
      */
     public IIOMetadata getAsMetadata() {
         return new TIFFImageMetadata(getDirectoryAsIFD(this));
@@ -453,7 +465,7 @@
     /**
      * Clones the directory and all the fields contained therein.
      *
-     * @return A clone of this <code>TIFFDirectory</code>.
+     * @return A clone of this {@code TIFFDirectory}.
      * @throws CloneNotSupportedException if the instance cannot be cloned.
      */
     @Override
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,7 @@
  *
  * <p> A field in a TIFF Image File Directory (IFD) is defined as a
  * tag number accompanied by a sequence of values of identical data type.
- * TIFF 6.0 defines 12 data types; a 13th type <code>IFD</code> is
+ * TIFF 6.0 defines 12 data types; a 13th type {@code IFD} is
  * defined in TIFF Tech Note 1 of TIFF Specification Supplement 1. These
  * TIFF data types are referred to by Java constants and mapped internally
  * onto Java language data types and type names as follows:
@@ -68,10 +68,10 @@
  * {@link TIFFTag#TIFF_BYTE}
  * </td>
  * <td>
- * <code>byte</code>
+ * {@code byte}
  * </td>
  * <td>
- * <code>"Byte"</code>
+ * {@code "Byte"}
  * </td>
  * </tr>
  *
@@ -83,10 +83,10 @@
  * {@link TIFFTag#TIFF_ASCII}
  * </td>
  * <td>
- * <code>String</code>
+ * {@code String}
  * </td>
  * <td>
- * <code>"Ascii"</code>
+ * {@code "Ascii"}
  * </td>
  * </tr>
  *
@@ -98,10 +98,10 @@
  * {@link TIFFTag#TIFF_SHORT}
  * </td>
  * <td>
- * <code>char</code>
+ * {@code char}
  * </td>
  * <td>
- * <code>"Short"</code>
+ * {@code "Short"}
  * </td>
  * </tr>
  *
@@ -113,10 +113,10 @@
  * {@link TIFFTag#TIFF_LONG}
  * </td>
  * <td>
- * <code>long</code>
+ * {@code long}
  * </td>
  * <td>
- * <code>"Long"</code>
+ * {@code "Long"}
  * </td>
  * </tr>
  *
@@ -128,10 +128,10 @@
  * {@link TIFFTag#TIFF_RATIONAL}
  * </td>
  * <td>
- * <code>long[2]</code> {numerator, denominator}
+ * {@code long[2]} {numerator, denominator}
  * </td>
  * <td>
- * <code>"Rational"</code>
+ * {@code "Rational"}
  * </td>
  * </tr>
  *
@@ -143,10 +143,10 @@
  * {@link TIFFTag#TIFF_SBYTE}
  * </td>
  * <td>
- * <code>byte</code>
+ * {@code byte}
  * </td>
  * <td>
- * <code>"SByte"</code>
+ * {@code "SByte"}
  * </td>
  * </tr>
  *
@@ -158,10 +158,10 @@
  * {@link TIFFTag#TIFF_UNDEFINED}
  * </td>
  * <td>
- * <code>byte</code>
+ * {@code byte}
  * </td>
  * <td>
- * <code>"Undefined"</code>
+ * {@code "Undefined"}
  * </td>
  * </tr>
  *
@@ -173,10 +173,10 @@
  * {@link TIFFTag#TIFF_SSHORT}
  * </td>
  * <td>
- * <code>short</code>
+ * {@code short}
  * </td>
  * <td>
- * <code>"SShort"</code>
+ * {@code "SShort"}
  * </td>
  * </tr>
  *
@@ -188,10 +188,10 @@
  * {@link TIFFTag#TIFF_SLONG}
  * </td>
  * <td>
- * <code>int</code>
+ * {@code int}
  * </td>
  * <td>
- * <code>"SLong"</code>
+ * {@code "SLong"}
  * </td>
  * </tr>
  *
@@ -203,10 +203,10 @@
  * {@link TIFFTag#TIFF_SRATIONAL}
  * </td>
  * <td>
- * <code>int[2]</code> {numerator, denominator}
+ * {@code int[2]} {numerator, denominator}
  * </td>
  * <td>
- * <code>"SRational"</code>
+ * {@code "SRational"}
  * </td>
  * </tr>
  *
@@ -218,10 +218,10 @@
  * {@link TIFFTag#TIFF_FLOAT}
  * </td>
  * <td>
- * <code>float</code>
+ * {@code float}
  * </td>
  * <td>
- * <code>"Float"</code>
+ * {@code "Float"}
  * </td>
  * </tr>
  *
@@ -233,10 +233,10 @@
  * {@link TIFFTag#TIFF_DOUBLE}
  * </td>
  * <td>
- * <code>double</code>
+ * {@code double}
  * </td>
  * <td>
- * <code>"Double"</code>
+ * {@code "Double"}
  * </td>
  * </tr>
  *
@@ -248,10 +248,10 @@
  * {@link TIFFTag#TIFF_IFD_POINTER}
  * </td>
  * <td>
- * <code>long</code>
+ * {@code long}
  * </td>
  * <td>
- * <code>"IFDPointer"</code>
+ * {@code "IFDPointer"}
  * </td>
  * </tr>
  *
@@ -411,19 +411,19 @@
     }
 
     /**
-     * Creates a <code>TIFFField</code> from a TIFF native image
+     * Creates a {@code TIFFField} from a TIFF native image
      * metadata node. If the value of the <tt>"tagNumber"</tt> attribute
-     * of the node is not found in <code>tagSet</code> then a new
-     * <code>TIFFTag</code> with name <code>TIFFTag.UNKNOWN_TAG_NAME</code>
+     * of the node is not found in {@code tagSet} then a new
+     * {@code TIFFTag} with name {@code TIFFTag.UNKNOWN_TAG_NAME}
      * will be created and assigned to the field.
      *
-     * @param tagSet The <code>TIFFTagSet</code> to which the
-     * <code>TIFFTag</code> of the field belongs.
-     * @param node A native TIFF image metadata <code>TIFFField</code> node.
-     * @throws NullPointerException if <code>node</code> is
-     * <code>null</code>.
+     * @param tagSet The {@code TIFFTagSet} to which the
+     * {@code TIFFTag} of the field belongs.
+     * @param node A native TIFF image metadata {@code TIFFField} node.
+     * @throws NullPointerException if {@code node} is
+     * {@code null}.
      * @throws IllegalArgumentException if the name of the node is not
-     * <code>"TIFFField"</code>.
+     * {@code "TIFFField"}.
      * @return A new {@code TIFFField}.
      */
     public static TIFFField createFromMetadataNode(TIFFTagSet tagSet,
@@ -487,14 +487,14 @@
     }
 
     /**
-     * Constructs a <code>TIFFField</code> with arbitrary data. The
-     * <code>type</code> parameter must be a value for which
+     * Constructs a {@code TIFFField} with arbitrary data. The
+     * {@code type} parameter must be a value for which
      * {@link TIFFTag#isDataTypeOK tag.isDataTypeOK()}
-     * returns <code>true</code>. The <code>data</code> parameter must
+     * returns {@code true}. The {@code data} parameter must
      * be an array of a Java type appropriate for the type of the TIFF
      * field.
      *
-     * <p>Note that the value (data) of the <code>TIFFField</code>
+     * <p>Note that the value (data) of the {@code TIFFField}
      * will always be the actual field value regardless of the number of
      * bytes required for that value. This is the case despite the fact
      * that the TIFF <i>IFD Entry</i> corresponding to the field may
@@ -503,24 +503,29 @@
      * value fits into 4 bytes). In other words, the value of the
      * field will already have been read from the TIFF stream. (An exception
      * to this case may occur when the field represents the contents of a
-     * non-baseline IFD. In that case the data will be a <code>long[]</code>
-     * containing the offset to the IFD and the <code>TIFFDirectory</code>
+     * non-baseline IFD. In that case the data will be a {@code long[]}
+     * containing the offset to the IFD and the {@code TIFFDirectory}
      * returned by {@link #getDirectory()} will be its contents.)
      *
      * @param tag The tag to associated with this field.
-     * @param type One of the <code>TIFFTag.TIFF_*</code> constants
+     * @param type One of the {@code TIFFTag.TIFF_*} constants
      * indicating the data type of the field as written to the TIFF stream.
      * @param count The number of data values.
      * @param data The actual data content of the field.
      *
-     * @throws NullPointerException if <code>tag&nbsp;==&nbsp;null</code>.
-     * @throws IllegalArgumentException if <code>type</code> is not
-     * one of the <code>TIFFTag.TIFF_*</code> data type constants.
-     * @throws IllegalArgumentException if <code>type</code> is an unacceptable
-     * data type for the supplied <code>TIFFTag</code>.
-     * @throws IllegalArgumentException if <code>count&nbsp;&lt;&nbsp;0</code>.
-     * @throws NullPointerException if <code>data&nbsp;==&nbsp;null</code>.
-     * @throws IllegalArgumentException if <code>data</code> is an instance of
+     * @throws NullPointerException if {@code tag&nbsp;==&nbsp;null}.
+     * @throws IllegalArgumentException if {@code type} is not
+     * one of the {@code TIFFTag.TIFF_*} data type constants.
+     * @throws IllegalArgumentException if {@code type} is an unacceptable
+     * data type for the supplied {@code TIFFTag}.
+     * @throws IllegalArgumentException if {@code count&nbsp;&lt;&nbsp;0}.
+     * @throws IllegalArgumentException if {@code count&nbsp;&lt;&nbsp;1}
+     * and {@code type} is {@code TIFF_RATIONAL} or
+     * {@code TIFF_SRATIONAL}.
+     * @throws IllegalArgumentException if {@code count&nbsp;&ne;&nbsp;1}
+     * and {@code type} is {@code TIFF_IFD_POINTER}.
+     * @throws NullPointerException if {@code data&nbsp;==&nbsp;null}.
+     * @throws IllegalArgumentException if {@code data} is an instance of
      * a class incompatible with the specified type.
      * @throws IllegalArgumentException if the size of the data array is wrong.
      */
@@ -534,6 +539,14 @@
                 + " for " + tag.getName() + " tag");
         } else if(count < 0) {
             throw new IllegalArgumentException("count < 0!");
+        } else if((type == TIFFTag.TIFF_RATIONAL
+                   || type == TIFFTag.TIFF_SRATIONAL)
+                  && count < 1) {
+            throw new IllegalArgumentException
+                ("Type is TIFF_RATIONAL or TIFF_SRATIONAL and count < 1");
+        } else if (type == TIFFTag.TIFF_IFD_POINTER && count != 1) {
+            throw new IllegalArgumentException
+                ("Type is TIFF_IFD_POINTER count != 1");
         } else if(data == null) {
             throw new NullPointerException("data == null!");
         }
@@ -612,15 +625,15 @@
      * parameters and the created array.
      *
      * @param tag The tag to associated with this field.
-     * @param type One of the <code>TIFFTag.TIFF_*</code> constants
+     * @param type One of the {@code TIFFTag.TIFF_*} constants
      * indicating the data type of the field as written to the TIFF stream.
      * @param count The number of data values.
-     * @throws NullPointerException if <code>tag&nbsp;==&nbsp;null</code>.
-     * @throws IllegalArgumentException if <code>type</code> is not
-     * one of the <code>TIFFTag.TIFF_*</code> data type constants.
-     * @throws IllegalArgumentException if <code>type</code> is an unacceptable
-     * data type for the supplied <code>TIFFTag</code>.
-     * @throws IllegalArgumentException if <code>count&nbsp;&lt;&nbsp;0</code>.
+     * @throws NullPointerException if {@code tag&nbsp;==&nbsp;null}.
+     * @throws IllegalArgumentException if {@code type} is not
+     * one of the {@code TIFFTag.TIFF_*} data type constants.
+     * @throws IllegalArgumentException if {@code type} is an unacceptable
+     * data type for the supplied {@code TIFFTag}.
+     * @throws IllegalArgumentException if {@code count&nbsp;&lt;&nbsp;0}.
      * @see #TIFFField(TIFFTag,int,int,Object)
      */
     public TIFFField(TIFFTag tag, int type, int count) {
@@ -628,20 +641,20 @@
     }
 
     /**
-     * Constructs a <code>TIFFField</code> with a single non-negative integral
+     * Constructs a {@code TIFFField} with a single non-negative integral
      * value.
      * The field will have type
      * {@link TIFFTag#TIFF_SHORT  TIFF_SHORT} if
-     * <code>val&nbsp;&lt;&nbsp;65536</code> and type
+     * {@code val&nbsp;&lt;&nbsp;65536} and type
      * {@link TIFFTag#TIFF_LONG TIFF_LONG} otherwise.  The count
      * of the field will be unity.
      *
      * @param tag The tag to associate with this field.
      * @param value The value to associate with this field.
-     * @throws NullPointerException if <code>tag&nbsp;==&nbsp;null</code>.
+     * @throws NullPointerException if {@code tag&nbsp;==&nbsp;null}.
      * @throws IllegalArgumentException if the derived type is unacceptable
-     * for the supplied <code>TIFFTag</code>.
-     * @throws IllegalArgumentException if <code>value&nbsp;&lt;&nbsp;0</code>.
+     * for the supplied {@code TIFFTag}.
+     * @throws IllegalArgumentException if {@code value&nbsp;&lt;&nbsp;0}.
      */
     public TIFFField(TIFFTag tag, int value) {
         if(tag == null) {
@@ -677,24 +690,24 @@
     }
 
     /**
-     * Constructs a <code>TIFFField</code> with an IFD offset and contents.
+     * Constructs a {@code TIFFField} with an IFD offset and contents.
      * The offset will be stored as the data of this field as
-     * <code>long[] {offset}</code>. The directory will not be cloned. The count
+     * {@code long[] {offset}}. The directory will not be cloned. The count
      * of the field will be unity.
      *
      * @param tag The tag to associated with this field.
-     * @param type One of the constants <code>TIFFTag.TIFF_LONG</code> or
-     * <code>TIFFTag.TIFF_IFD_POINTER</code>.
+     * @param type One of the constants {@code TIFFTag.TIFF_LONG} or
+     * {@code TIFFTag.TIFF_IFD_POINTER}.
      * @param offset The IFD offset.
      * @param dir The directory.
      *
-     * @throws NullPointerException if <code>tag&nbsp;==&nbsp;null</code>.
-     * @throws IllegalArgumentException if <code>type</code> is neither
-     * <code>TIFFTag.TIFF_LONG</code> nor <code>TIFFTag.TIFF_IFD_POINTER</code>.
-     * @throws IllegalArgumentException if <code>type</code> is an unacceptable
-     * data type for the supplied <code>TIFFTag</code>.
-     * @throws IllegalArgumentException if <code>offset</code> is non-positive.
-     * @throws NullPointerException if <code>dir&nbsp;==&nbsp;null</code>.
+     * @throws NullPointerException if {@code tag&nbsp;==&nbsp;null}.
+     * @throws IllegalArgumentException if {@code type} is neither
+     * {@code TIFFTag.TIFF_LONG} nor {@code TIFFTag.TIFF_IFD_POINTER}.
+     * @throws IllegalArgumentException if {@code type} is an unacceptable
+     * data type for the supplied {@code TIFFTag}.
+     * @throws IllegalArgumentException if {@code offset} is non-positive.
+     * @throws NullPointerException if {@code dir&nbsp;==&nbsp;null}.
      *
      * @see #TIFFField(TIFFTag,int,int,Object)
      */
@@ -715,14 +728,14 @@
     /**
      * Retrieves the tag associated with this field.
      *
-     * @return The associated <code>TIFFTag</code>.
+     * @return The associated {@code TIFFTag}.
      */
     public TIFFTag getTag() {
         return tag;
     }
 
     /**
-     * Retrieves the tag number in the range <code>[0,&nbsp;65535]</code>.
+     * Retrieves the tag number in the range {@code [0,&nbsp;65535]}.
      *
      * @return The tag number.
      */
@@ -732,7 +745,7 @@
 
     /**
      * Returns the type of the data stored in the field.  For a TIFF 6.0
-     * stream, the value will equal one of the <code>TIFFTag.TIFF_*</code>
+     * stream, the value will equal one of the {@code TIFFTag.TIFF_*}
      * constants. For future revisions of TIFF, higher values are possible.
      *
      * @return The data type of the field value.
@@ -744,11 +757,11 @@
     /**
      * Returns the name of the supplied data type constant.
      *
-     * @param dataType One of the <code>TIFFTag.TIFF_*</code> constants
+     * @param dataType One of the {@code TIFFTag.TIFF_*} constants
      * indicating the data type of the field as written to the TIFF stream.
      * @return The type name corresponding to the supplied type constant.
-     * @throws IllegalArgumentException if <code>dataType</code> is not
-     * one of the <code>TIFFTag.TIFF_*</code> data type constants.
+     * @throws IllegalArgumentException if {@code dataType} is not
+     * one of the {@code TIFFTag.TIFF_*} data type constants.
      */
     public static String getTypeName(int dataType) {
         if (dataType < TIFFTag.MIN_DATATYPE ||
@@ -761,11 +774,11 @@
 
     /**
      * Returns the data type constant corresponding to the supplied data
-     * type name. If the name is unknown <code>-1</code> will be returned.
+     * type name. If the name is unknown {@code -1} will be returned.
      *
      * @param typeName The type name.
-     * @return One of the <code>TIFFTag.TIFF_*</code> constants or
-     * <code>-1</code> if the name is not recognized.
+     * @return One of the {@code TIFFTag.TIFF_*} constants or
+     * {@code -1} if the name is not recognized.
      */
     public static int getTypeByName(String typeName) {
         for (int i = TIFFTag.MIN_DATATYPE; i <= TIFFTag.MAX_DATATYPE; i++) {
@@ -780,14 +793,14 @@
     /**
      * Creates an array appropriate for the indicated data type.
      *
-     * @param dataType One of the <code>TIFFTag.TIFF_*</code> data type
+     * @param dataType One of the {@code TIFFTag.TIFF_*} data type
      * constants.
      * @param count The number of values in the array.
      * @return An array appropriate for the specified data type.
      *
-     * @throws IllegalArgumentException if <code>dataType</code> is not
-     * one of the <code>TIFFTag.TIFF_*</code> data type constants.
-     * @throws IllegalArgumentException if <code>count&nbsp;&lt;&nbsp;0</code>.
+     * @throws IllegalArgumentException if {@code dataType} is not
+     * one of the {@code TIFFTag.TIFF_*} data type constants.
+     * @throws IllegalArgumentException if {@code count&nbsp;&lt;&nbsp;0}.
      */
     public static Object createArrayForType(int dataType, int count) {
         if(count < 0) {
@@ -823,15 +836,15 @@
     }
 
     /**
-     * Returns the <code>TIFFField</code> as a node named either
+     * Returns the {@code TIFFField} as a node named either
      * <tt>"TIFFField"</tt> or <tt>"TIFFIFD"</tt> as described in the
      * TIFF native image metadata specification. The node will be named
      * <tt>"TIFFIFD"</tt> if and only if the field's data object is an
      * instance of {@link TIFFDirectory} or equivalently
      * {@link TIFFTag#isIFDPointer getTag.isIFDPointer()} returns
-     * <code>true</code>.
+     * {@code true}.
      *
-     * @return a <code>Node</code> named <tt>"TIFFField"</tt> or
+     * @return a {@code Node} named <tt>"TIFFField"</tt> or
      * <tt>"TIFFIFD"</tt>.
      */
     public Node getAsNativeNode() {
@@ -850,8 +863,8 @@
 
     /**
      * Returns the number of data items present in the field.  For
-     * <code>TIFFTag.TIFF_ASCII</code> fields, the value returned is the
-     * number of <code>String</code>s, not the total length of the
+     * {@code TIFFTag.TIFF_ASCII} fields, the value returned is the
+     * number of {@code String}s, not the total length of the
      * data as in the file representation.
      *
      * @return The number of data items present in the field.
@@ -871,17 +884,17 @@
 
     /**
      * Returns the data as an uninterpreted array of
-     * <code>byte</code>s.  The type of the field must be one of
-     * <code>TIFFTag.TIFF_BYTE</code>, <code>TIFF_SBYTE</code>, or
-     * <code>TIFF_UNDEFINED</code>.
+     * {@code byte}s.  The type of the field must be one of
+     * {@code TIFFTag.TIFF_BYTE}, {@code TIFF_SBYTE}, or
+     * {@code TIFF_UNDEFINED}.
      *
-     * <p> For data in <code>TIFFTag.TIFF_BYTE</code> format, the application
+     * <p> For data in {@code TIFFTag.TIFF_BYTE} format, the application
      * must take care when promoting the data to longer integral types
      * to avoid sign extension.
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_BYTE</code>, <code>TIFF_SBYTE</code>, or
-     * <code>TIFF_UNDEFINED</code>.
+     * {@code TIFF_BYTE}, {@code TIFF_SBYTE}, or
+     * {@code TIFF_UNDEFINED}.
      * @return The data as an uninterpreted array of bytes.
      */
     public byte[] getAsBytes() {
@@ -889,11 +902,11 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_SHORT</code> data as an array of
-     * <code>char</code>s (unsigned 16-bit integers).
+     * Returns {@code TIFFTag.TIFF_SHORT} data as an array of
+     * {@code char}s (unsigned 16-bit integers).
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_SHORT</code>.
+     * {@code TIFF_SHORT}.
      * @return The data as an array of {@code char}s.
      */
     public char[] getAsChars() {
@@ -901,11 +914,11 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_SSHORT</code> data as an array of
-     * <code>short</code>s (signed 16-bit integers).
+     * Returns {@code TIFFTag.TIFF_SSHORT} data as an array of
+     * {@code short}s (signed 16-bit integers).
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_SSHORT</code>.
+     * {@code TIFF_SSHORT}.
      * @return The data as an array of {@code short}s.
      */
     public short[] getAsShorts() {
@@ -913,12 +926,12 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_SLONG</code> data as an array of
-     * <code>int</code>s (signed 32-bit integers).
+     * Returns {@code TIFFTag.TIFF_SLONG} data as an array of
+     * {@code int}s (signed 32-bit integers).
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_SHORT</code>, <code>TIFF_SSHORT</code>, or
-     * <code>TIFF_SLONG</code>.
+     * {@code TIFF_SHORT}, {@code TIFF_SSHORT}, or
+     * {@code TIFF_SLONG}.
      * @return The data as an array of {@code int}s.
      */
     public int[] getAsInts() {
@@ -944,12 +957,12 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_LONG</code> or
-     * <code>TIFF_IFD_POINTER</code> data as an array of
-     * <code>long</code>s (signed 64-bit integers).
+     * Returns {@code TIFFTag.TIFF_LONG} or
+     * {@code TIFF_IFD_POINTER} data as an array of
+     * {@code long}s (signed 64-bit integers).
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_LONG</code> or <code>TIFF_IFD_POINTER</code>.
+     * {@code TIFF_LONG} or {@code TIFF_IFD_POINTER}.
      * @return The data as an array of {@code long}s.
      */
     public long[] getAsLongs() {
@@ -957,11 +970,11 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_FLOAT</code> data as an array of
-     * <code>float</code>s (32-bit floating-point values).
+     * Returns {@code TIFFTag.TIFF_FLOAT} data as an array of
+     * {@code float}s (32-bit floating-point values).
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_FLOAT</code>.
+     * {@code TIFF_FLOAT}.
      * @return The data as an array of {@code float}s.
      */
     public float[] getAsFloats() {
@@ -969,11 +982,11 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_DOUBLE</code> data as an array of
-     * <code>double</code>s (64-bit floating-point values).
+     * Returns {@code TIFFTag.TIFF_DOUBLE} data as an array of
+     * {@code double}s (64-bit floating-point values).
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_DOUBLE</code>.
+     * {@code TIFF_DOUBLE}.
      * @return The data as an array of {@code double}s.
      */
     public double[] getAsDoubles() {
@@ -981,11 +994,11 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_SRATIONAL</code> data as an array of
-     * 2-element arrays of <code>int</code>s.
+     * Returns {@code TIFFTag.TIFF_SRATIONAL} data as an array of
+     * 2-element arrays of {@code int}s.
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_SRATIONAL</code>.
+     * {@code TIFF_SRATIONAL}.
      * @return The data as an array of signed rationals.
      */
     public int[][] getAsSRationals() {
@@ -993,11 +1006,11 @@
     }
 
     /**
-     * Returns <code>TIFFTag.TIFF_RATIONAL</code> data as an array of
-     * 2-element arrays of <code>long</code>s.
+     * Returns {@code TIFFTag.TIFF_RATIONAL} data as an array of
+     * 2-element arrays of {@code long}s.
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_RATIONAL</code>.
+     * {@code TIFF_RATIONAL}.
      * @return The data as an array of unsigned rationals.
      */
     public long[][] getAsRationals() {
@@ -1005,30 +1018,30 @@
     }
 
     /**
-     * Returns data in any format as an <code>int</code>.
+     * Returns data in any format as an {@code int}.
      *
-     * <p> <code>TIFFTag.TIFF_BYTE</code> values are treated as unsigned; that
+     * <p> {@code TIFFTag.TIFF_BYTE} values are treated as unsigned; that
      * is, no sign extension will take place and the returned value
-     * will be in the range [0, 255].  <code>TIFF_SBYTE</code> data
+     * will be in the range [0, 255].  {@code TIFF_SBYTE} data
      * will be returned in the range [-128, 127].
      *
-     * <p> A <code>TIFF_UNDEFINED</code> value is treated as though
-     * it were a <code>TIFF_BYTE</code>.
+     * <p> A {@code TIFF_UNDEFINED} value is treated as though
+     * it were a {@code TIFF_BYTE}.
      *
-     * <p> Data in <code>TIFF_SLONG</code>, <code>TIFF_LONG</code>,
-     * <code>TIFF_FLOAT</code>, <code>TIFF_DOUBLE</code> or
-     * <code>TIFF_IFD_POINTER</code> format are simply cast to
-     * <code>int</code> and may suffer from truncation.
+     * <p> Data in {@code TIFF_SLONG}, {@code TIFF_LONG},
+     * {@code TIFF_FLOAT}, {@code TIFF_DOUBLE} or
+     * {@code TIFF_IFD_POINTER} format are simply cast to
+     * {@code int} and may suffer from truncation.
      *
-     * <p> Data in <code>TIFF_SRATIONAL</code> or
-     * <code>TIFF_RATIONAL</code> format are evaluated by dividing the
+     * <p> Data in {@code TIFF_SRATIONAL} or
+     * {@code TIFF_RATIONAL} format are evaluated by dividing the
      * numerator into the denominator using double-precision
-     * arithmetic and then casting to <code>int</code>.  Loss of
+     * arithmetic and then casting to {@code int}.  Loss of
      * precision and truncation may occur.
      *
-     * <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
-     * the <code>Double.parseDouble</code> method, with the result
-     * case to <code>int</code>.
+     * <p> Data in {@code TIFF_ASCII} format will be parsed as by
+     * the {@code Double.parseDouble} method, with the result
+     * case to {@code int}.
      *
      * @param index The index of the data.
      * @return The data at the given index as an {@code int}.
@@ -1068,17 +1081,17 @@
     }
 
     /**
-     * Returns data in any format as a <code>long</code>.
+     * Returns data in any format as a {@code long}.
      *
-     * <p> <code>TIFFTag.TIFF_BYTE</code> and <code>TIFF_UNDEFINED</code> data
+     * <p> {@code TIFFTag.TIFF_BYTE} and {@code TIFF_UNDEFINED} data
      * are treated as unsigned; that is, no sign extension will take
      * place and the returned value will be in the range [0, 255].
-     * <code>TIFF_SBYTE</code> data will be returned in the range
+     * {@code TIFF_SBYTE} data will be returned in the range
      * [-128, 127].
      *
-     * <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
-     * the <code>Double.parseDouble</code> method, with the result
-     * cast to <code>long</code>.
+     * <p> Data in {@code TIFF_ASCII} format will be parsed as by
+     * the {@code Double.parseDouble} method, with the result
+     * cast to {@code long}.
      *
      * @param index The index of the data.
      * @return The data at the given index as a {@code long}.
@@ -1114,27 +1127,27 @@
     }
 
     /**
-     * Returns data in any format as a <code>float</code>.
+     * Returns data in any format as a {@code float}.
      *
-     * <p> <code>TIFFTag.TIFF_BYTE</code> and <code>TIFF_UNDEFINED</code> data
+     * <p> {@code TIFFTag.TIFF_BYTE} and {@code TIFF_UNDEFINED} data
      * are treated as unsigned; that is, no sign extension will take
      * place and the returned value will be in the range [0, 255].
-     * <code>TIFF_SBYTE</code> data will be returned in the range
+     * {@code TIFF_SBYTE} data will be returned in the range
      * [-128, 127].
      *
-     * <p> Data in <code>TIFF_SLONG</code>, <code>TIFF_LONG</code>,
-     * <code>TIFF_DOUBLE</code>, or <code>TIFF_IFD_POINTER</code> format are
-     * simply cast to <code>float</code> and may suffer from
+     * <p> Data in {@code TIFF_SLONG}, {@code TIFF_LONG},
+     * {@code TIFF_DOUBLE}, or {@code TIFF_IFD_POINTER} format are
+     * simply cast to {@code float} and may suffer from
      * truncation.
      *
-     * <p> Data in <code>TIFF_SRATIONAL</code> or
-     * <code>TIFF_RATIONAL</code> format are evaluated by dividing the
+     * <p> Data in {@code TIFF_SRATIONAL} or
+     * {@code TIFF_RATIONAL} format are evaluated by dividing the
      * numerator into the denominator using double-precision
-     * arithmetic and then casting to <code>float</code>.
+     * arithmetic and then casting to {@code float}.
      *
-     * <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
-     * the <code>Double.parseDouble</code> method, with the result
-     * cast to <code>float</code>.
+     * <p> Data in {@code TIFF_ASCII} format will be parsed as by
+     * the {@code Double.parseDouble} method, with the result
+     * cast to {@code float}.
      *
      * @param index The index of the data.
      * @return The data at the given index as a {@code float}.
@@ -1174,21 +1187,21 @@
     }
 
     /**
-     * Returns data in any format as a <code>double</code>.
+     * Returns data in any format as a {@code double}.
      *
-     * <p> <code>TIFFTag.TIFF_BYTE</code> and <code>TIFF_UNDEFINED</code> data
+     * <p> {@code TIFFTag.TIFF_BYTE} and {@code TIFF_UNDEFINED} data
      * are treated as unsigned; that is, no sign extension will take
      * place and the returned value will be in the range [0, 255].
-     * <code>TIFF_SBYTE</code> data will be returned in the range
+     * {@code TIFF_SBYTE} data will be returned in the range
      * [-128, 127].
      *
-     * <p> Data in <code>TIFF_SRATIONAL</code> or
-     * <code>TIFF_RATIONAL</code> format are evaluated by dividing the
+     * <p> Data in {@code TIFF_SRATIONAL} or
+     * {@code TIFF_RATIONAL} format are evaluated by dividing the
      * numerator into the denominator using double-precision
      * arithmetic.
      *
-     * <p> Data in <code>TIFF_ASCII</code> format will be parsed as by
-     * the <code>Double.parseDouble</code> method.
+     * <p> Data in {@code TIFF_ASCII} format will be parsed as by
+     * the {@code Double.parseDouble} method.
      *
      * @param index The index of the data.
      * @return The data at the given index as a {@code double}.
@@ -1228,11 +1241,11 @@
     }
 
     /**
-     * Returns a <code>TIFFTag.TIFF_ASCII</code> value as a
-     * <code>String</code>.
+     * Returns a {@code TIFFTag.TIFF_ASCII} value as a
+     * {@code String}.
      *
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_ASCII</code>.
+     * {@code TIFF_ASCII}.
      *
      * @param index The index of the data.
      * @return The data at the given index as a {@code String}.
@@ -1242,13 +1255,13 @@
     }
 
     /**
-     * Returns a <code>TIFFTag.TIFF_SRATIONAL</code> data item as a
-     * two-element array of <code>int</code>s.
+     * Returns a {@code TIFFTag.TIFF_SRATIONAL} data item as a
+     * two-element array of {@code int}s.
      *
      * @param index The index of the data.
      * @return The data at the given index as a signed rational.
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_SRATIONAL</code>.
+     * {@code TIFF_SRATIONAL}.
      */
     public int[] getAsSRational(int index) {
         return ((int[][])data)[index];
@@ -1261,7 +1274,7 @@
      * @param index The index of the data.
      * @return The data at the given index as an unsigned rational.
      * @throws ClassCastException if the field is not of type
-     * <code>TIFF_RATIONAL</code>.
+     * {@code TIFF_RATIONAL}.
      */
     public long[] getAsRational(int index) {
         return ((long[][])data)[index];
@@ -1269,11 +1282,11 @@
 
 
     /**
-     * Returns a <code>String</code> containing a human-readable
+     * Returns a {@code String} containing a human-readable
      * version of the data item.  Data of type
-     * <code>TIFFTag.TIFF_RATIONAL</code> or <code>TIFF_SRATIONAL</code> are
+     * {@code TIFFTag.TIFF_RATIONAL} or {@code TIFF_SRATIONAL} are
      * represented as a pair of integers separated by a
-     * <code>'/'</code> character.
+     * {@code '/'} character.
      *
      * @param index The index of the data.
      * @return The data at the given index as a {@code String}.
@@ -1342,7 +1355,7 @@
     }
 
     /**
-     * Returns whether the field has a <code>TIFFDirectory</code>.
+     * Returns whether the field has a {@code TIFFDirectory}.
      *
      * @return true if and only if getDirectory() returns non-null.
      */
@@ -1351,8 +1364,8 @@
     }
 
     /**
-     * Returns the associated <code>TIFFDirectory</code>, if available. If no
-     * directory is set, then <code>null</code> will be returned.
+     * Returns the associated {@code TIFFDirectory}, if available. If no
+     * directory is set, then {@code null} will be returned.
      *
      * @return the TIFFDirectory instance or null.
      */
@@ -1363,7 +1376,7 @@
     /**
      * Clones the field and all the information contained therein.
      *
-     * @return A clone of this <code>TIFFField</code>.
+     * @return A clone of this {@code TIFFField}.
      * @throws CloneNotSupportedException if the instance cannot be cloned.
      */
     @Override
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFImageReadParam.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFImageReadParam.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -39,11 +39,11 @@
  * be provided by this interface.
  *
  * <p> Additional TIFF tags must be organized into
- * <code>TIFFTagSet</code>s.  A <code>TIFFTagSet</code> may be
+ * {@code TIFFTagSet}s.  A {@code TIFFTagSet} may be
  * provided to the reader by means of the
- * <code>addAllowedTagSet</code> method.  By default, the tag sets
- * <code>BaselineTIFFTagSet</code>, <code>FaxTIFFTagSet</code>,
- * <code>ExifParentTIFFTagSet</code>, and <code>GeoTIFFTagSet</code>
+ * {@code addAllowedTagSet} method.  By default, the tag sets
+ * {@code BaselineTIFFTagSet}, {@code FaxTIFFTagSet},
+ * {@code ExifParentTIFFTagSet}, and {@code GeoTIFFTagSet}
  * are included.
  *
  * @since 9
@@ -53,10 +53,10 @@
     private List<TIFFTagSet> allowedTagSets = new ArrayList<TIFFTagSet>(4);
 
     /**
-     * Constructs a <code>TIFFImageReadParam</code>.  Tags defined by
-     * the <code>TIFFTagSet</code>s <code>BaselineTIFFTagSet</code>,
-     * <code>FaxTIFFTagSet</code>, <code>ExifParentTIFFTagSet</code>, and
-     * <code>GeoTIFFTagSet</code> will be supported.
+     * Constructs a {@code TIFFImageReadParam}.  Tags defined by
+     * the {@code TIFFTagSet}s {@code BaselineTIFFTagSet},
+     * {@code FaxTIFFTagSet}, {@code ExifParentTIFFTagSet}, and
+     * {@code GeoTIFFTagSet} will be supported.
      *
      * @see BaselineTIFFTagSet
      * @see FaxTIFFTagSet
@@ -71,13 +71,13 @@
     }
 
     /**
-     * Adds a <code>TIFFTagSet</code> object to the list of allowed
+     * Adds a {@code TIFFTagSet} object to the list of allowed
      * tag sets.
      *
-     * @param tagSet a <code>TIFFTagSet</code>.
+     * @param tagSet a {@code TIFFTagSet}.
      *
-     * @throws IllegalArgumentException if <code>tagSet</code> is
-     * <code>null</code>.
+     * @throws IllegalArgumentException if {@code tagSet} is
+     * {@code null}.
      */
     public void addAllowedTagSet(TIFFTagSet tagSet) {
         if (tagSet == null) {
@@ -87,15 +87,15 @@
     }
 
     /**
-     * Removes a <code>TIFFTagSet</code> object from the list of
-     * allowed tag sets.  Removal is based on the <code>equals</code>
-     * method of the <code>TIFFTagSet</code>, which is normally
+     * Removes a {@code TIFFTagSet} object from the list of
+     * allowed tag sets.  Removal is based on the {@code equals}
+     * method of the {@code TIFFTagSet}, which is normally
      * defined as reference equality.
      *
-     * @param tagSet a <code>TIFFTagSet</code>.
+     * @param tagSet a {@code TIFFTagSet}.
      *
-     * @throws IllegalArgumentException if <code>tagSet</code> is
-     * <code>null</code>.
+     * @throws IllegalArgumentException if {@code tagSet} is
+     * {@code null}.
      */
     public void removeAllowedTagSet(TIFFTagSet tagSet) {
         if (tagSet == null) {
@@ -105,10 +105,10 @@
     }
 
     /**
-     * Returns a <code>List</code> containing the allowed
-     * <code>TIFFTagSet</code> objects.
+     * Returns a {@code List} containing the allowed
+     * {@code TIFFTagSet} objects.
      *
-     * @return a <code>List</code> of <code>TIFFTagSet</code>s.
+     * @return a {@code List} of {@code TIFFTagSet}s.
      */
     public List<TIFFTagSet> getAllowedTagSets() {
         return allowedTagSets;
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFTag.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFTag.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -105,7 +105,7 @@
      * The name assigned to a tag with an unknown tag number. Such
      * a tag may be created for example when reading an IFD and a
      * tag number is encountered which is not in any of the
-     * <code>TIFFTagSet</code>s known to the reader.
+     * {@code TIFFTagSet}s known to the reader.
      */
     public static final String UNKNOWN_TAG_NAME = "UnknownTag";
 
@@ -141,12 +141,12 @@
     private SortedMap<Integer,String> valueNames = null;
 
     /**
-     * Constructs a <code>TIFFTag</code> with a given name, tag number, set
+     * Constructs a {@code TIFFTag} with a given name, tag number, set
      * of legal data types, and value count. A negative value count signifies
      * that either an arbitrary number of values is legal or the required count
      * is determined by the values of other fields in the IFD. A non-negative
      * count specifies the number of values which an associated field must
-     * contain. The tag will have no associated <code>TIFFTagSet</code>.
+     * contain. The tag will have no associated {@code TIFFTagSet}.
      *
      * <p> If there are mnemonic names to be associated with the legal
      * data values for the tag, {@link #addValueName(int, String)
@@ -183,18 +183,18 @@
     }
 
     /**
-     * Constructs a <code>TIFFTag</code> with a given name, tag number and
-     * <code>TIFFTagSet</code> to which it refers. The legal data types are
+     * Constructs a {@code TIFFTag} with a given name, tag number and
+     * {@code TIFFTagSet} to which it refers. The legal data types are
      * set to include {@link #TIFF_LONG} and {@link #TIFF_IFD_POINTER} and the
-     * value count is unity. The <code>TIFFTagSet</code> will
-     * represent the set of <code>TIFFTag</code>s which appear in the IFD
-     * pointed to. A <code>TIFFTag</code> represents an IFD pointer if and
-     * only if <code>tagSet</code> is non-<code>null</code> or the data
-     * type <code>TIFF_IFD_POINTER</code> is legal.
+     * value count is unity. The {@code TIFFTagSet} will
+     * represent the set of {@code TIFFTag}s which appear in the IFD
+     * pointed to. A {@code TIFFTag} represents an IFD pointer if and
+     * only if {@code tagSet} is non-{@code null} or the data
+     * type {@code TIFF_IFD_POINTER} is legal.
      *
      * @param name the name of the tag.
      * @param number the number used to represent the tag.
-     * @param tagSet the <code>TIFFTagSet</code> to which this tag belongs.
+     * @param tagSet the {@code TIFFTagSet} to which this tag belongs.
      * @throws NullPointerException if name or tagSet is null.
      * @throws IllegalArgumentException if number is negative.
      *
@@ -210,9 +210,9 @@
     }
 
     /**
-     * Constructs  a  <code>TIFFTag</code>  with  a  given  name,  tag number,
+     * Constructs  a  {@code TIFFTag}  with  a  given  name,  tag number,
      * and set  of  legal  data  types.  The value count of the tag will be
-     * undefined and it will  have  no associated <code>TIFFTagSet</code>.
+     * undefined and it will  have  no associated {@code TIFFTagSet}.
      *
      * @param name the name of the tag.
      * @param number the number used to represent the tag.
@@ -236,9 +236,9 @@
      *
      * @return the number of bytes used to store the given data type.
      *
-     * @throws IllegalArgumentException if <code>datatype</code> is
-     * less than <code>MIN_DATATYPE</code> or greater than
-     * <code>MAX_DATATYPE</code>.
+     * @throws IllegalArgumentException if {@code datatype} is
+     * less than {@code MIN_DATATYPE} or greater than
+     * {@code MAX_DATATYPE}.
      */
     public static int getSizeOfType(int dataType) {
         if (dataType < MIN_DATATYPE ||dataType > MAX_DATATYPE) {
@@ -251,7 +251,7 @@
     /**
      * Returns the name of the tag, as it will appear in image metadata.
      *
-     * @return the tag name, as a <code>String</code>.
+     * @return the tag name, as a {@code String}.
      */
     public String getName() {
         return name;
@@ -260,7 +260,7 @@
     /**
      * Returns the integer used to represent the tag.
      *
-     * @return the tag number, as an <code>int</code>.
+     * @return the tag number, as an {@code int}.
      */
     public int getNumber() {
         return number;
@@ -276,7 +276,7 @@
      * (1 &lt;&lt; TIFFTag.TIFF_SHORT) | (1 &lt;&lt; TIFFTag.TIFF_LONG)
      * </pre>
      *
-     * @return an <code>int</code> containing a bitmask encoding the
+     * @return an {@code int} containing a bitmask encoding the
      * set of valid data types.
      */
     public int getDataTypes() {
@@ -285,11 +285,11 @@
 
     /**
      * Returns the value count of this tag. If this value is positive, it
-     * represents the required number of values for a <code>TIFFField</code>
+     * represents the required number of values for a {@code TIFFField}
      * which has this tag. If the value is negative, the count is undefined.
      * In the latter case the count may be derived, e.g., the number of values
-     * of the <code>BitsPerSample</code> field is <code>SamplesPerPixel</code>,
-     * or it may be variable as in the case of most <code>US-ASCII</code>
+     * of the {@code BitsPerSample} field is {@code SamplesPerPixel},
+     * or it may be variable as in the case of most {@code US-ASCII}
      * fields.
      *
      * @return the value count of this tag.
@@ -299,18 +299,18 @@
     }
 
     /**
-     * Returns <code>true</code> if the given data type
+     * Returns {@code true} if the given data type
      * may be used for the data associated with this tag.
      *
      * @param dataType the data type to be queried, one of
-     * <code>TIFF_BYTE</code>, <code>TIFF_SHORT</code>, etc.
+     * {@code TIFF_BYTE}, {@code TIFF_SHORT}, etc.
      *
-     * @return a <code>boolean</code> indicating whether the given
+     * @return a {@code boolean} indicating whether the given
      * data type may be used with this tag.
      *
-     * @throws IllegalArgumentException if <code>datatype</code> is
-     * less than <code>MIN_DATATYPE</code> or greater than
-     * <code>MAX_DATATYPE</code>.
+     * @throws IllegalArgumentException if {@code datatype} is
+     * less than {@code MIN_DATATYPE} or greater than
+     * {@code MAX_DATATYPE}.
      */
     public boolean isDataTypeOK(int dataType) {
         if (dataType < MIN_DATATYPE || dataType > MAX_DATATYPE) {
@@ -320,38 +320,38 @@
     }
 
     /**
-     * Returns the <code>TIFFTagSet</code> of which this tag is a part.
+     * Returns the {@code TIFFTagSet} of which this tag is a part.
      *
-     * @return the containing <code>TIFFTagSet</code>.
+     * @return the containing {@code TIFFTagSet}.
      */
     public TIFFTagSet getTagSet() {
         return tagSet;
     }
 
     /**
-     * Returns <code>true</code> if this tag is used to point to an IFD
-     * structure containing additional tags. A <code>TIFFTag</code> represents
-     * an IFD pointer if and only if its <code>TIFFTagSet</code> is
-     * non-<code>null</code> or the data type <code>TIFF_IFD_POINTER</code> is
+     * Returns {@code true} if this tag is used to point to an IFD
+     * structure containing additional tags. A {@code TIFFTag} represents
+     * an IFD pointer if and only if its {@code TIFFTagSet} is
+     * non-{@code null} or the data type {@code TIFF_IFD_POINTER} is
      * legal. This condition will be satisfied if and only if either
-     * <code>getTagSet()&nbsp;!=&nbsp;null</code> or
-     * <code>isDataTypeOK(TIFF_IFD_POINTER)&nbsp;==&nbsp;true</code>.
+     * {@code getTagSet()&nbsp;!=&nbsp;null} or
+     * {@code isDataTypeOK(TIFF_IFD_POINTER)&nbsp;==&nbsp;true}.
      *
      * <p>Many TIFF extensions use the IFD mechanism in order to limit the
      * number of new tags that may appear in the root IFD.</p>
      *
-     * @return <code>true</code> if this tag points to an IFD.
+     * @return {@code true} if this tag points to an IFD.
      */
     public boolean isIFDPointer() {
         return tagSet != null || isDataTypeOK(TIFF_IFD_POINTER);
     }
 
     /**
-     * Returns <code>true</code> if there are mnemonic names associated with
+     * Returns {@code true} if there are mnemonic names associated with
      * the set of legal values for the data associated with this tag.  Mnemonic
      * names apply only to tags which have integral data type.
      *
-     * @return <code>true</code> if mnemonic value names are available.
+     * @return {@code true} if mnemonic value names are available.
      */
     public boolean hasValueNames() {
         return valueNames != null;
@@ -373,14 +373,14 @@
 
     /**
      * Returns the mnemonic name associated with a particular value
-     * that this tag's data may take on, or <code>null</code> if
+     * that this tag's data may take on, or {@code null} if
      * no name is present.  Mnemonic names apply only to tags which have
      * integral data type.
      *
      * @param value the data value.
      *
      * @return the mnemonic name associated with the value, as a
-     * <code>String</code>.
+     * {@code String}.
      */
     public String getValueName(int value) {
         if (valueNames == null) {
--- a/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFTagSet.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFTagSet.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -39,7 +39,7 @@
  * specification itself).
  *
  * <p> This class and its subclasses are responsible for mapping
- * between raw tag numbers and <code>TIFFTag</code> objects, which
+ * between raw tag numbers and {@code TIFFTag} objects, which
  * contain additional information about each tag, such as the tag's
  * name, legal data types, and mnemonic names for some or all of ts
  * data values.
@@ -59,15 +59,15 @@
     private TIFFTagSet() {}
 
     /**
-     * Constructs a <code>TIFFTagSet</code>, given a <code>List</code>
-     * of <code>TIFFTag</code> objects.
+     * Constructs a {@code TIFFTagSet}, given a {@code List}
+     * of {@code TIFFTag} objects.
      *
-     * @param tags a <code>List</code> object containing
-     * <code>TIFFTag</code> objects to be added to this tag set.
+     * @param tags a {@code List} object containing
+     * {@code TIFFTag} objects to be added to this tag set.
      *
-     * @throws IllegalArgumentException if <code>tags</code> is
-     * <code>null</code>, or contains objects that are not instances
-     * of the <code>TIFFTag</code> class.
+     * @throws IllegalArgumentException if {@code tags} is
+     * {@code null}, or contains objects that are not instances
+     * of the {@code TIFFTag} class.
      */
     public TIFFTagSet(List<TIFFTag> tags) {
         if (tags == null) {
@@ -88,29 +88,29 @@
     }
 
     /**
-     * Returns the <code>TIFFTag</code> from this set that is
-     * associated with the given tag number, or <code>null</code> if
+     * Returns the {@code TIFFTag} from this set that is
+     * associated with the given tag number, or {@code null} if
      * no tag exists for that number.
      *
      * @param tagNumber the number of the tag to be retrieved.
      *
-     * @return the numbered <code>TIFFTag</code>, or <code>null</code>.
+     * @return the numbered {@code TIFFTag}, or {@code null}.
      */
     public TIFFTag getTag(int tagNumber) {
         return allowedTagsByNumber.get(Integer.valueOf(tagNumber));
     }
 
     /**
-     * Returns the <code>TIFFTag</code> having the given tag name, or
-     * <code>null</code> if the named tag does not belong to this tag set.
+     * Returns the {@code TIFFTag} having the given tag name, or
+     * {@code null} if the named tag does not belong to this tag set.
      *
      * @param tagName the name of the tag to be retrieved, as a
-     * <code>String</code>.
+     * {@code String}.
      *
-     * @return the named <code>TIFFTag</code>, or <code>null</code>.
+     * @return the named {@code TIFFTag}, or {@code null}.
      *
-     * @throws IllegalArgumentException if <code>tagName</code> is
-     * <code>null</code>.
+     * @throws IllegalArgumentException if {@code tagName} is
+     * {@code null}.
      */
     public TIFFTag getTag(String tagName) {
         if (tagName == null) {
@@ -123,7 +123,7 @@
      * Retrieves an unmodifiable numerically increasing set of tag numbers.
      *
      * <p>The returned object is unmodifiable and contains the tag
-     * numbers of all <code>TIFFTag</code>s in this <code>TIFFTagSet</code>
+     * numbers of all {@code TIFFTag}s in this {@code TIFFTagSet}
      * sorted into ascending order according to
      * {@link Integer#compareTo(Object)}.</p>
      *
@@ -145,7 +145,7 @@
      * Retrieves an unmodifiable lexicographically increasing set of tag names.
      *
      * <p>The returned object is unmodifiable and contains the tag
-     * names of all <code>TIFFTag</code>s in this <code>TIFFTagSet</code>
+     * names of all {@code TIFFTag}s in this {@code TIFFTagSet}
      * sorted into ascending order according to
      * {@link String#compareTo(Object)}.</p>
      *
--- a/src/java.desktop/share/classes/javax/print/ServiceUI.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/print/ServiceUI.java	Fri Mar 11 09:16:55 2016 -0800
@@ -193,36 +193,48 @@
             getLocalGraphicsEnvironment().getDefaultScreenDevice().
             getDefaultConfiguration().getBounds() : gc.getBounds();
 
+        x += gcBounds.x;
+        y += gcBounds.y;
         ServiceDialog dialog;
         if (owner instanceof Frame) {
             dialog = new ServiceDialog(gc,
-                                       x + gcBounds.x,
-                                       y + gcBounds.y,
+                                       x,
+                                       y,
                                        services, defaultIndex,
                                        flavor, attributes,
                                        (Frame)owner);
         } else {
             dialog = new ServiceDialog(gc,
-                                       x + gcBounds.x,
-                                       y + gcBounds.y,
+                                       x,
+                                       y,
                                        services, defaultIndex,
                                        flavor, attributes,
                                        (Dialog)owner);
         }
         Rectangle dlgBounds = dialog.getBounds();
 
-        // get union of all GC bounds
-        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
-        GraphicsDevice[] gs = ge.getScreenDevices();
-        for (int j=0; j<gs.length; j++) {
-            gcBounds =
-                gcBounds.union(gs[j].getDefaultConfiguration().getBounds());
-        }
-
         // if portion of dialog is not within the gc boundary
         if (!gcBounds.contains(dlgBounds)) {
-            // put in the center relative to parent frame/dialog
-            dialog.setLocationRelativeTo(owner);
+            // check if dialog exceed window bounds at left or bottom
+            // Then position the dialog by moving it by the amount it exceeds
+            // the window bounds
+            // If it results in dialog moving beyond the window bounds at top/left
+            // then position it at window top/left
+            if (dlgBounds.x + dlgBounds.width > gcBounds.x + gcBounds.width) {
+                if ((gcBounds.x + gcBounds.width - dlgBounds.width) > gcBounds.x) {
+                    x = (gcBounds.x + gcBounds.width) - dlgBounds.width;
+                } else {
+                    x = gcBounds.x;
+                }
+            }
+            if (dlgBounds.y + dlgBounds.height > gcBounds.y + gcBounds.height) {
+                if ((gcBounds.y + gcBounds.height - dlgBounds.height) > gcBounds.y) {
+                    y = (gcBounds.y + gcBounds.height) - dlgBounds.height;
+                } else {
+                    y = gcBounds.y;
+                }
+            }
+            dialog.setBounds(x, y, dlgBounds.width, dlgBounds.height);
         }
         dialog.show();
 
--- a/src/java.desktop/share/classes/javax/swing/DefaultDesktopManager.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/swing/DefaultDesktopManager.java	Fri Mar 11 09:16:55 2016 -0800
@@ -191,12 +191,6 @@
             JLayeredPane.putLayer(desktopIcon, layer);
         }
 
-        // If we are maximized we already have the normal bounds recorded
-        // don't try to re-record them, otherwise we incorrectly set the
-        // normal bounds to maximized state.
-        if (!f.isMaximum()) {
-            f.setNormalBounds(f.getBounds());
-        }
         if (findNext) {
             if (d.selectFrame(true) == null) {
                 // The icon is the last frame.
--- a/src/java.desktop/share/classes/javax/swing/filechooser/FileSystemView.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/swing/filechooser/FileSystemView.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -584,6 +584,69 @@
     }
 
     /**
+     * Returns an array of files representing the values to show by default in
+     * the file chooser selector.
+     *
+     * @return an array of {@code File} objects.
+     * @throws SecurityException if the caller does not have necessary
+     *                           permissions
+     * @since 9
+     */
+    public File[] getChooserComboBoxFiles() {
+        return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
+    }
+
+    /**
+     * Returns whether the specified file denotes a shell interpreted link which
+     * can be obtained by the {@link #getLinkLocation(File)}.
+     *
+     * @param file a file
+     * @return whether this is a link
+     * @throws NullPointerException if {@code file} equals {@code null}
+     * @throws SecurityException if the caller does not have necessary
+     *                           permissions
+     * @see #getLinkLocation(File)
+     * @since 9
+     */
+    public boolean isLink(File file) {
+        if (file == null) {
+            throw new NullPointerException("file is null");
+        }
+        try {
+            return ShellFolder.getShellFolder(file).isLink();
+        } catch (FileNotFoundException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the regular file referenced by the specified link file if
+     * the specified file is a shell interpreted link.
+     * Returns {@code null} if the specified file is not
+     * a shell interpreted link.
+     *
+     * @param file a file
+     * @return the linked file or {@code null}.
+     * @throws FileNotFoundException if the linked file does not exist
+     * @throws NullPointerException if {@code file} equals {@code null}
+     * @throws SecurityException if the caller does not have necessary
+     *                           permissions
+     * @since 9
+     */
+    public File getLinkLocation(File file) throws FileNotFoundException {
+        if (file == null) {
+            throw new NullPointerException("file is null");
+        }
+        ShellFolder shellFolder;
+        try {
+            shellFolder = ShellFolder.getShellFolder(file);
+        } catch (FileNotFoundException e) {
+            return null;
+        }
+        return shellFolder.isLink() ? shellFolder.getLinkLocation() : null;
+    }
+
+    /**
      * Throws {@code FileNotFoundException} if file not found or current thread was interrupted
      */
     ShellFolder getShellFolder(File f) throws FileNotFoundException {
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -962,18 +962,13 @@
                 int orientation = SwingConstants.VERTICAL;
 
                 // find which scrollbar to scroll, or return if none
-                if (toScroll == null || !toScroll.isVisible()) {
+                if (toScroll == null || !toScroll.isVisible()
+                        || e.isShiftDown()) {
                     toScroll = scrollpane.getHorizontalScrollBar();
                     if (toScroll == null || !toScroll.isVisible()) {
                         return;
                     }
                     orientation = SwingConstants.HORIZONTAL;
-                } else if(e.isShiftDown()){
-                    JScrollBar hScroll = scrollpane.getHorizontalScrollBar();
-                    if (hScroll != null && hScroll.isVisible()) {
-                        toScroll = hScroll;
-                        orientation = SwingConstants.HORIZONTAL;
-                    }
                 }
 
                 e.consume();
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java	Fri Mar 11 09:16:55 2016 -0800
@@ -362,9 +362,6 @@
                 setWasIcon(f, Boolean.TRUE);
             }
 
-            if (!f.isMaximum()) {
-                f.setNormalBounds(f.getBounds());
-            }
             c.remove(f);
             c.repaint(f.getX(), f.getY(), f.getWidth(), f.getHeight());
             try {
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java	Fri Mar 11 09:16:55 2016 -0800
@@ -230,9 +230,10 @@
 
             boolean hasRollover = (column == getRolloverColumn());
             if (isSelected || hasRollover || hasFocus) {
+                boolean enabled = (table == null)? true : table.isEnabled();
                 SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel.
                              getUIOfType(getUI(), SynthLabelUI.class),
-                             isSelected, hasFocus, table.isEnabled(),
+                             isSelected, hasFocus, enabled,
                              hasRollover);
             } else {
                 SynthLookAndFeel.resetSelectedUI();
--- a/src/java.desktop/share/classes/sun/applet/Main.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/applet/Main.java	Fri Mar 11 09:16:55 2016 -0800
@@ -30,8 +30,6 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
 import java.net.MalformedURLException;
 import java.util.Enumeration;
@@ -75,7 +73,6 @@
     /**
      * Member variables set according to options passed in to AppletViewer.
      */
-    private boolean debugFlag = false;
     private boolean helpFlag  = false;
     private String  encoding  = null;
     private boolean noSecurityFlag  = false;
@@ -136,14 +133,6 @@
             return 1;
         }
 
-        if (debugFlag) {
-            // START A DEBUG SESSION
-            // Given the current architecture, we will end up decoding the
-            // arguments again, but at least we are guaranteed to have
-            // arguments which are valid.
-            return invokeDebugger(args);
-        }
-
         // INSTALL THE SECURITY MANAGER (if necessary)
         if (!noSecurityFlag && (System.getSecurityManager() == null))
             init();
@@ -191,9 +180,6 @@
                 throw new ParseException(lookup("main.err.dupoption", arg));
             encoding = args[++i];
             return 2;
-        } else if ("-debug".equals(arg)) {
-            debugFlag = true;
-            return 1;
         } else if ("-Xnosecurity".equals(arg)) {
             // This is an undocumented (and, in the future, unsupported)
             // flag which prevents AppletViewer from installing its own
@@ -267,68 +253,6 @@
         return u;
     }
 
-    /**
-     * Invoke the debugger with the arguments passed in to appletviewer.
-     *
-     * @param args The arguments passed into the debugger.
-     * @return     {@code 0} if the debugger is invoked successfully,
-     *             {@code 1} otherwise.
-     */
-    private int invokeDebugger(String [] args) {
-        // CONSTRUCT THE COMMAND LINE
-        String [] newArgs = new String[args.length + 1];
-        int current = 0;
-
-        // Add a -classpath argument that prevents
-        // the debugger from launching appletviewer with the default of
-        // ".". appletviewer's classpath should never contain valid
-        // classes since they will result in security exceptions.
-        // Ideally, the classpath should be set to "", but the VM won't
-        // allow an empty classpath, so a phony directory name is used.
-        String phonyDir = System.getProperty("java.home") +
-                          File.separator + "phony";
-        newArgs[current++] = "-Djava.class.path=" + phonyDir;
-
-        // Appletviewer's main class is the debuggee
-        newArgs[current++] = "sun.applet.Main";
-
-        // Append all the of the original appletviewer arguments,
-        // leaving out the "-debug" option.
-        for (int i = 0; i < args.length; i++) {
-            if (!("-debug".equals(args[i]))) {
-                newArgs[current++] = args[i];
-            }
-        }
-
-        // LAUNCH THE DEBUGGER
-        // Reflection is used for two reasons:
-        // 1) The debugger classes are on classpath and thus must be loaded
-        // by the application class loader. (Currently, appletviewer are
-        // loaded through the boot class path out of rt.jar.)
-        // 2) Reflection removes any build dependency between appletviewer
-        // and jdb.
-        try {
-            Class<?> c = Class.forName("com.sun.tools.example.debug.tty.TTY", true,
-                                    ClassLoader.getSystemClassLoader());
-            Method m = c.getDeclaredMethod("main",
-                                           new Class<?>[] { String[].class });
-            m.invoke(null, new Object[] { newArgs });
-        } catch (ClassNotFoundException cnfe) {
-            System.err.println(lookup("main.debug.cantfinddebug"));
-            return 1;
-        } catch (NoSuchMethodException nsme) {
-            System.err.println(lookup("main.debug.cantfindmain"));
-            return 1;
-        } catch (InvocationTargetException ite) {
-            System.err.println(lookup("main.debug.exceptionindebug"));
-            return 1;
-        } catch (IllegalAccessException iae) {
-            System.err.println(lookup("main.debug.cantaccess"));
-            return 1;
-        }
-        return 0;
-    }
-
     private void init() {
         // GET APPLETVIEWER USER-SPECIFIC PROPERTIES
         Properties avProps = getAVProps();
--- a/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer.java	Fri Mar 11 09:16:55 2016 -0800
@@ -74,7 +74,7 @@
             {"appletviewer.parse.warning.embed.requireswidth", "Warning: <embed> tag requires width attribute."},
             {"appletviewer.parse.warning.appnotLongersupported", "Warning: <app> tag no longer supported, use <applet> instead:"},
             {"appletviewer.deprecated", "AppletViewer is deprecated."},
-            {"appletviewer.usage", "Usage: appletviewer <options> url(s)\n\nwhere <options> include:\n  -debug                  Start the applet viewer in the Java debugger\n  -encoding <encoding>    Specify character encoding used by HTML files\n  -J<runtime flag>        Pass argument to the java interpreter\n\nThe -J option is non-standard and subject to change without notice."},
+            {"appletviewer.usage", "Usage: appletviewer <options> url(s)\n\nwhere <options> include:\n  -encoding <encoding>    Specify character encoding used by HTML files\n  -J<runtime flag>        Pass argument to the java interpreter\n\nThe -J option is non-standard and subject to change without notice."},
             {"appletviewer.main.err.unsupportedopt", "Unsupported option: {0}"},
             {"appletviewer.main.err.unrecognizedarg", "Unrecognized argument: {0}"},
             {"appletviewer.main.err.dupoption", "Duplicate use of option: {0}"},
--- a/src/java.desktop/share/classes/sun/awt/ExtendedKeyCodes.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/awt/ExtendedKeyCodes.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,3 +1,27 @@
+/*
+ * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * 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.awt;
 
 import java.util.Collections;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/share/classes/sun/java2d/ReentrantContext.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  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.java2d;
+
+import java.lang.ref.Reference;
+
+/**
+ * ReentrantContext is a base class to hold thread-local data supporting
+ * reentrancy in either a ThreadLocal or a ConcurrentLinkedQueue
+ *
+ * @see ReentrantContextProvider
+ */
+public class ReentrantContext {
+    // usage stored as a byte
+    byte usage = ReentrantContextProvider.USAGE_TL_INACTIVE;
+    /*
+     * Reference to this instance (hard, soft or weak).
+     * @see ReentrantContextProvider#refType
+     */
+    Reference<? extends ReentrantContext> reference = null;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/share/classes/sun/java2d/ReentrantContextProvider.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.java2d;
+
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+
+/**
+ * This abstract ReentrantContextProvider helper class manages the creation,
+ * storage, and retrieval of concrete ReentrantContext instances which can be
+ * subclassed to hold cached contextual data.
+ *
+ * It supports reentrancy as every call to acquire() provides a new unique context
+ * instance that must later be returned for reuse by a call to release(ctx)
+ * (typically in a try/finally block).
+ *
+ * It has a couple of abstract implementations which store references in a queue
+ * and/or thread-local storage.
+ * The Providers can be configured to hold ReentrantContext instances in memory
+ * using hard, soft or weak references.
+ *
+ * The acquire() and release() methods are used to retrieve and return the contexts.
+ *
+ * The {@code newContext()} method remains abstract in all implementations and
+ * must be provided by the module to create a new subclass of ReentrantContext
+ * with the appropriate contextual data in it.
+ *
+ * Sample Usage:
+ * - create a subclass ReentrantContextImpl to hold the thread state:
+ *
+ * static final class ReentrantContextImpl extends ReentrantContext {
+ *     // specific cached data
+ * }
+ *
+ * - create the appropriate ReentrantContextProvider:
+ *
+ * private static final ReentrantContextProvider<ReentrantContextImpl> contextProvider =
+ *     new ReentrantContextProviderTL<ReentrantContextImpl>(ReentrantContextProvider.REF_WEAK)
+ *     {
+ *         @Override
+ *         protected ReentrantContextImpl newContext() {
+ *             return new ReentrantContextImpl();
+ *         }
+ *     };
+ * ...
+ * void someMethod() {
+ *     ReentrantContextImpl ctx = contextProvider.acquire();
+ *     try {
+ *         // use the context
+ *     } finally {
+ *         contextProvider.release(ctx);
+ *     }
+ * }
+ *
+ * @param <K> ReentrantContext subclass
+ *
+ * @see ReentrantContext
+ */
+public abstract class ReentrantContextProvider<K extends ReentrantContext>
+{
+    // thread-local storage: inactive
+    static final byte USAGE_TL_INACTIVE = 0;
+    // thread-local storage: in use
+    static final byte USAGE_TL_IN_USE = 1;
+    // CLQ storage
+    static final byte USAGE_CLQ = 2;
+
+    // hard reference
+    public static final int REF_HARD = 0;
+    // soft reference
+    public static final int REF_SOFT = 1;
+    // weak reference
+    public static final int REF_WEAK = 2;
+
+    /* members */
+    // internal reference type
+    private final int refType;
+
+    /**
+     * Create a new ReentrantContext provider using the given reference type
+     * among hard, soft or weak
+     *
+     * @param refType reference type
+     */
+    protected ReentrantContextProvider(final int refType) {
+        this.refType = refType;
+    }
+
+    /**
+     * Create a new ReentrantContext instance
+     *
+     * @return new ReentrantContext instance
+     */
+    protected abstract K newContext();
+
+    /**
+     * Give a ReentrantContext instance for the current thread
+     *
+     * @return ReentrantContext instance
+     */
+    public abstract K acquire();
+
+    /**
+     * Restore the given ReentrantContext instance for reuse
+     *
+     * @param ctx ReentrantContext instance
+     */
+    public abstract void release(K ctx);
+
+    @SuppressWarnings("unchecked")
+    protected final Reference<K> getOrCreateReference(final K ctx) {
+        if (ctx.reference == null) {
+            // Create the reference:
+            switch (refType) {
+                case REF_HARD:
+                    ctx.reference = new HardReference<K>(ctx);
+                    break;
+                case REF_SOFT:
+                    ctx.reference = new SoftReference<K>(ctx);
+                    break;
+                default:
+                case REF_WEAK:
+                    ctx.reference = new WeakReference<K>(ctx);
+                    break;
+            }
+        }
+        return (Reference<K>) ctx.reference;
+    }
+
+    /* Missing HardReference implementation */
+    static final class HardReference<V> extends WeakReference<V> {
+        // kept strong reference:
+        private final V strongRef;
+
+        HardReference(final V referent) {
+            // no referent needed for the parent WeakReference:
+            super(null);
+            this.strongRef = referent;
+        }
+
+        @Override
+        public V get() {
+            return strongRef;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/share/classes/sun/java2d/ReentrantContextProviderCLQ.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.java2d;
+
+import java.lang.ref.Reference;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+/**
+ * This ReentrantContextProvider implementation uses one ConcurrentLinkedQueue
+ * to store all ReentrantContext instances (thread and its child contexts)
+ *
+ * Note: this implementation keeps less contexts in memory depending on the
+ * concurrent active threads in contrary to a ThreadLocal provider. However,
+ * it is slower in highly concurrent workloads.
+ *
+ * @param <K> ReentrantContext subclass
+ */
+public abstract class ReentrantContextProviderCLQ<K extends ReentrantContext>
+    extends ReentrantContextProvider<K>
+{
+    // ReentrantContext queue to store all contexts
+    private final ConcurrentLinkedQueue<Reference<K>> ctxQueue
+        = new ConcurrentLinkedQueue<Reference<K>>();
+
+    /**
+     * Create a new ReentrantContext provider using the given reference type
+     * among hard, soft or weak based using a ConcurrentLinkedQueue storage
+     *
+     * @param refType reference type
+     */
+    public ReentrantContextProviderCLQ(final int refType) {
+        super(refType);
+    }
+
+    /**
+     * Give a ReentrantContext instance for the current thread
+     *
+     * @return ReentrantContext instance
+     */
+    @Override
+    public final K acquire() {
+        K ctx = null;
+        // Drain queue if all referent are null:
+        Reference<K> ref = null;
+        while ((ctx == null) && ((ref = ctxQueue.poll()) != null)) {
+            ctx = ref.get();
+        }
+        if (ctx == null) {
+            // create a new ReentrantContext if none is available
+            ctx = newContext();
+            ctx.usage = USAGE_CLQ;
+        }
+        return ctx;
+    }
+
+    /**
+     * Restore the given ReentrantContext instance for reuse
+     *
+     * @param ctx ReentrantContext instance
+     */
+    @Override
+    public final void release(final K ctx) {
+        if (ctx.usage == USAGE_CLQ) {
+            ctxQueue.offer(getOrCreateReference(ctx));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/share/classes/sun/java2d/ReentrantContextProviderTL.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.java2d;
+
+import java.lang.ref.Reference;
+
+/**
+* This ReentrantContextProvider implementation uses a ThreadLocal to hold
+ * the first ReentrantContext per thread and a ReentrantContextProviderCLQ to
+ * store child ReentrantContext instances needed during recursion.
+ *
+ * Note: this implementation may keep up to one context in memory per thread.
+ * Child contexts for recursive uses are stored in the queue using a WEAK
+ * reference by default unless specified in the 2 argument constructor.
+ *
+ * @param <K> ReentrantContext subclass
+ */
+public abstract class ReentrantContextProviderTL<K extends ReentrantContext>
+    extends ReentrantContextProvider<K>
+{
+    // Thread-local storage:
+    private final ThreadLocal<Reference<K>> ctxTL
+        = new ThreadLocal<Reference<K>>();
+
+    // ReentrantContext CLQ provider for child contexts:
+    private final ReentrantContextProviderCLQ<K> ctxProviderCLQ;
+
+    /**
+     * Create a new ReentrantContext provider using the given reference type
+     * among hard, soft or weak.
+     * It uses weak reference for the child contexts.
+     *
+     * @param refType reference type
+     */
+    public ReentrantContextProviderTL(final int refType) {
+        this(refType, REF_WEAK);
+    }
+
+    /**
+     * Create a new ReentrantContext provider using the given reference types
+     * among hard, soft or weak
+     *
+     * @param refTypeTL reference type used by ThreadLocal
+     * @param refTypeCLQ reference type used by ReentrantContextProviderCLQ
+     */
+    public ReentrantContextProviderTL(final int refTypeTL, final int refTypeCLQ)
+    {
+        super(refTypeTL);
+
+        final ReentrantContextProviderTL<K> parent = this;
+
+        this.ctxProviderCLQ = new ReentrantContextProviderCLQ<K>(refTypeCLQ) {
+            @Override
+            protected K newContext() {
+                return parent.newContext();
+            }
+        };
+    }
+
+    /**
+     * Give a ReentrantContext instance for the current thread
+     *
+     * @return ReentrantContext instance
+     */
+    @Override
+    public final K acquire() {
+        K ctx = null;
+        final Reference<K> ref = ctxTL.get();
+        if (ref != null) {
+            ctx = ref.get();
+        }
+        if (ctx == null) {
+            // create a new ReentrantContext if none is available
+            ctx = newContext();
+            // update thread local reference:
+            ctxTL.set(getOrCreateReference(ctx));
+        }
+        // Check reentrance:
+        if (ctx.usage == USAGE_TL_INACTIVE) {
+           ctx.usage = USAGE_TL_IN_USE;
+        } else {
+            // get or create another ReentrantContext from CLQ provider:
+            ctx = ctxProviderCLQ.acquire();
+        }
+        return ctx;
+    }
+
+    /**
+     * Restore the given ReentrantContext instance for reuse
+     *
+     * @param ctx ReentrantContext instance
+     */
+    @Override
+    public final void release(final K ctx) {
+        if (ctx.usage == USAGE_TL_IN_USE) {
+           ctx.usage = USAGE_TL_INACTIVE;
+        } else {
+            ctxProviderCLQ.release(ctx);
+        }
+    }
+}
--- a/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/ByteArrayCache.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -126,7 +126,7 @@
         }
 
         if (doChecks) {
-            check(array, 0, array.length, value);
+            check(array, fromIndex, toIndex, value);
         }
     }
 
@@ -135,9 +135,10 @@
     {
         if (doChecks) {
             // check zero on full array:
-            for (int i = fromIndex; i < toIndex; i++) {
+            for (int i = 0; i < array.length; i++) {
                 if (array[i] != value) {
-                    logException("Invalid array value at " + i + "\n"
+                    logException("Invalid value at: " + i + " = " + array[i]
+                            + " from: " + fromIndex + " to: " + toIndex + "\n"
                             + Arrays.toString(array), new Throwable());
 
                     // ensure array is correctly filled:
--- a/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/FloatArrayCache.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -127,7 +127,7 @@
         }
 
         if (doChecks) {
-            check(array, 0, array.length, value);
+            check(array, fromIndex, toIndex, value);
         }
     }
 
@@ -136,9 +136,10 @@
     {
         if (doChecks) {
             // check zero on full array:
-            for (int i = fromIndex; i < toIndex; i++) {
+            for (int i = 0; i < array.length; i++) {
                 if (array[i] != value) {
-                    logException("Invalid array value at " + i + "\n"
+                    logException("Invalid value at: " + i + " = " + array[i]
+                            + " from: " + fromIndex + " to: " + toIndex + "\n"
                             + Arrays.toString(array), new Throwable());
 
                     // ensure array is correctly filled:
--- a/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/IntArrayCache.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -126,7 +126,7 @@
         }
 
         if (doChecks) {
-            check(array, 0, array.length, value);
+            check(array, fromIndex, toIndex, value);
         }
     }
 
@@ -135,9 +135,10 @@
     {
         if (doChecks) {
             // check zero on full array:
-            for (int i = fromIndex; i < toIndex; i++) {
+            for (int i = 0; i < array.length; i++) {
                 if (array[i] != value) {
-                    logException("Invalid array value at " + i + "\n"
+                    logException("Invalid value at: " + i + " = " + array[i]
+                            + " from: " + fromIndex + " to: " + toIndex + "\n"
                             + Arrays.toString(array), new Throwable());
 
                     // ensure array is correctly filled:
--- a/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/MarlinCache.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -590,8 +590,8 @@
             alphaRow[to + 1] = 0;
         }
         if (doChecks) {
-            IntArrayCache.check(blkFlags, 0, blkFlags.length, 0);
-            IntArrayCache.check(alphaRow, 0, alphaRow.length, 0);
+            IntArrayCache.check(blkFlags, blkW, blkE, 0);
+            IntArrayCache.check(alphaRow, from, px1 - bboxX0, 0);
         }
 
         if (doMonitors) {
--- a/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,11 +30,12 @@
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Path2D;
 import java.awt.geom.PathIterator;
-import java.lang.ref.Reference;
 import java.security.AccessController;
-import java.util.concurrent.ConcurrentLinkedQueue;
 import static sun.java2d.marlin.MarlinUtils.logInfo;
 import sun.awt.geom.PathConsumer2D;
+import sun.java2d.ReentrantContextProvider;
+import sun.java2d.ReentrantContextProviderCLQ;
+import sun.java2d.ReentrantContextProviderTL;
 import sun.java2d.pipe.AATileGenerator;
 import sun.java2d.pipe.Region;
 import sun.java2d.pipe.RenderingEngine;
@@ -882,46 +883,50 @@
     // use ThreadLocal or ConcurrentLinkedQueue to get one RendererContext
     private static final boolean useThreadLocal;
 
-    // hard reference
-    static final int REF_HARD = 0;
-    // soft reference
-    static final int REF_SOFT = 1;
-    // weak reference
-    static final int REF_WEAK = 2;
-
     // reference type stored in either TL or CLQ
     static final int REF_TYPE;
 
     // Per-thread RendererContext
-    private static final ThreadLocal<Object> rdrCtxThreadLocal;
-    // RendererContext queue when ThreadLocal is disabled
-    private static final ConcurrentLinkedQueue<Object> rdrCtxQueue;
+    private static final ReentrantContextProvider<RendererContext> rdrCtxProvider;
 
     // Static initializer to use TL or CLQ mode
     static {
-        // CLQ mode by default:
         useThreadLocal = MarlinProperties.isUseThreadLocal();
-        rdrCtxThreadLocal = (useThreadLocal) ? new ThreadLocal<Object>()
-                                             : null;
-        rdrCtxQueue = (!useThreadLocal) ? new ConcurrentLinkedQueue<Object>()
-                                        : null;
 
         // Soft reference by default:
-        String refType = AccessController.doPrivileged(
+        final String refType = AccessController.doPrivileged(
                             new GetPropertyAction("sun.java2d.renderer.useRef",
                             "soft"));
         switch (refType) {
             default:
             case "soft":
-                REF_TYPE = REF_SOFT;
+                REF_TYPE = ReentrantContextProvider.REF_SOFT;
                 break;
             case "weak":
-                REF_TYPE = REF_WEAK;
+                REF_TYPE = ReentrantContextProvider.REF_WEAK;
                 break;
             case "hard":
-                REF_TYPE = REF_HARD;
+                REF_TYPE = ReentrantContextProvider.REF_HARD;
                 break;
         }
+
+        if (useThreadLocal) {
+            rdrCtxProvider = new ReentrantContextProviderTL<RendererContext>(REF_TYPE)
+                {
+                    @Override
+                    protected RendererContext newContext() {
+                        return RendererContext.createContext();
+                    }
+                };
+        } else {
+            rdrCtxProvider = new ReentrantContextProviderCLQ<RendererContext>(REF_TYPE)
+                {
+                    @Override
+                    protected RendererContext newContext() {
+                        return RendererContext.createContext();
+                    }
+                };
+        }
     }
 
     private static boolean settingsLogged = !enableLogs;
@@ -936,13 +941,13 @@
         String refType;
         switch (REF_TYPE) {
             default:
-            case REF_HARD:
+            case ReentrantContextProvider.REF_HARD:
                 refType = "hard";
                 break;
-            case REF_SOFT:
+            case ReentrantContextProvider.REF_SOFT:
                 refType = "soft";
                 break;
-            case REF_WEAK:
+            case ReentrantContextProvider.REF_WEAK:
                 refType = "weak";
                 break;
         }
@@ -1025,22 +1030,7 @@
      */
     @SuppressWarnings({"unchecked"})
     static RendererContext getRendererContext() {
-        RendererContext rdrCtx = null;
-        final Object ref = (useThreadLocal) ? rdrCtxThreadLocal.get()
-                           : rdrCtxQueue.poll();
-        if (ref != null) {
-            // resolve reference:
-            rdrCtx = (REF_TYPE == REF_HARD) ? ((RendererContext) ref)
-                     : ((Reference<RendererContext>) ref).get();
-        }
-        // create a new RendererContext if none is available
-        if (rdrCtx == null) {
-            rdrCtx = RendererContext.createContext();
-            if (useThreadLocal) {
-                // update thread local reference:
-                rdrCtxThreadLocal.set(rdrCtx.reference);
-            }
-        }
+        final RendererContext rdrCtx = rdrCtxProvider.acquire();
         if (doMonitors) {
             RendererContext.stats.mon_pre_getAATileGenerator.start();
         }
@@ -1057,8 +1047,6 @@
         if (doMonitors) {
             RendererContext.stats.mon_pre_getAATileGenerator.stop();
         }
-        if (!useThreadLocal) {
-            rdrCtxQueue.offer(rdrCtx.reference);
-        }
+        rdrCtxProvider.release(rdrCtx);
     }
 }
--- a/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/Renderer.java	Fri Mar 11 09:16:55 2016 -0800
@@ -148,8 +148,8 @@
 //////////////////////////////////////////////////////////////////////////////
 //  EDGE LIST
 //////////////////////////////////////////////////////////////////////////////
-    private float edgeMinY = Float.POSITIVE_INFINITY;
-    private float edgeMaxY = Float.NEGATIVE_INFINITY;
+    private int edgeMinY = Integer.MAX_VALUE;
+    private int edgeMaxY = Integer.MIN_VALUE;
     private float edgeMinX = Float.POSITIVE_INFINITY;
     private float edgeMaxX = Float.NEGATIVE_INFINITY;
 
@@ -357,18 +357,21 @@
             }
             return;
         }
-        // edge min/max X/Y are in subpixel space (inclusive)
-        if (y1 < edgeMinY) {
-            edgeMinY = y1;
+
+        // edge min/max X/Y are in subpixel space (inclusive) within bounds:
+        // note: Use integer crossings to ensure consistent range within
+        // edgeBuckets / edgeBucketCounts arrays in case of NaN values (int = 0)
+        if (firstCrossing < edgeMinY) {
+            edgeMinY = firstCrossing;
         }
-        if (y2 > edgeMaxY) {
-            edgeMaxY = y2;
+        if (lastCrossing > edgeMaxY) {
+            edgeMaxY = lastCrossing;
         }
 
         // Use double-precision for improved accuracy:
         final double x1d   = x1;
         final double y1d   = y1;
-        final double slope = (x2 - x1d) / (y2 - y1d);
+        final double slope = (x1d - x2) / (y1d - y2);
 
         if (slope >= 0.0) { // <==> x1 < x2
             if (x1 < edgeMinX) {
@@ -504,7 +507,7 @@
     private float x0, y0;
 
     // Position of most recent 'moveTo' command
-    private float pix_sx0, pix_sy0;
+    private float sx0, sy0;
 
     // per-thread renderer context
     final RendererContext rdrCtx;
@@ -570,8 +573,8 @@
             edgeBucketCounts = rdrCtx.getIntArray(edgeBucketsLength);
         }
 
-        edgeMinY = Float.POSITIVE_INFINITY;
-        edgeMaxY = Float.NEGATIVE_INFINITY;
+        edgeMinY = Integer.MAX_VALUE;
+        edgeMaxY = Integer.MIN_VALUE;
         edgeMinX = Float.POSITIVE_INFINITY;
         edgeMaxX = Float.NEGATIVE_INFINITY;
 
@@ -628,7 +631,7 @@
             blkFlags = blkFlags_initial;
         }
 
-        if (edgeMinY != Float.POSITIVE_INFINITY) {
+        if (edgeMinY != Integer.MAX_VALUE) {
             // if context is maked as DIRTY:
             if (rdrCtx.dirty) {
                 // may happen if an exception if thrown in the pipeline processing:
@@ -688,16 +691,18 @@
     @Override
     public void moveTo(float pix_x0, float pix_y0) {
         closePath();
-        this.pix_sx0 = pix_x0;
-        this.pix_sy0 = pix_y0;
-        this.y0 = tosubpixy(pix_y0);
-        this.x0 = tosubpixx(pix_x0);
+        final float sx = tosubpixx(pix_x0);
+        final float sy = tosubpixy(pix_y0);
+        this.sx0 = sx;
+        this.sy0 = sy;
+        this.x0 = sx;
+        this.y0 = sy;
     }
 
     @Override
     public void lineTo(float pix_x1, float pix_y1) {
-        float x1 = tosubpixx(pix_x1);
-        float y1 = tosubpixy(pix_y1);
+        final float x1 = tosubpixx(pix_x1);
+        final float y1 = tosubpixy(pix_y1);
         addLine(x0, y0, x1, y1);
         x0 = x1;
         y0 = y1;
@@ -729,8 +734,9 @@
 
     @Override
     public void closePath() {
-        // lineTo expects its input in pixel coordinates.
-        lineTo(pix_sx0, pix_sy0);
+        addLine(x0, y0, sx0, sy0);
+        x0 = sx0;
+        y0 = sy0;
     }
 
     @Override
@@ -1396,7 +1402,7 @@
         if (doMonitors) {
             RendererContext.stats.mon_rdr_endRendering.start();
         }
-        if (edgeMinY == Float.POSITIVE_INFINITY) {
+        if (edgeMinY == Integer.MAX_VALUE) {
             return false; // undefined edges bounds
         }
 
@@ -1407,11 +1413,10 @@
         final int spminX = FloatMath.max(FloatMath.ceil_int(edgeMinX - 0.5f), boundsMinX);
         final int spmaxX = FloatMath.min(FloatMath.ceil_int(edgeMaxX - 0.5f), boundsMaxX - 1);
 
-        // y1 (and y2) are already biased by -0.5 in tosubpixy():
-        final int spminY = FloatMath.max(FloatMath.ceil_int(edgeMinY), _boundsMinY);
-        int maxY = FloatMath.ceil_int(edgeMaxY);
-
+        // edge Min/Max Y are already rounded to subpixels within bounds:
+        final int spminY = edgeMinY;
         final int spmaxY;
+        int maxY = edgeMaxY;
 
         if (maxY <= _boundsMaxY - 1) {
             spmaxY = maxY;
--- a/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/RendererContext.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,9 +26,10 @@
 package sun.java2d.marlin;
 
 import java.awt.geom.Path2D;
-import java.lang.ref.SoftReference;
 import java.lang.ref.WeakReference;
 import java.util.concurrent.atomic.AtomicInteger;
+import sun.java2d.ReentrantContext;
+import sun.java2d.ReentrantContextProvider;
 import static sun.java2d.marlin.ArrayCache.*;
 import sun.java2d.marlin.MarlinRenderingEngine.NormalizingPathIterator;
 import static sun.java2d.marlin.MarlinUtils.logInfo;
@@ -36,7 +37,7 @@
 /**
  * This class is a renderer context dedicated to a single thread
  */
-final class RendererContext implements MarlinConst {
+final class RendererContext extends ReentrantContext implements MarlinConst {
 
     // RendererContext creation counter
     private static final AtomicInteger contextCount = new AtomicInteger(1);
@@ -45,7 +46,7 @@
                                        ? RendererStats.getInstance(): null;
 
     private static final boolean USE_CACHE_HARD_REF = doStats
-        || (MarlinRenderingEngine.REF_TYPE == MarlinRenderingEngine.REF_WEAK);
+        || (MarlinRenderingEngine.REF_TYPE == ReentrantContextProvider.REF_WEAK);
 
     /**
      * Create a new renderer context
@@ -55,6 +56,7 @@
     static RendererContext createContext() {
         final RendererContext newCtx = new RendererContext("ctx"
                     + Integer.toString(contextCount.getAndIncrement()));
+
         if (RendererContext.stats != null) {
             RendererContext.stats.allContexts.add(newCtx);
         }
@@ -63,11 +65,6 @@
 
     // context name (debugging purposes)
     final String name;
-    /*
-     * Reference to this instance (hard, soft or weak).
-     * @see MarlinRenderingEngine#REF_TYPE
-     */
-    final Object reference;
     // Smallest object used as Cleaner's parent reference
     final Object cleanerObj = new Object();
     // dirty flag indicating an exception occured during pipeline in pathTo()
@@ -101,7 +98,7 @@
     /**
      * Constructor
      *
-     * @param name
+     * @param name context name (debugging)
      */
     RendererContext(final String name) {
         if (logCreateContext) {
@@ -124,20 +121,6 @@
 
         stroker = new Stroker(this);
         dasher = new Dasher(this);
-
-        // Create the reference to this instance (hard, soft or weak):
-        switch (MarlinRenderingEngine.REF_TYPE) {
-            default:
-            case MarlinRenderingEngine.REF_HARD:
-                reference = this;
-                break;
-            case MarlinRenderingEngine.REF_SOFT:
-                reference = new SoftReference<RendererContext>(this);
-                break;
-            case MarlinRenderingEngine.REF_WEAK:
-                reference = new WeakReference<RendererContext>(this);
-                break;
-        }
     }
 
     /**
--- a/src/java.desktop/share/classes/sun/java2d/marlin/Version.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/marlin/Version.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
 
 public final class Version {
 
-    private static final String version = "marlin-0.7.3-Unsafe-OpenJDK";
+    private static final String version = "marlin-0.7.3.2-Unsafe-OpenJDK";
 
     public static String getVersion() {
         return version;
--- a/src/java.desktop/share/classes/sun/java2d/pipe/AAShapePipe.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/java2d/pipe/AAShapePipe.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,11 @@
 import java.awt.Rectangle;
 import java.awt.Shape;
 import java.awt.geom.Rectangle2D;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import sun.awt.SunHints;
+import sun.java2d.ReentrantContext;
+import sun.java2d.ReentrantContextProvider;
+import sun.java2d.ReentrantContextProviderTL;
 import sun.java2d.SunGraphics2D;
 
 /**
@@ -38,28 +42,31 @@
  * This class sets up the Generator and computes the alpha tiles
  * and then passes them on to a CompositePipe object for painting.
  */
-public class AAShapePipe
+public final class AAShapePipe
     implements ShapeDrawPipe, ParallelogramPipe
 {
-    static RenderingEngine renderengine = RenderingEngine.getInstance();
+    static final RenderingEngine renderengine = RenderingEngine.getInstance();
 
     // Per-thread TileState (~1K very small so do not use any Weak Reference)
-    private static final ThreadLocal<TileState> tileStateThreadLocal =
-            new ThreadLocal<TileState>() {
-        @Override
-        protected TileState initialValue() {
-            return new TileState();
-        }
-    };
+    private static final ReentrantContextProvider<TileState> tileStateProvider =
+            new ReentrantContextProviderTL<TileState>(
+                    ReentrantContextProvider.REF_HARD)
+            {
+                @Override
+                protected TileState newContext() {
+                    return new TileState();
+                }
+            };
 
-    CompositePipe outpipe;
+    final CompositePipe outpipe;
 
     public AAShapePipe(CompositePipe pipe) {
         outpipe = pipe;
     }
 
+    @Override
     public void draw(SunGraphics2D sg, Shape s) {
-        BasicStroke bs;
+        final BasicStroke bs;
 
         if (sg.stroke instanceof BasicStroke) {
             bs = (BasicStroke) sg.stroke;
@@ -71,10 +78,12 @@
         renderPath(sg, s, bs);
     }
 
+    @Override
     public void fill(SunGraphics2D sg, Shape s) {
         renderPath(sg, s, null);
     }
 
+    @Override
     public void fillParallelogram(SunGraphics2D sg,
                                   double ux1, double uy1,
                                   double ux2, double uy2,
@@ -82,21 +91,23 @@
                                   double dx1, double dy1,
                                   double dx2, double dy2)
     {
-        Region clip = sg.getCompClip();
-        final TileState ts = tileStateThreadLocal.get();
-        final int[] abox = ts.abox;
+        final TileState ts = tileStateProvider.acquire();
+        try {
+            final int[] abox = ts.abox;
 
-        AATileGenerator aatg =
-            renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0,
-                                            clip, abox);
-        if (aatg == null) {
-            // Nothing to render
-            return;
+            final AATileGenerator aatg =
+                renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, 0, 0,
+                                                sg.getCompClip(), abox);
+            if (aatg != null) {
+                renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2),
+                            aatg, abox, ts);
+            }
+        } finally {
+            tileStateProvider.release(ts);
         }
-
-        renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2), aatg, abox, ts);
     }
 
+    @Override
     public void drawParallelogram(SunGraphics2D sg,
                                   double ux1, double uy1,
                                   double ux2, double uy2,
@@ -105,52 +116,61 @@
                                   double dx2, double dy2,
                                   double lw1, double lw2)
     {
-        Region clip = sg.getCompClip();
-        final TileState ts = tileStateThreadLocal.get();
-        final int[] abox = ts.abox;
+        final TileState ts = tileStateProvider.acquire();
+        try {
+            final int[] abox = ts.abox;
 
-        AATileGenerator aatg =
-            renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, lw1, lw2,
-                                            clip, abox);
-        if (aatg == null) {
-            // Nothing to render
-            return;
+            final AATileGenerator aatg =
+                renderengine.getAATileGenerator(x, y, dx1, dy1, dx2, dy2, lw1,
+                                                lw2, sg.getCompClip(), abox);
+            if (aatg != null) {
+                // Note that bbox is of the original shape, not the wide path.
+                // This is appropriate for handing to Paint methods...
+                renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2),
+                            aatg, abox, ts);
+            }
+        } finally {
+            tileStateProvider.release(ts);
         }
-
-        // Note that bbox is of the original shape, not the wide path.
-        // This is appropriate for handing to Paint methods...
-        renderTiles(sg, ts.computeBBox(ux1, uy1, ux2, uy2), aatg, abox, ts);
     }
 
     public void renderPath(SunGraphics2D sg, Shape s, BasicStroke bs) {
-        boolean adjust = (bs != null &&
+        final boolean adjust = (bs != null &&
                           sg.strokeHint != SunHints.INTVAL_STROKE_PURE);
-        boolean thin = (sg.strokeState <= SunGraphics2D.STROKE_THINDASHED);
+        final boolean thin = (sg.strokeState <= SunGraphics2D.STROKE_THINDASHED);
 
-        Region clip = sg.getCompClip();
-        final TileState ts = tileStateThreadLocal.get();
-        final int[] abox = ts.abox;
+        final TileState ts = tileStateProvider.acquire();
+        try {
+            final int[] abox = ts.abox;
 
-        AATileGenerator aatg =
-            renderengine.getAATileGenerator(s, sg.transform, clip,
-                                            bs, thin, adjust, abox);
-        if (aatg == null) {
-            // Nothing to render
-            return;
+            final AATileGenerator aatg =
+                renderengine.getAATileGenerator(s, sg.transform, sg.getCompClip(),
+                                                bs, thin, adjust, abox);
+            if (aatg != null) {
+                renderTiles(sg, s, aatg, abox, ts);
+            }
+        } finally {
+            tileStateProvider.release(ts);
         }
-
-        renderTiles(sg, s, aatg, abox, ts);
     }
 
     public void renderTiles(SunGraphics2D sg, Shape s,
-                            AATileGenerator aatg, int abox[], TileState ts)
+                            final AATileGenerator aatg,
+                            final int[] abox, final TileState ts)
     {
         Object context = null;
         try {
+            // reentrance: outpipe may also use AAShapePipe:
             context = outpipe.startSequence(sg, s,
                                             ts.computeDevBox(abox),
                                             abox);
 
+            // copy of int[] abox as local variables for performance:
+            final int x0 = abox[0];
+            final int y0 = abox[1];
+            final int x1 = abox[2];
+            final int y1 = abox[3];
+
             final int tw = aatg.getTileWidth();
             final int th = aatg.getTileHeight();
 
@@ -158,16 +178,15 @@
             final byte[] alpha = ts.getAlphaTile(tw * th);
             byte[] atile;
 
-            for (int y = abox[1]; y < abox[3]; y += th) {
-                int h = Math.min(th, abox[3] - y);
+            for (int y = y0; y < y1; y += th) {
+                final int h = Math.min(th, y1 - y);
 
-                for (int x = abox[0]; x < abox[2]; x += tw) {
-                    int w = Math.min(tw, abox[2] - x);
+                for (int x = x0; x < x1; x += tw) {
+                    final int w = Math.min(tw, x1 - x);
 
-                    int a = aatg.getTypicalAlpha();
-                    if (a == 0x00 ||
-                        outpipe.needTile(context, x, y, w, h) == false)
-                    {
+                    final int a = aatg.getTypicalAlpha();
+
+                    if (a == 0x00 || !outpipe.needTile(context, x, y, w, h)) {
                         aatg.nextTile();
                         outpipe.skipTile(context, x, y);
                         continue;
@@ -180,8 +199,7 @@
                         aatg.getAlpha(alpha, 0, tw);
                     }
 
-                    outpipe.renderPathTile(context, atile, 0, tw,
-                                           x, y, w, h);
+                    outpipe.renderPathTile(context, atile, 0, tw, x, y, w, h);
                 }
             }
         } finally {
@@ -193,7 +211,7 @@
     }
 
     // Tile state used by AAShapePipe
-    static final class TileState {
+    static final class TileState extends ReentrantContext {
         // cached tile (32 x 32 tile by default)
         private byte[] theTile = new byte[32 * 32];
         // dirty aabox array
@@ -240,5 +258,4 @@
             return box;
         }
     }
-
 }
--- a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Fri Mar 11 09:16:55 2016 -0800
@@ -791,12 +791,15 @@
             return page;
         }
 
-        final GraphicsConfiguration gc =
-            GraphicsEnvironment.getLocalGraphicsEnvironment().
-            getDefaultScreenDevice().getDefaultConfiguration();
-        Rectangle bounds = gc.getBounds();
-        int x = bounds.x+bounds.width/3;
-        int y = bounds.y+bounds.height/3;
+        GraphicsConfiguration grCfg = null;
+        Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+        if (w != null) {
+            grCfg = w.getGraphicsConfiguration();
+        } else {
+            grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                        getDefaultScreenDevice().getDefaultConfiguration();
+        }
+        final GraphicsConfiguration gc = grCfg;
 
         PrintService service = java.security.AccessController.doPrivileged(
                                new java.security.PrivilegedAction<PrintService>() {
@@ -814,9 +817,39 @@
             return null;
         }
 
+        // we position the dialog a little beyond the upper-left corner of the window
+        // which is consistent with the NATIVE page dialog
+        Rectangle gcBounds = gc.getBounds();
+        int x = gcBounds.x+50;
+        int y = gcBounds.y+50;
         ServiceDialog pageDialog = new ServiceDialog(gc, x, y, service,
                                        DocFlavor.SERVICE_FORMATTED.PAGEABLE,
                                        attributes, (Frame)null);
+        Rectangle dlgBounds = pageDialog.getBounds();
+
+        // if portion of dialog is not within the gc boundary
+        if (!gcBounds.contains(dlgBounds)) {
+            // check if dialog exceed window bounds at left or bottom
+            // Then position the dialog by moving it by the amount it exceeds
+            // the window bounds
+            // If it results in dialog moving beyond the window bounds at top/left
+            // then position it at window top/left
+            if (dlgBounds.x + dlgBounds.width > gcBounds.x + gcBounds.width) {
+                if ((gcBounds.x + gcBounds.width - dlgBounds.width) > gcBounds.x) {
+                    x = (gcBounds.x + gcBounds.width) - dlgBounds.width;
+                } else {
+                    x = gcBounds.x;
+                }
+            }
+            if (dlgBounds.y + dlgBounds.height > gcBounds.y + gcBounds.height) {
+                if ((gcBounds.y + gcBounds.height - dlgBounds.height) > gcBounds.y) {
+                    y = (gcBounds.y + gcBounds.height) - dlgBounds.height;
+                } else {
+                    y = gcBounds.y;
+                }
+            }
+            pageDialog.setBounds(x, y, dlgBounds.width, dlgBounds.height);
+        }
         pageDialog.show();
 
         if (pageDialog.getStatus() == ServiceDialog.APPROVE) {
@@ -893,9 +926,15 @@
          * We raise privilege when we put up the dialog, to avoid
          * the "warning applet window" banner.
          */
-        final GraphicsConfiguration gc =
-            GraphicsEnvironment.getLocalGraphicsEnvironment().
-            getDefaultScreenDevice().getDefaultConfiguration();
+        GraphicsConfiguration grCfg = null;
+        Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+        if (w != null) {
+            grCfg = w.getGraphicsConfiguration();
+        } else {
+            grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                        getDefaultScreenDevice().getDefaultConfiguration();
+        }
+        final GraphicsConfiguration gc = grCfg;
 
         PrintService service = java.security.AccessController.doPrivileged(
                                new java.security.PrivilegedAction<PrintService>() {
@@ -940,9 +979,10 @@
             }
         }
 
-        Rectangle bounds = gc.getBounds();
-        int x = bounds.x+bounds.width/3;
-        int y = bounds.y+bounds.height/3;
+        // we position the dialog a little beyond the upper-left corner of the window
+        // which is consistent with the NATIVE print dialog
+        int x = 50;
+        int y = 50;
         PrintService newService;
         // temporarily add an attribute pointing back to this job.
         PrinterJobWrapper jobWrapper = new PrinterJobWrapper(this);
--- a/src/java.desktop/unix/classes/sun/java2d/x11/XSurfaceData.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/unix/classes/sun/java2d/x11/XSurfaceData.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,3 +1,27 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under 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.java2d.x11;
 
 import java.awt.image.*;
--- a/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java	Fri Mar 11 09:16:55 2016 -0800
@@ -52,6 +52,7 @@
     private boolean initialized;
     private static native String getCupsServer();
     private static native int getCupsPort();
+    private static native String getCupsDefaultPrinter();
     private static native boolean canConnect(String server, int port);
     private static native boolean initIDs();
     // These functions need to be synchronized as
@@ -266,6 +267,15 @@
      * Returns 2 values - index 0 is printer name, index 1 is the uri.
      */
     static String[] getDefaultPrinter() {
+        // Try to get user/lpoptions-defined printer name from CUPS
+        // if not user-set, then go for server default destination
+        String printerInfo[] = new String[2];
+        printerInfo[0] = getCupsDefaultPrinter();
+
+        if (printerInfo[0] != null) {
+            printerInfo[1] = null;
+            return printerInfo.clone();
+        }
         try {
             URL url = new URL("http", getServer(), getPort(), "");
             final HttpURLConnection urlConnection =
@@ -301,7 +311,7 @@
                                         attCl)) {
 
                     HashMap<String, AttributeClass> defaultMap = null;
-                    String[] printerInfo = new String[2];
+
                     InputStream is = urlConnection.getInputStream();
                     HashMap<String, AttributeClass>[] responseMap = IPPPrintService.readIPPResponse(
                                          is);
--- a/src/java.desktop/unix/native/common/awt/CUPSfuncs.c	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/unix/native/common/awt/CUPSfuncs.c	Fri Mar 11 09:16:55 2016 -0800
@@ -43,6 +43,10 @@
 typedef http_t* (*fn_httpConnect)(const char *, int);
 typedef void (*fn_httpClose)(http_t *);
 typedef char* (*fn_cupsGetPPD)(const char *);
+typedef cups_dest_t* (*fn_cupsGetDest)(const char *name,
+    const char *instance, int num_dests, cups_dest_t *dests);
+typedef int (*fn_cupsGetDests)(cups_dest_t **dests);
+typedef void (*fn_cupsFreeDests)(int num_dests, cups_dest_t *dests);
 typedef ppd_file_t* (*fn_ppdOpenFile)(const char *);
 typedef void (*fn_ppdClose)(ppd_file_t *);
 typedef ppd_option_t* (*fn_ppdFindOption)(ppd_file_t *, const char *);
@@ -53,6 +57,9 @@
 fn_httpConnect j2d_httpConnect;
 fn_httpClose j2d_httpClose;
 fn_cupsGetPPD j2d_cupsGetPPD;
+fn_cupsGetDest j2d_cupsGetDest;
+fn_cupsGetDests j2d_cupsGetDests;
+fn_cupsFreeDests j2d_cupsFreeDests;
 fn_ppdOpenFile j2d_ppdOpenFile;
 fn_ppdClose j2d_ppdClose;
 fn_ppdFindOption j2d_ppdFindOption;
@@ -106,6 +113,24 @@
     return JNI_FALSE;
   }
 
+  j2d_cupsGetDest = (fn_cupsGetDest)dlsym(handle, "cupsGetDest");
+  if (j2d_cupsGetDest == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_cupsGetDests = (fn_cupsGetDests)dlsym(handle, "cupsGetDests");
+  if (j2d_cupsGetDests == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
+  j2d_cupsFreeDests = (fn_cupsFreeDests)dlsym(handle, "cupsFreeDests");
+  if (j2d_cupsFreeDests == NULL) {
+    dlclose(handle);
+    return JNI_FALSE;
+  }
+
   j2d_ppdOpenFile = (fn_ppdOpenFile)dlsym(handle, "ppdOpenFile");
   if (j2d_ppdOpenFile == NULL) {
     dlclose(handle);
@@ -170,6 +195,30 @@
 
 
 /*
+ * Gets CUPS default printer name.
+ *
+ */
+JNIEXPORT jstring JNICALL
+Java_sun_print_CUPSPrinter_getCupsDefaultPrinter(JNIEnv *env,
+                                                  jobject printObj)
+{
+    jstring cDefPrinter = NULL;
+    cups_dest_t *dests;
+    char *defaultPrinter = NULL;
+    int num_dests = j2d_cupsGetDests(&dests);
+    int i = 0;
+    cups_dest_t *dest = j2d_cupsGetDest(NULL, NULL, num_dests, dests);
+    if (dest != NULL) {
+        defaultPrinter = dest->name;
+        if (defaultPrinter != NULL) {
+            cDefPrinter = JNU_NewStringPlatform(env, defaultPrinter);
+        }
+    }
+    j2d_cupsFreeDests(num_dests, dests);
+    return cDefPrinter;
+}
+
+/*
  * Checks if connection can be made to the server.
  *
  */
--- a/src/java.desktop/windows/classes/sun/java2d/d3d/D3DBlitLoops.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/java.desktop/windows/classes/sun/java2d/d3d/D3DBlitLoops.java	Fri Mar 11 09:16:55 2016 -0800
@@ -500,6 +500,7 @@
 class D3DSurfaceToSwBlit extends Blit {
 
     private int typeval;
+    private WeakReference<SurfaceData> srcTmp;
 
     // REMIND: destination will actually be opaque/premultiplied...
     D3DSurfaceToSwBlit(SurfaceType dstType, int typeval) {
@@ -509,11 +510,97 @@
         this.typeval = typeval;
     }
 
+    /*
+     * Clip value is ignored in D3D SurfaceToSw blit.
+     * Root Cause: The native interfaces to D3D use StretchRect API followed
+     * by custom copy of pixels from Surface to Sysmem. As a result, clipping
+     * in D3DSurfaceToSw works 'only' for Rect clips, provided, proper srcX,
+     * srcY, dstX, dstY, width and height are passed to native interfaces.
+     * Non rect clips (For example: Shape clips) are ignored completely.
+     *
+     * Solution: There are three solutions possible to fix this issue.
+     * 1. Convert the entire Surface to Sysmem and perform regular Blit.
+     *    An optimized version of this is to take up the conversion only
+     *    when Shape clips are needed. Existing native interface will suffice
+     *    for supporting Rect clips.
+     * 2. With help of existing classes we could perform SwToSurface,
+     *    SurfaceToSurface (implements clip) and SurfaceToSw (complete copy)
+     *    in order.
+     * 3. Modify the native D3D interface to accept clip and perform same logic
+     *    as the second approach but at native side.
+     *
+     * Upon multiple experiments, the first approach has been found to be
+     * faster than the others as it deploys 1-draw/copy operation for rect clip
+     * and 2-draw/copy operations for shape clip compared to 3-draws/copy
+     * operations deployed by the remaining approaches.
+     *
+     * complexClipBlit method helps to convert or copy the contents from
+     * D3DSurface onto Sysmem and perform a regular Blit with the clip
+     * information as required. This method is used when non-rectangular
+     * clip is needed.
+     */
+    private synchronized void complexClipBlit(SurfaceData src, SurfaceData dst,
+                                              Composite comp, Region clip,
+                                              int sx, int sy, int dx, int dy,
+                                              int w, int h) {
+        SurfaceData cachedSrc = null;
+        if (srcTmp != null) {
+            // use cached intermediate surface, if available
+            cachedSrc = srcTmp.get();
+        }
+
+        // Type- indicates the pixel format of Sysmem based BufferedImage.
+        // Native d3d interfaces support on the fly conversion of pixels from
+        // d3d surface to destination sysmem memory of type IntARGB only.
+        final int type = BufferedImage.TYPE_INT_ARGB;
+        src = convertFrom(this, src, sx, sy, w, h, cachedSrc, type);
+
+        // copy intermediate SW to destination SW using complex clip
+        final Blit performop = Blit.getFromCache(src.getSurfaceType(),
+                                                 CompositeType.SrcNoEa,
+                                                 dst.getSurfaceType());
+        performop.Blit(src, dst, comp, clip, 0, 0, dx, dy, w, h);
+
+        if (src != cachedSrc) {
+            // cache the intermediate surface
+            srcTmp = new WeakReference<>(src);
+        }
+    }
+
     public void Blit(SurfaceData src, SurfaceData dst,
                      Composite comp, Region clip,
                      int sx, int sy, int dx, int dy,
                      int w, int h)
     {
+        if (clip != null) {
+            clip = clip.getIntersectionXYWH(dx, dy, w, h);
+            // At the end this method will flush the RenderQueue, we should exit
+            // from it as soon as possible.
+            if (clip.isEmpty()) {
+                return;
+            }
+
+            // Adjust final dst(x,y) and src(x,y) based on the clip. The
+            // logic is that, when clip limits drawing on the destination,
+            // corresponding pixels from the src should be skipped.
+            sx += clip.getLoX() - dx;
+            sy += clip.getLoY() - dy;
+            dx = clip.getLoX();
+            dy = clip.getLoY();
+            w = clip.getWidth();
+            h = clip.getHeight();
+
+            // Check if the clip is Rectangular. For non-rectangular clips
+            // complexClipBlit will convert Surface To Sysmem and perform
+            // regular Blit.
+            if (!clip.isRectangular()) {
+                complexClipBlit(src, dst, comp, clip,
+                                sx, sy, dx, dy,
+                                w, h);
+                return;
+            }
+        }
+
         D3DRenderQueue rq = D3DRenderQueue.getInstance();
         rq.lock();
         try {
--- a/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/Translator.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/Translator.java	Fri Mar 11 09:16:55 2016 -0800
@@ -32,6 +32,7 @@
 import java.awt.*;
 import java.awt.event.*;
 import java.awt.image.*;
+import java.security.AccessControlException;
 // Do not import Swing classes.  This module is intended to work
 // with both Swing and AWT.
 // import javax.swing.*;
@@ -77,7 +78,7 @@
             return null;
         }
         try {
-            t = Class.forName("com.sun.java.accessibility.util.internal"
+            t = Class.forName("com.sun.java.accessibility.util.internal."
                               + c.getSimpleName()
                               + "Translator");
             return t;
@@ -105,6 +106,10 @@
         if (o instanceof Accessible) {
             a = (Accessible)o;
         } else {
+            // About to "newInstance" an object of a class of a restricted package
+            // so ensure the caller is allowed access to that package.
+            String pkg = "com.sun.java.accessibility.util.internal";
+            System.getSecurityManager().checkPackageAccess(pkg);
             Class<?> translatorClass = getTranslatorClass(o.getClass());
             if (translatorClass != null) {
                 try {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/Focus/FocusTraversalPolicy/ContainerOrderFTPTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+  @test
+  @bug 8025001
+  @summary Tests java.awt.ContainerOrderFocusTraversalPolicy functionality.
+  @run main ContainerOrderFTPTest
+*/
+
+import java.awt.Frame;
+import java.awt.Button;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.ContainerOrderFocusTraversalPolicy;
+
+public class ContainerOrderFTPTest {
+
+    private final ContainerOrderFocusTraversalPolicy coftp;
+    private final Frame frame;
+    private final Button b1;
+    private final Button b2;
+    private final String expectedTraversal;
+
+    public ContainerOrderFTPTest() {
+        expectedTraversal = "B1B2F1";
+        b1 = new Button("B1");
+        b2 = new Button("B2");
+        frame = new Frame("F1");
+
+        frame.setLayout(new FlowLayout());
+        frame.setSize(200, 200);
+        coftp = new ContainerOrderFocusTraversalPolicy();
+        frame.setFocusTraversalPolicy(coftp);
+        frame.add(b1);
+        frame.add(b2);
+        frame.setVisible(true);
+    }
+
+    public static void main(String[] args) throws Exception {
+        ContainerOrderFTPTest test = new ContainerOrderFTPTest();
+        test.performTest();
+        test.dispose();
+    }
+
+    public void performTest() {
+        int count = 0;
+        Component comp = coftp.getFirstComponent(frame);
+        String traversal = "";
+        do {
+            comp = coftp.getComponentAfter(frame, comp);
+            if (comp instanceof Button) {
+                traversal += ((Button)comp).getLabel();
+            } else if (comp instanceof Frame) {
+                traversal += ((Frame)comp).getTitle();
+            }
+            count++;
+        } while(count < 3);
+
+        if (!expectedTraversal.equals(traversal)) {
+            dispose();
+            throw new RuntimeException("Incorrect Traversal. Expected : "
+                + expectedTraversal + "Actual : " + traversal);
+        }
+    }
+
+    public void dispose() {
+        frame.dispose();
+    }
+}
--- a/test/java/awt/image/DrawImage/IncorrectClipSurface2SW.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/test/java/awt/image/DrawImage/IncorrectClipSurface2SW.java	Fri Mar 11 09:16:55 2016 -0800
@@ -42,11 +42,11 @@
 
 /**
  * @test
- * @bug 8041644
+ * @bug 8041644 8044788
  * @summary Tests drawing volatile image to BI using different clip.
  *          Results of the blit compatibleImage to BI used for comparison.
  * @author Sergey Bylokhov
- * @run main/othervm -Dsun.java2d.d3d=false IncorrectClipSurface2SW
+ * @run main/othervm IncorrectClipSurface2SW
  */
 public final class IncorrectClipSurface2SW {
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/image/multiresolution/MenuMultiresolutionIconTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8150258
+ * @author a.stepanov
+ * @summary Check that correct resolution variants are chosen for menu icons
+ *          when multiresolution image is used for their construction.
+ *
+ * @library ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @run main/othervm -Dsun.java2d.uiScale=1 MenuMultiresolutionIconTest
+ * @run main/othervm -Dsun.java2d.uiScale=2 MenuMultiresolutionIconTest
+ */
+
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.image.*;
+import javax.swing.*;
+
+public class MenuMultiresolutionIconTest extends JPanel {
+
+    private final static int DELAY = 1000;
+    private final static int SZ = 50;
+    private final static String SCALE = "sun.java2d.uiScale";
+    private final static Color C1X = Color.RED, C2X = Color.BLUE;
+    private final ExtendedRobot r;
+
+    private static BufferedImage generateImage(int scale, Color c) {
+
+        int x = SZ * scale;
+        BufferedImage img = new BufferedImage(x, x, BufferedImage.TYPE_INT_RGB);
+        Graphics g = img.getGraphics();
+        g.setColor(c);
+        g.fillRect(0, 0, x, x);
+        return img;
+    }
+
+    private static BaseMultiResolutionImage createIcon() {
+
+        return new BaseMultiResolutionImage(new BufferedImage[] {
+            generateImage(1, C1X), generateImage(2, C2X)});
+    }
+
+    private JFrame     frame;
+    private JPopupMenu popup;
+    private JMenuItem  popupItem;
+    private JMenu      menu;
+
+    public MenuMultiresolutionIconTest() throws Exception {
+
+        r = new ExtendedRobot();
+        SwingUtilities.invokeAndWait(this::createUI);
+    }
+
+    private void createUI() {
+
+        ImageIcon ii = new ImageIcon(createIcon());
+
+        popup = new JPopupMenu();
+        popupItem = new JMenuItem("test", ii);
+        popup.add(popupItem);
+        popupItem.setHorizontalTextPosition(JMenuItem.RIGHT);
+        addMouseListener(new MousePopupListener());
+
+        frame = new JFrame();
+        JMenuBar menuBar = new JMenuBar();
+        menu = new JMenu("test");
+        menuBar.add(menu);
+        menu.add(new JMenuItem("test", ii));
+        menu.add(new JRadioButtonMenuItem("test", ii, true));
+        menu.add(new JCheckBoxMenuItem("test", ii, true));
+
+        frame.setJMenuBar(menuBar);
+        frame.setContentPane(this);
+        frame.setSize(300, 300);
+        frame.setVisible(true);
+    }
+
+    private class MousePopupListener extends MouseAdapter {
+
+        @Override
+        public void mousePressed(MouseEvent e)  { showPopup(e); }
+        @Override
+        public void mouseClicked(MouseEvent e)  { showPopup(e); }
+        @Override
+        public void mouseReleased(MouseEvent e) { showPopup(e); }
+
+        private void showPopup(MouseEvent e) {
+            if (e.isPopupTrigger()) {
+                popup.show(MenuMultiresolutionIconTest.this, e.getX(), e.getY());
+            }
+        }
+    }
+
+    private static boolean is2x() {
+
+        return GraphicsEnvironment.getLocalGraphicsEnvironment().
+            getDefaultScreenDevice().getDefaultConfiguration().
+            getDefaultTransform().getScaleX() > 1.001;
+    }
+
+    private boolean eqColors(Color c1, Color c2) {
+
+        int tol = 15;
+        return (
+            Math.abs(c2.getRed()   - c1.getRed()  ) < tol &&
+            Math.abs(c2.getGreen() - c1.getGreen()) < tol &&
+            Math.abs(c2.getBlue()  - c1.getBlue() ) < tol);
+    }
+
+    private void checkIconColor(Point p, String what) {
+
+        Color expected = is2x() ? C2X : C1X;
+        Color c = r.getPixelColor(p.x + SZ / 2, p.y + SZ / 2);
+        if (!eqColors(c, expected)) {
+            frame.dispose();
+            throw new RuntimeException("invalid " + what + "menu item icon " +
+                "color, expected: " + expected + ", got: " + c);
+        }
+        System.out.println(what + "item icon check passed");
+    }
+
+    private void doTest() {
+
+        r.waitForIdle(2 * DELAY);
+
+        Point p = getLocationOnScreen();
+        r.mouseMove(p.x + getWidth() / 4, p.y + getHeight() / 4);
+        r.waitForIdle(DELAY);
+        r.click(InputEvent.BUTTON3_DOWN_MASK);
+        r.waitForIdle(DELAY);
+        p = popupItem.getLocationOnScreen();
+        checkIconColor(p, "popup ");
+        r.waitForIdle(DELAY);
+
+        p = menu.getLocationOnScreen();
+        r.mouseMove(p.x + menu.getWidth() / 2, p.y + menu.getHeight() / 2);
+        r.waitForIdle(DELAY);
+        r.click();
+        p = menu.getItem(0).getLocationOnScreen();
+        checkIconColor(p, "");
+        r.waitForIdle(DELAY);
+
+        p = menu.getItem(1).getLocationOnScreen();
+        checkIconColor(p, "radiobutton ");
+        r.waitForIdle(DELAY);
+
+        p = menu.getItem(2).getLocationOnScreen();
+        checkIconColor(p, "checkbox ");
+        r.waitForIdle(DELAY);
+
+        frame.dispose();
+    }
+
+    public static void main(String s[]) throws Exception {
+
+        // TODO: remove is2x() after JDK-8150844 fix
+        if (is2x() == "2".equals(System.getProperty(SCALE))) {
+            (new MenuMultiresolutionIconTest()).doTest();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/image/multiresolution/MultiResolutionTrayIconTest/MultiResolutionTrayIconTest.html	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,41 @@
+<!--
+ Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+-->
+
+<html>
+<head>
+<title> MultiResolutionTrayIconTest </title>
+</head>
+<body>
+<applet code="MultiResolutionTrayIconTest.class" width=100 height=30></applet>
+
+To run test please push "Start" (if system tray is not supported, push "Pass").
+
+Two tray icons will appear (note: sometimes they can go to the tray icons pool).
+
+Please check if both of them have correct size and
+the same colouring (white rectagle in a blue mount). In this case please push "Pass".
+
+Otherwise (if the 2nd red-white small icon appears) please push "Fail".
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/image/multiresolution/MultiResolutionTrayIconTest/MultiResolutionTrayIconTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/*
+  @test
+  @bug 8150176
+  @ignore 8150176
+  @summary Check if correct resolution variant is used for tray icon.
+  @author a.stepanov
+  @run applet/manual=yesno MultiResolutionTrayIconTest.html
+*/
+
+
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.image.*;
+
+
+public class MultiResolutionTrayIconTest extends Applet {
+
+    private SystemTray tray;
+    private TrayIcon   icon, iconMRI;
+
+    public void init() { this.setLayout(new BorderLayout()); }
+
+    public void start() {
+
+        boolean trayIsSupported = SystemTray.isSupported();
+        Button b = new Button("Start");
+        if (trayIsSupported) {
+
+            prepareIcons();
+            b.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) { doTest(); }
+            });
+        } else {
+             b.setLabel("not supported");
+             b.setEnabled(false);
+             System.out.println("system tray is not supported");
+        }
+        add(b, BorderLayout.CENTER);
+
+        validate();
+        setVisible(true);
+    }
+
+    private BufferedImage generateImage(int w, int h, Color c) {
+
+        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics g = img.getGraphics();
+        g.setColor(c);
+        g.fillRect(0, 0, w, h);
+        g.setColor(Color.WHITE);
+        int r = (Math.min(w, h) >= 8) ? 3 : 1;
+        g.fillRect(r, r, w - 2 * r, h - 2 * r);
+        return img;
+    }
+
+    private void prepareIcons() {
+
+        tray = SystemTray.getSystemTray();
+        Dimension d = tray.getTrayIconSize();
+        int w = d.width, h = d.height;
+
+        BufferedImage img = generateImage(w, h, Color.BLUE);
+        // use wrong icon size for "nok"
+        BufferedImage nok = generateImage(w / 2 + 2, h / 2 + 2, Color.RED);
+        BaseMultiResolutionImage mri =
+            new BaseMultiResolutionImage(new BufferedImage[] {nok, img});
+        icon    = new TrayIcon(img);
+        iconMRI = new TrayIcon(mri);
+    }
+
+    private void doTest() {
+
+        if (tray.getTrayIcons().length > 0) { return; } // icons were added already
+        try {
+            tray.add(icon);
+            tray.add(iconMRI);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void stop() {
+
+        // check for null, just in case
+        if (tray != null) {
+            tray.remove(icon);
+            tray.remove(iconMRI);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/print/PrinterJob/MultiMonPrintDlgTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.awt.Button;
+import java.awt.Component;
+import java.awt.Frame;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+/**
+ * @test
+ * @bug 8138749
+ * @summary PrinterJob.printDialog() does not support multi-mon,
+ *           always displayed on primary
+ * @run main/manual MultiMonPrintDlgTest
+ */
+public class MultiMonPrintDlgTest implements ActionListener {
+
+    Frame primaryFrame = null;
+    Frame secFrame = null;
+    GraphicsDevice gd[] = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                            getScreenDevices();
+
+    public MultiMonPrintDlgTest() throws Exception {
+        if (gd.length <= 1) {
+            System.out.println("This test should be run only on dual-monitor systems. Aborted!!");
+            return;
+        }
+
+        String[] instructions =
+            {
+             " This test should be running on a dual-monitor setup.",
+             "A frame will be created on each of the 2 monitor. ",
+             "Click the Print button on the frame displayed in the non-default monitor.",
+             "Please verify that page dialog followed by print dialog ",
+             " is displayed in the same screen",
+             "where the frame is located ie, in the non-default monitor.",
+            };
+
+        SwingUtilities.invokeAndWait(() -> {
+            JOptionPane.showMessageDialog(
+                    (Component) null,
+                    instructions,
+                    "information", JOptionPane.INFORMATION_MESSAGE);
+        });
+        GraphicsDevice defDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
+        int x = 0;
+        Frame f = null;
+        for (x = 0; x < gd.length; x ++) {
+            if (gd[x] != defDev) {
+                secFrame = new Frame("Screen " + x + " - secondary", gd[x].getDefaultConfiguration());
+                f = secFrame;
+            } else {
+                primaryFrame = new Frame("Screen " + x + " - primary", gd[x].getDefaultConfiguration());
+                f = primaryFrame;
+            }
+            Button b = new Button("Print");
+            b.addActionListener(this);
+            f.add("South", b);
+            f.addWindowListener (new WindowAdapter() {
+                public void windowClosing(WindowEvent we) {
+                    ((Window) we.getSource()).dispose();
+                }
+            });
+            f.setSize(200, 200);
+            f.setVisible(true);
+        }
+    }
+
+    public void actionPerformed (ActionEvent ae) {
+        try {
+            javax.print.attribute.PrintRequestAttributeSet prSet =
+                  new javax.print.attribute.HashPrintRequestAttributeSet();
+            java.awt.print.PrinterJob.getPrinterJob().pageDialog(prSet);
+            Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+            int dialogButton = JOptionPane.showConfirmDialog (w,
+                            "Did the pageDialog shown in non-default monitor?",
+                            null, JOptionPane.YES_NO_OPTION);
+            if(dialogButton == JOptionPane.NO_OPTION) {
+                throw new RuntimeException("PageDialog is shown in wrong monitor");
+            }
+            java.awt.print.PrinterJob.getPrinterJob().printDialog(prSet);
+            dialogButton = JOptionPane.showConfirmDialog (w,
+                            "Did the printDialog shown in non-default monitor?",
+                            null, JOptionPane.YES_NO_OPTION);
+            if(dialogButton == JOptionPane.NO_OPTION) {
+                throw new RuntimeException("PrintDialog is shown in wrong monitor");
+            }
+        } finally {
+            primaryFrame.dispose();
+            secFrame.dispose();
+        }
+    }
+
+    public static void main (String args[]) throws Exception {
+        MultiMonPrintDlgTest test = new MultiMonPrintDlgTest();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/sound/sampled/AudioInputStream/FrameLengthAfterConversion.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import javax.sound.sampled.spi.AudioFileWriter;
+import javax.sound.sampled.spi.FormatConversionProvider;
+
+import static java.util.ServiceLoader.load;
+import static javax.sound.sampled.AudioFileFormat.Type.AIFC;
+import static javax.sound.sampled.AudioFileFormat.Type.AIFF;
+import static javax.sound.sampled.AudioFileFormat.Type.AU;
+import static javax.sound.sampled.AudioFileFormat.Type.SND;
+import static javax.sound.sampled.AudioFileFormat.Type.WAVE;
+import static javax.sound.sampled.AudioSystem.NOT_SPECIFIED;
+
+/**
+ * @test
+ * @bug 8038139
+ */
+public final class FrameLengthAfterConversion {
+
+    /**
+     * We will try to use all formats, in this case all our providers will be
+     * covered by supported/unsupported formats.
+     */
+    private static final List<AudioFormat> formats = new ArrayList<>(23000);
+
+    private static final AudioFormat.Encoding[] encodings = {
+            AudioFormat.Encoding.ALAW, AudioFormat.Encoding.ULAW,
+            AudioFormat.Encoding.PCM_SIGNED, AudioFormat.Encoding.PCM_UNSIGNED,
+            AudioFormat.Encoding.PCM_FLOAT, new AudioFormat.Encoding("Test")
+    };
+
+    private static final int[] sampleBits = {
+            1, 4, 8, 11, 16, 20, 24, 32
+    };
+
+    private static final int[] channels = {
+            1, 2, 3, 4, 5
+    };
+
+    private static final AudioFileFormat.Type[] types = {
+            WAVE, AU, AIFF, AIFC, SND,
+            new AudioFileFormat.Type("TestName", "TestExt")
+    };
+
+    private static final int FRAME_LENGTH = 10;
+
+    static {
+        for (final int sampleSize : sampleBits) {
+            for (final int channel : channels) {
+                for (final AudioFormat.Encoding enc : encodings) {
+                    final int frameSize = ((sampleSize + 7) / 8) * channel;
+                    formats.add(new AudioFormat(enc, 44100, sampleSize, channel,
+                                                frameSize, 44100, true));
+                    formats.add(new AudioFormat(enc, 44100, sampleSize, channel,
+                                                frameSize, 44100, false));
+                }
+            }
+        }
+    }
+
+    public static void main(final String[] args) {
+        for (final FormatConversionProvider fcp : load(
+                FormatConversionProvider.class)) {
+            System.out.println("fcp = " + fcp);
+            for (final AudioFormat from : formats) {
+                for (final AudioFormat to : formats) {
+                    testAfterConversion(fcp, to, getStream(from, true));
+                }
+            }
+        }
+
+        for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
+            System.out.println("afw = " + afw);
+            for (final AudioFileFormat.Type type : types) {
+                for (final AudioFormat from : formats) {
+                    testAfterSaveToStream(afw, type, getStream(from, true));
+                }
+            }
+        }
+
+        for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
+            System.out.println("afw = " + afw);
+            for (final AudioFileFormat.Type type : types) {
+                for (final AudioFormat from : formats) {
+                    testAfterSaveToFile(afw, type, getStream(from, true));
+                }
+            }
+        }
+
+        for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
+            System.out.println("afw = " + afw);
+            for (final AudioFileFormat.Type type : types) {
+                for (final AudioFormat from : formats) {
+                    testAfterSaveToFile(afw, type, getStream(from, false));
+                }
+            }
+        }
+    }
+
+    /**
+     * Verifies the frame length after the stream was saved/read to/from
+     * stream.
+     */
+    private static void testAfterSaveToStream(final AudioFileWriter afw,
+                                              final AudioFileFormat.Type type,
+                                              final AudioInputStream ais) {
+        try {
+            final ByteArrayOutputStream out = new ByteArrayOutputStream();
+            afw.write(ais, type, out);
+            final InputStream input = new ByteArrayInputStream(
+                    out.toByteArray());
+            validate(AudioSystem.getAudioInputStream(input).getFrameLength());
+        } catch (IllegalArgumentException | UnsupportedAudioFileException
+                | IOException ignored) {
+        }
+    }
+
+    /**
+     * Verifies the frame length after the stream was saved/read to/from file.
+     */
+    private static void testAfterSaveToFile(final AudioFileWriter afw,
+                                            final AudioFileFormat.Type type,
+                                            AudioInputStream ais) {
+        try {
+            final File temp = File.createTempFile("sound", ".tmp");
+            temp.deleteOnExit();
+            afw.write(ais, type, temp);
+            ais = AudioSystem.getAudioInputStream(temp);
+            final long frameLength = ais.getFrameLength();
+            ais.close();
+            temp.delete();
+            validate(frameLength);
+        } catch (IllegalArgumentException | UnsupportedAudioFileException
+                | IOException ignored) {
+        }
+    }
+
+    /**
+     * Verifies the frame length after the stream was converted to other
+     * stream.
+     *
+     * @see FormatConversionProvider#getAudioInputStream(AudioFormat,
+     * AudioInputStream)
+     */
+    private static void testAfterConversion(final FormatConversionProvider fcp,
+                                            final AudioFormat to,
+                                            final AudioInputStream ais) {
+        if (fcp.isConversionSupported(to, ais.getFormat())) {
+            validate(fcp.getAudioInputStream(to, ais).getFrameLength());
+        }
+    }
+
+    /**
+     * Throws an exception if the frameLength is specified and is not equal to
+     * the gold value.
+     */
+    private static void validate(final long frameLength) {
+        if (frameLength != FRAME_LENGTH) {
+            System.err.println("Expected: " + FRAME_LENGTH);
+            System.err.println("Actual: " + frameLength);
+            throw new RuntimeException();
+        }
+    }
+
+    private static AudioInputStream getStream(final AudioFormat format,
+                                              final boolean frameLength) {
+        final int dataSize = FRAME_LENGTH * format.getFrameSize();
+        final InputStream in = new ByteArrayInputStream(new byte[dataSize]);
+        if (frameLength) {
+            return new AudioInputStream(in, format, FRAME_LENGTH);
+        } else {
+            return new AudioInputStream(in, format, NOT_SPECIFIED);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JFileChooser/ShellFolderQueries/ShellFolderQueriesTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8081722
+ * @summary Provide public API for file hierarchy provided by
+ * sun.awt.shell.ShellFolder
+ * @author Semyon Sadetsky
+ * @run main ShellFolderQueriesTest
+ */
+
+import sun.awt.OSInfo;
+
+import javax.swing.filechooser.FileSystemView;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class ShellFolderQueriesTest {
+    static final String HOME = System.getProperty("user.home");
+    static final FileSystemView fsv = FileSystemView.getFileSystemView();
+
+
+    static String scriptBeg =
+            "set WshShell = WScript.CreateObject(\"WScript.Shell\")\n" +
+            "set oShellLink = WshShell.CreateShortcut(\"shortcut.lnk\")\n" +
+            "oShellLink.TargetPath = \"";
+    static String scriptEnd = "\"\noShellLink.WindowStyle = 1\noShellLink.Save";
+
+    public static void main(String[] args) throws Exception {
+        if(OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {
+            testGet();
+            testLink();
+        } else {
+            testGet();
+        }
+        System.out.println("ok");
+    }
+
+    private static void testLink() throws IOException, InterruptedException {
+        // Create and execute VBS script to create a link
+        File file = createVbsScript(scriptBeg + HOME + scriptEnd);
+        Runtime.getRuntime().exec("cscript " + file.getName(), null,
+                file.getParentFile()).waitFor();
+        file.delete();
+
+        File link = new File(file.getParentFile(), "shortcut.lnk");
+        if (!fsv.isLink(link)) {
+            link.delete();
+            throw new RuntimeException("Link is not detected");
+        }
+
+        File location = fsv.getLinkLocation(link);
+        if (!location.getAbsolutePath().equals(HOME)) {
+            link.delete();
+            throw new RuntimeException("Link location " + location +
+                    " is wrong");
+        }
+        link.delete();
+
+
+        link = File.createTempFile("test", ".tst");
+
+        if (fsv.isLink(link)) {
+            link.delete();
+            throw new RuntimeException("File is not a link");
+        }
+
+        try {
+            location = fsv.getLinkLocation(link);
+            if (location != null) {
+                link.delete();
+                throw new RuntimeException("Not a link, should return null");
+            }
+        }
+        catch (FileNotFoundException e) {
+        }
+        link.delete();
+    }
+
+    private static File createVbsScript(String script) throws IOException {
+        File file = File.createTempFile("test", ".vbs");
+        file.deleteOnExit();
+        FileOutputStream fos = new FileOutputStream(file);
+        fos.write(script.getBytes());
+        fos.close();
+        return file;
+    }
+
+    private static void testGet() {
+        File[] files = fsv.getChooserComboBoxFiles();
+        for (File file : files) {
+            if (fsv.isLink(file)) {
+                throw new RuntimeException(
+                        "Link shouldn't be in FileChooser combobox, "
+                                + file.getPath());
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JInternalFrame/8146321/JInternalFrameIconTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,275 @@
+/*
+ * 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 8146321
+ * @summary verifies JInternalFrame Icon and ImageIcon
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main JInternalFrameIconTest
+ */
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.image.BufferedImage;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class JInternalFrameIconTest {
+
+    private static JFrame frame;
+    private static JDesktopPane desktopPane;
+    private static JInternalFrame internalFrame;
+    private static ImageIcon titleImageIcon;
+    private static Icon titleIcon;
+    private static BufferedImage imageIconImage;
+    private static BufferedImage iconImage;
+
+    private static Robot robot;
+
+    public static void main(String[] args) throws Exception {
+        robot = new Robot();
+        robot.delay(2000);
+        UIManager.LookAndFeelInfo[] lookAndFeelArray
+                = UIManager.getInstalledLookAndFeels();
+        for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+            executeCase(lookAndFeelItem.getClassName());
+        }
+
+    }
+
+    private static void executeCase(String lookAndFeelString) throws Exception {
+        if (tryLookAndFeel(lookAndFeelString)) {
+            createImageIconUI(lookAndFeelString);
+            robot.delay(1000);
+            getImageIconBufferedImage();
+            robot.waitForIdle();
+            cleanUp();
+            robot.waitForIdle();
+
+            createIconUI(lookAndFeelString);
+            robot.delay(1000);
+            getIconBufferedImage();
+            robot.waitForIdle();
+            cleanUp();
+            robot.waitForIdle();
+            testIfSame();
+            robot.waitForIdle();
+        }
+
+    }
+
+    private static void createImageIconUI(final String lookAndFeelString)
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                desktopPane = new JDesktopPane();
+                internalFrame = new JInternalFrame();
+                frame = new JFrame();
+                internalFrame.setTitle(lookAndFeelString);
+                titleImageIcon = new ImageIcon() {
+                    @Override
+                    public int getIconWidth() {
+                        return 16;
+                    }
+
+                    @Override
+                    public int getIconHeight() {
+                        return 16;
+                    }
+
+                    @Override
+                    public void paintIcon(
+                            Component c, Graphics g, int x, int y) {
+                        g.setColor(java.awt.Color.black);
+                        g.fillRect(x, y, 16, 16);
+                    }
+                };
+                internalFrame.setFrameIcon(titleImageIcon);
+                internalFrame.setSize(500, 200);
+                internalFrame.setVisible(true);
+                desktopPane.add(internalFrame);
+
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.getContentPane().setLayout(new BorderLayout());
+                frame.getContentPane().add(desktopPane, "Center");
+                frame.setSize(500, 500);
+                frame.setLocationRelativeTo(null);
+                frame.setVisible(true);
+                frame.toFront();
+            }
+        });
+    }
+
+    private static void createIconUI(final String lookAndFeelString)
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                desktopPane = new JDesktopPane();
+                internalFrame = new JInternalFrame();
+                frame = new JFrame();
+                internalFrame.setTitle(lookAndFeelString);
+                titleIcon = new Icon() {
+                    @Override
+                    public int getIconWidth() {
+                        return 16;
+                    }
+
+                    @Override
+                    public int getIconHeight() {
+                        return 16;
+                    }
+
+                    @Override
+                    public void paintIcon(
+                            Component c, Graphics g, int x, int y) {
+                        g.setColor(java.awt.Color.black);
+                        g.fillRect(x, y, 16, 16);
+                    }
+                };
+                internalFrame.setFrameIcon(titleIcon);
+                internalFrame.setSize(500, 200);
+                internalFrame.setVisible(true);
+                desktopPane.add(internalFrame);
+
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.getContentPane().setLayout(new BorderLayout());
+                frame.getContentPane().add(desktopPane, "Center");
+                frame.setSize(500, 500);
+                frame.setLocationRelativeTo(null);
+                frame.setVisible(true);
+                frame.toFront();
+            }
+        });
+    }
+
+    private static void getImageIconBufferedImage() throws Exception {
+        Point point = internalFrame.getLocationOnScreen();
+        Rectangle rect = internalFrame.getBounds();
+        Rectangle captureRect = new Rectangle(
+                point.x + internalFrame.getInsets().left,
+                point.y,
+                rect.width,
+                internalFrame.getInsets().top);
+        imageIconImage
+                = robot.createScreenCapture(captureRect);
+    }
+
+    private static void getIconBufferedImage() throws Exception {
+        Point point = internalFrame.getLocationOnScreen();
+        Rectangle rect = internalFrame.getBounds();
+        Rectangle captureRect = new Rectangle(
+                point.x + internalFrame.getInsets().left,
+                point.y,
+                rect.width,
+                internalFrame.getInsets().top);
+        iconImage
+                = robot.createScreenCapture(captureRect);
+    }
+
+    private static void testIfSame() throws Exception {
+        if (!bufferedImagesEqual(imageIconImage, iconImage)) {
+            System.err.println("ERROR: icon and imageIcon not same.");
+        } else {
+            System.out.println("SUCCESS: icon and imageIcon same.");
+        }
+    }
+
+    private static boolean bufferedImagesEqual(
+            BufferedImage bufferedImage1, BufferedImage bufferedImage2) {
+        boolean flag = true;
+
+        if (bufferedImage1.getWidth() == bufferedImage2.getWidth()
+                && bufferedImage1.getHeight() == bufferedImage2.getHeight()) {
+            final int colorTolerance = 25;
+            final int mismatchTolerance = (int) (0.1
+                    * bufferedImage1.getWidth() * bufferedImage1.getHeight());
+            int mismatchCounter = 0;
+            for (int x = 0; x < bufferedImage1.getWidth(); x++) {
+                for (int y = 0; y < bufferedImage1.getHeight(); y++) {
+
+                    int color1 = bufferedImage1.getRGB(x, y);
+                    int red1 = (color1 >> 16) & 0x000000FF;
+                    int green1 = (color1 >> 8) & 0x000000FF;
+                    int blue1 = (color1) & 0x000000FF;
+
+                    int color2 = bufferedImage2.getRGB(x, y);
+                    int red2 = (color2 >> 16) & 0x000000FF;
+                    int green2 = (color2 >> 8) & 0x000000FF;
+                    int blue2 = (color2) & 0x000000FF;
+                    if (red1 != red2 || green1 != green2 || blue1 != blue2) {
+                        ++mismatchCounter;
+                        if ((Math.abs(red1 - red2) > colorTolerance)
+                                || (Math.abs(green1 - green2) > colorTolerance)
+                                || (Math.abs(blue1 - blue2) > colorTolerance)) {
+
+                            flag = false;
+                        }
+                    }
+                }
+            }
+            if (mismatchCounter > mismatchTolerance) {
+                flag = false;
+            }
+        } else {
+            System.err.println("ERROR: size is different");
+            flag = false;
+        }
+        return flag;
+    }
+
+    private static void cleanUp() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                frame.dispose();
+            }
+        });
+    }
+
+    private static boolean tryLookAndFeel(String lookAndFeelString)
+            throws Exception {
+        try {
+            UIManager.setLookAndFeel(
+                    lookAndFeelString);
+
+        } catch (UnsupportedLookAndFeelException
+                | ClassNotFoundException
+                | InstantiationException
+                | IllegalAccessException e) {
+            return false;
+        }
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JInternalFrame/NormalBoundsTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ @test
+ @bug 7126823
+ @summary Verify NormalBounds upon iconify/deiconify sequence
+ @run main NormalBoundsTest
+ */
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import java.beans.PropertyVetoException;
+import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.WindowConstants;
+
+public class NormalBoundsTest {
+
+    private static JFrame mainFrame;
+    private static JInternalFrame internalFrame;
+    private static Rectangle bounds;
+
+    private static void createUI(String lookAndFeelString) {
+        internalFrame = new JInternalFrame("Internal", true, true, true, true);
+        internalFrame.setDefaultCloseOperation(
+                WindowConstants.DO_NOTHING_ON_CLOSE);
+        internalFrame.setSize(200, 200);
+
+        JDesktopPane desktopPane = new JDesktopPane();
+        desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
+        desktopPane.add(internalFrame);
+
+        mainFrame = new JFrame(lookAndFeelString);
+        mainFrame.setSize(640, 480);
+        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        mainFrame.setContentPane(desktopPane);
+
+        mainFrame.setVisible(true);
+        internalFrame.setVisible(true);
+
+    }
+
+    private static int signWOZero(int i) {
+        return (i > 0) ? 1 : -1;
+    }
+
+    private static void mouseMove(Robot robot, Point startPt, Point endPt) {
+        int dx = endPt.x - startPt.x;
+        int dy = endPt.y - startPt.y;
+
+        int ax = Math.abs(dx) * 2;
+        int ay = Math.abs(dy) * 2;
+
+        int sx = signWOZero(dx);
+        int sy = signWOZero(dy);
+
+        int x = startPt.x;
+        int y = startPt.y;
+
+        int d = 0;
+
+        if (ax > ay) {
+            d = ay - ax / 2;
+            while (true) {
+                robot.mouseMove(x, y);
+                robot.delay(50);
+
+                if (x == endPt.x) {
+                    return;
+                }
+                if (d >= 0) {
+                    y = y + sy;
+                    d = d - ax;
+                }
+                x = x + sx;
+                d = d + ay;
+            }
+        } else {
+            d = ax - ay / 2;
+            while (true) {
+                robot.mouseMove(x, y);
+                robot.delay(50);
+
+                if (y == endPt.y) {
+                    return;
+                }
+                if (d >= 0) {
+                    x = x + sx;
+                    d = d - ay;
+                }
+                y = y + sy;
+                d = d + ax;
+            }
+        }
+    }
+
+    private static void drag(Robot r, Point startPt, Point endPt, int button) {
+        if (!(button == InputEvent.BUTTON1_MASK
+                || button == InputEvent.BUTTON2_MASK
+                || button == InputEvent.BUTTON3_MASK)) {
+            throw new IllegalArgumentException("invalid mouse button");
+        }
+
+        r.mouseMove(startPt.x, startPt.y);
+        r.mousePress(button);
+        try {
+            mouseMove(r, startPt, endPt);
+        } finally {
+            r.mouseRelease(button);
+        }
+    }
+
+    private static boolean tryLookAndFeel(String lookAndFeelString) {
+        try {
+            UIManager.setLookAndFeel(lookAndFeelString);
+            return true;
+        } catch (UnsupportedLookAndFeelException | ClassNotFoundException |
+                InstantiationException | IllegalAccessException e) {
+            return false;
+        }
+    }
+
+    public static void executeTest(Robot robot) throws Exception {
+
+        // Iconize JInternalFrame
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    internalFrame.setIcon(true);
+                } catch (PropertyVetoException ex) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Iconize InternalFrame Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        // Deiconize JInternalFrame
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    internalFrame.setIcon(false);
+                } catch (PropertyVetoException ex) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Deiconize InternalFrame"
+                            + " Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                Point loc = internalFrame.getLocationOnScreen();
+                // Drag Frame
+                drag(robot,
+                        new Point((int) loc.x + 80, (int) loc.y + 12),
+                        new Point((int) loc.x + 100, (int) loc.y + 40),
+                        InputEvent.BUTTON1_MASK);
+            }
+        });
+        robot.waitForIdle();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                bounds = internalFrame.getBounds();
+                if (!internalFrame.getNormalBounds().equals(bounds)) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Invalid NormalBounds");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        // Regression Test Bug ID: 4424247
+        // Maximize JInternalFrame
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    internalFrame.setMaximum(true);
+                } catch (PropertyVetoException ex) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Maximize InternalFrame Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        // Iconize JInternalFrame
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    internalFrame.setIcon(true);
+                } catch (PropertyVetoException ex) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Iconize InternalFrame Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        // DeIconize JInternalFrame
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    internalFrame.setIcon(false);
+                } catch (PropertyVetoException ex) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("DeIcoize InternalFrame "
+                            + " Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        // Restore/Undo Maximize JInternalFrame
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    internalFrame.setMaximum(false);
+                } catch (PropertyVetoException ex) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Restore InternalFrame "
+                            + " Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                if (!internalFrame.getBounds().equals(bounds)) {
+                    mainFrame.dispose();
+                    throw new RuntimeException("Regression Test Failed");
+                }
+            }
+        });
+        robot.waitForIdle();
+
+        mainFrame.dispose();
+    }
+
+    public static void main(String[] args) throws Exception {
+        Robot robot = new Robot();
+        UIManager.LookAndFeelInfo[] lookAndFeelArray
+                = UIManager.getInstalledLookAndFeels();
+        for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+            String lookAndFeelString = lookAndFeelItem.getClassName();
+            if (tryLookAndFeel(lookAndFeelString)) {
+                // create UI
+                SwingUtilities.invokeAndWait(new Runnable() {
+                    @Override
+                    public void run() {
+                        createUI(lookAndFeelString);
+                    }
+                });
+
+                robot.waitForIdle();
+                executeTest(robot);
+            } else {
+                throw new RuntimeException("Setting Look and Feel Failed");
+            }
+        }
+
+    }
+}
--- a/test/javax/swing/JScrollPane/8033000/bug8033000.java	Fri Mar 11 18:35:26 2016 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-import java.awt.BorderLayout;
-import java.awt.Point;
-import java.awt.Robot;
-import java.awt.event.KeyEvent;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
-import jdk.testlibrary.OSInfo;
-
-/**
- * @test
- * @bug 8033000
- * @author Alexander Scherbatiy
- * @summary No Horizontal Mouse Wheel Support In BasicScrollPaneUI
- * @library ../../../../lib/testlibrary
- * @build jdk.testlibrary.OSInfo
- * @run main bug8033000
- */
-public class bug8033000 {
-
-    private static JScrollPane scrollPane;
-    private static JTextArea textArea;
-    private static Point point;
-    private static final int delta;
-
-    static {
-        delta = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ? -30 : 30;
-    }
-
-    public static void main(String[] args) throws Exception {
-
-        Robot robot = new Robot();
-        robot.setAutoDelay(50);
-
-        SwingUtilities.invokeAndWait(bug8033000::createAndShowGUI);
-        robot.waitForIdle();
-
-        SwingUtilities.invokeAndWait(() -> {
-            Point locationOnScreen = scrollPane.getLocationOnScreen();
-            point = new Point(
-                    locationOnScreen.x + scrollPane.getWidth() / 2,
-                    locationOnScreen.y + scrollPane.getHeight() / 2);
-        });
-
-        robot.mouseMove(point.x, point.y);
-        robot.waitForIdle();
-
-        // vertical scroll bar is enabled
-        initScrollPane(true, false);
-        robot.waitForIdle();
-        robot.mouseWheel(delta);
-        robot.waitForIdle();
-        checkScrollPane(true);
-
-        // vertical scroll bar is enabled + shift
-        initScrollPane(true, false);
-        robot.waitForIdle();
-        robot.keyPress(KeyEvent.VK_SHIFT);
-        robot.mouseWheel(delta);
-        robot.keyRelease(KeyEvent.VK_SHIFT);
-        robot.waitForIdle();
-        checkScrollPane(true);
-
-        // horizontal scroll bar is enabled
-        initScrollPane(false, true);
-        robot.waitForIdle();
-        robot.mouseWheel(delta);
-        robot.waitForIdle();
-        checkScrollPane(false);
-
-        // horizontal scroll bar is enabled + shift
-        initScrollPane(false, true);
-        robot.waitForIdle();
-        robot.keyPress(KeyEvent.VK_SHIFT);
-        robot.mouseWheel(delta);
-        robot.keyRelease(KeyEvent.VK_SHIFT);
-        robot.waitForIdle();
-        checkScrollPane(false);
-
-        // both scroll bars are enabled
-        initScrollPane(true, true);
-        robot.waitForIdle();
-        robot.mouseWheel(delta);
-        robot.waitForIdle();
-        checkScrollPane(true);
-
-        // both scroll bars are enabled + shift
-        initScrollPane(true, true);
-        robot.waitForIdle();
-        robot.keyPress(KeyEvent.VK_SHIFT);
-        robot.mouseWheel(delta);
-        robot.keyRelease(KeyEvent.VK_SHIFT);
-        robot.waitForIdle();
-        checkScrollPane(false);
-    }
-
-    static void initScrollPane(boolean vVisible, boolean hVisible) throws Exception {
-        SwingUtilities.invokeAndWait(() -> {
-            scrollPane.getVerticalScrollBar().setValue(0);
-            scrollPane.getHorizontalScrollBar().setValue(0);
-
-            textArea.setRows(vVisible ? 100 : 1);
-            textArea.setColumns(hVisible ? 100 : 1);
-            scrollPane.getVerticalScrollBar().setVisible(vVisible);
-            scrollPane.getHorizontalScrollBar().setVisible(hVisible);
-        });
-    }
-
-    static void checkScrollPane(boolean verticalScrolled) throws Exception {
-        SwingUtilities.invokeAndWait(() -> {
-
-            if (verticalScrolled) {
-                if (scrollPane.getVerticalScrollBar().getValue() == 0
-                        || scrollPane.getHorizontalScrollBar().getValue() != 0) {
-                    throw new RuntimeException("Wrong vertical scrolling!");
-                }
-            } else {
-                if (scrollPane.getVerticalScrollBar().getValue() != 0
-                        || scrollPane.getHorizontalScrollBar().getValue() == 0) {
-                    throw new RuntimeException("Wrong horizontal scrolling!");
-                }
-            }
-        });
-    }
-
-    static void createAndShowGUI() {
-        JFrame frame = new JFrame();
-        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-        frame.setSize(300, 300);
-        textArea = new JTextArea("Hello World!");
-        scrollPane = new JScrollPane(textArea);
-        JPanel panel = new JPanel(new BorderLayout());
-        panel.add(scrollPane, BorderLayout.CENTER);
-        frame.getContentPane().add(panel);
-        frame.setVisible(true);
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JScrollPane/HorizontalMouseWheelOnShiftPressed/HorizontalMouseWheelOnShiftPressed.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+import jdk.testlibrary.OSInfo;
+
+/**
+ * @test
+ * @bug 8033000 8147994
+ * @author Alexander Scherbatiy
+ * @summary No Horizontal Mouse Wheel Support In BasicScrollPaneUI
+ * @library ../../../../lib/testlibrary
+ * @build jdk.testlibrary.OSInfo
+ * @run main HorizontalMouseWheelOnShiftPressed
+ */
+public class HorizontalMouseWheelOnShiftPressed {
+
+    private static JScrollPane scrollPane;
+    private static JTextArea textArea;
+    private static Point point;
+    private static final int delta;
+    private static JFrame frame;
+
+    static {
+        delta = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ? -30 : 30;
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        Robot robot = new Robot();
+        robot.setAutoDelay(50);
+
+        SwingUtilities.invokeAndWait(
+                HorizontalMouseWheelOnShiftPressed::createAndShowGUI);
+        robot.waitForIdle();
+        try {
+            test(robot);
+        } finally {
+            frame.dispose();
+        }
+    }
+
+    private static void test(Robot robot) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            Point locationOnScreen = scrollPane.getLocationOnScreen();
+            point = new Point(
+                    locationOnScreen.x + scrollPane.getWidth() / 2,
+                    locationOnScreen.y + scrollPane.getHeight() / 2);
+        });
+
+        robot.mouseMove(point.x, point.y);
+        robot.waitForIdle();
+
+        // vertical scroll bar is enabled
+        initScrollPane(true, false);
+        robot.waitForIdle();
+        robot.mouseWheel(delta);
+        robot.waitForIdle();
+        checkScrollPane(true, false);
+
+        // vertical scroll bar is enabled + shift
+        initScrollPane(true, false);
+        robot.waitForIdle();
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.mouseWheel(delta);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.waitForIdle();
+        checkScrollPane(false, false);
+
+        // horizontal scroll bar is enabled
+        initScrollPane(false, true);
+        robot.waitForIdle();
+        robot.mouseWheel(delta);
+        robot.waitForIdle();
+        checkScrollPane(false, true);
+
+        // horizontal scroll bar is enabled + shift
+        initScrollPane(false, true);
+        robot.waitForIdle();
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.mouseWheel(delta);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.waitForIdle();
+        checkScrollPane(false, true);
+
+        // both scroll bars are enabled
+        initScrollPane(true, true);
+        robot.waitForIdle();
+        robot.mouseWheel(delta);
+        robot.waitForIdle();
+        checkScrollPane(true, false);
+
+        // both scroll bars are enabled + shift
+        initScrollPane(true, true);
+        robot.waitForIdle();
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.mouseWheel(delta);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.waitForIdle();
+        checkScrollPane(false, true);
+    }
+
+    static void initScrollPane(boolean vVisible, boolean hVisible) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            scrollPane.getVerticalScrollBar().setValue(0);
+            scrollPane.getHorizontalScrollBar().setValue(0);
+
+            textArea.setRows(vVisible ? 100 : 1);
+            textArea.setColumns(hVisible ? 100 : 1);
+            scrollPane.getVerticalScrollBar().setVisible(vVisible);
+            scrollPane.getHorizontalScrollBar().setVisible(hVisible);
+        });
+    }
+
+    static void checkScrollPane(boolean verticalScrolled,
+                                boolean horizontalScrolled) throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+
+            if (verticalScrolled) {
+                if (scrollPane.getVerticalScrollBar().getValue() == 0) {
+                    throw new RuntimeException("Wrong vertical scrolling!");
+                }
+            } else{
+                if (scrollPane.getVerticalScrollBar().getValue() != 0) {
+                    throw new RuntimeException("Wrong vertical scrolling!");
+                }
+            }
+            if (horizontalScrolled) {
+                if (scrollPane.getHorizontalScrollBar().getValue() == 0) {
+                    throw new RuntimeException("Wrong horizontal scrolling!");
+                }
+            } else {
+                if (scrollPane.getHorizontalScrollBar().getValue() != 0) {
+                    throw new RuntimeException("Wrong horizontal scrolling!");
+                }
+            }
+        });
+    }
+
+    static void createAndShowGUI() {
+        frame = new JFrame();
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setSize(300, 300);
+        frame.setLocationRelativeTo(null);
+        textArea = new JTextArea("Hello World!");
+        scrollPane = new JScrollPane(textArea);
+        JPanel panel = new JPanel(new BorderLayout());
+        panel.add(scrollPane, BorderLayout.CENTER);
+        frame.getContentPane().add(panel);
+        frame.setVisible(true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/swing/JTableHeader/8020039/TableHeaderRendererExceptionTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.UIManager;
+import javax.swing.table.JTableHeader;
+
+/**
+ * @test
+ * @summary Tests whether getTableCellRendererComponent() method handles
+ *          null table parameter
+ * @bug 8020039
+ * @run main TableHeaderRendererExceptionTest
+ */
+public class TableHeaderRendererExceptionTest {
+
+    public static void main(String[] args) throws Throwable {
+        //Execute test for all supported look and feels
+        UIManager.LookAndFeelInfo[] lookAndFeelArray
+                = UIManager.getInstalledLookAndFeels();
+
+        for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+            String lookAndFeelString = lookAndFeelItem.getClassName();
+
+            UIManager.setLookAndFeel(lookAndFeelString);
+
+            // Test getTableCellRendererComponent method by passing null table
+            JTableHeader header = new JTableHeader();
+
+            header.getDefaultRenderer().getTableCellRendererComponent(null,
+                    " test ", true, true, -1, 0);
+        }
+    }
+}
--- a/test/javax/swing/plaf/gtk/crash/RenderBadPictureCrash.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/test/javax/swing/plaf/gtk/crash/RenderBadPictureCrash.java	Fri Mar 11 09:16:55 2016 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,16 +23,15 @@
 
 /*
  @test
- @bug 8056151
+ @bug 8056151 8131751
  @summary Switching to GTK L&F on-the-fly leads to X Window System error RenderBadPicture
  @run main/othervm -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel -Dsun.java2d.xrender=T RenderBadPictureCrash
  */
-
 import java.awt.Color;
+import java.awt.GraphicsDevice;
 import java.lang.reflect.InvocationTargetException;
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
-
 import javax.swing.UIManager;
 
 public class RenderBadPictureCrash {
@@ -41,7 +40,10 @@
         SwingUtilities.invokeAndWait(() -> {
             JFrame f = new JFrame();
             f.setUndecorated(true);
-            f.setBackground(new Color(0, 0, 0, 0));
+            GraphicsDevice gd = f.getGraphicsConfiguration().getDevice();
+            if (gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)) {
+                f.setBackground(new Color(0, 0, 0, 0));
+            }
             f.setSize(200, 300);
             f.setVisible(true);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/java2d/marlin/CrashNaNTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Path2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import static java.lang.Double.NaN;
+import java.util.Locale;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+import javax.imageio.ImageIO;
+
+/**
+ * @test
+ * @bug 8149338
+ * @summary Verifies that Marlin supports NaN coordinates and no JVM crash happens !
+ * @run main CrashNaNTest
+ */
+public class CrashNaNTest {
+
+    static final boolean SAVE_IMAGE = false;
+
+    public static void main(String argv[]) {
+        Locale.setDefault(Locale.US);
+
+        // initialize j.u.l Looger:
+        final Logger log = Logger.getLogger("sun.java2d.marlin");
+        log.addHandler(new Handler() {
+            @Override
+            public void publish(LogRecord record) {
+                Throwable th = record.getThrown();
+                // detect any Throwable:
+                if (th != null) {
+                    System.out.println("Test failed:\n" + record.getMessage());
+                    th.printStackTrace(System.out);
+
+                    throw new RuntimeException("Test failed: ", th);
+                }
+            }
+
+            @Override
+            public void flush() {
+            }
+
+            @Override
+            public void close() throws SecurityException {
+            }
+        });
+
+        // enable Marlin logging & internal checks:
+        System.setProperty("sun.java2d.renderer.log", "true");
+        System.setProperty("sun.java2d.renderer.useLogger", "true");
+        System.setProperty("sun.java2d.renderer.doChecks", "true");
+
+        final int width = 400;
+        final int height = 400;
+
+        final BufferedImage image = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_ARGB);
+
+        final Graphics2D g2d = (Graphics2D) image.getGraphics();
+        try {
+            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                    RenderingHints.VALUE_ANTIALIAS_ON);
+
+            g2d.setBackground(Color.WHITE);
+            g2d.clearRect(0, 0, width, height);
+
+            final Path2D.Double path = new Path2D.Double();
+            path.moveTo(30, 30);
+            path.lineTo(100, 100);
+
+            for (int i = 0; i < 20000; i++) {
+                path.lineTo(110 + 0.01 * i, 110);
+                path.lineTo(111 + 0.01 * i, 100);
+            }
+
+            path.lineTo(NaN, 200);
+            path.lineTo(200, 200);
+            path.lineTo(200, NaN);
+            path.lineTo(300, 300);
+            path.lineTo(NaN, NaN);
+            path.lineTo(100, 100);
+            path.closePath();
+
+            final Path2D.Double path2 = new Path2D.Double();
+            path2.moveTo(0,0);
+            path2.lineTo(width,height);
+            path2.lineTo(10, 10);
+            path2.closePath();
+
+            for (int i = 0; i < 1; i++) {
+                final long start = System.nanoTime();
+                g2d.setColor(Color.BLUE);
+                g2d.fill(path);
+
+                g2d.fill(path2);
+
+                final long time = System.nanoTime() - start;
+                System.out.println("paint: duration= " + (1e-6 * time) + " ms.");
+            }
+
+            if (SAVE_IMAGE) {
+                try {
+                    final File file = new File("CrashNaNTest.png");
+                    System.out.println("Writing file: "
+                            + file.getAbsolutePath());
+                    ImageIO.write(image, "PNG", file);
+                } catch (IOException ex) {
+                    System.out.println("Writing file failure:");
+                    ex.printStackTrace();
+                }
+            }
+        } finally {
+            g2d.dispose();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sun/java2d/marlin/CrashPaintTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.PaintContext;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.TexturePaint;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.Raster;
+import java.io.File;
+import java.io.IOException;
+import java.util.Locale;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+import javax.imageio.ImageIO;
+
+/**
+ * @test
+ * @bug 8148886
+ * @summary Verifies that Marlin supports reentrant operations (ThreadLocal)
+ * like in custom Paint or custom Composite
+ * @run main CrashPaintTest
+ */
+public class CrashPaintTest {
+
+    static final boolean SAVE_IMAGE = false;
+
+    public static void main(String argv[]) {
+        Locale.setDefault(Locale.US);
+
+        // initialize j.u.l Looger:
+        final Logger log = Logger.getLogger("sun.java2d.marlin");
+        log.addHandler(new Handler() {
+            @Override
+            public void publish(LogRecord record) {
+                Throwable th = record.getThrown();
+                // detect any Throwable:
+                if (th != null) {
+                    System.out.println("Test failed:\n" + record.getMessage());
+                    th.printStackTrace(System.out);
+
+                    throw new RuntimeException("Test failed: ", th);
+                }
+            }
+
+            @Override
+            public void flush() {
+            }
+
+            @Override
+            public void close() throws SecurityException {
+            }
+        });
+
+        // enable Marlin logging & internal checks:
+        System.setProperty("sun.java2d.renderer.log", "true");
+        System.setProperty("sun.java2d.renderer.useLogger", "true");
+        System.setProperty("sun.java2d.renderer.doChecks", "true");
+
+        // Force using thread-local storage:
+        System.setProperty("sun.java2d.renderer.useThreadLocal", "true");
+        // Force smaller pixelsize to force using array caches:
+        System.setProperty("sun.java2d.renderer.pixelsize", "256");
+
+        final int width = 300;
+        final int height = 300;
+
+        final BufferedImage image = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_ARGB);
+
+        final Graphics2D g2d = (Graphics2D) image.getGraphics();
+        try {
+            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                    RenderingHints.VALUE_ANTIALIAS_ON);
+
+            g2d.setBackground(Color.WHITE);
+            g2d.clearRect(0, 0, width, height);
+
+            final Ellipse2D.Double ellipse
+                = new Ellipse2D.Double(0, 0, width, height);
+
+            final Paint paint = new CustomPaint(100);
+
+            for (int i = 0; i < 20; i++) {
+                final long start = System.nanoTime();
+                g2d.setPaint(paint);
+                g2d.fill(ellipse);
+
+                g2d.setColor(Color.GREEN);
+                g2d.draw(ellipse);
+
+                final long time = System.nanoTime() - start;
+                System.out.println("paint: duration= " + (1e-6 * time) + " ms.");
+            }
+
+            if (SAVE_IMAGE) {
+                try {
+                    final File file = new File("CrashPaintTest.png");
+                    System.out.println("Writing file: "
+                            + file.getAbsolutePath());
+                    ImageIO.write(image, "PNG", file);
+                } catch (IOException ex) {
+                    System.out.println("Writing file failure:");
+                    ex.printStackTrace();
+                }
+            }
+
+            // Check image on few pixels:
+            final Raster raster = image.getData();
+
+            // 170, 175 = blue
+            checkPixel(raster, 170, 175, Color.BLUE.getRGB());
+            // 50, 50 = blue
+            checkPixel(raster, 50, 50, Color.BLUE.getRGB());
+
+            // 190, 110 = pink
+            checkPixel(raster, 190, 110, Color.PINK.getRGB());
+            // 280, 210 = pink
+            checkPixel(raster, 280, 210, Color.PINK.getRGB());
+
+        } finally {
+            g2d.dispose();
+        }
+    }
+
+    private static void checkPixel(final Raster raster,
+                                   final int x, final int y,
+                                   final int expected) {
+
+        final int[] rgb = (int[]) raster.getDataElements(x, y, null);
+
+        if (rgb[0] != expected) {
+            throw new IllegalStateException("bad pixel at (" + x + ", " + y
+                + ") = " + rgb[0] + " expected: " + expected);
+        }
+    }
+
+    private static class CustomPaint extends TexturePaint {
+        private int size;
+
+        CustomPaint(final int size) {
+            super(new BufferedImage(size, size,
+                    BufferedImage.TYPE_INT_ARGB),
+                    new Rectangle2D.Double(0, 0, size, size)
+            );
+            this.size = size;
+        }
+
+        @Override
+        public PaintContext createContext(ColorModel cm,
+                                          Rectangle deviceBounds,
+                                          Rectangle2D userBounds,
+                                          AffineTransform at,
+                                          RenderingHints hints) {
+
+            // Fill bufferedImage using
+            final Graphics2D g2d = (Graphics2D) getImage().getGraphics();
+            try {
+                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                        RenderingHints.VALUE_ANTIALIAS_ON);
+                g2d.setBackground(Color.PINK);
+                g2d.clearRect(0, 0, size, size);
+
+                g2d.setColor(Color.BLUE);
+                g2d.drawRect(0, 0, size, size);
+
+                g2d.fillOval(size / 10, size / 10,
+                             size * 8 / 10, size * 8 / 10);
+
+            } finally {
+                g2d.dispose();
+            }
+
+            return super.createContext(cm, deviceBounds, userBounds, at, hints);
+        }
+    }
+}
--- a/test/sun/java2d/marlin/TextClipErrorTest.java	Fri Mar 11 18:35:26 2016 +0530
+++ b/test/sun/java2d/marlin/TextClipErrorTest.java	Fri Mar 11 09:16:55 2016 -0800
@@ -69,24 +69,12 @@
             @Override
             public void publish(LogRecord record) {
                 Throwable th = record.getThrown();
-                // detect potential Throwable thrown by XxxArrayCache.check():
-                if (th != null && th.getClass() == Throwable.class) {
-                    StackTraceElement[] stackElements = th.getStackTrace();
+                // detect any Throwable:
+                if (th != null) {
+                    System.out.println("Test failed:\n" + record.getMessage());
+                    th.printStackTrace(System.out);
 
-                    for (int i = 0; i < stackElements.length; i++) {
-                        StackTraceElement e = stackElements[i];
-
-                        if (e.getClassName().startsWith("sun.java2d.marlin")
-                            && e.getClassName().contains("ArrayCache")
-                            && "check".equals(e.getMethodName()))
-                        {
-                            System.out.println("Test failed:\n"
-                                + record.getMessage());
-                            th.printStackTrace(System.out);
-
-                            throw new RuntimeException("Test failed: ", th);
-                        }
-                    }
+                    throw new RuntimeException("Test failed: ", th);
                 }
             }