changeset 215:84fdd208a6cd

8133533: Latest DIO spec merge Summary: No code/sygnatures changes, description updates only Reviewed-by: alkonsta
author snazarki
date Thu, 13 Aug 2015 12:59:51 +0300
parents 63f9b3b2d14b
children 8a3ef39ecad5
files src/share/classes/jdk/dio/Device.java src/share/classes/jdk/dio/DeviceAlreadyExistsException.java src/share/classes/jdk/dio/DeviceConfig.java src/share/classes/jdk/dio/DeviceEvent.java src/share/classes/jdk/dio/DeviceException.java src/share/classes/jdk/dio/DeviceManager.java src/share/classes/jdk/dio/DeviceMgmtPermission.java src/share/classes/jdk/dio/DeviceNotFoundException.java src/share/classes/jdk/dio/DevicePermission.java src/share/classes/jdk/dio/InvalidDeviceConfigException.java src/share/classes/jdk/dio/RegistrationEvent.java src/share/classes/jdk/dio/UnavailableDeviceException.java src/share/classes/jdk/dio/UnsupportedAccessModeException.java src/share/classes/jdk/dio/UnsupportedByteOrderException.java src/share/classes/jdk/dio/UnsupportedDeviceTypeException.java src/share/classes/jdk/dio/adc/ADCChannel.java src/share/classes/jdk/dio/adc/ADCChannelConfig.java src/share/classes/jdk/dio/adc/ADCPermission.java src/share/classes/jdk/dio/adc/InvalidInputSamplingRateException.java src/share/classes/jdk/dio/adc/MonitoringEvent.java src/share/classes/jdk/dio/adc/MonitoringListener.java src/share/classes/jdk/dio/adc/package-info.java src/share/classes/jdk/dio/atcmd/ATDevice.java src/share/classes/jdk/dio/atcmd/ATDeviceConfig.java src/share/classes/jdk/dio/atcmd/ATPermission.java src/share/classes/jdk/dio/atcmd/CommandResponseHandler.java src/share/classes/jdk/dio/atcmd/DataConnection.java src/share/classes/jdk/dio/atcmd/DataConnectionHandler.java src/share/classes/jdk/dio/atcmd/UnsolicitedResponseHandler.java src/share/classes/jdk/dio/atcmd/package-info.java src/share/classes/jdk/dio/counter/CounterPermission.java src/share/classes/jdk/dio/counter/CountingEvent.java src/share/classes/jdk/dio/counter/CountingListener.java src/share/classes/jdk/dio/counter/PulseCounter.java src/share/classes/jdk/dio/counter/PulseCounterConfig.java src/share/classes/jdk/dio/counter/package-info.java src/share/classes/jdk/dio/dac/DACChannel.java src/share/classes/jdk/dio/dac/DACChannelConfig.java src/share/classes/jdk/dio/dac/DACPermission.java src/share/classes/jdk/dio/dac/GenerationRoundListener.java src/share/classes/jdk/dio/dac/InvalidOutputSamplingRateException.java src/share/classes/jdk/dio/dac/package-info.java src/share/classes/jdk/dio/generic/GenericBufferIODevice.java src/share/classes/jdk/dio/generic/GenericDevice.java src/share/classes/jdk/dio/generic/GenericDeviceConfig.java src/share/classes/jdk/dio/generic/GenericEvent.java src/share/classes/jdk/dio/generic/GenericEventListener.java src/share/classes/jdk/dio/generic/GenericPermission.java src/share/classes/jdk/dio/generic/package-info.java src/share/classes/jdk/dio/gpio/GPIOPin.java src/share/classes/jdk/dio/gpio/GPIOPinConfig.java src/share/classes/jdk/dio/gpio/GPIOPinPermission.java src/share/classes/jdk/dio/gpio/GPIOPort.java src/share/classes/jdk/dio/gpio/GPIOPortConfig.java src/share/classes/jdk/dio/gpio/GPIOPortPermission.java src/share/classes/jdk/dio/gpio/PinEvent.java src/share/classes/jdk/dio/gpio/PinListener.java src/share/classes/jdk/dio/gpio/PortEvent.java src/share/classes/jdk/dio/gpio/PortListener.java src/share/classes/jdk/dio/gpio/package-info.java src/share/classes/jdk/dio/i2cbus/I2CCombinedMessage.java src/share/classes/jdk/dio/i2cbus/I2CDevice.java src/share/classes/jdk/dio/i2cbus/I2CDeviceConfig.java src/share/classes/jdk/dio/i2cbus/I2CPermission.java src/share/classes/jdk/dio/i2cbus/package-info.java src/share/classes/jdk/dio/modem/ModemSignalEvent.java src/share/classes/jdk/dio/modem/ModemSignalsControl.java src/share/classes/jdk/dio/modem/package-info.java src/share/classes/jdk/dio/package-info.java src/share/classes/jdk/dio/power/PowerManaged.java src/share/classes/jdk/dio/power/PowerSavingHandler.java src/share/classes/jdk/dio/power/package-info.java src/share/classes/jdk/dio/pwm/GenerationEvent.java src/share/classes/jdk/dio/pwm/GenerationListener.java src/share/classes/jdk/dio/pwm/GenerationRoundListener.java src/share/classes/jdk/dio/pwm/InvalidPulseRateException.java src/share/classes/jdk/dio/pwm/PWMChannel.java src/share/classes/jdk/dio/pwm/PWMChannelConfig.java src/share/classes/jdk/dio/pwm/PWMPermission.java src/share/classes/jdk/dio/pwm/package-info.java src/share/classes/jdk/dio/spi/AbstractDevice.java src/share/classes/jdk/dio/spi/DeviceProvider.java src/share/classes/jdk/dio/spi/package-info.java src/share/classes/jdk/dio/spibus/InvalidWordLengthException.java src/share/classes/jdk/dio/spibus/SPICompositeMessage.java src/share/classes/jdk/dio/spibus/SPIDevice.java src/share/classes/jdk/dio/spibus/SPIDeviceConfig.java src/share/classes/jdk/dio/spibus/SPIPermission.java src/share/classes/jdk/dio/spibus/package-info.java src/share/classes/jdk/dio/uart/ModemUART.java src/share/classes/jdk/dio/uart/UART.java src/share/classes/jdk/dio/uart/UARTConfig.java src/share/classes/jdk/dio/uart/UARTEvent.java src/share/classes/jdk/dio/uart/UARTEventListener.java src/share/classes/jdk/dio/uart/UARTPermission.java src/share/classes/jdk/dio/uart/package-info.java src/share/classes/jdk/dio/watchdog/WatchdogTimer.java src/share/classes/jdk/dio/watchdog/WatchdogTimerConfig.java src/share/classes/jdk/dio/watchdog/WatchdogTimerPermission.java src/share/classes/jdk/dio/watchdog/WindowedWatchdogTimer.java src/share/classes/jdk/dio/watchdog/package-info.java
diffstat 101 files changed, 1875 insertions(+), 1234 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/jdk/dio/Device.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/Device.java	Thu Aug 13 12:59:51 2015 +0300
@@ -40,6 +40,7 @@
  * other form being accessed/used.
  * </p>
  * <h3><a name="byte_order">Device Byte Order</a></h3>
+ * <p>
  * Devices that perform multi-byte value I/O operations have a "native" byte order
  * (see {@link #getByteOrder getByteOrder}).
  * Passing to such a device a buffer with a byte order different from its native
@@ -47,7 +48,26 @@
  * re-ordering may have an impact on performance, memory consumption and I/O throughput.
  * On resource-constrained platforms a device driver may throw an {@link UnsupportedByteOrderException} when a
  * byte re-ordering may induce a detrimental loss of quality or performance.
- *
+ * </p>
+ * <h3><a name="locking">Platform Dependencies of the Locking Facility</a></h3>
+ * <p>
+ * The {@link #tryLock tryLock} and {@link #unlock unlock} methods are primarily
+ * intended to prevents other concurrently-running Java applications and threads
+ * from accessing a device locked for exclusive access, provided the device is
+ * accessed through this API. The {@code tryLock} and {@code unlock} methods may
+ * not necessarily map directly to any native locking facility of the underlying
+ * operating system. Thus a lock held on a device may not necessarily be
+ * visible to all programs that have access to the device, regardless of the
+ * language in which those programs are written. Whether or not a lock acquire
+ * through this API actually prevents another program from accessing a locked
+ * device is implementation-dependent as well as system-dependent and therefore
+ * unspecified. A compliant implementation of this specification MUST nevertheless ensure
+ * that a lock held on a device accessed through this API is visible to other
+ * threads running in the same instance of the Java virtual machine (JVM) as
+ * well to other Java applications concurrently running in different instances
+ * of that same JVM.
+ * </p>
+  *
  * @param <P>
  *            the device type the descriptor is defined for.
  * @since 1.0
@@ -69,7 +89,7 @@
     int MIXED_ENDIAN = 2;
 
     /**
-     * Attempts to lock for (platform-wide) exclusive access the underlying device
+     * Attempts to lock for exclusive access the underlying device
      * resource. This method will block until the designated device resource becomes
      * available for exclusive access by this {@code Device} instance or the specified amount of
      * real time has elapsed. A {@code timeout} of {@code 0} means to wait forever.
@@ -118,7 +138,7 @@
     boolean isOpen();
 
     /**
-     * Releases from (platform-wide) exclusive access the underlying device resource.
+     * Releases from exclusive access the underlying device resource.
      * <p>
      * This method returns silently if the underlying device resource is either open in
      * exclusive access mode or is not currently acquired for exclusive access (locked) or has
--- a/src/share/classes/jdk/dio/DeviceAlreadyExistsException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceAlreadyExistsException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -47,7 +47,7 @@
      * {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public DeviceAlreadyExistsException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/DeviceConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -33,6 +33,7 @@
  * <p>
  * A device's configuration consists of the following elements:
  * </p>
+ * <blockquote>
  * <dl>
  * <dt><b>Hardware Addressing Information</b></dt>
  * <dd>Information required to address the device. Examples are an I2C bus
@@ -55,6 +56,7 @@
  * {@code DeviceConfig} object of that device, which retains its initial values.
  * </dd>
  * </dl>
+ * </blockquote>
  * The {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} can be used to open a device and obtain
@@ -131,17 +133,17 @@
  * </blockquote>
  * <h3><a name="default_unassigned">Unassigned, Default or Unused Parameter Values</a></h3>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} (or {@code null}) when opening or registering a
+ * set to {@link #UNASSIGNED UNASSIGNED} (or {@code null}) when opening or registering a
  * device configuration. Device drivers may substitute hardware addressing parameters
  * and static and dynamic configuration parameters
- * set to {@link #UNASSIGNED} (or {@code null}) with actual default values;
+ * set to {@link #UNASSIGNED UNASSIGNED} (or {@code null}) with actual default values;
  * whether such default settings are supported is platform- as well as device driver-dependent;
- * if a required parameter is set to {@link #UNASSIGNED} (or {@code null}) the device driver
+ * if a required parameter is set to {@link #UNASSIGNED UNASSIGNED} (or {@code null}) the device driver
  * MUST reject the configuration and throw an {@link InvalidDeviceConfigException}.
  * When querying the configuration of an open device using the
  * {@link DeviceDescriptor#getConfiguration DeviceDescriptor.getConfiguration}
  * method the actual settings are returned; parameters that are neither supported
- * nor required by the underlying hardware or driver are still set to {@link #UNASSIGNED}
+ * nor required by the underlying hardware or driver are still set to {@link #UNASSIGNED UNASSIGNED}
  * (or {@code null}); whether or not this is the case when listing registered
  * device configuration using the {@link DeviceManager#list DeviceManager.list}
  * methods depends on whether the device could be probed upon registration
@@ -165,8 +167,9 @@
    * configuration parameter is requested upon opening or registering a device
    * configuration or to indicate that a configuration parameter is unassigned
    * (such as when it is not supported).
-   * @deprecated As of 1.1 replaced by {@link #UNASSIGNED}.
+   * @deprecated As of 1.1 replaced by {@link #UNASSIGNED UNASSIGNED}.
    */
+    @Deprecated
   int DEFAULT = -1;
   /**
    * Used to indicate that the default value of a hardware addressing or
@@ -179,11 +182,12 @@
   /**
    * The {@code HardwareAddressing} interface defines an abstraction of an
    * hardware addressing information common on different platforms.
-   * <p />
+   * <p>
    * When a device's {@code HardwareAddressing} contains both a specific controller number
    * (see {@link #getControllerNumber getControllerNumber}) and a specific controller name (see {@link #getControllerName getControllerName})
    * a compliant implementation of this specification MUST only use the controller number
    * for addressing the device and for permission checks.
+   * </p>
    *
    * @since 1.0
    */
@@ -194,7 +198,7 @@
      * Gets the controller number.
      *
      * @return the controller number (a positive or zero integer) or
-     * {@link #UNASSIGNED} if no specific value is requested or no actual value is
+     * {@link #UNASSIGNED UNASSIGNED} if no specific value is requested or no actual value is
      * assigned (see
      * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
      */
--- a/src/share/classes/jdk/dio/DeviceEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -50,7 +50,7 @@
      */
     protected long lastTimeStamp;
     /**
-     * The additional microseconds to the timestamp for when the last coalesced event occurred. If
+     * The additional microseconds (in the range {@code [0 - 999]}) to the timestamp for when the last coalesced event occurred. If
      * events were not coalesced then this is the same as that of the first event.
      * <p>
      * The actual last timestamp in microseconds is equal to: <i>(lastTimeStamp * 1000) +
@@ -68,7 +68,7 @@
      */
     protected long timeStamp;
     /**
-     * The additional microseconds to the timestamp for when this event (first) occurred. If events
+     * The additional microseconds (in the range {@code [0 - 999]}) to the timestamp for when this event (first) occurred. If events
      * were coalesced then this is that of the first event.
      * <p>
      * The actual timestamp in microseconds is equal to: <i>(timeStamp * 1000) +
@@ -82,7 +82,7 @@
      * may represent.
      *
      * @return the number of underlying coalesced hardware interrupts software signals this event
-     *         may represent.
+     *         may represent; {@code 1} if no coalescing occurred.
      */
     public final int getCount() {
         return count;
@@ -102,7 +102,7 @@
      * Returns the additional microseconds to the timestamp for when the last coalesced event
      * occurred. If events were not coalesced then this is the same as that of the first event.
      *
-     * @return the additional microseconds to the timestamp for when the last coalesced event
+     * @return the additional microseconds (in the range {@code [0 - 999]}) to the timestamp for when the last coalesced event
      *         occurred.
      */
     public final int getLastTimeStampMicros() {
@@ -133,7 +133,7 @@
      * Returns the additional microseconds to the timestamp for when this event (first) occurred. If
      * events were coalesced then the time is that of the first event.
      *
-     * @return the additional microseconds to the timestamp for when this event (first) occurred.
+     * @return the additional microseconds (in the range {@code [0 - 999]}) to the timestamp for when this event (first) occurred.
      */
     public final int getTimeStampMicros() {
         return timeStampMicros;
--- a/src/share/classes/jdk/dio/DeviceException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -48,7 +48,7 @@
      * {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public DeviceException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/DeviceManager.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceManager.java	Thu Aug 13 12:59:51 2015 +0300
@@ -106,11 +106,11 @@
  * for device determines that the device does not exist or is not addressable
  * or, that it does not support the requested configuration a
  * {@code DeviceNotFoundException} or respectively an
- * {@code InvalidDeviceConfigException} is thrown. If the underlying platform or
- * driver does not implement any probing facility then a {@code Device} instance
- * is returned; I/O operations on the device will later fail - typically with an
- * {@code IOException} - if the device does not exist or is not addressable or,
- * if it does not support the requested configuration.
+ * {@code InvalidDeviceConfigException} is thrown. When the underlying platform or
+ * driver does not implement any probing facility a {@code Device} instance
+ * is returned, but I/O operations on the device will later fail - typically with an
+ * {@code IOException} - if the device does not exist, is not addressable, or
+ * does not support the requested configuration.
  *
  * @see UnavailableDeviceException
  * @see DeviceMgmtPermission
@@ -665,6 +665,9 @@
      * it is open and initially set-up according to the matching configuration;
      * if the device is already open in a mode that is not compatible
      * with the requested mode the next matching registered device configuration is considered.
+     * <br>
+     * A provided {@code null} name matches all registered device names; an empty
+     * string name can only be matched by an empty string name or a by a {@code null} name.
      * <p>
      * The device is opened in the designated access mode. A device may be
      * opened in shared mode if supported by the underlying driver and hardware and if it is not
@@ -778,6 +781,9 @@
      * it is open and initially set-up according to the matching configuration;
      * if the device is already open (therefore <em>not available</em>)
      * the next matching registered device configuration is considered.
+     * <br>
+     * A provided {@code null} name matches all registered device names; an empty
+     * string name can only be matched by an empty string name or a by a {@code null} name.
      * <p>
      * The device is opened in exclusive access mode.
      * </p><p>
@@ -826,7 +832,7 @@
     }
 
     /**
-     * Registers under the specified ID (and optionally name and properties) a new device
+     * Registers under the specified ID and name (as well as optional properties) a new device
      * supporting the provided configuration. Upon successful registration all
      * {@link RegistrationListener} instances registered for the type of the registered device
      * are notified.
@@ -877,7 +883,7 @@
      * @param config
      *            the device configuration.
      * @param name
-     *            the name of the device to be registered; may be {@code null}.
+     *            the name of the device to be registered.
      * @param properties
      *            the list of properties/capabilities of the device to be registered; may be
      *            {@code null}.
@@ -894,7 +900,7 @@
      * @throws IOException
      *             if any other I/O error occurred.
      * @throws NullPointerException
-     *             if {@code intf} or {@code config} is {@code null}.
+     *             if {@code name}, {@code intf} or {@code config} is {@code null}.
      * @throws IllegalArgumentException
      *             if {@code id} is less than {@code 0} and is not equal to {@link #UNSPECIFIED_ID}.
      * @throws UnsupportedOperationException
@@ -1076,6 +1082,12 @@
         RegistrationEventHandler.removeListener(listener, intf);
     }
 
+    /**
+     * Prevents instantiation.
+     */
+    private DeviceManager() {}
+
+
     /* ------------------- Private API ---------------- */
 
     private static void checkID(int ID) throws IllegalArgumentException {
@@ -1215,4 +1227,3 @@
         );
     }
 }
-
--- a/src/share/classes/jdk/dio/DeviceMgmtPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceMgmtPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -44,6 +44,8 @@
  * <blockquote>
  * <code>{device-name-spec} [ ":"{device-id-spec} ]</code>
  * </blockquote>
+ * where <code>{device-name-spec}</code> and <code>{device-id-spec}</code> are defined as follows:
+ * <blockquote>
  * <dl>
  * <dt><code>{device-name-spec}</code></dt>
  * <dd>
@@ -76,10 +78,12 @@
  * The target name {@code "*:*"} matches all device names and all device IDs as is the target name {@code "*"}.
  * </dd>
  * </dl>
+ * </blockquote>
  * <p>
  * The actions to be granted are passed to the constructor in a string containing a list of one or more comma-separated
  * keywords. The supported actions are {@code open}, {@code register} and {@code unregister}. Their
  * meaning is defined as follows:</p>
+ * <blockquote>
  * <dl>
  * <dt>{@code open}</dt>
  * <dd>open a device using its device ID or name (see {@link DeviceManager#open(int) DeviceManager.open(id, ...)}
@@ -89,6 +93,7 @@
  * <dt>{@code unregister}</dt>
  * <dd>unregister a device (see {@link DeviceManager#unregister DeviceManager.unregister})</dd>
  * </dl>
+ * </blockquote>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see DeviceManager#register DeviceManager.register
--- a/src/share/classes/jdk/dio/DeviceNotFoundException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DeviceNotFoundException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -44,7 +44,7 @@
      * error message string {@code message} can later be retrieved by the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public DeviceNotFoundException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/DevicePermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/DevicePermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -33,69 +33,69 @@
 import romizer.Local;
 
 /**
- * The {@code DevicePermission} abstract class is the superclass of all device
- * permissions.
+ * The {@code DevicePermission} abstract class is the superclass of all device permissions.
  * <p>
- * A {@code DevicePermission} permission has a target name and, optionally, a
- * list of actions.
+ * A {@code DevicePermission} permission has a target name and, optionally, a list of actions.
  * </p><p>
- * The target name contains hardware addressing information. It takes the
- * following form:</p>
- * <blockquote> <code>( {controller-spec} ) [ ":" {channel-spec}]</code>
- * </blockquote>
+ * The target name contains hardware addressing information. It takes the following form:</p>
+ * <blockquote> <code>( {controller-spec} ) [ ":" {channel-spec}]</code> </blockquote>
+ * where <code>{controller-spec}</code> and <code>{channel-spec}</code> are defined as follows:
+ * <blockquote>
  * <dl>
  * <dt><code>{controller-spec}</code></dt>
  * <dd>The <code>{controller-spec}</code> takes the following form: <blockquote>
- * <code>{controller-name-spec} | {controller-number} | "*" | ""</code>
- * </blockquote>
+ * <code>{controller-name-spec} | {controller-number} | "*" | ""</code> </blockquote>
+ * where <code>{controller-name-spec}</code> and <code>{controller-number}</code> are defined as follows:
+ * <blockquote>
  * <dl>
  * <dt><code>{controller-name-spec}</code></dt>
- * <dd>The <code>{controller-name-spec}</code> string is the string
- * representation of a controller name as may be returned by a call to {@link DeviceConfig.HardwareAddressing#getControllerName
- * DeviceConfig.HardwareAddressing.getControllerName}. A controller name is
- * Operating System specific such as a <em>device file</em> name on UNIX
- * systems. Occurrences of the semicolon character ( {@code ":"}) must be
- * escaped with a backslash ({@code "\"}). A <code>{controller-name-spec}</code>
- * string that ends with an asterisk ({@code "*"}) is a prefix pattern that
- * matches all the controller names starting with the same prefix.</dd>
+ * <dd>The <code>{controller-name-spec}</code> string is the string representation of a controller name as
+ * may be returned by a call to {@link DeviceConfig.HardwareAddressing#getControllerName
+ * DeviceConfig.HardwareAddressing.getControllerName}. A controller name is Operating System specific
+ * such as a <em>device file</em> name on UNIX systems. Occurrences of the semicolon character (
+ * {@code ":"}) must be escaped with a backslash ({@code "\"}). A <code>{controller-name-spec}</code>
+ * string that ends with an asterisk ({@code "*"}) is a prefix pattern that matches all the controller
+ * names starting with the same prefix.</dd>
  * <dt><code>{controller-number}</code></dt>
- * <dd>The <code>{controller-number}</code> string is the decimal string
- * representation of a controller number as may be returned by a call to  {@link DeviceConfig.HardwareAddressing#getControllerNumber
- * DeviceConfig.HardwareAddressing.getControllerNumber}. The characters in the
- * string must all be decimal digits.</dd>
+ * <dd>The <code>{controller-number}</code> string is the decimal string representation of a controller
+ * number as may be returned by a call to
+ * {@link DeviceConfig.HardwareAddressing#getControllerNumber
+ * DeviceConfig.HardwareAddressing.getControllerNumber}. The characters in the string must all be
+ * decimal digits.</dd>
  * </dl>
- * A <code>{controller-spec}</code> specification consisting of the asterisk
- * ({@code "*"}) matches all controller names or numbers. A
- * <code>{controller-spec}</code> specification consisting of the empty string
- * ({@code ""}) designates an undefined controller name or number that may only
- * be matched by an empty string or an asterisk.</dd>
+ * </blockquote>
+ * A <code>{controller-spec}</code> specification consisting of the asterisk ({@code "*"}) matches all
+ * controller names or numbers. A <code>{controller-spec}</code> specification consisting of the empty
+ * string ({@code ""}) designates an undefined controller name or number that may only be matched by an
+ * empty string or an asterisk.</dd>
  * <dt>{channel-spec}</dt>
  * <dd>The <code>{channel-spec}</code> takes the following form: <blockquote>
  * <code>{channel-desc} | "*" | ""</code> </blockquote>
+ * where <code>{channel-desc}</code> is defined as follows:
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
- * <dd>The <code>{channel-desc}</code> string is device type-specific and must
- * be defined by subclasses.</dd>
+ * <dd>The <code>{channel-desc}</code> string is device type-specific and must be defined by
+ * subclasses.</dd>
  * </dl>
- * A <code>{channel-spec}</code> specification consisting of the asterisk
- * ({@code "*"}) matches all channels. A <code>{channel-spec}</code>
- * specification consisting of the empty string ({@code ""}) designates an
- * undefined channel that may only be matched by an empty string or an asterisk.
+ * </blockquote>
+ * A <code>{channel-spec}</code> specification consisting of the asterisk ({@code "*"}) matches all
+ * channels. A <code>{channel-spec}</code> specification consisting of the empty string ({@code ""})
+ * designates an undefined channel that may only be matched by an empty string or an asterisk.
  * <br>
- * The {@code DevicePermission} abstract class treats the
- * <code>{channel-desc}</code> string as an opaque string: a
- * <code>{channel-spec}</code> string may therefore only be matched by the exact
- * same <code>{channel-spec}</code> string or by the asterisk ({@code "*"}).
+ * The {@code DevicePermission} abstract class treats the <code>{channel-desc}</code> string
+ * as an opaque string: a <code>{channel-spec}</code> string may therefore only be matched
+ * by the exact same <code>{channel-spec}</code> string or by the asterisk ({@code "*"}).
  * </dd>
  * </dl>
- * Subclasses of {@code DevicePermission} may defined additional specific target
- * name formats to designate devices using their specific hardware addressing
- * information.
+ * </blockquote>
+ * Subclasses of {@code DevicePermission} may defined additional specific target name formats to
+ * designate devices using their specific hardware addressing information.
  * <p>
- * The actions to be granted are passed to the constructor in a string
- * containing a list of one or more comma-separated keywords. The supported
- * common actions are {@code open} and {@code powermanage}. Their meaning is
- * defined as follows:</p>
+ * The actions to be granted are passed to the constructor in a string containing a list of one or
+ * more comma-separated keywords. The supported common actions are {@code open} and
+ * {@code powermanage}. Their meaning is defined as follows:</p>
+ * <blockquote>
  * <dl>
  * <dt>{@code open}</dt>
  * <dd>open a device (see {@link DeviceManager#open DeviceManager.open})</dd>
@@ -103,6 +103,7 @@
  * <dd>manage the power saving mode of a device (see
  * {@link jdk.dio.power.PowerManaged})</dd>
  * </dl>
+ * </blockquote>
  * Additional actions to be granted may be defined by subclasses of
  * {@code DevicePermission}.
  *
@@ -112,7 +113,6 @@
  */
 @apimarker.API("device-io_1.1")
 public abstract class DevicePermission extends Permission {
-
     /**
      * The {@code open} action.
      */
@@ -123,26 +123,28 @@
      */
     public static final String POWER_MANAGE = "powermanage";
 
-    /**
-     * Coma-separated action list
-     *
+     /**
+     * Coma-separated action list     *
      */
     private String myActions;
 
     private String thisDevice;
     private String thisChannel;
 
+
     /**
-     * Constructs a new {@code DevicePermission} with the specified target name
-     * and the implicit {@code open} action. The target name is normalized so
-     * that leading and trailing spaces are removed and each occurrence of
-     * <code>{controller-number}</code> is represented in its canonical decimal
-     * representation form (without leading zeros).
+     * Constructs a new {@code DevicePermission} with the specified target name and the implicit
+     * {@code open} action.
+     * The target name is normalized so that leading and trailing spaces are removed
+     * and each occurrence of <code>{controller-number}</code> is represented in its canonical
+     * decimal representation form (without leading zeros).
      *
-     * @param name the target name (as defined above).
-     * @throws NullPointerException if {@code name} is {@code null}.
-     * @throws IllegalArgumentException if {@code name} is not properly
-     * formatted.
+     * @param name
+     *            the target name (as defined above).
+     * @throws NullPointerException
+     *             if {@code name} is {@code null}.
+     * @throws IllegalArgumentException
+     *             if {@code name} is not properly formatted.
      * @see #getName getName
      */
     public DevicePermission(String name) {
@@ -191,16 +193,14 @@
     }
 
     /**
-     * Checks two {@code DevicePermission} objects for equality. Checks that
-     * {@code obj}'s class is the same as this object's class and has the same
-     * name (as returned by {@link Permission#getName Permission.getName}) and
-     * same actions (sorted as per {@link #getActions getActions}) as this
-     * object.
+     * Checks two {@code DevicePermission} objects for equality.
+     * Checks that {@code obj}'s class is the same as this object's class and has the
+     * same name (as returned by {@link Permission#getName Permission.getName}) and same actions (sorted as per {@link #getActions getActions}) as this object.
      *
-     * @param obj the object to test for equality with this object.
-     * @return {@code true} if {@code obj}'s class is the same as this object's
-     * class and has the same target name and actions as this object;
-     * {@code false} otherwise.
+     * @param obj
+     *         the object to test for equality with this object.
+     * @return {@code true} if {@code obj}'s class is the same as this object's class and has the same target
+     *         name and actions as this object; {@code false} otherwise.
      */
     @Override
     public boolean equals(Object obj) {
@@ -244,14 +244,11 @@
 
     /**
      * Returns the hash code value for this object. The hash code is calculated
-     * from this permission's name (as returned by
-     * {@link Permission#getName Permission.getName}) and actions (sorted as per
-     * {@link #getActions getActions}) in a way that ensures that
-     * {@code permission1.equals(permission2)} implies that
-     * {@code permission1.hashCode()==permission2.hashCode()} for any two
-     * permissions, {@code permission1} and {@code permission2}, as required by
-     * the general contract of {@link Object#hashCode() Object.hashCode} and the
-     * contract of {@link Permission#hashCode Permission.hashCode}.
+     * from this permission's name (as returned by {@link Permission#getName Permission.getName}) and actions (sorted as per {@link #getActions getActions})
+     * in a way that ensures that {@code permission1.equals(permission2)} implies
+     * that {@code permission1.hashCode()==permission2.hashCode()} for any two permissions,
+     * {@code permission1} and {@code permission2}, as required by the general contract of {@link Object#hashCode() Object.hashCode}
+     * and the contract of {@link Permission#hashCode Permission.hashCode}.
      *
      * @return a hash code value for this object.
      */
@@ -265,24 +262,19 @@
      * <p>
      * More specifically, this method returns {@code true} if:</p>
      * <ul>
-     * <li>{@code permission}'s class is the same as this object's class,
-     * and</li>
-     * <li>{@code permission}'s actions (as returned by
-     * {@link #getActions getActions}) are a proper subset of this object's
-     * action list, and</li>
-     * <li>{@code permission}'s hardware addressing information or range thereof
-     * is included in this object's hardware addressing information range; the
-     * implementation of this method by the {@code DevicePermission} abstract
-     * class treats the channel description (<code>{channel-desc}</code>) string
-     * as an opaque string: a channel specification
-     * (<code>{channel-spec}</code>) string may therefore only be matched by the
-     * exact same a channel specification string or by the asterisk
-     * ({@code "*"}).</li>
+     * <li>{@code permission}'s class is the same as this object's class, and</li>
+     * <li>{@code permission}'s actions (as returned by {@link #getActions getActions}) are a proper subset of this object's action list, and</li>
+     * <li>{@code permission}'s hardware addressing information or range thereof is included in this
+     * object's hardware addressing information range; the implementation of this method by
+     * the {@code DevicePermission} abstract class treats the channel description (<code>{channel-desc}</code>) string
+     * as an opaque string: a channel specification (<code>{channel-spec}</code>) string may therefore only be matched
+     * by the exact same a channel specification string or by the asterisk ({@code "*"}).</li>
      * </ul>
      *
-     * @param permission the permission to check against.
-     * @return {@code true} if the specified permission is not {@code null} and
-     * is implied by this object, {@code false} otherwise.
+     * @param permission
+     *            the permission to check against.
+     * @return {@code true} if the specified permission is not {@code null} and is implied by this
+     *         object, {@code false} otherwise.
      */
     @Override
     public boolean implies(Permission permission) {
@@ -334,14 +326,12 @@
     }
 
     /**
-     * Returns a new {@code PermissionCollection} for storing
-     * {@code DevicePermission} objects.
+     * Returns a new {@code PermissionCollection} for storing {@code DevicePermission} objects.
      * <p>
-     * {@code DevicePermission} objects must be stored in a manner that allows
-     * them to be inserted into the collection in any order, but that also
-     * enables the
-     * {@link PermissionCollection#implies PermissionCollection.implies} method
-     * to be implemented in an efficient (and consistent) manner.
+     * {@code DevicePermission} objects must be stored in a manner that allows them to be
+     * inserted into the collection in any order, but that also enables the
+     * {@link PermissionCollection#implies PermissionCollection.implies} method to be implemented in an efficient (and
+     * consistent) manner.
      * </p><p>
      * For example, assuming a {@code PermissionCollection} object containing
      * the two following {@code DevicePermission}s:</p>
@@ -355,19 +345,16 @@
      * </p><pre>
      *   "adc:1", "open,powermanage",
      * </pre>
-     * <p>
-     * the {@code implies} method must take into account both the "adc:*" and
-     * "adc:1" permissions, so the effective permission is "open,powermanage",
-     * and {@code implies} returns {@code true}. The "implies" semantics for
-     * {@code DevicePermission}s are handled properly by the
-     * {@code PermissionCollection} object returned by this method. If a
-     * device-specific subclass of {@code DevicePermission} defines a different
-     * "implies" semantics then that subclass must re-implement this method
-     * accordingly.
+     * <p>the {@code implies} method must take into account both the "adc:*"
+     * and "adc:1" permissions, so the effective permission is
+     * "open,powermanage", and {@code implies} returns {@code true}. The
+     * "implies" semantics for {@code DevicePermission}s are handled properly by
+     * the {@code PermissionCollection} object returned by this method. If a device-specific subclass
+     * of {@code DevicePermission} defines a different "implies" semantics then
+     * that subclass must re-implement this method accordingly.
      * </p>
      *
-     * @return a new {@code PermissionCollection} suitable for storing
-     * {@code DevicePermission}.
+     * @return a new {@code PermissionCollection} suitable for storing {@code DevicePermission}.
      */
     @Override
     public PermissionCollection newPermissionCollection() {
--- a/src/share/classes/jdk/dio/InvalidDeviceConfigException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/InvalidDeviceConfigException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -45,7 +45,7 @@
      * The error message string {@code message} can later be retrieved by the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public InvalidDeviceConfigException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/RegistrationEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/RegistrationEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -39,7 +39,8 @@
 @apimarker.API("device-io_1.1")
 public class RegistrationEvent<P extends Device<? super P>> extends EventObject {
     /**
-     * The identifying and descriptive information of the registered or unregistered device.
+     * The free-formed name of the initiator of the registration or
+     * unregistration; or {@code null} if none is defined.
      */
     private DeviceDescriptor<P> descriptor;
 
@@ -63,7 +64,7 @@
 
     /**
      * Creates a new {@link RegistrationEvent} with the specified device descriptor and
-     * initiator.
+     * no initiator name.
      *
      * @param descriptor
      *            the identifying and descriptive information of the registered or unregistered
--- a/src/share/classes/jdk/dio/UnavailableDeviceException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/UnavailableDeviceException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -47,7 +47,7 @@
      * {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public UnavailableDeviceException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/UnsupportedAccessModeException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/UnsupportedAccessModeException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -47,7 +47,7 @@
      * the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public UnsupportedAccessModeException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/UnsupportedByteOrderException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/UnsupportedByteOrderException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -49,7 +49,7 @@
      * the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public UnsupportedByteOrderException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/UnsupportedDeviceTypeException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/UnsupportedDeviceTypeException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -47,7 +47,7 @@
      * the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public UnsupportedDeviceTypeException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/adc/ADCChannel.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/ADCChannel.java	Thu Aug 13 12:59:51 2015 +0300
@@ -213,30 +213,23 @@
     int getSamplingInterval() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Sets the sampling interval scale factor of this ADC channel.
-     * <p>
-     * If the underlying platform or driver does not support the
-     * requested scale factor value then {@code factor} will be <em>rounded
-     * down</em> to aligned to the closest lower supported discrete factor value. The resulting factor can
-     * be retrieved by a call to {@link #getScaleFactor getScaleFactor}.
-     * </p><p>
-     * If the scale factor - after adjustment - is {@code scale} and the scaled
-     * sampling interval value as returned by
-     * {@link #getSamplingInterval getSamplingInterval} is {@code sInterval}
-     * then the effective sampling interval is re-calculated as follows:</p>
-     * <blockquote>
-     * <pre>
-     * {@code eInterval = (sInterval / scale)}
-     * </pre>
-     * </blockquote>
+     * Sets the sampling interval scale factor of this ADC channel. The current
+     * scaled sampling interval value is reset to the new resulting minimum <em>scaled</em> sampling interval
+     * value. A call to this method should be immediately followed by a call to
+     * the {@link #setSamplingInterval setSamplingInterval} method in order to set
+     * an appropriate <em>scaled</em> sampling interval.
      *
-     * @param factor the scale factor.
+     * @param factor the scale factor (a number greater or equal to {@code 1.0}).
+     * @throws IllegalArgumentException if {@code factor} is {@link Double#NaN NaN}, is less than {@code 1.0} or,
+     * if the setting of the scale factor would result
+     * in the <em>scaled</em> sampling interval range to be outside the range {@code [1 - }{@link Integer#MAX_VALUE}{@code ]}.
      * @throws IOException if some other I/O error occurs.
      * @throws UnavailableDeviceException if this device is not currently
      * available - such as it is locked by another application.
      * @throws ClosedDeviceException if the device has been closed.
      *
      * @see #getScaleFactor
+     * @see #setSamplingInterval
      */
     void setScaleFactor(double factor) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -384,7 +377,15 @@
      * If the underlying platform or driver does not support the requested interval value
      * then {@code interval} will be aligned to the closest lower supported discrete interval value. The resulting, actual
      * scaled sampling interval can be retrieved by a call to {@link #getSamplingInterval getSamplingInterval}.
-     * </p>
+     * If the current scale factor as returned by
+     * {@link #getScaleFactor getScaleFactor} is {@code scale} and the current scaled
+     * sampling interval value - after alignment - is {@code sInterval}
+     * then the effective sampling interval can be calculated as follows:</p>
+     * <blockquote>
+     * <pre>
+     * {@code eInterval = (sInterval / scale)}
+     * </pre>
+     * </blockquote>
      *
      * @param interval
      *            the scaled input sampling interval (in microseconds).
@@ -466,6 +467,8 @@
      *            input values have been read.
      * @throws NullPointerException
      *             If {@code dst} or {@code listener} is {@code null}.
+     * @throws IllegalArgumentException
+     *             if the provided buffer {@code dst} has a zero-capacity.
      * @throws IllegalStateException
      *             if another synchronous or asynchronous acquisition is already active.
      * @throws UnavailableDeviceException
--- a/src/share/classes/jdk/dio/adc/ADCChannelConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/ADCChannelConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -45,12 +45,12 @@
  * The {@code ADCChannelConfig} class encapsulates the hardware addressing
  * information, and static and dynamic configuration parameters of an ADC
  * channel.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned,
  * Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code ADCChannelConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
@@ -58,6 +58,7 @@
  * the specified configuration. A {@link InvalidDeviceConfigException} is thrown
  * when attempting to open a device with an invalid or unsupported
  * configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -135,7 +136,7 @@
          * Sets the channel number (default value is {@code UNASSIGNED} if not set).
          *
          * @param channelNumber the channel number (a positive or zero integer)
-         * or {@code DeviceConfig.UNASSIGNED}.
+         * or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code channelNumber} is not in
          * the defined range.
@@ -150,7 +151,7 @@
          * Sets the controller number (default value is {@code UNASSIGNED} if not set).
          *
          * @param controllerNumber the hardware converter's number (a positive
-         * or zero integer) or {@link #UNASSIGNED}.
+         * or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -165,7 +166,7 @@
          * Sets the resolution (default value is {@code UNASSIGNED} if not set).
          *
          * @param resolution the resolution in bits (a positive integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code resolution} is not in the
          * defined range.
@@ -182,7 +183,7 @@
          *
          * @param samplingInterval the initial scaled input sampling interval
          * (the amount of time between two samples) in microseconds (a positive
-         * integer) or {@code DeviceConfig.UNASSIGNED}.
+         * integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code samplingInterval} is not
          * in the defined range.
@@ -200,7 +201,7 @@
          *
          * @param samplingTime the scaled sampling time (the amount of time to
          * take the sample) in microseconds (a positive integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code samplingTime} is not in
          * the defined range.
@@ -218,10 +219,10 @@
          * sampling time scale factor (default value is {@code 1.0} if not set).
          *
          * @param scaleFactor the sampling time and sampling interval scale
-         * factor (a positive number).
+         * factor (a number greater or equal to {@code 1.0}).
          * @return this {@code Builder} instance.
-         * @throws IllegalArgumentException if {@code scaleFactor} is not in the
-         * defined range.
+         * @throws IllegalArgumentException if {@code scaleFactor} is {@link Double#NaN NaN} or
+         * is less than {@code 1.0}.
          */
         public Builder setScaleFactor(double scaleFactor) {
             Utils.checkDoubleGreaterThanZero(scaleFactor);
@@ -234,7 +235,7 @@
          *
          * @param inputBufferSize the requested input buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code inputBufferSize} is not in
          * the defined range.
@@ -253,22 +254,25 @@
     /**
      * Creates a new {@code ADCChannelConfig} with the specified hardware
      * addressing information and configuration parameters.
-     * <p />
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input buffer size is set to {@code UNASSIGNED}.
      * The sampling interval and sampling time scale factor is set to
      * {@code 1.0}.
+     * </p>
      *
      * @param controllerNumber the hardware converter's number (a positive or
-     * zero integer) or {@link #UNASSIGNED}.
+     * zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber the hardware channel's number (a positive or zero
-     * integer) or {@code DeviceConfig.UNASSIGNED}.
+     * integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param resolution the resolution in bits (a positive integer) or
-     * {@code DeviceConfig.UNASSIGNED}.
+     * {@code UNASSIGNED}.
      * @param samplingInterval the initial input sampling interval (the amount
      * of time between two samples) in microseconds (a positive integer) or
-     * {@code DeviceConfig.UNASSIGNED}.
+     * {@code UNASSIGNED}.
      * @param samplingTime the sampling time (the amount of time to take the
      * sample) in microseconds (a positive integer) or
-     * {@code DeviceConfig.UNASSIGNED}.
+     * {@code UNASSIGNED}.
      * @throws IllegalArgumentException if any of the following is true:
      * <ul>
      * <li>{@code controllerNumber} is not in the defined range;</li>
@@ -292,22 +296,25 @@
     /**
      * Creates a new {@code ADCChannelConfig} with the specified hardware
      * addressing information and configuration parameters.
-     * <p />
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input buffer size is set to {@code UNASSIGNED}.
      * The sampling interval and sampling time scale factor is set to
      * {@code 1.0}.
+     * </p>
      *
      * @param controllerName the hardware controller's name (such as its
      * <em>device file</em> name on UNIX systems).
      * @param channelNumber the hardware channel's number (a positive or zero
-     * integer) or {@link #UNASSIGNED}.
+     * integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param resolution the resolution in bits (a positive integer) or
-     * {@code DeviceConfig.UNASSIGNED}.
+     * {@code UNASSIGNED}.
      * @param samplingInterval the initial input sampling interval (the amount
      * of time between two samples) in microseconds (a positive integer) or
-     * {@code DeviceConfig.UNASSIGNED}.
+     * {@code UNASSIGNED}.
      * @param samplingTime the sampling time (the amount of time to take the
      * sample) in microseconds (a positive integer) or
-     * {@code DeviceConfig.UNASSIGNED}.
+     * {@code UNASSIGNED}.
      * @throws IllegalArgumentException if any of the following is true:
      * <ul>
      * <li>{@code channelNumber} is not in the defined range;</li>
@@ -366,7 +373,7 @@
      * Gets the configured channel number.
      *
      * @return the hardware channel's number (a positive or zero integer) or
-     * {@link #UNASSIGNED}.
+     * {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getChannelNumber() {
         return channelNumber;
@@ -376,7 +383,7 @@
      * Gets the configured device number (such as the ADC converter number).
      *
      * @return the device number (a positive or zero integer) or
-     * {@link #UNASSIGNED}.
+     * {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -413,18 +420,18 @@
      * Gets the configured resolution.
      *
      * @return the resolution in bits (a positive integer) or
-     * {@link #UNASSIGNED}.
+     * {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getResolution() {
         return resolution;
     }
 
     /**
-     * Gets the configured default/initial <em>scaled</em> input sampling
+     * Gets the configured initial <em>scaled</em> input sampling
      * interval - the amount of time between two samples (in microseconds).
      *
-     * @return the default/initial input sampling interval in microseconds (a
-     * positive integer) or {@link #UNASSIGNED}.
+     * @return the initial input sampling interval in microseconds (a
+     * positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @see #getScaleFactor
      */
@@ -437,7 +444,7 @@
      * time to take the sample (in microseconds).
      *
      * @return the input sampling time in microseconds (a positive integer) or
-     * {@link #UNASSIGNED}.
+     * {@link #UNASSIGNED UNASSIGNED}.
      *
      * @see #getScaleFactor
      */
@@ -446,11 +453,10 @@
     }
 
     /**
-     * Gets the default/initial configured input sampling interval and input
+     * Gets the configured initial input sampling interval and input
      * sampling time scale factor.
      *
-     * @return the default/initial input sampling interval scale factor (a
-     * positive number).
+     * @return the initial input sampling interval scale factor (a number greater or equal to {@code 1.0}).
      *
      * @since 1.1
      */
--- a/src/share/classes/jdk/dio/adc/ADCPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/ADCPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,13 @@
 
 /**
  * The {@code ADCPermission} class defines permissions for ADC channel access.
- * <p />
+ * <p>
  * A {@code ADCPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the
  * base {@link DevicePermission} class with the following addition:
+ * </p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@code DevicePermission}) is the
@@ -44,6 +46,7 @@
  * {@link ADCChannelConfig#getChannelNumber ADCChannelConfig.getChannelNumber}. The characters in
  * the string must all be decimal digits.</dd>
  * </dl>
+ * </blockquote>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
  *
  * @see DeviceManager#open DeviceManager.open
--- a/src/share/classes/jdk/dio/adc/InvalidInputSamplingRateException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/InvalidInputSamplingRateException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -48,7 +48,7 @@
      * {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception.
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public InvalidInputSamplingRateException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/adc/MonitoringEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/MonitoringEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -96,8 +96,8 @@
      * @throws NullPointerException
      *             if {@code channel} is {@code null}.
      * @throws IllegalArgumentException
-     *             if {@code type} is not one of the defined types or if {@code timeStamp} or
-     *             {@code timeStampMicros} is negative.
+     *             if {@code type} is not one of the defined types or if {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public MonitoringEvent(ADCChannel channel, int type, int value, long timeStamp, int timeStampMicros) {
         if (null == channel) {
--- a/src/share/classes/jdk/dio/adc/MonitoringListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/MonitoringListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -30,9 +30,10 @@
 /**
  * The {@code MonitoringListener} interface defines methods for getting notified of ADC channel under- and
  * over-threshold input value conditions as well as device errors.
- * <p />
+ * <p>
  * A {@code MonitoringListener} can be registered using the
  * {@link ADCChannel#startMonitoring ADCChannel.startMonitoring} method.
+ * </p>
  *
  * @see ADCChannel
  * @since 1.0
--- a/src/share/classes/jdk/dio/adc/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/adc/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,13 +24,14 @@
  */
 /**
  * Interfaces and classes for reading analog inputs using an Analog to Digital Converter (ADC).
- * <p />
+ * <p>
  * One ADC converter can have several channels. Each channel can sample a continuous input voltage and convert it to a
  * numeric value.
- * <p />
+ * </p><p>
  * In order to access and control a specific ADC channel, an application should first open and obtain an
  * {@link jdk.dio.adc.ADCChannel ADCChannel} instance for the ADC channel the application wants to
  * access and control, using its numeric ID, name, type (interface) and/or properties:
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd>
@@ -51,23 +52,23 @@
  *
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
  * Once the device opened, the application can read or monitor sampled input values using methods of the
  * {@code ADCChannel} interface such as the
- * {@link jdk.dio.adc.ADCChannel#acquire() acquire} method. <blockquote>
- *
+ * {@link jdk.dio.adc.ADCChannel#acquire() acquire} method.
+ * <blockquote>
  * <pre>
  * int temp = channel.acquire();
  * </pre>
- *
- * </blockquote> When done, the application should call the {@link jdk.dio.adc.ADCChannel#close
- * ADCChannel.close} method to close ADC channel. <blockquote>
- *
+ * </blockquote>
+ * When done, the application should call the {@link jdk.dio.adc.ADCChannel#close
+ * ADCChannel.close} method to close ADC channel.
+ * <blockquote>
  * <pre>
  * channel.close();
  * </pre>
- *
- * </blockquote> The following sample codes give examples of using the ADC API: <blockquote>
- *
+ * </blockquote>
+ * The following sample codes give examples of using the ADC API: <blockquote>
  * <pre>
  * class ADCAcquisition implements AcquisitionRoundListener {
  *
@@ -100,9 +101,7 @@
  *     }
  * }
  * </pre>
- *
  * </blockquote> <blockquote>
- *
  * <pre>
  * class ADCThreshold implements MonitoringListener {
  *
@@ -134,12 +133,18 @@
  *     }
  * }
  * </pre>
- *
- * </blockquote> Because of performance issue, procedures handling analog inputs, and especially event listeners, should
+ * </blockquote>
+ * <p>Because of performance issue, procedures handling analog inputs, and especially event listeners, should
  * be implemented to be as fast as possible.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/atcmd/ATDevice.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/ATDevice.java	Thu Aug 13 12:59:51 2015 +0300
@@ -34,19 +34,21 @@
 /**
  * The {@code ATDevice} interface provides methods for controlling a Data Communication Equipment
  * such as a modem or a cellular module using AT commands.
- * <p />
+ * <p>
  * An AT device may be identified by the numeric ID, by the name (if any defined) and by an
  * optional set of capabilities (properties) that correspond to its registered configuration. An
  * {@code ATDevice} instance can be opened by a call to one of the
  * {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using its ID or by a
  * call to one of the
  * {@link DeviceManager#open(java.lang.String, java.lang.Class, java.lang.String[])
- * DeviceManager.open(name,...)} methods using its name and capabilities. <br />
+ * DeviceManager.open(name,...)} methods using its name and capabilities. <br>
  * The defined property keywords include {@code jdk.dio.atcmd.config},
  * {@code jdk.dio.atcmd.csd}, {@code jdk.dio.atcmd.psd},
  * {@code jdk.dio.atcmd.voice}, {@code jdk.dio.atcmd.sms},
  * {@code jdk.dio.atcmd.sim}, {@code jdk.dio.atcmd.phonebook}. Their meaning
  * is defined as follows:
+ * </p>
+ * <blockquote>
  * <dl>
  * <dt>{@code jdk.dio.atcmd.config}</dt>
  * <dd>Supports access to configuration, control and identification commands.</dd>
@@ -63,15 +65,17 @@
  * <dt>{@code jdk.dio.atcmd.phonebook}</dt>
  * <dd>Supports access to phonebook related AT commands.
  * </dl>
+ * </blockquote>
+ * <p>
  * This list may be extended to designate other (possibly proprietary) capabilities (properties).
- * <p />
+ * </p><p>
  * As per the convention, when one of this capabilities is supported by an AT device it must be
- * assigned as a positively asserted boolean capability: <blockquote>
- * <em>&lt;keyword&gt;</em>{@code =true} </blockquote>
- * For example: {@code jdk.dio.atcmd.phonebook=true}. <br />
+ * assigned as a positively asserted boolean capability:</p> <blockquote>
+ * <em>&lt;keyword&gt;</em>{@code =true} </blockquote><p>
+ * For example: {@code jdk.dio.atcmd.phonebook=true}. <br>
  * When a capability is not supported by an AT device negatively asserting the boolean capability is
  * optional.
- * <p />
+ * </p><p>
  * Commands can be issued to an {@code ATDevice} either synchronously or asynchronously. When
  * submitted synchronously using the {@link #sendCommand(java.lang.String) sendCommand(String)}, the
  * response string will be available as the return value to the call. When submitted asynchronously
@@ -79,43 +83,44 @@
  * {@link #sendCommand(java.lang.String, jdk.dio.atcmd.CommandResponseHandler)
  * sendCommand(String, CommandResponseHandler)} a {@link CommandResponseHandler} instance must be
  * provided to handle the response when available.
- * <p />
+ * </p><p>
  * The command strings passed as parameter to the {@code sendCommand} methods are the
  * complete AT command lines including the {@code AT} prefix and a termination character.
- * <p />
+ * </p><p>
  * An {@code ATDevice} can only handle one command at a time. Commands cannot be sent (or queued)
  * while a command is already being handled. Nevertheless, if supported by the underlying AT device,
  * several commands may be concatenated in a single command line.
- * <p />
+ * </p><p>
  * An {@code ATDevice} may report responses that are either information text or result codes. A
  * result code can be one of three types: final, intermediate, and unsolicited. A final result code
  * (e.g; {@code OK} or {@code ERROR}) indicates the completion of command and the readiness for
  * accepting new commands. An intermediate result code (e.g. {@code CONNECT}) is a report of the
  * progress of a command. An unsolicited result code (e.g. {@code RING}) indicates the occurrence of
- * an event not directly associated with the issuance of a command. <br />
+ * an event not directly associated with the issuance of a command. <br>
  * Information text, final result code and intermediate result code responses are reported as return
  * values of calls to the {@code sendCommand(String)} method or as the parameter to the
  * {@code processResponse} method of a {@code CommandResponseHandler} instance provided as parameter
- * to a call to {@code sendCommand(String, CommandResponseHandler)}. <br />
+ * to a call to {@code sendCommand(String, CommandResponseHandler)}. <br>
  * Such response strings may include command echos unless command echo has been disabled
- * (such as with an {@code ATE0} command). <br />
+ * (such as with an {@code ATE0} command). <br>
  * Unsolicited result code responses are reported and passed as parameter to the
  * {@link UnsolicitedResponseHandler#processResponse processResponse} method of a
  * {@link UnsolicitedResponseHandler} instance.
- * <p />
+ * </p><p>
  * A data connection can be established by calling the {@link #openDataConnection
  * openDataConnection} with a dedicated AT command such as {@code ATD}. The state of the connection
  * can be monitored by additionally providing an {@link DataConnectionHandler} instance.
- * <p />
+ * </p><p>
  * When done, an application should call the {@link #close() close} method to close the AT device.
  * Any further attempt to use an {@code ATDevice} instance which has been closed will result in a
  * {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * Opening an {@code ATDevice} instance is subject to permission checks (see {@link ATPermission}).
- * <p />
+ * </p><p>
  * Note: The {@code sendCommand} methods of {@code ATDevice} do not parse the provided AT commands.
  * The AT command line should include the {@code AT} prefix and the proper termination character
  * when and where needed.
+ * </p>
  *
  * @see ATPermission
  * @see CommandResponseHandler
@@ -145,6 +150,7 @@
      *             if the device has been closed.
      * @deprecated As of 1.1, replaced by {@link #tryAbortCommand tryAbortCommand}.
      */
+    @Deprecated
     void abortCommand(String abortSequence) throws IOException, UnavailableDeviceException,
             ClosedDeviceException;
 
@@ -188,6 +194,7 @@
      *
      * @deprecated As of 1.1, replaced by {@link #tryEscapeToCommandMode tryEscapeToCommandMode}.
      */
+    @Deprecated
     void escapeToCommandMode() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
@@ -293,7 +300,7 @@
     /**
      * Sends an AT command and wait for the response. If the command line includes payload text, it
      * must be properly terminated with e.g. {@code Ctrl-Z} otherwise the operation may block. In
-     * which case it may be canceled by a call to {@link #abortCommand abortCommand}. <br />
+     * which case it may be canceled by a call to {@link #abortCommand abortCommand}. <br>
      * The returned response string may include the command echo unless command echo has
      * been disabled (such as with an {@code ATE0} command).
      *
@@ -343,14 +350,15 @@
 
     /**
      * Registers a handler for handling Unsolicited Result Code responses.
-     * <p />
+     * <p>
      * If this {@code ATDevice} is open in {@link DeviceManager#SHARED} access mode the handlers
      * registered by all the applications sharing the underlying device will get invoked to handle
      * Unsolicited Result Code responses.
-     * <p />
+     * </p><p>
      * If {@code handler} is {@code null} then the previously registered handler will be removed.
-     * <p />
+     * </p><p>
      * Only one handler can be registered at a particular time.
+     * </p>
      *
      * @param handler
      *            the {@code UnsolicitedResponseHandler} instance to handle Unsolicited Result Code
@@ -369,8 +377,9 @@
 
     /**
      * {@inheritDoc}
-     * <p />
+     * <p>
      * Closing an {@code ATDevice} will also close the device's {@code DataConnection}.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
--- a/src/share/classes/jdk/dio/atcmd/ATDeviceConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/ATDeviceConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -42,17 +42,18 @@
 /**
  * The {@code ATDeviceConfig} class encapsulates the hardware addressing information, and static and
  * dynamic configuration parameters of an AT device.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code ATDeviceConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated AT device
  * with the specified configuration. A {@link InvalidDeviceConfigException} is thrown when
  * attempting to open a device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -62,7 +63,7 @@
  */
 @SerializeMe
 @apimarker.API("device-io_1.1_atcmd")
-public class ATDeviceConfig implements DeviceConfig<ATDevice>, DeviceConfig.HardwareAddressing {
+public final class ATDeviceConfig implements DeviceConfig<ATDevice>, DeviceConfig.HardwareAddressing {
 
     private String controllerName;
 
@@ -76,11 +77,14 @@
 
     /**
      * Creates a new {@code ATDeviceConfig} with the specified hardware addressing information.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if {@code channelNumber} is not in the defined range.
      * @throws NullPointerException
@@ -95,11 +99,14 @@
 
     /**
      * Creates a new {@code ATDeviceConfig} with the specified hardware addressing information.
+     * <p>
+     * The controller name is set to {@code null}.
+     * </p>
      *
      * @param controllerNumber
-     *            the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if {@code channelNumber} is not in the defined range.
      */
@@ -146,7 +153,7 @@
     /**
      * Gets the configured channel number.
      *
-     * @return the channel number (a positive or zero integer); or {@link #UNASSIGNED}.
+     * @return the channel number (a positive or zero integer); or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getChannelNumber() {
         return channelNumber;
@@ -155,7 +162,7 @@
     /**
      * Gets the configured controller number.
      *
-     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
--- a/src/share/classes/jdk/dio/atcmd/ATPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/ATPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code ATPermission} class defines permissions for AT device access.
- * <p />
+ * <p>
  * A {@code ATPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the base {@link DevicePermission} class
- * with the following addition:
+ * with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>
@@ -45,11 +46,15 @@
  * {@link ATDeviceConfig#getChannelNumber ATDeviceConfig.getChannelNumber}. The characters in the string must all be decimal digits.
  * </dd>
  * </dl>
- * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}, and {@code data} defined as follows:
+ * </blockquote>
+ * <p>
+ * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}, and {@code data} defined as follows:</p>
+ * <blockquote>
  * <dl>
  * <dt>{@code data}</dt>
  * <dd>open data connections (see {@link ATDevice#openDataConnection})</dd>
  * </dl>
+ * </blockquote>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/atcmd/CommandResponseHandler.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/CommandResponseHandler.java	Thu Aug 13 12:59:51 2015 +0300
@@ -26,18 +26,19 @@
 
 /**
  * The {@code CommandResponseHandler} interface defines methods for handling responses to AT commands.
- * <p />
+ * <p>
  * When commands are submitted asynchronously using the
  * {@link ATDevice#sendCommand(java.lang.String, jdk.dio.atcmd.CommandResponseHandler)
  * sendCommand(String, CommandResponseHandler)} a {@code CommandResponseHandler} instance must be provided to handle the
  * response when available.
- * <p />
+ * </p><p>
  * Only information text, final result code and intermediate result code responses can be handled by a
  * {@code CommandResponseHandler} instance. Unsolicited result code responses can be handled by a
  * {@link UnsolicitedResponseHandler} instance.
- * <p />
+ * </p><p>
  * A {@code CommandResponseHandler} should not throw any unchecked exception. A compliant implementation of this
  * specification MUST catch unchecked exceptions that may be thrown by a {@code CommandResponseHandler}.
+ * </p>
  *
  * @see ATDevice
  * @since 1.0
--- a/src/share/classes/jdk/dio/atcmd/DataConnection.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/DataConnection.java	Thu Aug 13 12:59:51 2015 +0300
@@ -36,12 +36,13 @@
 
     /**
      * Returns the {@code ATDevice} this data connection has been opened with.
-     * <p />
+     * <p>
      * The returned object may be an instance of {@link ATModem ATModem},
      * allowing for controlling the modem signals; in case of a virtual
      * channel open over a multiplexing protocol, this {@code ATModem} instance may
      * be specific to that channel and may allow
      * for controlling the virtual modem signals associated to that virtual channel.
+     * </p>
      *
      * @return the {@code ATDevice} this data connection has been opened with.
      */
--- a/src/share/classes/jdk/dio/atcmd/DataConnectionHandler.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/DataConnectionHandler.java	Thu Aug 13 12:59:51 2015 +0300
@@ -27,10 +27,12 @@
 /**
  * The {@code DataConnectionHandler} interface defines methods for handling connection state
  * changes.
- * <p />
+ * <p>
  * A {@code DataConnectionHandler} should not throw any unchecked exception. A compliant
  * implementation of this specification MUST catch unchecked exceptions that may be thrown by a
  * {@code DataConnectionHandler}.
+ * </p>
+ *
  * @since 1.0
  */
 @apimarker.API("device-io_1.1_atcmd")
--- a/src/share/classes/jdk/dio/atcmd/UnsolicitedResponseHandler.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/UnsolicitedResponseHandler.java	Thu Aug 13 12:59:51 2015 +0300
@@ -28,14 +28,15 @@
  * The {@code UnsolicitedResponseHandler} interface defines methods for handling unsolicited result
  * code responses from an AT device. Unsolicited result codes (such as {@code RING}) indicate the
  * occurrence of an event not directly associated with the issuance of an AT command.
- * <p />
+ * <p>
  * To receive unsolicited result codes an {@code UnsolicitedResponseHandler} instance must be
  * registered with the AT device using the
  * {@link ATDevice#setUnsolicitedResponseHandler ATDevice.setUnsolicitedResponseHandler} method.
- * <p />
+ * </p><p>
  * A {@code UnsolicitedResponseHandler} should not throw any unchecked exception. A compliant
  * implementation of this specification MUST catch unchecked exceptions that may be thrown by a
  * {@code UnsolicitedResponseHandler}.
+ * </p>
  *
  * @see ATDevice
  * @since 1.0
--- a/src/share/classes/jdk/dio/atcmd/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/atcmd/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -25,59 +25,55 @@
 /**
  * Interfaces and classes for controlling a Data Communication Equipment such as a modem or a
  * cellular module using AT commands.
- * <p />
+ * <p>
  * AT commands for GSM phone or modem are standardized through ETSI GSM 07.07 and ETSI GSM 07.05
  * specifications. A typical modem or an cellular module supports most of its features through AT
  * commands and many manufactures provide additional features by adding proprietary extensions to
  * the AT commands set.
- * <p />
+ * </p><p>
  * In this specification, a device that can be controlled using AT commands is generically referred
  * to as an AT device.
- * <p />
+ * </p><p>
  * To control a specific AT device, an application should first open and obtain an
  * {@link jdk.dio.atcmd.ATDevice} or {@link jdk.dio.atcmd.ATModem}
  * instance for the device the application wants to control, using its numeric ID, name, type
- * (interface) and/or properties:
+ * (interface) and/or properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd><blockquote>
- *
  * <pre>
  * ATDevice device = DeviceManager.open(15);
  * </pre>
  * </blockquote></dd>
  * <dt>Using its name, properties and interface</dt>
  * <dd><blockquote>
- *
  * <pre>
  * ATDevice device = DeviceManager.open(&quot;MODEM&quot;, ATDevice.class, &quot;jdk.dio.atcmd.psd=true&quot;,
  *         &quot;jdk.dio.atcmd.sms=true&quot;);
  * </pre>
  * </blockquote> Or (with modem signals control properties), <blockquote>
- *
  * <pre>
  * ATModem device = DeviceManager.open(&quot;MODEM&quot;, ATModem.class, &quot;jdk.dio.atcmd.psd=true&quot;,
  *         &quot;jdk.dio.atcmd.sms=true&quot;);
  * </pre>
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
  * Once the device opened, the application can issue AT commands to the device using methods
  * of the {@link jdk.dio.atcmd.ATDevice} interface such as the
  * {@link jdk.dio.atcmd.ATDevice#sendCommand(String cmd, CommandResponseHandler handler)
  * sendCommand} methods. <blockquote>
- *
  * <pre>
  * device.sendCommand(&quot;AT\n&quot;);
  * </pre>
  * </blockquote> When done, the application should call the
  * {@link jdk.dio.atcmd.ATDevice#close() } method to close AT device. <blockquote>
- *
  * <pre>
  * device.close();
  * </pre>
  * </blockquote> The following sample codes give examples of using the AT API to send an SMS:
  * <blockquote>
- *
  * <pre>
  * public static final int SUBMITTED = 1;
  * public static final int SENT = 2;
@@ -138,12 +134,18 @@
  * }
  * </pre>
  * </blockquote>
- * <p />
+ * <p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException
  * NullPointerException} to be thrown.
- * <p />
+ * </p><p>
  * This package requires the {@link jdk.dio.modem} package.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/counter/CounterPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/counter/CounterPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code CounterPermission} class defines permissions for pulse counter access.
- * <p />
+ * <p>
  * A {@code CounterPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the
- * base {@link DevicePermission} class with the following addition:
+ * base {@link DevicePermission} class with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@code DevicePermission}) is the
@@ -44,7 +45,10 @@
  * {@code PulseCounterConfig#getChannelNumber}. The characters in the string must all be decimal
  * digits.</dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/counter/CountingEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/counter/CountingEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -28,7 +28,7 @@
 
 /**
  * The {@code CountingEvent} class encapsulates pulse counting conditions such as counter terminal
- * value reached or counting session time interval expired. <br />
+ * value reached or counting session time interval expired. <br>
  * When/if counting events for the same pulse counter are coalesced the count value and the type
  * (terminal value reached or time interval expired) retained are that of the last occurrence.
  *
@@ -108,7 +108,8 @@
      *             if {@code counter} is {@code null}.
      * @throws IllegalArgumentException
      *             if {@code type} is not one of the defined types or if {@code value},
-     *             {@code interval}, {@code timeStamp} or {@code timeStampMicros} is negative.
+     *             {@code interval} or {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public CountingEvent(PulseCounter counter, int type, int value, long interval, long timeStamp, int timeStampMicros) {
         this.device = counter;
@@ -146,7 +147,7 @@
      * Returns the type of counting condition being notified.
      *
      * @return the type of counting condition being notified: {@link #INTERVAL_EXPIRED} or
-     *         {@link #TERMINAL_VALUE_REACHED}..
+     *         {@link #TERMINAL_VALUE_REACHED}.
      */
     public int getType() {
         return type;
--- a/src/share/classes/jdk/dio/counter/CountingListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/counter/CountingListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -31,10 +31,11 @@
  * The {@code CountingListener} interface defines methods for getting notified of pulse counter
  * counting conditions such as counter terminal value reached or counting session time interval
  * expired as well of device errors.
- * <p />
+ * <p>
  * A {@code CountingListener} can be registered using the
  * {@link PulseCounter#startCounting(int, long, jdk.dio.counter.CountingListener)}
  * method.
+ * </p>
  *
  * @see PulseCounter
  * @since 1.0
--- a/src/share/classes/jdk/dio/counter/PulseCounter.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/counter/PulseCounter.java	Thu Aug 13 12:59:51 2015 +0300
@@ -37,7 +37,7 @@
 /**
  * The {@code PulseCounter} interface provides methods for controlling a pulse counter. A pulse
  * counter can count pulses (or events) on a digital input line (possibly a GPIO pin).
- * <p />
+ * <p>
  * A pulse counter may be identified by the numeric ID and by the name (if any defined) that
  * correspond to its registered configuration. A {@code PulseCounter} instance can be opened by a
  * call to one of the {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods
@@ -48,7 +48,7 @@
  * addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig)
  * DeviceManager.open(config,...)} methods it is not assigned any ID nor name.
- * <p />
+ * </p><p>
  * Once opened, an application can either start a pulse counting session using the
  * {@link #startCounting() startCounting} method and retrieve the current pulse count on-the-fly
  * by calling the {@link #getCount getCount} method; or it can start a pulse counting session with a
@@ -57,24 +57,24 @@
  * asynchronously notified once the terminal count value has been reached or the counting time
  * interval has expired. In both cases, the application can retrieve the current pulse count at any
  * time (on-the-fly) by calling the {@link #getCount getCount}.
- * <p />
+ * </p><p>
  * The pulse counting session can be suspended by calling {@link #suspendCounting suspendCounting}
  * and later on resumed from its previous count value by calling {@link #resumeCounting
  * resumeCounting}. Suspending the pulse counting also suspends the session counting time interval
  * timer if active.
- * <p />
+ * </p><p>
  * The pulse count value can be reset at any time during counting by calling {@link #resetCounting
  * resetCounting}. This also resets the session counting time interval timer if active.
- * <p />
+ * </p><p>
  * Finally, the pulse counting can be stopped by calling {@link #stopCounting stopCounting}.
- * <p />
+ * </p><p>
  * When an application is no longer using a pulse counter it should call the {@link #close close}
  * method to close the pulse counter. Any further attempt to use a pulse counter which has been
  * closed will result in a {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * Asynchronous notification of pulse counting conditions is only loosely tied to
  * hardware-level interrupt requests. The platform does not guarantee notification in a
- * deterministic/timely manner.
+ * deterministic/timely manner.</p>
  * <h3><a name="permission">Permission Requirement For Pulse Counters Configured with an Explicit GPIO Input Pin</a></h3>
  * Opening a {@code PulseCounter} instance with an ad-hoc configuration requires
  * the {@link jdk.dio.counter.CounterPermission CounterPermission.OPEN} to be granted;
@@ -82,6 +82,33 @@
  * on which the pulses are to be counted requires, in addition, the
  * {@link jdk.dio.gpio.GPIOPinPermission GPIOPinPermission.OPEN} permission to be granted
  * on the designated GPIO pin.
+ * <p>
+ * Opening a {@code PulseCounter} with the following ad hoc sample configuration:</p>
+ * <blockquote>
+ * <pre>
+ * PulseCounterConfig config = new PulseCounterConfig.Builder()
+ *     .setControllerNumber(1)
+ *     .setChannelNumber(1)
+ *     .setSourceConfig(new GPIOPinConfig.Builder()
+ *                          .setControllerNumber(4)
+ *                          .setPinNumber(7)
+ *                          .setDirection(GPIOPinConfig.DIR_INPUT_ONLY)
+ *                          .setDriveMode(GPIOPinConfig.MODE_INPUT_PULL_DOWN)
+ *                          .setTrigger(GPIOPinConfig.TRIGGER_BOTH_EDGES)
+ *                          .build())
+ *     .setType(TYPE_NEGATIVE_PULSE)
+ *     .build();
+ * </pre>
+ * </blockquote>
+ * <p>
+ * requires the following permissions to be granted:
+ * </p>
+ * <blockquote>
+ * <pre>
+ * CounterPermission("1:1", "open")
+ * GPIOPinPermission("4:7", "open")
+ * </pre>
+ * </blockquote>
  *
  * @see CountingListener
  * @see CounterPermission
@@ -140,13 +167,14 @@
 
     /**
      * Starts a pulse counting session.
-     * <p />
+     * <p>
      * The pulse count value is first reset.
-     * <p />
+     * </p><p>
      * If the counter overflows it restarts from {@code 0} without any further notification. To be
      * notified of such conditions the
      * {@link #startCounting(int, long, jdk.dio.counter.CountingListener) } method
      * should be used instead.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
@@ -164,10 +192,10 @@
      * Starts an asynchronous pulse counting session. The provided {@link CountingListener} instance
      * will be asynchronously invoked when the pulse count reaches the provided terminal count value
      * or the specified counting time interval expires - whichever happens first.
-     * <p />
+     * <p>
      * The pulse count value is first reset and will be reset every time the terminal count value is
      * reached or the counting time interval expires.
-     * <p />
+     * </p><p>
      * If {@code limit} is equal to or less than {@code 0} then the counting time interval will end
      * only after the time specified by {@code interval} has passed. If {@code interval} is equal to
      * or less than {@code 0} then the counting time interval will end only after the pulse count
@@ -176,11 +204,12 @@
      * does not support a microsecond resolution or does not support the requested interval value
      * then {@code interval} will be <em>rounded up</em> to accommodate the supported timer resolution
      * or respectively aligned to the closest greater supported interval value.
-     * <p/>
+     * </p><p>
      * Pulse counting and notification will immediately start and will repeat until it is stopped by
      * a call to {@link #stopCounting stopCounting}.
-     * <p />
+     * </p><p>
      * Only one pulse counting session can be going on at any time.
+     * </p>
      *
      * @param listener
      *            the {@link CountingListener} instance to be notified when the pulse count reaches
@@ -209,8 +238,9 @@
     /**
      * Stops the pulse counting and freezes the current count value. The count value will be reset
      * upon the next start.
-     * <p />
+     * <p>
      * This method return silently if no pulse counting session is currently active.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
@@ -239,10 +269,11 @@
 
     /**
      * Gets the input source on which the pulses are counted/measured.
-     * <p />
+     * <p>
      * A concurrent runtime change of the dynamic configuration parameters of
      * the source (such as of its direction) may result in {@code IOException}
      * being thrown by counting operations.
+     * </p>
      *
      * @return the source on which the pulses are to counted/measured; or {@code null} if the source is implicit.
      *
--- a/src/share/classes/jdk/dio/counter/PulseCounterConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/counter/PulseCounterConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -47,17 +47,18 @@
 /**
  * The {@code PulseCounterConfig} class encapsulates the hardware addressing information, and static
  * and dynamic configuration parameters of a pulse counter.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code PulseCounterConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated counter
  * with the specified configuration. A {@link InvalidDeviceConfigException} is thrown when
  * attempting to open a device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -67,7 +68,7 @@
  */
 @SerializeMe
 @apimarker.API("device-io_1.1_counter")
-public class PulseCounterConfig implements DeviceConfig<PulseCounter>, DeviceConfig.HardwareAddressing {
+public final class PulseCounterConfig implements DeviceConfig<PulseCounter>, DeviceConfig.HardwareAddressing {
 
     /**
      * Falling pulse edge (counting only falling pulse edges). When the pulse source is a GPIO pin
@@ -141,6 +142,12 @@
          * parameter was not explictly set its default value will be used.
          *
          * @return a new initialized {@code PulseCounterConfig} instance.
+         * @throws IllegalArgumentException if any of the following is true:
+         * <ul>
+         * <li>if the provided source (GPIO pin - if any provided) configuration's trigger mode is
+         * not compatible with the specified pulse or pulse edge type (see the description of each
+         * {@link PulseCounterConfig#TYPE_FALLING_EDGE_ONLY TYPE_*} constant).</li>
+         * </ul>
          * @throws IllegalStateException if any of the following is true:
          * <ul>
          * <li>the pulse or pulse edge type is not set.</li>
@@ -171,7 +178,7 @@
          * set).
          *
          * @param channelNumber the channel/counter number (a positive or zero integer)
-         * or {@code DeviceConfig.UNASSIGNED}.
+         * or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code channelNumber} is not in
          * the defined range.
@@ -187,7 +194,7 @@
          * not set).
          *
          * @param controllerNumber the controller number (a positive
-         * or zero integer) or {@link #UNASSIGNED}.
+         * or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -202,11 +209,12 @@
          * Sets the configuration of the source (a GPIO input pin) on which the pulses are to be
          * counted (default value is {@code null} if not set).
          *
-         * @param source the configuration of the source (a GPIO input pin); or {@code null} if the source is
+         * @param sourceConfig the configuration of the source (a GPIO input pin); or {@code null} if the source is
          * implicit.
          * @return this {@code Builder} instance.
-         * @throws IllegalArgumentException if {@code source} is not
-         * {@code null} and is not configured for input.
+         * @throws IllegalArgumentException if {@code sourceConfig} is not
+         * {@code null} and {@code sourceConfig}'s direction is not set to
+         * {@link GPIOPinConfig#DIR_INPUT_ONLY} or {@link GPIOPinConfig#DIR_BOTH_INIT_INPUT}.
          */
         public Builder setSourceConfig(GPIOPinConfig source) {
             if (null != source) {
@@ -240,11 +248,14 @@
     /**
      * Creates a new {@code PulseCounterConfig} with the specified hardware addressing information
      * and type. The source of the pulse counter is implicit (such as a dedicated input pin).
+     * <p>
+     * The controller name is set to {@code null}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param type
      *            the pulse or pulse edge type: {@link #TYPE_FALLING_EDGE_ONLY},
      *            {@link #TYPE_RISING_EDGE_ONLY}, {@link #TYPE_NEGATIVE_PULSE} or
@@ -270,11 +281,14 @@
     /**
      * Creates a new {@code PulseCounterConfig} the specified hardware addressing information, type
      * and GPIO pin source.
+     * <p>
+     * The controller name is set to {@code null}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param type
      *            the pulse or pulse edge type: {@link #TYPE_FALLING_EDGE_ONLY},
      *            {@link #TYPE_RISING_EDGE_ONLY}, {@link #TYPE_NEGATIVE_PULSE} or
@@ -288,9 +302,11 @@
      *             <li>{@code controllerNumber} is not in the defined range;</li>
      *             <li>{@code channelNumber} is not in the defined range;</li>
      *             <li>{@code type} is not one of the defined values;</li>
-     *             <li>if the provided source is not configured for input;</li>
-     *             <li>if the provided source is not configured with an edge trigger mode compatible
-     *             with the specified pulse type.</li>
+     *             <li>if the provided source (GPIO pin) configuration's direction is not set to
+     *             {@link GPIOPinConfig#DIR_INPUT_ONLY} or {@link GPIOPinConfig#DIR_BOTH_INIT_INPUT};</li>
+     *             <li>if the provided source (GPIO pin) configuration's trigger mode is not compatible
+     *             with the specified pulse type (see the description of each
+     *             {@link PulseCounterConfig#TYPE_FALLING_EDGE_ONLY TYPE_*} constant).</li>
      *             </ul>
      * @throws NullPointerException
      *             if {@code source} is {@code null}.
@@ -307,11 +323,14 @@
     /**
      * Creates a new {@code PulseCounterConfig} with the specified hardware addressing information
      * and type. The source of the pulse counter is implicit (such as a dedicated input pin).
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param type
      *            the pulse or pulse edge type: {@link #TYPE_FALLING_EDGE_ONLY},
      *            {@link #TYPE_RISING_EDGE_ONLY}, {@link #TYPE_NEGATIVE_PULSE} or
@@ -338,11 +357,14 @@
     /**
      * Creates a new {@code PulseCounterConfig} the specified hardware addressing information, type
      * and GPIO pin source.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware counter's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param type
      *            the pulse or pulse edge type: {@link #TYPE_FALLING_EDGE_ONLY},
      *            {@link #TYPE_RISING_EDGE_ONLY}, {@link #TYPE_NEGATIVE_PULSE} or
@@ -355,9 +377,11 @@
      *             <ul>
      *             <li>{@code channelNumber} is not in the defined range;</li>
      *             <li>{@code type} is not one of the defined values;</li>
-     *             <li>if the provided source is not configured for input;</li>
-     *             <li>if the provided source is not configured with an edge trigger mode compatible
-     *             with the specified pulse type.</li>
+     *             <li>if the provided source (GPIO pin) configuration's direction is not set to
+     *             {@link GPIOPinConfig#DIR_INPUT_ONLY} or {@link GPIOPinConfig#DIR_BOTH_INIT_INPUT};</li>
+     *             <li>if the provided source (GPIO pin) configuration's trigger mode is not compatible
+     *             with the specified pulse type (see the description of each
+     *             {@link PulseCounterConfig#TYPE_FALLING_EDGE_ONLY TYPE_*} constant).</li>
      *             </ul>
      * @throws NullPointerException
      *             if {@code controllerName} or {@code source} is {@code null}.
@@ -406,7 +430,7 @@
     /**
      * Gets the configured controller number.
      *
-     * @return the controller number (a positive or zero integer); or {@link #UNASSIGNED}.
+     * @return the controller number (a positive or zero integer); or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -416,7 +440,7 @@
     /**
      * Gets the configured counter number.
      *
-     * @return the counter number (a positive or zero integer); or {@link #UNASSIGNED}.
+     * @return the counter number (a positive or zero integer); or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getChannelNumber() {
         return channelNumber;
@@ -433,11 +457,12 @@
     }
 
     /**
-     * Gets the input source on which the pulses are to be counted/measured.
-     * <p />
+     * Gets the source (GPIO input pin) on which the pulses are to be counted/measured.
+     * <p>
      * A concurrent runtime change of the
      * dynamic configuration parameters of the source (such as of its direction) may result in
      * {@code IOException} being thrown by counting operations.
+     * </p>
      *
      * @return the source on which the pulses are to be counted/measured; or {@code null} if the source is implicit
      * or if this {@code PusleCounterConfig} instance is not associated to an actual {@code PulseCounter} instance.
@@ -450,7 +475,7 @@
     }
 
     /**
-     * Gets the configured input source configuration on which the pulses are to be
+     * Gets the configured source (GPIO input pin) configuration on which the pulses are to be
      * counted/measured.
      *
      * @return the configuration of the source on which the pulses are to be counted/measured; or
--- a/src/share/classes/jdk/dio/counter/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/counter/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,11 +24,12 @@
  */
 /**
  * Interfaces and classes for counting pulses (or events) on a digital input line.
- * <p />
+ * <p>
  * In order to access and control a specific pulse counter, an application should first open and
  * obtain an {@link jdk.dio.counter.PulseCounter} instance for the pulse counter the
  * application wants to access and control, using its numeric ID, name, type (interface) and/or
- * properties:
+ * properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd><blockquote>
@@ -45,6 +46,7 @@
  * </pre>
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
  * Once opened, an application can either start a pulse counting session using the
  * {@link jdk.dio.counter.PulseCounter#startCounting() startCounting} method and
  * retrieve the current pulse count on-the-fly by calling the
@@ -94,12 +96,22 @@
  *     }
  * }
  * </pre>
- * </blockquote> Because of performance issue, procedures handling pulse counting events, and
+ * </blockquote>
+ * <p>
+ * Because of performance issue, procedures handling pulse counting events, and
  * especially event listeners, should be implemented to be as fast as possible.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException
  * NullPointerException} to be thrown.
+ * </p><p>
+ * This package requires the {@link jdk.dio.gpio} package.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/dac/DACChannel.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/dac/DACChannel.java	Thu Aug 13 12:59:51 2015 +0300
@@ -34,13 +34,13 @@
 /**
  * The {@code DACChannel} interface provides methods for controlling a DAC (Digital to Analog
  * Converter) channel.
- * <p />
+ * <p>
  * One DAC device can have several channels. Raw digital output values (samples) are converted to
  * analog output values according to the DAC channel resolution. The raw digital output values may
  * range from {@link #getMinValue getMinValue} to {@link #getMaxValue getMaxValue}. Actual output
  * voltage values can be calculated from the raw digital output values and the
  * <em>Reference Voltage</em> value as returned by {@link #getVRefValue getVRefValue}.
- * <p />
+ * </p><p>
  * A DAC channel may be identified by the numeric ID and by the name (if any defined) that
  * correspond to its registered configuration. A {@code DACChannel} instance can be opened by a call
  * to one of the {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using
@@ -51,37 +51,37 @@
  * addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig)
  * DeviceManager.open(config,...)} methods it is not assigned any ID nor name.
- * <p />
+ * </p><p>
  * Once opened, an application can write an output value to a DAC channel by calling the
  * {@link #generate(int) generate(int)} method or can write a series of output values to be
  * converted over a period of time by calling the {@link #generate(IntBuffer) generate(IntBuffer)}
  * method.
- * <p />
+ * </p><p>
  * An application can also asynchronously write a series of output values (samples) to be converted
  * at a certain rate by calling the {@link #startGeneration(IntBuffer, GenerationRoundListener)
  * startGeneration} method with a {@link GenerationRoundListener} instance which will get cyclicly
  * and asynchronously invoked to fetch more values to be converted. Analog output generation can be
  * stopped by calling the {@link #stopGeneration stopGeneration} method.
- * <p />
+ * </p><p>
  * Only one output generation (synchronous or asynchronous) can be going on at any time.
- * <p />
+ * </p><p>
  * When an application is no longer using an DAC channel it should call the {@link #close close}
  * method to close the DAC channel. Any further attempt to set or get the value of a DAC channel
  * which has been closed will result in a {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * Asynchronous notification of output generation completion is only loosely tied to
  * hardware-level interrupt requests. The platform does not guarantee notification in a
- * deterministic/timely manner.
+ * deterministic/timely manner.</p>
  * <h3><a name="iomodes">Buffered I/O and Direct I/O Transfers</a></h3>
  * A DAC channel may support buffered I/O or direct I/O operations depending on
- * the capabilities of the underlying device hardware and driver. <br />
+ * the capabilities of the underlying device hardware and driver. <br>
  * Buffered output - output in buffering mode - may be requested by setting the
  * output buffer size parameter of the {@link DACChannelConfig} configuration to
  * a value greater than {@code 0} ; whether or not the channel will indeed work
  * in buffering mode and will use an internal output buffer of the size requested
  * is up to the device driver. An application may check whether a channel is
  * working in buffering mode by calling the
- * {@link DACChannelConfig#getOutputBufferSize DACChannelConfig.getOutputBufferSize} method. <br />
+ * {@link DACChannelConfig#getOutputBufferSize DACChannelConfig.getOutputBufferSize} method. <br>
  * When a DAC channel is not working in buffering mode, direct I/O may be
  * enabled by providing direct {@code Buffer}s to the output methods; whether
  * efficient direct output transfers will be used depends on the underlying
@@ -223,29 +223,23 @@
 
     /**
      * Sets the sampling interval scale factor of this DAC channel.
-     * <p />
-     * If the underlying platform or driver does not support the
-     * requested scale factor value then {@code factor} will be <em>rounded
-     * down</em> to aligned to the closest lower supported discrete factor value. The resulting factor can
-     * be retrieved by a call to {@link #getScaleFactor getScaleFactor}.
-     * <p />
-     * If the scale factor - after adjustment - is {@code scale} and the scaled
-     * sampling interval value as returned by
-     * {@link #getSamplingInterval getSamplingInterval} is {@code sInterval}
-     * then the effective sampling interval is re-calculated as follows:
-     * <blockquote>
-     * <pre>
-     * {@code eInterval = (sInterval / scale)}
-     * </pre>
-     * </blockquote>
+     * The current
+     * scaled sampling interval value is reset to the new resulting minimum <em>scaled</em> sampling interval
+     * value. A call to this method should be immediately followed by a call to
+     * the {@link #setSamplingInterval setSamplingInterval} method in order to set
+     * an appropriate <em>scaled</em> sampling interval.
      *
-     * @param factor the scale factor.
+     * @param factor the scale factor (a number greater or equal to {@code 1.0}).
+     * @throws IllegalArgumentException if {@code factor} is {@link Double#NaN NaN}, is less than {@code 1.0} or,
+     * if the setting of the scale factor would result
+     * in the <em>scaled</em> sampling interval range to be outside the range {@code [1 - }{@link Integer#MAX_VALUE}{@code ]}.
      * @throws IOException if some other I/O error occurs.
      * @throws UnavailableDeviceException if this device is not currently
      * available - such as it is locked by another application.
      * @throws ClosedDeviceException if the device has been closed.
      *
      * @see #getScaleFactor
+     * @see #setSamplingInterval
      */
     void setScaleFactor(double factor) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -265,13 +259,15 @@
      * {@code sInterval = (eInterval * scale)}
      * </pre>
      * </blockquote>
+     * <p>
      * The scale factor also applies to the minimum and maximum scaled sampling intervals
      * as respectively returned by {@link #getMinSamplingInterval getMinSamplingInterval}
      * and {@link #getMaxSamplingInterval getMaxSamplingInterval}.
-     * <p />
+     * </p><p>
      * If the sampling interval scale factor was not set previously using
      * {@link #setScaleFactor setScaleFactor}, the device configuration-specific
      * default value is returned.
+     * </p>
      *
      * @return the scale factor.
      * @throws IOException
@@ -291,10 +287,19 @@
      * Whether changing the sampling interval
      * has an immediate effect or not on an active (synchronous or asynchronous) generation is
      * device- as well as platform-dependent.
-     * <p />
+     * <p>
      * If the underlying platform or driver does not support the requested interval value
      * then {@code interval} will be aligned to the closest lower supported discrete interval value. The resulting, actual
      * scaled sampling interval can be retrieved by a call to {@link #getSamplingInterval getSamplingInterval}.
+     * If the current scale factor as returned by
+     * {@link #getScaleFactor getScaleFactor} is {@code scale} and the current scaled
+     * sampling interval value - after alignment - is {@code sInterval}
+     * then the effective sampling interval can be calculated as follows:</p>
+     * <blockquote>
+     * <pre>
+     * {@code eInterval = (sInterval / scale)}
+     * </pre>
+     * </blockquote>
      *
      * @param interval
      *            the scaled output sampling interval (in microseconds).
@@ -317,12 +322,13 @@
     /**
      * Writes the provided raw output value to this channel. The corresponding converted analog
      * output value will be held until it is overwritten by another output generation.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a synchronous
      * output generation upon this channel then an invocation of this method will block until the
      * first operation is complete.
-     * <p />
+     * </p><p>
      * Only one output generation (synchronous or asynchronous) can be going on at any time.
+     * </p>
      *
      * @param value
      *            the raw value to be output.
@@ -344,41 +350,42 @@
     /**
      * Writes a sequence of raw output values from the provided buffer to this channel for
      * conversion.
-     * <p />
+     * <p>
      * The raw output values will be converted according to the current effective output sampling interval
      * as determined by the current scaled sampling interval (see {@link #getSamplingInterval getSamplingInterval})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * </p><p>
      * <i>r</i> integers will be written to this channel, where <i>r</i> is the number of integers
      * remaining in the buffer, that is, {@code src.remaining()}, at the moment this method is
      * invoked.
-     * <p />
+     * </p><p>
      * Suppose that an integer sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}
      * </i>. This integer sequence will be transferred from the buffer starting at index <i>p</i>,
      * where <i>p</i> is the buffer's position at the moment this method is invoked; the index of
      * the last integer written will be <i>{@code p + n - 1}</i>. Upon return the buffer's position
-     * will be equal to <i>{@code p + n}</i>; its limit will not have changed. <br />
+     * will be equal to <i>{@code p + n}</i>; its limit will not have changed. <br>
      * This operation will return only after all of the <i>r</i> raw output values
      * remaining in the provided {@code src} buffer have been written or otherwise
      * transferred to the driver/hardware. If this channel uses an internal output buffer and
      * is therefore working in <a href="#iomodes">buffering mode</a> this method will block until all the
      * <i>r</i> raw output values have been copied to the internal output buffer.
-     * <br />
+     * <br>
      * The buffer's position upon stopping this asynchronous operation by a call
      * to {@link #stopGeneration()  stopGeneration} is not predictable unless called from within the listener.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a synchronous
      * output generation upon this channel, however, then an invocation of this method will block
      * until the first operation is complete.
-     * <p />
+     * </p><p>
      * Only one output generation (synchronous or asynchronous) can be going on at any time.
-     * <p />
+     * </p><p>
      * This method does not throw an {@link IllegalArgumentException} if any of the
      * designated raw values is not within the range defined by {@link #getMinValue getMinValue}
      * and {@link #getMaxValue getMaxValue}. If a value is not within range the actual analog value
      * output by the DAC device is hardware- or driver-specific: the output value may for example be
      * equal to the maximum output value or it may correspond to the raw value where the most
      * significant bits beyond the {@code n} bits of the DAC device resolution have been truncated.
+     * </p>
      *
      * @param src
      *            the buffer from which the integer raw values can be retrieved.
@@ -403,36 +410,36 @@
      * values (samples). More values to be converted are asynchronously fetched by notifying the
      * provided {@link GenerationRoundListener} instance once the whole sequence of raw output values have
      * been converted. The raw output values to be converted are read from the provided buffer.
-     * <p />
+     * <p>
      * Analog output generation can be stopped by a call to {@link #stopGeneration stopGeneration}.
-     * <p />
+     * </p><p>
      * <i>r</i> integers will be written to this channel, where <i>r</i> is the number of integers
      * remaining in the buffer (possibly {@code 0}), that is, {@code src.remaining()}, at the moment
      * this method is initially invoked and then subsequently when the listener is returning.
-     * <p />
+     * </p><p>
      * Suppose that an integer sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}
      * </i>. This integer sequence will be transferred from the buffer starting at index <i>p</i>,
      * where <i>p</i> is the buffer's position at the moment this method is invoked and then
      * subsequently when the listener is returning; the index of the last integer written will be
      * <i>{@code p + n - 1}</i>. Upon invocation of the listener to fetch more values to convert the
-     * buffer's position will be equal to <i>{@code p + n}</i>; its limit will not have changed. <br />
+     * buffer's position will be equal to <i>{@code p + n}</i>; its limit will not have changed. <br>
      * The buffer's position upon stopping this asynchronous operation by a call to
      * {@link #stopGeneration stopGeneration} is not predictable unless called from within the
-     * listener. <br />
+     * listener. <br>
      * If this channel
      * uses an internal output buffer and is therefore working in <a href="#iomodes">buffering mode</a> the listener will only be
      * invoked after all the <i>r</i> raw output values have been copied to the
      * internal output buffer; otherwise the listener will only be invoked after all the
      * <i>r</i> raw output values have been transferred to the driver/hardware.
-     * <p />
+     * </p><p>
      * The raw output values will be converted according to the current effective output sampling interval
      * as determined by the current scaled sampling interval (see {@link #getSamplingInterval getSamplingInterval})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code GenerationRoundListener}
      * the reference to the provided {@code src} buffer can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A buffer with {@code 0} integers remaining to be written (that is a buffer already
      * empty) at the moment this method is initially invoked or then subsequently when the listener
      * is returning will not stop the asynchronous operation; the listener is guaranteed to
@@ -440,20 +447,21 @@
      * notification have been dispatched. The underrun condition resulting from the listener notification
      * returning with an empty buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one output generation (synchronous or asynchronous) can be going on at any time.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffer
      * concurrently may yield unpredictable results.
-     * <p />
+     * </p><p>
      * This method does not throw an {@link IllegalArgumentException} if any of the
      * designated raw values is not within the range defined by {@link #getMinValue getMinValue}
      * and {@link #getMaxValue getMaxValue}. If a value is not within range the actual analog value
      * output by the DAC device is hardware- or driver-specific: the output value may for example be
      * equal to the maximum output value or it may correspond to the raw value where the most
      * significant bits beyond the {@code n} bits of the DAC device resolution have been truncated.
+     * </p>
      *
      * @param src
      *            the buffer from which the integer raw sampled output values are to be retrieved.
@@ -464,6 +472,8 @@
      *             If {@code src} or {@code listener} is {@code null}.
      * @throws IllegalStateException
      *             if another synchronous or asynchronous output generation is already active.
+     * @throws IllegalArgumentException
+     *             if the provided buffer {@code src} has a zero-capacity.
      * @throws UnavailableDeviceException
      *             if this device is not currently available - such as it is locked by another
      *             application.
@@ -480,7 +490,7 @@
     /**
      * Starts asynchronous analog output generation on this channel from a series of raw output
      * values (samples).
-     * <p />
+     * <p>
      * This method behaves identically to
      * {@link #startGeneration(IntBuffer, GenerationRoundListener)} excepts that it uses
      * double-buffering - the provided buffers must not have a zero-capacity and must not overlap
@@ -492,11 +502,11 @@
      * the position of the current working buffer upon stopping this asynchronous operation by a call to
      * {@link #stopGeneration stopGeneration} is not predictable even if called from within the
      * listener.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code GenerationRoundListener}
      * the reference to the  current working buffer (initially {@code src1}) can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A working buffer with {@code 0} integers remaining to be written (that is a buffer
      * already empty) at the moment this method is initially invoked or then subsequently when the
      * listener is returning will not stop the asynchronous operation; the listener is guaranteed to
@@ -504,20 +514,21 @@
      * notification have been dispatched. The underrun condition resulting from the listener notification
      * returning with an empty buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one output generation (synchronous or asynchronous) can be going on at any time.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffers until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffers
      * concurrently may yield unpredictable results.
-     * <p />
+     * </p><p>
      * This method does not throw an {@link IllegalArgumentException} if any of the
      * designated raw values is not within the range defined by {@link #getMinValue getMinValue}
      * and {@link #getMaxValue getMaxValue}. If a value is not within range the actual analog value
      * output by the DAC device is hardware- or driver-specific: the output value may for example be
      * equal to the maximum output value or it may correspond to the raw value where the most
      * significant bits beyond the {@code n} bits of the DAC device resolution have been truncated.
+     * </p>
      *
      * @param src1
      *            the first buffer from which the integer raw sampled output values are to be
@@ -551,8 +562,9 @@
     /**
      * Stops the asynchronous analog output generation on this channel as started by a call to one
      * of the {@link #startGeneration startGeneration} methods.
-     * <p />
+     * <p>
      * This method return silently if no asynchronous analog output generation is currently active.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
--- a/src/share/classes/jdk/dio/dac/DACChannelConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/dac/DACChannelConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -45,17 +45,18 @@
 /**
  * The {@code DACChannelConfig} class encapsulates the hardware addressing information, and static
  * and dynamic configuration parameters of an DAC channel.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code DACChannelConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated DAC channel
  * with the specified configuration. A {@link InvalidDeviceConfigException} is thrown when
  * attempting to open a device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -132,7 +133,7 @@
          * Sets the channel number (default value is {@code UNASSIGNED} if not set).
          *
          * @param channelNumber the channel number (a positive or zero integer)
-         * or {@code DeviceConfig.UNASSIGNED}.
+         * or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code channelNumber} is not in
          * the defined range.
@@ -147,7 +148,7 @@
          * Sets the controller number (default value is {@code UNASSIGNED} if not set).
          *
          * @param controllerNumber the hardware converter's number (a positive
-         * or zero integer) or {@link #UNASSIGNED}.
+         * or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -162,7 +163,7 @@
          * Sets the resolution (default value is {@code UNASSIGNED} if not set).
          *
          * @param resolution the resolution in bits (a positive integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code resolution} is not in the
          * defined range.
@@ -179,7 +180,7 @@
          *
          * @param samplingInterval the initial scaled output sampling interval
          * (the amount of time between two samples) in microseconds (a positive
-         * integer) or {@code DeviceConfig.UNASSIGNED}.
+         * integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code samplingInterval} is not
          * in the defined range.
@@ -196,11 +197,11 @@
          * Sets the initial output sampling interval scale factor
          * (default value is {@code 1.0} if not set).
          *
-         * @param scaleFactor the sampling interval scale
-         * factor (a positive number).
+         * @param scaleFactor the sampling time and sampling interval scale
+         * factor (a number greater or equal to {@code 1.0}).
          * @return this {@code Builder} instance.
-         * @throws IllegalArgumentException if {@code scaleFactor} is not in the
-         * defined range.
+         * @throws IllegalArgumentException if {@code scaleFactor} is {@link Double#NaN NaN} or
+         * is less than {@code 1.0}.
          */
         public Builder setScaleFactor(double scaleFactor) {
             Utils.checkDoubleGreaterThanZero(scaleFactor);
@@ -213,7 +214,7 @@
          *
          * @param outputBufferSize the requested output buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputBufferSize} is not in
          * the defined range.
@@ -232,18 +233,21 @@
     /**
      * Creates a new {@code DACChannelConfig} with the specified hardware addressing information and
      * configuration parameters.
-     * <p />
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested output buffer size is set to {@code UNASSIGNED}.
      * The sampling interval scale factor is set to {@code 1.0}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware converter's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware converter's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param resolution
-     *            the resolution in bits (a positive integer) or {@link #UNASSIGNED}.
+     *            the resolution in bits (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param samplingInterval
      *            the initial output sampling interval in microseconds (a positive integer) or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -267,18 +271,21 @@
     /**
      * Creates a new {@code DACChannelConfig} with the specified hardware addressing information and
      * configuration parameters.
-     * <p />
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested output buffer size is set to {@code UNASSIGNED}.
      * The sampling interval scale factor is set to {@code 1.0}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param resolution
-     *            the resolution in bits (a positive integer) or {@link #UNASSIGNED}.
+     *            the resolution in bits (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param samplingInterval
      *            the initial output sampling interval in microseconds (a positive integer) or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -302,7 +309,6 @@
         checkValues();
     }
 
-
     /**
      * Creates a new {@code DACChannelConfig} whose state is deserialized from the specified {@code InputStream}.
      * This method may be invoked to restore the state of a {@code DACChannelConfig}
@@ -338,7 +344,7 @@
     /**
      * Gets the configured channel number.
      *
-     * @return the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getChannelNumber() {
         return channelNumber;
@@ -347,7 +353,7 @@
     /**
      * Gets the configured controller number.
      *
-     * @return the hardware converter's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware converter's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -371,7 +377,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated output buffer size (a positive or zero integer).
+     * @return the requested or allocated output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -382,18 +388,18 @@
     /**
      * Gets the configured resolution.
      *
-     * @return the resolution in bits (a positive integer) or {@link #UNASSIGNED}.
+     * @return the resolution in bits (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getResolution() {
         return resolution;
     }
 
     /**
-     * Gets the default/initial configured <em>scaled</em> output sampling interval - the amount of time between two
+     * Gets the configured initial <em>scaled</em> output sampling interval - the amount of time between two
      * samples (in microseconds).
      *
-     * @return the default/initial output sampling interval in microseconds (a positive integer) or
-     *         {@link #UNASSIGNED}.
+     * @return the initial output sampling interval in microseconds (a positive integer) or
+     *         {@link #UNASSIGNED UNASSIGNED}.
      *
      * @see #getScaleFactor
      */
@@ -402,9 +408,9 @@
     }
 
     /**
-     * Gets the default/initial configured output sampling interval scale factor.
+     * Gets the configured initial output sampling interval scale factor.
      *
-     * @return the default/initial output sampling interval scale factor (a positive number).
+     * @return the initial output sampling interval scale factor (a number greater or equal to {@code 1.0}).
      *
      * @since 1.1
      */
--- a/src/share/classes/jdk/dio/dac/DACPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/dac/DACPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -33,9 +33,11 @@
 
 /**
  * The {@code DACPermission} class defines permissions for DAC channel access.
- * <p />
+ * <p>
  * The target name contains hardware addressing information. The format is the one defined for the
  * base {@link DevicePermission} class with the following addition:
+ * </p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@link DevicePermission}) is the
@@ -43,7 +45,10 @@
  * {@link DACChannelConfig#getChannelNumber DACChannelConfig.getChannelNumber}. The characters in
  * the string must all be decimal digits.</dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/dac/GenerationRoundListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/dac/GenerationRoundListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -31,12 +31,13 @@
 /**
  * The {@code GenerationRoundListener} interface defines methods for getting notified of the
  * completion of the conversion of a set of raw output values and that more output values to be
- * converted may be provided. <br />
+ * converted may be provided. <br>
  * This interface also indirectly extends the {@link jdk.dio.AsyncErrorHandler
  * AsyncErrorHandler} interface for getting notified of asynchronous I/O errors.
- * <p />
+ * <p>
  * A {@code GenerationRoundListener} can be registered using one of the {@link DACChannel#startGeneration DACChannel.startGeneration}
  * methods.
+ * </p>
  *
  * @see DACChannel#startGeneration DACChannel.startGeneration
  * @since 1.0
--- a/src/share/classes/jdk/dio/dac/InvalidOutputSamplingRateException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/dac/InvalidOutputSamplingRateException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -48,7 +48,7 @@
      * {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public InvalidOutputSamplingRateException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/dac/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/dac/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,50 +24,49 @@
  */
 /**
  * Interfaces and classes for writing analog outputs using a Digital to Analog Converter (DAC).
- * <p />
+ * <p>
  * One DAC converter can have several channels. Each channel can generate an analog output from numeric values that
  * are converted to output voltages.
- * <p />
+ * </p><p>
  * In order to access and control a specific DAC channel, an application should first open and obtain an
  * {@link jdk.dio.dac.DACChannel DACChannel} instance for the DAC channel the application wants to
- * access and control, using its numeric ID, name, type (interface) and/or properties:
+ * access and control, using its numeric ID, name, type (interface) and/or properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * DACChannel channel = (DACChannel) DeviceManager.open(5);
  * </pre>
- *
  * </blockquote></dd>
  * <dt>Using its name and interface</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * DACChannel channel = (DACChannel) DeviceManager.open(&quot;LED&quot;, DACChannel.class, null);
  * </pre>
- *
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * Once the device opened, an application can write output values to a DAC channel using methods of the
  * {@link jdk.dio.dac.DACChannel DACChannel} interface such as the
- * {@link jdk.dio.dac.DACChannel#generate(int) generate} method. <blockquote>
- *
+ * {@link jdk.dio.dac.DACChannel#generate(int) generate} method.
+ * </p>
+ * <blockquote>
  * <pre>
  * channel.generate(brightness);
  * </pre>
- *
  * </blockquote> When done, the application should call the {@link jdk.dio.dac.DACChannel#close
  * DACChannel.close} method to close the DAC channel. <blockquote>
- *
  * <pre>
  * channel.close();
  * </pre>
- *
- * </blockquote> The following sample codes give examples of using the DAC API: <blockquote>
- *
+ * </blockquote>
+ * <p>
+ * The following sample codes give examples of using the DAC API:</p>
+ * <blockquote>
  * <pre>
  * class VaryingDimmer implements GenerationRoundListener {
  *
@@ -118,13 +117,20 @@
  *     }
  * }
  * </pre>
- *
- * </blockquote> Because of performance issue, procedures handling analog outputs, and especially event listeners,
+ * </blockquote>
+ * <p>
+ * Because of performance issue, procedures handling analog outputs, and especially event listeners,
  * should be implemented to be as fast as possible.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
-package jdk.dio.dac;
+package jdk.dio.dac;
\ No newline at end of file
--- a/src/share/classes/jdk/dio/generic/GenericBufferIODevice.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/GenericBufferIODevice.java	Thu Aug 13 12:59:51 2015 +0300
@@ -36,11 +36,13 @@
 /**
  * The {@code GenericBufferIODevice} interface defines generic methods for accessing and controlling
  * devices using read and write operations.
- * <p />
+ * <p>
  * A platform implementer may allow through this interface access and control of devices
  * for which there exist no other more specific API such as
  * {@link jdk.dio.spibus.SPIDevice} or
  * {@link jdk.dio.i2cbus.I2CDevice}.
+ * </p>
+ *
  * @since 1.0
  */
 @apimarker.API("device-io_1.1_generic")
@@ -49,10 +51,10 @@
 
     /**
      * Reads a sequence of bytes from this device into the given buffer.
-     * <p />
+     * <p>
      * The availability of new input data may be notified through an {@link GenericEvent}
      * with ID {@link GenericEvent#INPUT_DATA_AVAILABLE}.
-     * <p />
+     * </p>
      * {@inheritDoc }
      *
      * @param dst
@@ -77,9 +79,10 @@
     /**
      * Reads a sequence of bytes from this device into the given buffer, skipping the first
      * {@code skip} bytes read.
-     * <p />
+     * <p>
      * Apart from skipping the first {@code skip} bytes, this method behaves identically to
      * {@link #read(java.nio.ByteBuffer)}.
+     * </p>
      *
      * @param skip
      *            the number of read bytes that must be ignored/skipped before filling in the
@@ -106,10 +109,10 @@
 
     /**
      * Writes a sequence of bytes to this device from the given buffer.
-     * <p />
+     * <p>
      * An empty output buffer condition may be notified through an {@link GenericEvent}
      * with ID {@link GenericEvent#OUTPUT_BUFFER_EMPTY}.
-     * <p />
+     * </p>
      * {@inheritDoc}
      *
      * @param src
--- a/src/share/classes/jdk/dio/generic/GenericDevice.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/GenericDevice.java	Thu Aug 13 12:59:51 2015 +0300
@@ -34,21 +34,21 @@
 /**
  * The {@code GenericDevice} interface defines methods for setting and getting
  * device-specific configuration and access (I/O) controls as well as registering event listeners.
- * <p/>
+ * <p>
  * A generic device may be identified by the numeric ID and by the name (if any defined) that
  * correspond to its registered configuration. An {@code GenericDevice} instance can be opened by a
  * call to one of the {@link jdk.dio.DeviceManager#open(int)
  * DeviceManager.open(id,...)} methods using its ID or by a call to one of the
  * {@link jdk.dio.DeviceManager#open(java.lang.String, java.lang.Class, java.lang.String[])
  * DeviceManager.open(name,...)} methods using its name.
- * <p />
+ * </p><p>
  * An application can set and get configuration and access (I/O) controls. A control is identified
  * by a {@link GenericDeviceControl} instance and can be set or gotten using the
  * {@link #setControl setControl} and
  * {@link #getControl getControl} methods. Controls can
  * be used to configured a device a well as performing basic input/output operations. The
  * list of controls supported by a device is device-specific.
- * <p />
+ * </p><p>
  * An application can also register an {@link GenericEventListener} instance to monitor native
  * events of the designated type fired by the device. To register a
  * {@link GenericEventListener} instance, the application must call the
@@ -56,11 +56,12 @@
  * be removed by calling the same method with a {@code null} listener parameter. Asynchronous
  * notification may not be supported by all devices. An attempt to set a listener on a device which
  * does not supports it will result in an {@link UnsupportedOperationException} being thrown.
- * <p />
+ * </p><p>
  * A platform implementer may allow through this interface access and control of devices
  * which do not require read and write operations and for which there exist no other more specific
  * API such as {@link jdk.dio.gpio.GPIOPin} or
  * {@link jdk.dio.gpio.GPIOPort}.
+ * </p>
  *
  * @see GenericEventListener
  * @see GenericDeviceControl
@@ -119,19 +120,20 @@
      * type fired by the device associated to this {@code GenericDevice} object. While
      * the listener can be triggered by hardware interrupts, there are no real-time guarantees of
      * when the listener will be called.
-     * <p />
+     * <p>
      * A list of event type IDs is defined in {@link GenericEvent}. This list can be extended with
      * device-specific IDs.
-     * <p />
+     * </p><p>
      * If this {@code GenericDevice} is open in
      * {@link jdk.dio.DeviceManager#SHARED} access mode the listeners registered
      * by all the applications sharing the underlying device will get notified of the events they
      * registered for.
-     * <p />
+     * </p><p>
      * If {@code listener} is {@code null} then the listener previously registered for the specified
      * event type will be removed.
-     * <p />
+     * </p><p>
      * Only one listener can be registered at a particular time for a particular event type.
+     * </p>
      *
      * @param eventId
      *            ID of the native event to listen to.
--- a/src/share/classes/jdk/dio/generic/GenericDeviceConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/GenericDeviceConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -44,21 +44,21 @@
 /**
  * The {@code GenericDeviceConfig} class encapsulates the hardware addressing information of generic
  * device.
- * <br />
  * It does not encapsulates static or dynamic configuration parameters;
  * configuration parameters should be set using the {@link GenericDevice#setControl
  * GenericDevice.setControl} method.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code GenericDeviceConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated generic
  * device with the specified configuration. A {@link InvalidDeviceConfigException} is thrown
  * when attempting to open a device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -129,7 +129,7 @@
          * set).
          *
          * @param channelNumber the channel number (a positive or zero integer)
-         * or {@code DeviceConfig.UNASSIGNED}.
+         * or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code channelNumber} is not in
          * the defined range.
@@ -145,7 +145,7 @@
          * not set).
          *
          * @param controllerNumber the hardware converter's number (a positive
-         * or zero integer) or {@link #UNASSIGNED}.
+         * or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -162,7 +162,7 @@
          *
          * @param inputBufferSize the requested input buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code inputBufferSize} is not in
          * the defined range.
@@ -179,7 +179,7 @@
          *
          * @param outputBufferSize the requested output buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputBufferSize} is not
          * in the defined range.
@@ -198,11 +198,15 @@
     /**
      * Creates a new {@code GenericDeviceConfig} with the specified hardware addressing information
      * .
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware device's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware device's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -223,11 +227,15 @@
 
     /**
      * Creates a new {@code GenericDeviceConfig} with the specified hardware addressing information.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware device's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware device's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if {@code channelNumber} is not in the defined range.
      * @throws NullPointerException
@@ -277,7 +285,7 @@
     /**
      * Gets the configured channel number.
      *
-     * @return the hardware device channel's number (a positive or zero integer) or {@link #UNASSIGNED}
+     * @return the hardware device channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}
      *         .
      */
     public int getChannelNumber() {
@@ -288,7 +296,7 @@
      * Gets the configured controller number.
      *
      * @return the hardware device controller's number (a positive or zero integer) or
-     *         {@link #UNASSIGNED}.
+     *         {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -312,7 +320,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated input buffer size (a positive or zero integer).
+     * @return the requested or allocated input buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -327,7 +335,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated output buffer size (a positive or zero integer).
+     * @return the requested or allocated output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
--- a/src/share/classes/jdk/dio/generic/GenericEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/GenericEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -90,8 +90,8 @@
      * @throws NullPointerException
      *             if {@code device} is {@code null}.
      * @throws IllegalArgumentException
-     *             if {@code id} is negative or if {@code timeStamp} or {@code timeStampMicros} is
-     *             negative.
+     *             if {@code id} is negative or if {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public GenericEvent(GenericDevice device, int id, long timeStamp, int timeStampMicros) {
         // NPE check
--- a/src/share/classes/jdk/dio/generic/GenericEventListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/GenericEventListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -28,7 +28,7 @@
 
 /**
  * The {@code GenericEventListener} interface defines methods for getting notified of events fired
- * by devices that implement the {@link GenericDevice} interface. <br />
+ * by devices that implement the {@link GenericDevice} interface. <br>
  * A {@code GenericEventListener} can be registered using the
  * {@link GenericDevice#setEventListener GenericDevice.setEventListener} method.
  *
--- a/src/share/classes/jdk/dio/generic/GenericPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/GenericPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,9 +32,10 @@
 
 /**
  * The {@code GenericPermission} class defines permissions for g device access.
- * <p />
+ * <p>
  * The target name contains hardware addressing information. The format is the one defined for the
- * base {@link DevicePermission} class with the following addition:
+ * base {@link DevicePermission} class with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@link DevicePermission}) is the
@@ -42,7 +43,10 @@
  * {@link GenericDeviceConfig#getChannelNumber GenericDeviceConfig.getChannelNumber}. The characters
  * in the string must all be decimal digits.</dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/generic/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/generic/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,13 +24,14 @@
  */
 /**
  * Interfaces and classes for controlling devices using generic I/O operations.
- * <p />
+ * <p>
  * The generic device API allows for accessing devices when there are no more specific
  * standard Java API such as {@link jdk.dio.i2cbus.I2CDevice},
  * {@link jdk.dio.spibus.SPIDevice}, {@link jdk.dio.gpio.GPIOPin} or
  * {@link jdk.dio.gpio.GPIOPort}...
- * <p />
- * This API offers 2 main interfaces:
+ * </p><p>
+ * This API offers 2 main interfaces:</p>
+ * <blockquote>
  * <dl>
  * <dt>{@link jdk.dio.generic.GenericDevice}</dt>
  * <dd>Device control operations and event listener registration. A device may implements this sole
@@ -40,42 +41,47 @@
  * {@code GenericDevice} and byte buffer read and write
  * operations.</dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * In order to access a device using its generic interface, an application should first open and
  * obtain a {@code GenericDevice} instance for the device using its
- * numeric ID, name, type (interface) and/or properties:
+ * numeric ID, name, type (interface) and/or properties:</p>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd><blockquote>
- *
  * <pre>
  * GenericDevice device = (GenericDevice) DeviceManager.open(17);
  * </pre>
  * </blockquote></dd>
  * <dt>Using its name and interface</dt>
  * <dd><blockquote>
- *
  * <pre>
  * GeneriBufferIODevice device = DeviceManager.open(&quot;STORAGE&quot;, GeneriBufferIODevice.class, null);
  * </pre>
  * </blockquote></dd>
  * </dl>
+ * <p>
  * Once the device opened, the application can set and get controls, read and write data using
  * methods of the {@code GenericDevice} or
- * {@code GenericBufferIODevice} interfaces. <blockquote>
- *
+ * {@code GenericBufferIODevice} interfaces.</p>
+ * <blockquote>
  * <pre>
  * device.read(buffer, 0, buffer.length);
  * </pre>
- * </blockquote> When done, the application should call the
+ * </blockquote>
+ * <p>
+ * When done, the application should call the
  * {@link jdk.dio.generic.GenericDevice#close GenericDevice.close} method to close
- * the Generic device. <blockquote>
- *
+ * the Generic device.</p>
+ * <blockquote>
  * <pre>
  * device.close();
  * </pre>
- * </blockquote> The following sample code gives an example of using the Generic API to access
- * a Real Time Clock device: <blockquote>
- *
+ * </blockquote>
+ * <p>
+ * The following sample code gives an example of using the Generic API to access
+ * a Real Time Clock device:</p>
+ * <blockquote>
  * <pre>
  * public static final int EVT_ALARM = 0;
  * public static final GenericDeviceControl&lt;Byte&gt; SECONDS = new GenericDeviceControl&lt;&gt;(0, Byte.class);
@@ -113,9 +119,10 @@
  *     }
  * }
  * </pre>
- * </blockquote>The following sample code gives an example of using the Generic API to control
- * and capture audio input from a microphone such a USB microphone exposed as a {@code GenericDevice}:<blockquote>
- *
+ * </blockquote>
+ * <p>The following sample code gives an example of using the Generic API to control
+ * and capture audio input from a microphone such a USB microphone exposed as a {@code GenericDevice}:</p>
+ * <blockquote>
  * <pre>
  * public static final int EVT_VOLUME_CHANGED = 0;
  * public static final GenericDeviceControl&lt;Float&gt; MIC_VOLUME = new GenericDeviceControl&lt;&gt;(0, Float.class);
@@ -148,13 +155,20 @@
  * }
  * </pre>
  * </blockquote>
+ * <p>
  * The preceding examples are using a <em>try-with-resources</em> statement;
  * the {@link jdk.dio.generic.GenericDevice#close GenericDevice.close}
  * method is automatically invoked by the platform at the end of the statement
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException
  * NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/gpio/GPIOPin.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/GPIOPin.java	Thu Aug 13 12:59:51 2015 +0300
@@ -33,7 +33,7 @@
 
 /**
  * The {@code GPIOPin} interface provides methods for controlling a GPIO pin.
- * <p />
+ * <p>
  * A GPIO pin may be identified by the numeric ID and by the name (if any defined) that correspond
  * to its registered configuration. A {@code GPIOPin} instance can be opened by a call to one of the
  * {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using its ID or by a
@@ -44,14 +44,14 @@
  * information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig)
  * DeviceManager.open(config,...)} methods it is not assigned any ID nor name.
- * <p />
+ * </p><p>
  * A GPIO pin may be configured for output or input. Output pins are both writable and readable
  * while input pins are only readable.
- * <p />
+ * </p><p>
  * Once opened, an application can obtain the current value of a GPIO pin by calling the
  * {@link #getValue getValue} method and set its value by calling the {@link #setValue setValue}
  * method.
- * <p/>
+ * </p><p>
  * An application can either monitor a GPIO pin value changes using polling or can register a
  * {@link PinListener} instance which will get asynchronously notified of any pin value changes. To
  * register a {@link PinListener} instance, the application must call the {@link #setInputListener
@@ -59,21 +59,22 @@
  * method with a {@code null} listener parameter. Asynchronous notification is only supported for
  * GPIO pin configured for input. An attempt to set a listener on a GPIO pin configured for output
  * will result in an {@link UnsupportedOperationException} being thrown.
- * <p />
+ * </p><p>
  * When an application is no longer using a GPIO pin it should call the {@link #close close} method
  * to close the GPIO pin. Any further attempt to set or get the value of a GPIO pin which has been
  * closed will result in a {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * The initial direction of a GPIO pin which may be used for output or input as well as
  * the initial value of a GPIO pin set for output is configuration-specific. An application should
  * always initially set the GPIO pin's direction; or first query the GPIO pin's direction then set
  * it if necessary.
- * <p />
+ * </p><p>
  * The underlying platform configuration may allow for some GPIO pins to be set by an application for either
  * output or input while others may be used for input only or output only and their direction cannot
  * be changed by the application. Asynchronous notification of pin value changes is
  * only loosely tied to hardware-level interrupt requests. The platform does not guarantee
  * notification in a deterministic/timely manner.
+ * </p>
  *
  * @see PinListener
  * @see GPIOPinPermission
@@ -114,13 +115,14 @@
      * {@link #setTrigger setTrigger} the device configuration-specific default value is
      * returned. Setting the trigger mode to {@link GPIOPinConfig#TRIGGER_NONE} disables
      * the notification of the {@link PinListener} instance (see {@link #setInputListener
-     * setInputListener} without unregistering it.
+     * setInputListener} without unregistering it. The value returned by this
+     * method is unaffected by changes of the direction on a bidirectional GPIO pin.
      *
      * @return the current pin interrupt trigger, one of: {@link GPIOPinConfig#TRIGGER_NONE},
      *         {@link GPIOPinConfig#TRIGGER_FALLING_EDGE}, {@link GPIOPinConfig#TRIGGER_RISING_EDGE}
      *         , {@link GPIOPinConfig#TRIGGER_BOTH_EDGES}, {@link GPIOPinConfig#TRIGGER_HIGH_LEVEL},
      *         {@link GPIOPinConfig#TRIGGER_LOW_LEVEL}, {@link GPIOPinConfig#TRIGGER_BOTH_LEVELS};
-     *         {@code GPIOPinConfig.TRIGGER_NONE} if this GPIO pin is currently configured for output.
+     *         {@code GPIOPinConfig.TRIGGER_NONE} if this GPIO pin is configured for output-only.
      * @throws IOException
      *             if some other I/O error occurs.
      * @throws UnavailableDeviceException
@@ -134,8 +136,9 @@
     /**
      * Returns the current value of this GPIO pin. If the value was not set previously using
      * {@link #setValue setValue} the device configuration-specific default value is returned.
-     * <p />
+     * <p>
      * This method can be called on both output and input pins.
+     * </p>
      *
      * @return true if this pin is currently <em>high</em>.
      * @throws IOException
@@ -149,10 +152,13 @@
     boolean getValue() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Sets this GPIO pin for output or input.
-     * <p />
-     * An attempt to set the direction of a GPIO pin to a value that is not supported by the
-     * platform configuration will result in a {@link UnsupportedOperationException} being thrown.
+     * Sets this GPIO pin for output or input. The direction can only be set to {@link GPIOPin#INPUT}
+     * if the GPIO pin is configured for input-only (see {@link GPIOPinConfig#DIR_INPUT_ONLY})
+     * or is configured as bidirectional (see {@link GPIOPinConfig#DIR_BOTH_INIT_INPUT} and {@link GPIOPinConfig#DIR_BOTH_INIT_OUTPUT}).
+     * The direction can only be set to {@link GPIOPin#OUTPUT}
+     * if the GPIO pin is configured for output-only (see {@link GPIOPinConfig#DIR_OUTPUT_ONLY})
+     * or is configured as bidirectional (see {@link GPIOPinConfig#DIR_BOTH_INIT_INPUT} and {@link GPIOPinConfig#DIR_BOTH_INIT_OUTPUT}).
+     * The value returned by {@link #getTrigger() getTrigger} is unaffected by changes of the direction on a bidirectional GPIO pin.
      *
      * @param direction
      *            {@link GPIOPin#OUTPUT} for output; {@link GPIOPin#INPUT} for input.
@@ -174,7 +180,9 @@
     void setDirection(int direction) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Sets this GPIO pin trigger mode.
+     * Sets this GPIO pin trigger mode. Setting the trigger mode to {@link GPIOPinConfig#TRIGGER_NONE} disables
+     * the notification of the {@link PinListener} instance (see {@link #setInputListener
+     * setInputListener} without unregistering it.
      *
      * @param trigger
      *            the interrupt trigger events, one of: {@link GPIOPinConfig#TRIGGER_NONE},
@@ -202,16 +210,17 @@
      * Registers a {@link PinListener} instance which will get asynchronously notified when this
      * GPIO pin's value changes and according to the current trigger mode (see {@link #getTrigger
      * getTrigger}). Notification will automatically begin after registration completes.
-     * <p />
+     * <p>
      * If this {@code GPIOPin} is open in {@link DeviceManager#SHARED} access mode and if this
      * {@code GPIOPin} is currently configured for input, the listeners registered by all the
      * applications sharing the underlying GPIO pin will get notified when its value changes.
-     * <p />
+     * </p><p>
      * A listener can only be registered for a GPIO pin currently configured for input.
-     * <p />
+     * </p><p>
      * If {@code listener} is {@code null} then the previously registered listener is removed.
-     * <p />
+     * </p><p>
      * Only one listener can be registered at a particular time.
+     * </p>
      *
      * @param listener
      *            the {@link PinListener} instance to be notified when this GPIO pin's value
@@ -229,9 +238,10 @@
 
     /**
      * Sets the value of this GPIO pin.
-     * <p />
+     * <p>
      * An attempt to set the value on a GPIO pin currently configured for input will result in a
      * {@link UnsupportedOperationException} being thrown.
+     * </p>
      *
      * @param value
      *            the new pin value: {@code true} for <em>high</em>, {@code false} for <em>low</em>.
@@ -246,4 +256,4 @@
      *             if the device has been closed.
      */
     void setValue(boolean value) throws IOException, UnavailableDeviceException, ClosedDeviceException;
-}
+}
\ No newline at end of file
--- a/src/share/classes/jdk/dio/gpio/GPIOPinConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/GPIOPinConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -43,17 +43,18 @@
 /**
  * The {@code GPIOPinConfig} class encapsulates the hardware addressing information, and static and
  * dynamic configuration parameters of a GPIO pin.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code GPIOPinConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated GPIO pin
  * with the specified configuration. A {@link InvalidDeviceConfigException} is thrown when
  * attempting to open a device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -66,43 +67,47 @@
 public final class GPIOPinConfig implements  DeviceConfig<GPIOPin>, DeviceConfig.HardwareAddressing {
 
     /**
-     * Bidirectional port direction with initial input direction.
+     * Bidirectional pin direction with initial input direction.
      */
     public static final int DIR_BOTH_INIT_INPUT = 2;
     /**
-     * Bidirectional port direction with initial output direction.
+     * Bidirectional pin direction with initial output direction.
      */
     public static final int DIR_BOTH_INIT_OUTPUT = 3;
     /**
-     * Input port direction.
+     * Input pin direction.
      */
     public static final int DIR_INPUT_ONLY = 0;
     /**
-     * Output port direction.
+     * Output pin direction.
      */
     public static final int DIR_OUTPUT_ONLY = 1;
     /**
      * Input pull-down drive mode.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other drive mode bit flags.
+     * </p>
      */
     public static final int MODE_INPUT_PULL_DOWN = 2;
     /**
      * Input pull-up drive mode.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other drive mode bit flags.
+     * </p>
      */
     public static final int MODE_INPUT_PULL_UP = 1;
     /**
      * Output open-drain drive mode.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other drive mode bit flags.
+     * </p>
      */
     public static final int MODE_OUTPUT_OPEN_DRAIN = 8;
     /**
      * Output push-pull drive mode.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other drive mode bit flags.
+     * </p>
      */
     public static final int MODE_OUTPUT_PUSH_PULL = 4;
     /**
@@ -180,12 +185,12 @@
          * @return a new initialized {@code GPIOPinConfig} instance.
          * @throws IllegalArgumentException if any of the following is true:
          * <ul>
-         * <li>{@code trigger} is incompatible with the direction(s) designated
-         * by {@code direction};</li>
-         * <li>{@code mode} does not designates a drive mode for or designates a
-         * drive mode incompatible (as specified by {@link #setDriveMode setDriveMode})
-         * with the direction(s) designated by
-         * {@code direction}.</li>
+         * <li>the interrupt trigger event setting is incompatible with the direction setting:
+         * if the direction is set to output-only then the trigger mode must be
+         * {@link #TRIGGER_NONE}.</li>
+         * <li>the drive mode setting is incompatible with the direction setting: if
+         * the direction is set to both input and output then the drive mode
+         * must specify both an input drive mode and an output drive mode.</li>
          * </ul>
          * @throws IllegalStateException if any of the following is true:
          * <ul>
@@ -216,7 +221,7 @@
          * Sets the pin number (default value is {@code UNASSIGNED} if not set).
          *
          * @param pinNumber the pin number (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code pinNumber} is not in the
          * defined range.
@@ -232,7 +237,7 @@
          * not set).
          *
          * @param controllerNumber the controller number (a positive or zero
-         * integer) or {@link #UNASSIGNED}.
+         * integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -277,12 +282,9 @@
          * Sets the pin drive mode (default value is {@code UNASSIGNED} if not
          * set).
          *
-         * @param mode the pin drive mode: either {@link #UNASSIGNED} or a
+         * @param mode the pin drive mode: either {@link #UNASSIGNED UNASSIGNED} or a
          * bitwise OR of at least one of: {@link #MODE_INPUT_PULL_UP}, {@link #MODE_INPUT_PULL_DOWN} ,
-         *            {@link #MODE_OUTPUT_PUSH_PULL}, {@link #MODE_OUTPUT_OPEN_DRAIN}; if
-         * the pin can be set in both input and output direction then the mode
-         * must specify both an input drive mode and an output drive mode (bit
-         * mask).
+         *            {@link #MODE_OUTPUT_PUSH_PULL}, {@link #MODE_OUTPUT_OPEN_DRAIN}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if any of the following is true:
          * <ul>
@@ -305,9 +307,7 @@
          * @param trigger the initial interrupt trigger events, one of: {@link #TRIGGER_NONE},
          *            {@link #TRIGGER_FALLING_EDGE}, {@link #TRIGGER_RISING_EDGE},
          *            {@link #TRIGGER_BOTH_EDGES}, {@link #TRIGGER_HIGH_LEVEL},
-         *            {@link #TRIGGER_LOW_LEVEL}, {@link #TRIGGER_BOTH_LEVELS}; if the pin
-         * is set for output-only then {@code trigger} must be
-         * {@link #TRIGGER_NONE}.
+         *            {@link #TRIGGER_LOW_LEVEL}, {@link #TRIGGER_BOTH_LEVELS}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code trigger} is not in the
          * defined range.
@@ -327,17 +327,20 @@
     /**
      * Creates a new {@code GPIOPinConfig} with the specified hardware addressing information and
      * configuration parameters.
+     * <p>
+     * The controller name is set to {@code null}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware port's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware port's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param pinNumber
-     *            the hardware pin's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware pin's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param direction
      *            the allowed and initial direction of the pin, one of: {@link #DIR_INPUT_ONLY},
      *            {@link #DIR_OUTPUT_ONLY}, {@link #DIR_BOTH_INIT_INPUT},
      *            {@link #DIR_BOTH_INIT_OUTPUT}.
      * @param mode
-     *            the drive mode of the pin: either {@link #UNASSIGNED} or a bitwise OR of at least one
+     *            the drive mode of the pin: either {@link #UNASSIGNED UNASSIGNED} or a bitwise OR of at least one
      *            of: {@link #MODE_INPUT_PULL_UP}, {@link #MODE_INPUT_PULL_DOWN} ,
      *            {@link #MODE_OUTPUT_PUSH_PULL}, {@link #MODE_OUTPUT_OPEN_DRAIN}; if the pin can be
      *            set in both input and output direction then the mode must specify both an input
@@ -383,17 +386,20 @@
     /**
      * Creates a new {@code GPIOPinConfig} with the specified hardware addressing information and
      * configuration parameters.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param pinNumber
-     *            the hardware pin's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware pin's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param direction
      *            the allowed and initial direction of the pin, one of: {@link #DIR_INPUT_ONLY},
      *            {@link #DIR_OUTPUT_ONLY}, {@link #DIR_BOTH_INIT_INPUT},
      *            {@link #DIR_BOTH_INIT_OUTPUT}.
      * @param mode
-     *            the drive mode of the pin: either {@link #UNASSIGNED} or a bitwise OR of at least one
+     *            the drive mode of the pin: either {@link #UNASSIGNED UNASSIGNED} or a bitwise OR of at least one
      *            of: {@link #MODE_INPUT_PULL_UP}, {@link #MODE_INPUT_PULL_DOWN} ,
      *            {@link #MODE_OUTPUT_PUSH_PULL}, {@link #MODE_OUTPUT_OPEN_DRAIN}; if the pin can be
      *            set in both input and output direction then the mode must specify both an input
@@ -475,7 +481,7 @@
     /**
      * Gets the configured pin drive mode.
      *
-     * @return the pin drive mode: either {@link #UNASSIGNED} or a bitwise OR of at least one of :
+     * @return the pin drive mode: either {@link #UNASSIGNED UNASSIGNED} or a bitwise OR of at least one of :
      *         {@link #MODE_INPUT_PULL_UP}, {@link #MODE_INPUT_PULL_DOWN},
      *         {@link #MODE_OUTPUT_PUSH_PULL}, {@link #MODE_OUTPUT_OPEN_DRAIN}.
      */
@@ -495,7 +501,7 @@
     /**
      * Gets the configured pin number.
      *
-     * @return the hardware pin's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware pin's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getPinNumber() {
         return pinNumber;
@@ -504,7 +510,7 @@
     /**
      * Gets the configured controller number for the pin.
      *
-     * @return the hardware port's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware port's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
--- a/src/share/classes/jdk/dio/gpio/GPIOPinPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/GPIOPinPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code GPIOPinPermission} class defines permissions for GPIO pin access.
- * <p />
+ * <p>
  * A {@code GPIOPinPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the
- * base {@link DevicePermission} class with the following addition:
+ * base {@link DevicePermission} class with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@link DevicePermission}) is the
@@ -44,11 +45,16 @@
  * {@link GPIOPinConfig#getPinNumber GPIOPinConfig.getPinNumber}. The characters in the string must
  * all be decimal digits.</dd>
  * </dl>
- * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}, and {@code setdirection} defined as follows:
+ * </blockquote>
+ * <p>
+ * The supported actions are {@code open} and {@code powermanage} as defined in
+ * {@link DevicePermission}, and {@code setdirection} defined as follows:</p>
+ * <blockquote>
  * <dl>
  * <dt>{@code setdirection}</dt>
  * <dd>change GPIO pin direction (see {@link GPIOPin#setDirection GPIOPin.setDirection})</dd>
  * </dl>
+ * </blockquote>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/gpio/GPIOPort.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/GPIOPort.java	Thu Aug 13 12:59:51 2015 +0300
@@ -33,15 +33,15 @@
 
 /**
  * The {@code GPIOPort} interface provides methods for controlling a GPIO port.
- * <p />
+ * <p>
  * Each GPIO port is identified by a numeric ID and optionally by a name.
- * <p />
+ * </p><p>
  * A GPIO port is a platform-defined or an ad-hoc grouping of GPIO pins that may be configured for output or
  * input. Output ports are both writable and readable while input ports are only readable.
  * Whether GPIO pins that are part of a platform-defined GPIO port can be retrieved and controlled individually as
  * {@link GPIOPin} instances depends on the hardware and platform configuration (and especially
  * whether the GPIO pins can be shared through different abstractions).
- * <p />
+ * </p><p>
  * A GPIO port may be identified by the numeric ID and by the name (if any defined) that
  * correspond to its registered configuration. A {@code GPIOPort} instance can be opened by a call
  * to one of the {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using
@@ -52,15 +52,15 @@
  * addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig)
  * DeviceManager.open(config,...)} methods it is not assigned any ID nor name.
- * <p />
+ * </p><p>
  * Once opened, an application can obtain the current value of a GPIO port by calling the
  * {@link #getValue getValue} method and set its value by calling the {@link #setValue setValue}
- * method. <br />
+ * method. <br>
  * A GPIO port has a minimum/maximum value range. The minimum value is zero. An application can
  * check the maximum value by calling {@link #getMaxValue getMaxValue} method. An attempt to set a
  * GPIO port with a value that exceeds its maximum range value will result in an
  * {@link IllegalArgumentException} being thrown.
- * <p/>
+ * </p><p>
  * An application can either monitor a GPIO port value changes using polling or can register a
  * {@link PortListener} instance which will get asynchronously notified of any value changes. To
  * register a {@link PortListener} instance, the application must call the {@link #setInputListener
@@ -68,29 +68,55 @@
  * method with a {@code null} listener parameter. Asynchronous notification is only supported for
  * GPIO port configured for input. An attempt to set a listener on a GPIO port configured for output
  * will result in an {@link UnsupportedOperationException} being thrown.
- * <p />
+ * </p><p>
  * When an application is no longer using a GPIO port it should call the {@link #close close} method
  * to close the GPIO port. Any further attempt to set or get the value of a GPIO port which has been
  * closed will result in a {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * The initial direction of a GPIO port which may be used for output or input as well as
  * the initial value of a GPIO port set for output is configuration-specific. An application should
  * always initially set the GPIO port's direction; or first query the GPIO port's direction then set
  * it if necessary.
- * <p />
+ * </p><p>
  * The underlying platform configuration may allow for some GPIO ports to be set by an application for either
  * output or input while others may be used for input only or output only and their direction cannot
  * be changed by an application. Asynchronous notification of port value changes is
  * only loosely tied to hardware-level interrupt requests. The platform does not guarantee
- * notification in a deterministic/timely manner.
+ * notification in a deterministic/timely manner.</p>
  * <h3><a name="permission">Permission Requirement For Ad Hoc GPIO Ports</a></h3>
  * Opening a {@code GPIOPort} instance with an ad-hoc configuration is subject
- * to {@link jdk.dio.gpio.GPIOPortPermission GPIOPortPermission.OPEN} permission checks. <br />
+ * to {@link jdk.dio.gpio.GPIOPortPermission GPIOPortPermission.OPEN} permission checks. <br>
  * When opening an instance of {@code GPIOPort} defined as an ad-hoc grouping of GPIO pins
  * the target of the {@link jdk.dio.gpio.GPIOPortPermission GPIOPortPermission.OPEN} permissions
- * designate the controller or controllers of the GPIO pins that compose the port.
+ * designate the controller or controllers of the GPIO pins that compose the port;
+ * therefore if a GPIO port is composed with pins from different controllers
+ * then the {@code GPIOPortPermission.OPEN} permissions for each of these controllers has to be granted.
  * Opening such an ad-hoc grouping of GPIO pins is, in addition, subject to {@link jdk.dio.gpio.GPIOPinPermission GPIOPinPermission.OPEN} permission checks
  * on all the GPIO pins that compose the port.
+ * <p>
+ * Opening a {@code GPIOPort} with the following ad hoc sample configuration:</p>
+ * <blockquote>
+ * <pre>
+ * GPIOPinConfig.Builder builder = new GPIOPinConfig.Builder()
+ *     .setDirection(GPIOPinConfig.DIR_OUTPUT_ONLY)
+ *     .setDriveMode(GPIOPinConfig.MODE_OUTPUT_PUSH_PULL);
+ * GPIOPortConfig config = new GPIOPortConfig(GPIOPortConfig.DIR_OUTPUT_ONLY, 0x0,
+ *      builder.setControllerNumber(1).setPinNumber(0).build(),
+ *      builder.setControllerNumber(4).setPinNumber(7).build()
+  * );
+ * </pre>
+ * </blockquote>
+ * <p>
+ * requires the following permissions to be granted:
+ * </p>
+ * <blockquote>
+ * <pre>
+ * GPIOPortPermission("1", "open")
+ * GPIOPortPermission("4", "open")
+ * GPIOPinPermission("1:0", "open")
+ * GPIOPinPermission("4:7", "open")
+ * </pre>
+ * </blockquote>
  *
  * @see PortListener
  * @see GPIOPortPermission
@@ -146,8 +172,9 @@
      * Returns the current value of this GPIO port. The value returned should be interpreted as an
      * unsigned 32-bit integer. If the value was not set previously using {@link #setValue setValue}
      * the device configuration-specific default value is returned.
-     * <p />
+     * <p>
      * This method can be called on both output and input ports.
+     * </p>
      *
      * @return the current value of this GPIO port.
      * @throws IOException
@@ -161,10 +188,12 @@
     int getValue() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Sets this GPIO port for output or input.
-     * <p />
-     * An attempt to set the direction of a GPIO port to a value that is not supported by the
-     * platform configuration will result in a {@link UnsupportedOperationException} being thrown.
+     * Sets this GPIO port for output or input. The direction can only be set to {@link GPIOPort#INPUT}
+     * if the GPIO port is configured for input-only (see {@link GPIOPortConfig#DIR_INPUT_ONLY})
+     * or is configured as bidirectional (see {@link GPIOPortConfig#DIR_BOTH_INIT_INPUT} and {@link GPIOPortConfig#DIR_BOTH_INIT_OUTPUT}).
+     * The direction can only be set to {@link GPIOPort#OUTPUT}
+     * if the GPIO pin is configured for output-only (see {@link GPIOPortConfig#DIR_OUTPUT_ONLY})
+     * or is configured as bidirectional (see {@link GPIOPortConfig#DIR_BOTH_INIT_INPUT} and {@link GPIOPortConfig#DIR_BOTH_INIT_OUTPUT}).
      *
      * @param direction
      *            {@link GPIOPort#OUTPUT} for output; {@link GPIOPort#INPUT} for input.
@@ -189,16 +218,17 @@
      * Registers a {@link PortListener} instance which will get asynchronously notified when this
      * GPIO port's value changes and according to its trigger mode.
      * Notification will automatically begin after registration completes.
-     * <p />
+     * <p>
      * A listener can only be registered for a GPIO port currently configured for input.
-     * <p />
+     * </p><p>
      * If this {@code GPIOPort} is open in {@link DeviceManager#SHARED} access mode and if this
      * {@code GPIOPort} is currently configured for input, the listeners registered by all the
      * applications sharing the underlying GPIO port will get notified when its value changes.
-     * <p />
+     * </p><p>
      * If {@code listener} is {@code null} then the previously registered listener is removed.
-     * <p />
+     * </p><p>
      * Only one listener can be registered at a particular time.
+     * </p>
      *
      * @param listener
      *            the {@link PortListener} instance to be notified when this GPIO port's value
@@ -217,9 +247,10 @@
     /**
      * Sets the value of this GPIO port. The value passed should be interpreted as an unsigned
      * 32-bit integer.
-     * <p />
+     * <p>
      * An attempt to set the value on a GPIO port currently configured for input will result in a
      * {@link UnsupportedOperationException} being thrown.
+     * </p>
      *
      * @param value
      *            the new port value.
@@ -239,10 +270,11 @@
 
     /**
      * Gets the pins composing the port (in the exact same order they compose the port).
-     * <p />
+     * <p>
      * A concurrent runtime change of the
      * dynamic configuration parameters of any of the pins composing the port (such as of its direction) may result in
      * {@code IOException} being thrown by port operations.
+     * </p>
      *
      * @return the pins composing the port (a defensive copy is returned); or {@code null} if
      * the composing pins cannot be individually retrieved.
--- a/src/share/classes/jdk/dio/gpio/GPIOPortConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/GPIOPortConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -44,22 +44,39 @@
 /**
  * The {@code GPIOPortConfig} class encapsulates the hardware addressing information, and static and
  * dynamic configuration parameters of a GPIO port.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code GPIOPortConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated GPIO port
  * with the specified configuration. A {@link InvalidDeviceConfigException} is thrown when
  * attempting to open a device with an invalid or unsupported configuration.
- * <p />
+ * </p><p>
  * The value change notification trigger of a GPIO port is defined by the interrupt trigger(s) configured
  * for its pins (see {@link GPIOPinConfig#getTrigger GPIOPinConfig.getTrigger}). Any of
  * the {@code GPIOPin}s configured with an interrupt trigger (other than {@link GPIOPinConfig#TRIGGER_NONE})
  * that compose a {@code GPIOPort} may trigger a notification for that {@code GPIOPort}.
+ * </p><p>
+ * The following sample code illustrates how a 4-pin GPIO port configuration may be built
+ * with pins from the same GPIO controller:</p>
+ * <blockquote>
+ * <pre>
+ * GPIOPinConfig.Builder builder = new GPIOPinConfig.Builder()
+ *     .setControllerNumber(1)
+ *     .setDirection(GPIOPinConfig.DIR_OUTPUT_ONLY)
+ *     .setDriveMode(GPIOPinConfig.MODE_OUTPUT_PUSH_PULL);
+ * GPIOPortConfig config = new GPIOPortConfig(GPIOPortConfig.DIR_OUTPUT_ONLY, 0x0,
+ *      builder.setPinNumber(0).build(),
+ *      builder.setPinNumber(1).build(),
+ *      builder.setPinNumber(2).build(),
+ *      builder.setPinNumber(3).build()
+ * );
+ * </pre>
+ * </blockquote>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -101,12 +118,13 @@
     /**
      * Creates a new {@code GPIOPortConfig} with the specified hardware addressing information and
      * configuration parameters.
-     * <p />
+     * <p>
      * If the access modes (exclusive or shared) supported by the designated
      * {@code GPIOPin}s are incompatible with those required by the underlying {@code GPIOPort}
      * device or device driver, attempting to open
      * the {@code GPIOPort} device using this configuration may result in a
      * {@link InvalidDeviceConfigException} to be thrown.
+     * </p>
      *
      * @param direction
      *            the allowed and initial direction of the port, one of: {@link #DIR_INPUT_ONLY},
@@ -122,7 +140,17 @@
      *             <li>{@code direction} is not one of the defined values;</li>
      *             <li>{@code pins.length} is {@code 0};</li>
      *             <li>if any of the provided pin configurations does not support the specified
-     *             direction.</li>
+     *             direction; more precisely:
+     *             <ul>
+     *             <li>if {@code direction} is {@link #DIR_BOTH_INIT_INPUT} or
+     *            {@link #DIR_BOTH_INIT_OUTPUT} and any of the provided pin
+     *            configurations' direction is {@link GPIOPinConfig#DIR_INPUT_ONLY} or {@link GPIOPinConfig#DIR_OUTPUT_ONLY};</li>
+     *             <li>if {@code direction} is {@link #DIR_INPUT_ONLY} and any of the provided pin
+     *            configurations' direction is {@link GPIOPinConfig#DIR_OUTPUT_ONLY};</li>
+     *             <li>if {@code direction} is {@link #DIR_OUTPUT_ONLY} and any of the provided pin
+     *            configurations' direction is {@link GPIOPinConfig#DIR_INPUT_ONLY};</li>
+     *             </ul>
+     *             </li>
      *             </ul>
      * @throws NullPointerException
      *             if {@code pins} is {@code null}.
@@ -198,9 +226,9 @@
     }
 
     /**
-     * Gets the configured default/initial value of the port, if configured for output.
+     * Gets the configured initial value of the port, if configured for output.
      *
-     * @return the port's default/initial output value.
+     * @return the port's initial output value.
      */
     public int getInitValue() {
         return initValue;
@@ -223,10 +251,11 @@
 
     /**
      * Gets the pins composing the port (in the exact same order they compose the port).
-     * <p />
+     * <p>
      * A concurrent runtime change of the
      * dynamic configuration parameters of any of the pins composing the port (such as of its direction) may result in
      * {@code IOException} being thrown by port operations.
+     * </p>
      *
      * @return the pins composing the port (a defensive copy is returned); or {@code null}
      * if this {@code GPIOPortConfig} instance is not associated to an actual {@code GPIOPort} instance -
--- a/src/share/classes/jdk/dio/gpio/GPIOPortPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/GPIOPortPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,21 +32,27 @@
 
 /**
  * The {@code GPIOPortPermission} class defines permissions for GPIO port access.
- * <p />
+ * <p>
  * A {@code GPIOPortPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the
- * base {@link DevicePermission} class with the following addition:
+ * base {@link DevicePermission} class with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@link DevicePermission}) must be
  * the empty string ({@code ""}).</dd>
  * </dl>
- * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}, and {@code setdirection} defined as follows:
+ * </blockquote>
+ * <p>
+ * The supported actions are {@code open} and {@code powermanage} as defined in
+ * {@link DevicePermission}, and {@code setdirection} defined as follows:</p>
+ * <blockquote>
  * <dl>
  * <dt>{@code setdirection}</dt>
  * <dd>change GPIO port direction (see {@link GPIOPort#setDirection GPIOPort.setDirection})</dd>
  * </dl>
+ * </blockquote>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/gpio/PinEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/PinEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -71,7 +71,8 @@
      * @throws NullPointerException
      *             if {@code pin} is {@code null}.
      * @throws IllegalArgumentException
-     *             if {@code timeStamp} or {@code timeStampMicros} is negative.
+     *             if {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public PinEvent(GPIOPin pin, boolean value, long timeStamp, int timeStampMicros) {
         // checks for null
--- a/src/share/classes/jdk/dio/gpio/PinListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/PinListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -28,9 +28,10 @@
 
 /**
  * The {@code PinListener} interface defines methods for getting notified of GPIO pin value changes.
- * <p />
+ * <p>
  * A {@code PinListener} can be registered using the {@link GPIOPin#setInputListener
  * GPIOPin.setInputListener} method.
+ * </p>
  *
  * @see GPIOPin
  * @since 1.0
--- a/src/share/classes/jdk/dio/gpio/PortEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/PortEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -71,7 +71,8 @@
      * @throws NullPointerException
      *             if {@code port} is {@code null}.
      * @throws IllegalArgumentException
-     *             if {@code timeStamp} or {@code timeStampMicros} is negative.
+     *             if {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public PortEvent(GPIOPort port, int value, long timeStamp, int timeStampMicros) {
         // checks for null
--- a/src/share/classes/jdk/dio/gpio/PortListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/PortListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -27,9 +27,10 @@
 /**
  * The {@code PortListener} interface defines methods for getting notified of GPIO port value
  * changes.
- * <p />
+ * <p>
  * A {@code PortListener} can be registered using the {@link GPIOPort#setInputListener
  * GPIOPort.setInputListener} method.
+ * </p>
  *
  * @see GPIOPort
  * @since 1.0
--- a/src/share/classes/jdk/dio/gpio/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/gpio/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -25,39 +25,39 @@
 /**
  * Interfaces and classes for reading and writing from/to GPIO (General Purpose Input Output) pins
  * and ports of the device.
- * <p/>
+ * <p>
  * A GPIO port is a platform-defined or an ad-hoc grouping of GPIO pins that may be configured for output or
  * input. Whether GPIO pins that are part of a platform-defined GPIO port can be retrieved and controlled individually as
  * {@code GPIOPin} instances depends on the hardware and platform configuration (and especially
  * whether the GPIO pins can be shared through different abstractions).
- * <p/>
+ * </p><p>
  * In order to use a specific pin or port, an application should first open and obtain a
  * {@link jdk.dio.gpio.GPIOPin} instance or
  * {@link jdk.dio.gpio.GPIOPort} instance, respectively, for the pin or port it
- * wants to use using its numeric ID, name, type (interface) and/or properties:
- * <ul>
- * <li>Using its ID <blockquote>
- *
+ * wants to use using its numeric ID, name, type (interface) and/or properties:</p>
+ * <blockquote><dl>
+ * <dt>Using its ID</dt><dd><blockquote>
  * <pre>
  * GPIOPin pin = (GPIOPin) DeviceManager.open(1);
  * GPIOPort port = (GPIOPort) DeviceManager.open(0);
  * </pre>
- * </blockquote></li>
- * <li>Using its name and interface <blockquote>
- *
+ * </blockquote></dd>
+ * <dt>Using its name and interface</dt><dd><blockquote>
  * <pre>
  * GPIOPin pin = (GPIOPin) DeviceManager.open(&quot;LED_PIN&quot;, GPIOPin.class, null);
  * GPIOPort port = (GPIOPort) DeviceManager.open(&quot;LCD_DATA_PORT&quot;, GPIOPort.class, null);
  * </pre>
- * </blockquote></li>
- * </ul>
+ * </blockquote></dd>
+ * </dl></blockquote>
+ * <p>
  * Once a pin opened, an application can obtain the current value of a GPIO pin by calling the
  * {@link jdk.dio.gpio.GPIOPin#getValue GPIOPin.getValue} method and set its value by calling the
- * {@link jdk.dio.gpio.GPIOPin#setValue GPIOPin.setValue} method. <br />
+ * {@link jdk.dio.gpio.GPIOPin#setValue GPIOPin.setValue} method. <br>
  * Once a port opened, an application can obtain the current value of a GPIO port by calling the
  * {@link jdk.dio.gpio.GPIOPort#getValue GPIOPort.getValue} method and set its value by calling the
- * {@link jdk.dio.gpio.GPIOPort#setValue GPIOPort.setValue} method. <blockquote>
- *
+ * {@link jdk.dio.gpio.GPIOPort#setValue GPIOPort.setValue} method.
+ * </p>
+ * <blockquote>
  * <pre>
  * pin.setValue(true);
  * port.setValue(0xFF);
@@ -66,16 +66,17 @@
  * {@link jdk.dio.gpio.GPIOPin#close GPIOPin.close} or
  * {@link jdk.dio.gpio.GPIOPort#close GPIOPort.close} method to close the pin or
  * port, respectively. <blockquote>
- *
  * <pre>
  * pin.close();
  * port.close();
  * </pre>
- * </blockquote> The following sample code gives an example of using the GPIO API. It shows how to
+ * </blockquote>
+ * <p>
+ * The following sample code gives an example of using the GPIO API. It shows how to
  * control GPIO Pins. It registers a pin listener for the GPIO input pin a switch button is attached
  * to. When the button is pressed the listener is notified to turn the LED on or off by setting
- * accordingly the GPIO output pin the LED is attached to. <blockquote>
- *
+ * accordingly the GPIO output pin the LED is attached to.</p>
+ * <blockquote>
  * <pre>
  * try (GPIOPin switchPin = (GPIOPin) DeviceManager.open(1); GPIOPin ledPin = (GPIOPin) DeviceManager.open(3)) {
  *     switchPin.setInputListener(new PinListener() {
@@ -93,22 +94,30 @@
  *     <i>// handle exception</i>
  * }
  * </pre>
- * </blockquote> The preceding example is using a <em>try-with-resources</em> statement;
+ * </blockquote>
+ * <p>
+ * The preceding example is using a <em>try-with-resources</em> statement;
  * the {@link jdk.dio.gpio.GPIOPin#close GPIOPin.close} method is
  * automatically invoked by the platform at the end of the statement.
- * <p />
+ * </p><p>
  * The underlying platform configuration may allow for some GPIO pins or ports to be set
  * by an application for either output or input while others may be used for input only or output
  * only and their direction can not be changed by an application. The asynchronous
  * notification of pin or port value changes is only loosely tied to hardware-level interrupt
  * requests. The platform does not guarantee notification in a deterministic/timely manner.
- * <p/>
+ * </p><p>
  * Because of performance issue, procedures handling GPIO pins, and especially event listeners,
  * should be implemented to be as fast as possible.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException
  * NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/i2cbus/I2CCombinedMessage.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/i2cbus/I2CCombinedMessage.java	Thu Aug 13 12:59:51 2015 +0300
@@ -36,9 +36,9 @@
  * START bit and ends with a STOP bit. But each of read and write messages
  * constituting the combined message following the very first of these messages
  * starts with a REPEATED START bit (one that is not preceded by a STOP bit).
- * <p />
- * Here is an example of a combined message to several slaves: <blockquote>
- *
+ * <p>
+ * Here is an example of a combined message to several slaves:</p>
+ * <blockquote>
  * <pre>
  * try (I2CDevice slave1 = DeviceManager.open("TEMP", I2CDevice.class, null);
  *         I2CDevice slave2 = DeviceManager.open("EEPROM", I2CDevice.class, null)) {
@@ -53,17 +53,20 @@
  *     <i>// Handle exception</i>
  * }
  * </pre>
- * </blockquote> The preceding example is using a
+ * </blockquote>
+ * <p>
+ * The preceding example is using a
  * <em>try-with-resources</em> statement; the
  * {@link I2CDevice#close I2CDevice.close} method is automatically invoked by
  * the platform at the end of the statement.
- * <p />
+ * </p><p>
  * While a combined message containing a single read or a single write
  * or a write followed by a read to the same I2C slave device can be constructed
  * using this class, it is more effective to use directly the {@link I2CDevice#read(ByteBuffer) I2CDevice.read},
  * {@link I2CDevice#write(ByteBuffer) I2CDevice.write}, {@link I2CDevice#read(int, int, ByteBuffer)
  * I2CDevice.read(subaddress,...)} {@link I2CDevice#write(int, int, ByteBuffer)
  * I2CDevice.write(subaddress,...)} methods for that purpose.
+ * </p>
  *
  * @since 1.0
  */
@@ -74,13 +77,14 @@
      * Appends a read message/operation from the provided I2C slave device.
      * Reads up to {@code rxBuf.remaining()} bytes of data from the provided slave
      * device into the buffer {@code rxBuf}.
-     * <p />
+     * <p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@link #transfer() transfer} method has been invoked and has returned.
-     * <p />
+     * </p><p>
      * The appended operation will have a behavior equivalent to that of the
      * {@link I2CDevice#read(java.nio.ByteBuffer)} method.
+     * </p>
      *
      * @param slave the I2C slave device to read from.
      * @param rxBuf the buffer into which the data is read.
@@ -100,13 +104,14 @@
      * Reads up to {@code rxBuf.remaining()} bytes of data from the provided slave
      * device into the buffer {@code rxBuf} skipping the first {@code rxSkip}
      * bytes read.
-     * <p />
+     * <p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@link #transfer() transfer} method has been invoked and has returned.
-     * <p />
+     * </p><p>
      * The appended operation will have a behavior equivalent to that of the
      * {@link I2CDevice#read(int, java.nio.ByteBuffer)} method.
+     * </p>
      *
      * @param slave the I2C slave device to read from.
      * @param rxSkip the number of read bytes that must be ignored/skipped
@@ -128,13 +133,14 @@
      * Appends a write message/operation from the provided I2C slave device.
      * Writes to the provided slave device {@code txBuf.remaining()} bytes from the
      * buffer {@code txBuf}.
-     * <p />
+     * <p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@link #transfer() transfer} method has been invoked and has returned.
-     * <p />
+     * </p><p>
      * The appended operation will have a behavior equivalent to that of the
      * {@link I2CDevice#write(java.nio.ByteBuffer)} method.
+     * </p>
      *
      * @param slave the I2C slave device to write to.
      * @param txBuf the buffer containing the bytes to write.
@@ -154,11 +160,11 @@
      * Transfers this combined message. This will result in each of the
      * contained messages/operations to be sent/executed in the same order they
      * have been appended to this combined message.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a transaction
      * (see {@link jdk.dio.Transactional}) or, a read or write operation upon any of the targeted slave devices,
      * however, then an invocation of this method will block until the first operation is complete.
-     * <p />
+     * </p><p>
      * Once transferred no additional operation can be appended anymore to this
      * combined message. Any such attempt will result in a
      * {@link IllegalStateException} to be thrown.
@@ -166,9 +172,10 @@
      * the same sequence of operations. The data transferred
      * to or from each of the provided {@code ByteBuffer}s is determined by their respective current {@code position}
      * and {@code remaining} attributes at the time this method is call.
-     * <br />
+     * <br>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffers until the transfer has completed.
+     * </p>
      *
      * @return an array (possibly empty) containing the number of bytes read for each of the read
      * operations of this combined message; the results of each read operations
--- a/src/share/classes/jdk/dio/i2cbus/I2CDevice.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/i2cbus/I2CDevice.java	Thu Aug 13 12:59:51 2015 +0300
@@ -38,7 +38,7 @@
 /**
  * The {@code I2CDevice} interface provides methods for sending and receiving data to/from an I2C
  * slave device.
- * <p />
+ * <p>
  * An I2C slave device may be identified by the numeric ID and by the name (if any defined) that
  * correspond to its registered configuration. An {@code I2CDevice} instance can be opened by a call
  * to one of the {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using
@@ -49,17 +49,19 @@
  * addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig)
  * DeviceManager.open(config,...)} methods it is not assigned any ID nor name.
- * <p />
+ * </p><p>
  * On an I2C bus, data is transferred between the I2C master device and an I2C slave device through
- * single or combined messages:
+ * single or combined messages:</p>
+ * <blockquote>
  * <dl>
  * <dt><b>Single Messages</b></dt>
  * <dd>The I2C master reads data from an I2C slave device. An application can read from an I2C slave
- * device using one of the {@link #read read} methods. <br />
+ * device using one of the {@link #read read} methods. <br>
  * The I2C master writes data to an I2C slave device. An application can write to an I2C slave
  * device using one of the {@link #write write} methods.</dd>
  * <dt><b>Combined Messages Messages</b></dt>
  * <dd>The I2C master issues at least two reads and/or writes to one or more slaves.
+ * <blockquote>
  * <dl>
  * <dt><b>To a single slave</b></dt>
  * <dd> An application can use the methods {@link #read(int, int, ByteBuffer) read(subaddress, subaddressSize,...)} and
@@ -70,15 +72,17 @@
  * <dd>An application can issue several reads and/or writes to several slaves using a
  * {@link I2CCombinedMessage} object.</dd>
  * </dl>
+ * </blockquote>
  * </dd>
  * </dl>
- * <p />
+ * </blockquote>
+ * <p>
  * When the data exchange is over, an application should call the {@link #close close} method to
  * close the I2C slave device. Any further attempt to write to or read from an I2C slave device
  * which has been closed will result in a {@link ClosedDeviceException} been thrown.
- * <p/>
+ * </p><p>
  * Opening an {@link I2CDevice} instance is subject to permission checks (see {@link I2CPermission}
- * ).
+ * ).</p>
  * <h3><a name="tx">I2C Transactions</a></h3>
  * Depending on the underlying platform and driver capabilities an {@code I2CDevice} instance may additionally implement
  * the {@link jdk.dio.Transactional Transactional} interface to indicate that it supports I2C transactions. In such a case the {@link jdk.dio.Transactional#begin Transactional.begin}
@@ -87,7 +91,6 @@
  * The following example illustrates the use of {@link Transactional#begin begin} and {@link Transactional#end end} to implement the
  * same behavior as that of the {@link #read(int, int, ByteBuffer) read(subaddress, subaddressSize,...)} method:
  * <blockquote>
- *
  * <pre>
  * I2CDevice device = ...;
  * if (device instanceof Transactional) {
@@ -136,7 +139,7 @@
     /**
      * Retrieves the {@code Bus} instance representing the I2C bus this device is
      * connected to.
-     * <br />
+     * <br>
      * Even if this device is closed, a {@code Bus} instance for
      * this device can still be retrieved.
      *
@@ -150,10 +153,11 @@
     /**
      * Reads one byte of data from this slave device. The byte is returned as an {@code int} in the
      * range {@code 0} to {@code 255}.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @return the unsigned 8-bit value read.
      * @throws IOException
@@ -168,26 +172,27 @@
 
     /**
      * Reads a sequence of bytes from this slave device into the given buffer.
-     * <p />
+     * <p>
      * An attempt is made to read up to <i>r</i> bytes from the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code dst.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is read, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred into the buffer so that the first byte in the sequence
      * is at index <i>p</i> and the last byte is at index <i>{@code p + n - 1}</i>, where <i>p</i>
      * is the buffer's position at the moment this method is invoked. Upon return the buffer's
      * position will be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A read operation will block until the requested <i>r</i> bytes are read.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already
      * initiated a read upon this device, however, then an invocation
      * of this method will block until the first operation is complete.
+     * </p>
      *
      * @param dst
      *            the buffer into which bytes are to be transferred.
@@ -208,9 +213,10 @@
     /**
      * Reads a sequence of bytes from this device into the given buffer, skipping the first
      * {@code skip} bytes read.
-     * <p />
+     * <p>
      * Apart from skipping the first {@code skip} bytes, this method behaves identically to
      * {@link #read(java.nio.ByteBuffer)}.
+     * </p>
      *
      * @param skip
      *            the number of read bytes that must be ignored/skipped before filling in the
@@ -236,22 +242,23 @@
      * Reads a sequence of bytes from a subaddress or register address of this slave device into the
      * given buffer. The most significant bytes (MSB) of the subaddress or register address are
      * transferred first.
-     * <p />
+     * <p>
      * An attempt is made to read up to <i>r</i> bytes from the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code dst.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is read, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred into the buffer so that the first byte in the sequence
      * is at index <i>p</i> and the last byte is at index <i>{@code p + n - 1}</i>, where <i>p</i>
      * is the buffer's position at the moment this method is invoked. Upon return the buffer's
      * position will be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A read operation will block until the requested <i>r</i> bytes are read.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param subaddress
      *            the slave device's subaddress or register address from where to start reading.
@@ -280,22 +287,23 @@
      * Reads a sequence of bytes from a subaddress or register address of this device into the given
      * buffer, skipping the first {@code skip} bytes read. The most significant bytes (MSB) of the
      * subaddress or register address are transferred first.
-     * <p />
+     * <p>
      * An attempt is made to read up to <i>r</i> bytes from the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code dst.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is read, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred into the buffer so that the first byte in the sequence
      * is at index <i>p</i> and the last byte is at index <i>{@code p + n - 1}</i>, where <i>p</i>
      * is the buffer's position at the moment this method is invoked. Upon return the buffer's
      * position will be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A read operation will block until the requested <i>r</i> bytes are read.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param subaddress
      *            the slave device's subaddress or register address from where to start reading.
@@ -325,22 +333,23 @@
 
     /**
      * Writes a sequence of bytes to this slave device from the given buffer.
-     * <p />
+     * <p>
      * An attempt is made to write up to <i>r</i> bytes to the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code src.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred from the buffer starting at index <i>p</i>, where
      * <i>p</i> is the buffer's position at the moment this method is invoked; the index of the last
      * byte written will be <i>{@code p + n - 1}</i>. Upon return the buffer's position will be
      * equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A write operation will return only after writing all of the <i>r</i> requested bytes.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param src
      *            the buffer from which bytes are to be retrieved.
@@ -361,10 +370,11 @@
     /**
      * Writes one byte to this slave device. The eight low-order bits of the argument {@code data}
      * are written. The 24 high-order bits of {@code srcData} are ignored.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param srcData
      *            the byte to be written.
@@ -382,22 +392,23 @@
      * Writes a sequence of bytes to a subaddress or register address of this slave device from the
      * given buffer. The most significant bytes (MSB) of the subaddress or register address are
      * transferred first.
-     * <p />
+     * <p>
      * An attempt is made to write up to <i>r</i> bytes to the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code src.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred from the buffer starting at index <i>p</i>, where
      * <i>p</i> is the buffer's position at the moment this method is invoked; the index of the last
      * byte written will be <i>{@code p + n - 1}</i>. Upon return the buffer's position will be
      * equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A write operation will return only after writing all of the <i>r</i> requested bytes.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param subaddress
      *            the slave device's subaddress or register address where to start writing.
--- a/src/share/classes/jdk/dio/i2cbus/I2CDeviceConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/i2cbus/I2CDeviceConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -43,17 +43,18 @@
 /**
  * The {@code I2CDeviceConfig} class encapsulates the hardware addressing information, and static
  * and dynamic configuration parameters of an I2C slave device.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code I2CDeviceConfig} can be passed to the
  * {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated I2C slave
  * device with the specified configuration. A {@link InvalidDeviceConfigException} is thrown
  * when attempting to open a device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -144,9 +145,9 @@
          * Sets the address of the slave device on the bus.
          *
          * @param address the address of the slave device on the bus (a positive
-         * or zero integer).
+         * or zero integer, strictly lesser than 2<sup>{@code addressSize}</sup>).
          * @param addressSize the address size: {@link #ADDR_SIZE_7} bits,
-         * {@link #ADDR_SIZE_10} bits or {@link #UNASSIGNED}.
+         * {@link #ADDR_SIZE_10} bits.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if any of the following is true:
          * <ul>
@@ -167,7 +168,7 @@
          * value is {@code UNASSIGNED} if not set).
          *
          * @param controllerNumber the number of the bus the slave device is
-         * connected to (a positive or zero integer) or {@link #UNASSIGNED}.
+         * connected to (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -184,7 +185,7 @@
          *
          * @param inputBufferSize the requested input buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code inputBufferSize} is not in
          * the defined range.
@@ -201,7 +202,7 @@
          *
          * @param outputBufferSize the requested output buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputBufferSize} is not
          * in the defined range.
@@ -217,7 +218,7 @@
          * {@code UNASSIGNED} if not set).
          *
          * @param clockFrequency the clock frequency of the slave device in Hz
-         * (a positive integer) or {@link #UNASSIGNED}.
+         * (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code clockFrequency} is not in
          * the defined range.
@@ -239,18 +240,20 @@
     /**
      * Creates a new {@code I2CDeviceConfig} with the specified hardware addressing information and
      * configuration parameters.
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerNumber
      *            the number of the bus the slave device is connected to (a positive or zero
-     *            integer) or {@link #UNASSIGNED}.
-     * @param address
-     *            the address of the slave device on the bus (a positive or zero integer).
-     * @param addressSize
-     *            the address size: {@link #ADDR_SIZE_7} bits, {@link #ADDR_SIZE_10} bits or
-     *            {@link #UNASSIGNED}.
+     *            integer) or {@link #UNASSIGNED UNASSIGNED}.
+     * @param address the address of the slave device on the bus (a positive or zero integer, strictly lesser than
+     * 2<sup>{@code addressSize}</sup>).
+     * @param addressSize the address size: {@link #ADDR_SIZE_7} bits, {@link #ADDR_SIZE_10} bits.
      * @param clockFrequency
      *            the clock frequency of the slave device in Hz (a positive integer) or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -274,17 +277,19 @@
     /**
      * Creates a new {@code I2CDeviceConfig} with the specified hardware addressing information and
      * configuration parameters.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the name of the bus the slave device is connected to (such as its <em>device file</em> name on UNIX systems).
-     * @param address
-     *            the address of the slave device on the bus (a positive or zero integer).
-     * @param addressSize
-     *            the address size: {@link #ADDR_SIZE_7} bits, {@link #ADDR_SIZE_10} bits or
-     *            {@link #UNASSIGNED}.
+     * @param address the address of the slave device on the bus (a positive or zero integer, strictly lesser than
+     * 2<sup>{@code addressSize}</sup>).
+     * @param addressSize the address size: {@link #ADDR_SIZE_7} bits, {@link #ADDR_SIZE_10} bits.
      * @param clockFrequency
      *            the clock frequency of the slave device in Hz (a positive integer) or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -349,7 +354,7 @@
      * Gets the configured address size of the I2C slave device.
      *
      * @return the address size: {@link #ADDR_SIZE_7} bits, {@link #ADDR_SIZE_10} bits or
-     *         {@link #UNASSIGNED}.
+     *         {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getAddressSize() {
         return addressSize;
@@ -359,7 +364,7 @@
      * Gets the configured controller number (the controller number the I2C bus adapter the I2C slave device
      * is connected to).
      *
-     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -382,7 +387,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated input buffer size (a positive or zero integer).
+     * @return the requested or allocated input buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -397,7 +402,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated output buffer size (a positive or zero integer).
+     * @return the requested or allocated output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -409,7 +414,7 @@
      * Gets the configured clock frequency (in Hz) supported by the I2C slave device.
      *
      * @return the clock frequency of the slave device in Hz (a positive integer) or
-     *         {@link #UNASSIGNED}.
+     *         {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getClockFrequency() {
         return clockFrequency;
--- a/src/share/classes/jdk/dio/i2cbus/I2CPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/i2cbus/I2CPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code I2CPermission} class defines permissions for I2C slave device access.
- * <p />
+ * <p>
  * A {@code I2CPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the
- * base {@link DevicePermission} class with the following addition:
+ * base {@link DevicePermission} class with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>The <code>{channel-desc}</code> string (described in {@link DevicePermission}) is the
@@ -44,7 +45,10 @@
  * to {@link I2CDeviceConfig#getAddress I2CDeviceConfig.getAddress}. The characters in the string
  * must all be hexadecimal digits.</dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
--- a/src/share/classes/jdk/dio/i2cbus/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/i2cbus/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,46 +24,43 @@
  */
 /**
  * Interfaces and classes for I2C (Inter-Integrated Circuit Bus) device access.
- * <p />
+ * <p>
  * The functionalities supported by this API are those of an I2C master.
- * <p />
+ * </p><p>
  * In order to communicate with a specific slave device, an application should first open and obtain
  * an {@link jdk.dio.i2cbus.I2CDevice} instance for the I2C slave device the
  * application wants to exchange data with, using its numeric ID, name, type (interface) and/or
  * properties:
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd><blockquote>
- *
  * <pre>
  * I2CDevice slave = (I2CDevice) DeviceManager.open(3);
  * </pre>
  * </blockquote></dd>
  * <dt>Using its name and interface</dt>
  * <dd><blockquote>
- *
  * <pre>
  * I2CDevice slave = DeviceManager.open(&quot;ADC1&quot;, I2CDevice.class, null);
  * </pre>
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
  * Once the device opened, the application can exchange data with the I2C slave device using
  * methods of the {@link jdk.dio.i2cbus.I2CDevice} interface such as the
  * {@link jdk.dio.i2cbus.I2CDevice#write(ByteBuffer) write} method. <blockquote>
- *
  * <pre>
  * slave.write(sndBuf, 0, 1);
  * </pre>
  * </blockquote> When the data exchange is over, the application should call the
  * {@link jdk.dio.i2cbus.I2CDevice#close I2CDevice.close} method to close the I2C
  * slave device. <blockquote>
- *
  * <pre>
  * slave.close();
  * </pre>
  * </blockquote> The following sample code gives an example of using the I2C API to communicate with
  * an I2C slave device: <blockquote>
- *
  * <pre>
  * try (I2CDevice slave = DeviceManager.open(&quot;LED_CONTROLLER&quot;, I2CDevice.class, null)) {
  *     ByteBuffer stopCmd = ByteBuffer.wrap(LED_STOP_COMMAND);
@@ -92,17 +89,25 @@
  *     <i>// handle exception</i>
  * }
  * </pre>
- * </blockquote> The preceding example is using a <em>try-with-resources</em> statement;
+ * </blockquote>
+ * <p>
+ * The preceding example is using a <em>try-with-resources</em> statement;
  * the {@link jdk.dio.i2cbus.I2CDevice#close I2CDevice.close} method is
  * automatically invoked by the platform at the end of the statement.
- * <p />
+ * </p><p>
  * Information about the I2C-bus specification can be found at <a
  * href="http://www.nxp.com/documents/user_manual/UM10204.pdf"
  * >http://www.nxp.com/documents/user_manual/UM10204.pdf</a>.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException
  * NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/modem/ModemSignalEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/modem/ModemSignalEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -87,8 +87,8 @@
      * @throws NullPointerException
      *             if {@code device} is {@code null}.
      * @throws IllegalArgumentException
-     *             if {@code signalID} is not a valid signal ID or if {@code timeStamp} or {@code timeStampMicros} is
-     *             negative.
+     *             if {@code signalID} is not a valid signal ID or if {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public ModemSignalEvent(P device, int signalID, boolean signalState, long timeStamp, int timeStampMicros) {
         this.device = device;
--- a/src/share/classes/jdk/dio/modem/ModemSignalsControl.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/modem/ModemSignalsControl.java	Thu Aug 13 12:59:51 2015 +0300
@@ -41,38 +41,44 @@
 
     /**
      * Clear To Send (CTS) signal.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other signal bit flags.
+     * </p>
      */
     public static final int CTS_SIGNAL = 32;
     /**
      * Data Carrier Detect (DCD) signal.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other signal bit flags.
+     * </p>
      */
     public static final int DCD_SIGNAL = 2;
     /**
      * Data Set Ready (DSR) signal.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other signal bit flags.
+     * </p>
      */
     public static final int DSR_SIGNAL = 4;
     /**
      * Data Terminal Ready (DTR) signal.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other signal bit flags.
+     * </p>
      */
     public static final int DTR_SIGNAL = 1;
     /**
      * Ring Indicator (RI) signal.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other signal bit flags.
+     * </p>
      */
     public static final int RI_SIGNAL = 8;
     /**
      * Ready To Send (RTS) signal.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other signal bit flags.
+     * </p>
      */
     public static final int RTS_SIGNAL = 16;
 
@@ -99,10 +105,11 @@
     /**
      * Registers a {@link ModemSignalListener} instance which will get asynchronously notified when one of the
      * designated signals changes. Notification will automatically begin after registration completes.
-     * <p />
+     * <p>
      * If {@code listener} is {@code null} then the previously registered listener will be removed.
-     * <p />
+     * </p><p>
      * Only one listener can be registered at a particular time.
+     * </p>
      *
      * @param listener
      *            the {@link ModemSignalListener} instance to be notified when a signal state changes.
--- a/src/share/classes/jdk/dio/modem/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/modem/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,9 +24,15 @@
  */
 /**
  * Interfaces and classes for controlling MODEM signals.
- * <p />
+ * <p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -27,10 +27,16 @@
  * defined types and can be accessed and control by the means of
  * {@link jdk.dio.Device} sub-interfaces. Devices are registered
  * under a device ID and with optionally a name and a set of properties.
- * <p />
+ * <p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException
  * NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/power/PowerManaged.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/power/PowerManaged.java	Thu Aug 13 12:59:51 2015 +0300
@@ -31,13 +31,13 @@
 /**
  * The {@code PowerManaged} interface provides methods that a {@link Device} class may implement to control how the
  * underlying device hardware resource is managed by the power management facility of the device.
- * <p />
+ * <p>
  * The power management states defined are device as well as host device-dependent. For devices on a
  * microcontroller unit, there may be no distinction between {@link #POWER_OFF}, {@link #LOW_POWER} and
  * {@link #LOWEST_POWER} and they may for example all be supported by clock-gating the unused devices. Conversely, a
  * device external to the host device could support the four power management modes and could especially be
  * powered off.
- * <p />
+ * </p><p>
  * A power state change may be dictated by the power management facility of the device or it may be requested by the
  * power management facility on behalf of the application itself or of another application (see
  * {@link #requestPowerStateChange requestPowerStateChange}). A power state change for a specific device may be requested
@@ -46,9 +46,9 @@
  * GPIO pin controlled by the same GPIO controller; the application will get notified of any power state changes
  * requested by the other application. Devices currently open by an application whose power managements
  * are logically or physically dependent belong to the same power management group (see {@link Group}).
- * <p />
+ * </p><p>
  * An application may register to get notified of power state changes. When notified, the application may take the
- * following actions:
+ * following actions:</p>
  * <ol>
  * <li>the application may save or restore the state/configuration of the device if needed. Saving the device's
  * state/configuration may be needed when the application is being notified of a power state change requested by another
@@ -64,29 +64,30 @@
  * the specified duration if the application anticipates it will use the designated device earlier than the
  * specified duration.</li>
  * </ol>
- * <p />
+ * <p>
  * If application-dictated power saving for a device is not explicitly enabled by a call to one of the
  * {@link #enablePowerSaving enablePowerSaving} methods the default power saving strategy of the platform applies.
  * This strategy is <em>platform as well as implementation-dependent</em>. It may define power saving rules (changing
  * the power state of a device when certain conditions are met) that may or may not differ from device
  * device to device. It may, for example, consist in forcefully changing all devices' power state to
  * {@link #LOWEST_POWER} upon some condition; in such a situation, attempting to access the device without restoring
- * its state/configuration may result in unexpected behavior. Therefore an application should always either:
+ * its state/configuration may result in unexpected behavior. Therefore an application should always either:</p>
  * <ol>
  * <li>register for power state changes on the devices it uses</li>
  * <li>or, register for system-wide power state changes (if supported by the platform) and close the devices when
  * going to power saving modes that may not preserve the device state/context and then open again the devices
  * when returning from such power saving modes.</li>
  * </ol>
- * <p />
- * <br />
+ * <p>
+ * <br>
  * When an application has enabled application-dictated power saving for several devices that belong to the same
  * power management group (by a call to one of the {@link #enablePowerSaving enablePowerSaving} methods) the effective
  * set of enabled power states is the intersection of the individually sets of enabled power states (bitwise AND). This
  * corresponds to the power states enabled for the group. If one of the device is subsequently closed the
- * power states enabled for the group MUST reflect the change.
+ * power states enabled for the group MUST reflect the change.</p>
  * <h3><a name="transitions">Valid Power State Transitions</a></h3>
  * The valid power state transitions are as follows:
+ * <blockquote>
  * <dl>
  * <dt>From the higher power states (lesser power saving states) to the lower power states (higher power saving states):
  * </dt>
@@ -112,6 +113,7 @@
  * {@link #requestPowerStateChange requestPowerStateChange} has expired the device's power state always transitions to
  * {@link #POWER_ON}.</dd>
  * </dl>
+ * </blockquote>
  *
  * @see PowerSavingHandler
  * @since 1.0
@@ -131,41 +133,45 @@
     /**
      * Low power mode (may save less power while preserving more device context/state than
      * {@link #LOWEST_POWER}, hence allowing for a faster return to full performance).
-     * <p />
+     * <p>
      * When transitioning from this state to {@link #POWER_ON} no state/configuration restoration of the device
      * device must be needed.
-     * <p />
+     * </p><p>
      * This bit flag can be bitwise-combined (OR) with other power state bit flags.
+     * </p>
      */
     int LOW_POWER = 2;
 
     /**
      * Lowest power mode (may save more power while preserving less device context/state than
      * {@link #LOW_POWER}, hence only allowing for a slower return to full performance).
-     * <p />
+     * <p>
      * When transitioning from this state to {@link #POWER_ON} some state/configuration restoration of the device
      * device may be needed. This state/configuration restoration of the device may be handled by a
      * {@link PowerSavingHandler}.
-     * <p />
+     * </p><p>
      * This bit flag can be bitwise-combined (OR) with other power state bit flags.
+     * </p>
      */
     int LOWEST_POWER = 4;
 
     /**
      * Power has been fully removed from the device (for example from an external device).
-     * <p />
+     * <p>
      * When transitioning from this state to {@link #POWER_ON} a complete state/configuration restoration of the
      * device may be needed. This state/configuration restoration of the device may be handled by
      * a {@link PowerSavingHandler}.
-     * <p />
+     * </p><p>
      * This bit flag can be bitwise-combined (OR) with other power state bit flags.
+     * </p>
      */
     int POWER_OFF = 8;
 
     /**
      * Fully powered on.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other power state bit flags.
+     * </p>
      */
     int POWER_ON = 1;
 
@@ -177,9 +183,10 @@
     /**
      * Disables application-dictated power saving for the {@link Device} instance. The power saving strategy of the
      * platform applies.
-     * <p />
+     * <p>
      * If a {@link PowerSavingHandler} instance was registered using
      * {@link #enablePowerSaving(int, jdk.dio.power.PowerSavingHandler)} it will be unregistered.
+     * </p>
      *
      * @throws ClosedDeviceException
      *             if the device has been closed.
@@ -196,14 +203,15 @@
      * the {@link Device} instance to a state different from those specified will be automatically vetoed. The power
      * management facility will not forcefully change the power state of the {@link Device} instance to a state
      * different from those specified unless in case of urgency.
-     * <p />
+     * <p>
      * By using the {@link #requestPowerStateChange requestPowerStateChange} method an application may override this directive and
      * request a power state change to a state other than those specified.
-     * <p />
+     * </p><p>
      * The {@link #POWER_ON} state is always implicitly enabled.
-     * <p />
+     * </p><p>
      * Subsequent calls to this method silently override any previous settings of enabled power states as well as
      * registered {@link PowerSavingHandler}.
+     * </p>
      *
      * @param powerStates
      *            bitwise OR of enabled power states: {@link #LOW_POWER}, {@link #LOWEST_POWER} or {@link #POWER_OFF}.
@@ -227,17 +235,18 @@
      * from those specified will be automatically vetoed. The power management facility will not forcefully change the
      * power state of the {@link Device} instance to a state different from those specified unless in case of
      * urgency.
-     * <p />
+     * <p>
      * By using the {@link #requestPowerStateChange requestPowerStateChange} method an application may override this directive and
      * request a power state change to a state other than those specified.
-     * <p />
+     * </p><p>
      * The {@link #POWER_ON} state is always implicitly enabled.
-     * <p />
+     * </p><p>
      * Since only the specified power states are enabled, the application will only be notified of changes to these
      * states (including the {@link #POWER_ON} state).
-     * <p />
+     * </p><p>
      * Subsequent calls to this method silently override any previous settings of enabled power states as well as
      * registered {@link PowerSavingHandler}.
+     * </p>
      *
      * @param powerStates
      *            bitwise OR of enabled power states: {@link #LOW_POWER}, {@link #LOWEST_POWER} or {@link #POWER_OFF}.
@@ -274,20 +283,21 @@
      * Requests the change of the device's current power state to the specified power state for the specified
      * duration. The power state change may be vetoed by the system or by other applications, or the actual duration of
      * the power state change may be lesser than the requested duration.
-     * <p />
+     * <p>
      * If a {@link PowerSavingHandler} instance has been registered by the current application, it will not get notified
      * of the requested power state change (neither its request nor its confirmation); it will only get notified when returning back to the {@link #POWER_ON} state
      * or of any interleaving power state changes requested by the system or by other applications.
-     * <p />
+     * </p><p>
      * If the device is already in the requested power state no notification will be performed and the remaining
      * duration of the current state will be set to the smallest of the requested duration and the currently remaining
      * duration.
-     * <p />
+     * </p><p>
      * Any invalid power state request (see <a href="#transitions">Valid Power State Transitions</a>) is automatically
      * vetoed and {@code 0} is returned.
-     * <p />
+     * </p><p>
      * A transition to the {@link #POWER_ON} state can never be vetoed such as to not deny device access to other
      * applications and the {@code duration} parameter is ignored and always assumed to be {@link #UNLIMITED_DURATION}.
+     * </p>
      *
      * @param powerState
      *            the new power state of the {@link Device} instance: {@link #POWER_ON}, {@link #LOW_POWER},
@@ -312,12 +322,13 @@
 
     /**
      * Returns the power management {@code Group} this device belongs to.
-     * <p />
+     * <p>
      * A compliant implementation MAY return the same {@code Group} instance (application-wise)
      * upon subsequent calls
      * to this {@code PowerManaged} {@code Device} instance or to other
      * {@code PowerManaged} {@code Device} instances belonging to that same
      * power management {@code Group} (until that {@code Group} is closed - see {@link Group}).
+     * </p>
      *
      * @return the {@code Group} this device belongs to.
      *
@@ -341,14 +352,15 @@
      * of the devices opened by the application belonging to that group. If an
      * application has registered for both notifications on an individual device belonging to a group and for notifications
      * on that same group notifications will happen on all registered handlers. Notification on the group happens last.
-     * <p />
+     * <p>
      * Devices belonging to the same group may not necessarily be of the same type.
-     * <p />
+     * </p><p>
      * When all the {@code Device} instances open by an application and belonging to the same power management group
      * have been closed the {@code Group} instance corresponding to that group enters an irreversible {@code closed} state:
      * power state changes are no longer notified on that {@code Group}.
-     * <p />
+     * </p><p>
      * A compliant implementation MUST guarantee the thread-safety of {@code Group} instances.
+     * </p>
      *
      * @since 1.0
      */
@@ -359,8 +371,9 @@
          * Registers a {@code PowerSavingHandler} instance to get asynchronously notified when the power management
          * facility is about to change the power state of this group, hence allowing the application to veto the power
          * state change.
-         * <p />
+         * <p>
          * If {@code handler} is {@code null} then the previously registered {@code PowerSavingHandler} is unregistered.
+         * </p>
          *
          * @param handler the {@link PowerSavingHandler} instance to be notified when a power state change is requested
          * for this group.
--- a/src/share/classes/jdk/dio/power/PowerSavingHandler.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/power/PowerSavingHandler.java	Thu Aug 13 12:59:51 2015 +0300
@@ -28,20 +28,22 @@
 
 /**
  * The {@code PowerSavingHandler} interface defines methods for getting notified of power state change requests on a
- * specific {@link Device} instance. <br />
+ * specific {@link Device} instance. <br>
  * A {@code PowerSavingHandler} can be registered using the
  * {@link PowerManaged#enablePowerSaving(int, jdk.dio.power.PowerSavingHandler) } method.
- * <p />
- * A power saving handler should implement the following requirements:
+ * <p>
+ * A power saving handler should implement the following requirements:</p>
  * <ul>
  * <li>it should be implemented to be as fast as possible; for example it should not call any operations that may block,
  * nor pause the current thread.</li>
  * <li>it should not throw any unchecked exception.</li>
  * </ul>
+ * <p>
  * A compliant implementation of this specification MUST catch unchecked exceptions that may be thrown by a power saving
  * handler and MAY guard against a hanging handler by timing out in order to guarantee the notification of all the
  * registered power saving handlers. A compliant implementation of this specification MUST ignore such unresponsive
  * or failing power saving handler invocations.
+ * </p>
  *
  * @see PowerManaged
  * @since 1.0
@@ -58,14 +60,15 @@
      * example the application is currently using or is about to use the designated device. An application may grant
      * a power state change duration lesser than the specified duration if for example the application anticipates it
      * will use the designated device earlier than the specified duration.
-     * <p />
+     * <p>
      * Since a transition to the {@link PowerManaged#POWER_ON} state can never be vetoed such as to not deny device
      * access to other applications this method is never invoked prior to a transition to the
      * {@link PowerManaged#POWER_ON} state.
-     * <p />
+     * </p><p>
      * Once this method has been called on all the {@code PowerSavingHandler}s registered for the device the
      * {@link #handlePowerStateChange handlePowerStateChange} method is invoked on these same {@code PowerSavingHandler}s with the smallest
      * of the negotiated durations unless the power state change has been vetoed.
+     * </p>
      *
      * @param <P>
      *            the type of the device for which a power state change is requested.
@@ -120,4 +123,4 @@
      *            unlimited or unknown.
      */
     <P extends Device<? super P>> void handlePowerStateChange(P device, PowerManaged.Group group, int currentState, int requestedState, long duration);
-}
+}
\ No newline at end of file
--- a/src/share/classes/jdk/dio/power/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/power/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,12 +24,13 @@
  */
 /**
  * Interfaces and classes for power management of devices.
- * <p />
+ * <p>
  * A {@link jdk.dio.Device} implementing class may implement the
  * {@link jdk.dio.power.PowerManaged} interface if the underlying device supports some form
  * of power management and saving states that can be mapped to the states defined by this API.
- * <p />
- * The following sample code gives an examples of using the power saving/management API: <blockquote>
+ * </p><p>
+ * The following sample code gives an examples of using the power saving/management API:</p>
+ * <blockquote>
  *
  * <pre>
  * class SignalLevelMonitor implements MonitoringListener, PowerSavingHandler {
@@ -80,9 +81,15 @@
  * </pre>
  *
  * </blockquote>
- * <p />
+ * <p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/pwm/GenerationEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/GenerationEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -28,7 +28,7 @@
 
 /**
  * The {@code GenerationEvent} class encapsulates pulse a generation completion condition (i.e. generated pulse count
- * value reached). <br />
+ * value reached). <br>
  * {@code GenerationEvent}s are <em>never coalesced</em>.
  *
  * @see PWMChannel
@@ -74,7 +74,8 @@
      * @throws NullPointerException
      *             if {@code channel} is {@code null}.
      * @throws IllegalArgumentException
-     *             if {@code count}, {@code timeStamp} or {@code timeStampMicros} is negative.
+     *             if {@code count} or {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public GenerationEvent(PWMChannel channel, int count, long timeStamp, int timeStampMicros) {
         if (null == channel) {
--- a/src/share/classes/jdk/dio/pwm/GenerationListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/GenerationListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -30,8 +30,9 @@
 /**
  * The {@code GenerationListener} interface defines methods for getting notified of pulse generation completion
  * conditions (i.e. maximum generated pulse count value reached) as well as device errors.
- * <p />
+ * <p>
  * A {@code GenerationListener} can be registered using the {@link PWMChannel#startGeneration(int, int, jdk.dio.pwm.GenerationListener) PWMChannel.startGeneration} method.
+ * </p>
  *
  * @see PWMChannel#startGeneration(int, int, GenerationListener)
  * @since 1.0
@@ -41,10 +42,11 @@
 
     /**
      * Invoked when the generated pulse count has reached the maximum value.
-     * <p />
+     * <p>
      * The corresponding pulse generation operation being completed another <em>asynchronous</em> pulse generation
      * operation may be started from within this method (see {@link PWMChannel#startGeneration}. This may be used to
      * generate a subsequent pulse train with different specifications: pulse period and/or width/duty cycle.
+     * </p>
      *
      * @param event
      *            the event that occurred.
--- a/src/share/classes/jdk/dio/pwm/GenerationRoundListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/GenerationRoundListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -30,11 +30,12 @@
 
 /**
  * The {@code GenerationRoundListener} interface defines methods for getting notified of the completion of the
- * generation of a sequence of pulses and that more pulses (the width thereof) to generate may be specified. <br />
+ * generation of a sequence of pulses and that more pulses (the width thereof) to generate may be specified. <br>
  * This interface also indirectly extends the {@link jdk.dio.AsyncErrorHandler AsyncErrorHandler} interface for getting notified of asynchronous I/O errors.
- * <p />
+ * <p>
  * A {@code GenerationRoundListener} can be registered using one of the
  * {@link PWMChannel#startGeneration(java.nio.IntBuffer, jdk.dio.pwm.GenerationRoundListener) PWMChannel.startGeneration} methods.
+ * </p>
  *
  * @see PWMChannel#startGeneration PWMChannel.startGeneration
  * @since 1.0
--- a/src/share/classes/jdk/dio/pwm/InvalidPulseRateException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/InvalidPulseRateException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -47,7 +47,7 @@
      * {@code message} can later be retrieved by the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public InvalidPulseRateException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/pwm/PWMChannel.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/PWMChannel.java	Thu Aug 13 12:59:51 2015 +0300
@@ -40,10 +40,10 @@
 /**
  * The {@code PWMChannel} interface provides methods for controlling a PWM (Pulse Width Modulation) signal generator
  * channel.
- * <p />
+ * <p>
  * One PWM generator/controller can have several channels. A PWM channel can generate pulses on a digital output line
  * (possibly a GPIO pin).
- * <p />
+ * </p><p>
  * A PWM channel may be identified by the numeric ID and by the name (if any defined) that correspond to its
  * registered configuration. A {@code PWMChannel} instance can be opened by a call to one of the
  * {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using its ID or by a call to one of the
@@ -52,34 +52,34 @@
  * {@link PWMChannelConfig} configuration (which includes its hardware addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig) DeviceManager.open(config,...)} methods it is not
  * assigned any ID nor name.
- * <p />
+ * </p><p>
  * Once opened, an application can set the pulse period using the {@link #setPulsePeriod setPulsePeriod} and then generate a certain
  * number of pulses of a specified width by calling one of the {@link #generate generate} methods.
- * <p />
+ * </p><p>
  * An application can also asynchronously generate a train of pulses either of a specified width up to a specified
  * maximum count or from widths specified in a buffer by calling one of the
  * {@link #startGeneration(int, int, jdk.dio.pwm.GenerationListener) startGeneration} methods with a
  * {@link GenerationListener} instance which will get notified upon completion. Such an asynchronous pulse generation
  * can be stopped or canceled by calling the {@link #stopGeneration stopGeneration} method.
- * <p />
+ * </p><p>
  * Only one output/generation operation (synchronous or asynchronous) can be going on at any time.
- * <p />
+ * </p><p>
  * When an application is no longer using a PWM channel it should call the {@link #close PWMChannel.close} method to
  * close the PWM channel. Any further attempt to use a PWM channel which has been closed will result in a
  * {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * Upon opening a PWM channel the default pulse width and duty cycle are always {@code 0}; the idle
  * state is platform or configuration-specific.
  * <h3><a name="iomodes">Buffered I/O and Direct I/O Transfers</a></h3>
  * A PWM channel may support buffered I/O or direct I/O operations depending on
- * the capabilities of the underlying device hardware and driver. <br />
+ * the capabilities of the underlying device hardware and driver. <br>
  * Buffered output - output in buffering mode - may be requested by setting the
  * output buffer size parameter of the {@link PWMChannelConfig} configuration to
  * a value greater than {@code 0} ; whether or not the channel will indeed work
  * in buffering mode and will use an internal output buffer of the size requested
  * is up to the device driver. An application may check whether a channel is
  * working in buffering mode by calling the
- * {@link PWMChannelConfig#getOutputBufferSize PWMChannelConfig.getOutputBufferSize} method. <br />
+ * {@link PWMChannelConfig#getOutputBufferSize PWMChannelConfig.getOutputBufferSize} method. <br>
  * When a PWM channel is not working in buffering mode, direct I/O may be
  * enabled by providing direct {@code Buffer}s to the output methods; whether
  * efficient direct output transfers will be used depends on the underlying
@@ -95,6 +95,35 @@
  * on which the pulses are to be generated requires, in addition, the
  * {@link jdk.dio.gpio.GPIOPinPermission GPIOPinPermission.OPEN} permission to be granted
  * on the designated GPIO pin.
+ * <p>
+ * Opening a {@code PWMChannel} with the following ad hoc sample configuration:</p>
+ * <blockquote>
+ * <pre>
+ * PWMChannelConfig config = new PWMChannelConfig.Builder()
+ *     .setControllerNumber(1)
+ *     .setChannelNumber(1)
+ *     .setOutputConfig(new GPIOPinConfig.Builder()
+ *                          .setControllerNumber(3)
+ *                          .setPinNumber(1)
+ *                          .setDirection(GPIOPinConfig.DIR_OUTPUT_ONLY)
+ *                          .setDriveMode(GPIOPinConfig.MODE_OUTPUT_PUSH_PULL)
+ *                          .build())
+ *     .setScaleFactor(1.0)
+ *     .setPulsePeriod(10)
+ *     .setIdleState(IDLE_STATE_HIGH)
+ *     .setPulseAlignment(ALIGN_CENTER)
+ *     .setOutputBufferSize(0)
+ *     .build();
+ * </pre>
+ * </blockquote>
+ * <p>
+ * requires the following permissions to be granted:</p>
+ * <blockquote>
+ * <pre>
+ * PWMChannelPermission("1:1", "open")
+ * GPIOPinPermission("3:1", "open")
+ * </pre>
+ * </blockquote>
  *
  * @see GenerationListener
  * @see PWMPermission
@@ -112,11 +141,20 @@
      * Whether changing the pulse period
      * has an immediate effect or not on an active (synchronous or asynchronous) generation is
      * device- as well as platform-dependent.
-     * <p />
+     * <p>
      * If the underlying platform or driver
      * does not support the requested pulse period value
      * then {@code period} will be aligned to the closest lower supported discrete period value. The resulting, actual
      * pulse period can be retrieved by a call to {@link #getPulsePeriod() getPulsePeriod}.
+     * If the current scale factor as returned by
+     * {@link #getScaleFactor getScaleFactor} is {@code scale} and the current scaled
+     * pulse period value - after alignment - is {@code sPeriod}
+     * then the effective pulse period is calculated as follows:</p>
+     * <blockquote>
+     * <pre>
+     * {@code ePeriod = (sPeriod / scale)}
+     * </pre>
+     * </blockquote>
      *
      * @param period
      *            the scaled pulse period as a period in microseconds.
@@ -155,27 +193,23 @@
 
     /**
      * Sets the pulse period scale factor of this PWM channel.
-     * <p />
-     * If the underlying platform or driver does not support the
-     * requested scale factor value then {@code factor} will be <em>rounded
-     * down</em> to aligned to the closest lower supported discrete factor value. The resulting factor can
-     * be retrieved by a call to {@link #getScaleFactor getScaleFactor}.
-     * <p />
-     * If the scale factor - after adjustment - is {@code scale} and the scaled pulse period value as
-     * returned by {@link #getPulsePeriod getPulsePeriod} is {@code sPeriod} then the
-     * effective pulse period is calculated as follows: <blockquote>
-     * <pre>
-     * {@code ePeriod = (sPeriod / scale)}
-     * </pre>
-     * </blockquote>
+     * The current
+     * scaled pulse period value is reset to the new resulting minimum <em>scaled</em> pulse period
+     * value. A call to this method should be immediately followed by a call to
+     * the {@link #setPulsePeriod setPulsePeriod} method in order to set
+     * an appropriate <em>scaled</em> pulse period.
      *
-     * @param factor the scale factor.
+     * @param factor the scale factor (a number greater or equal to {@code 1.0}).
+     * @throws IllegalArgumentException if {@code factor} is {@link Double#NaN NaN}, is less than {@code 1.0} or,
+     * if the setting of the scale factor would result
+     * in the <em>scaled</em> pulse period range to be outside the range {@code [1 - }{@link Integer#MAX_VALUE}{@code ]}.
      * @throws IOException if some other I/O error occurs.
      * @throws UnavailableDeviceException if this device is not currently
      * available - such as it is locked by another application.
      * @throws ClosedDeviceException if the device has been closed.
      *
      * @see #getScaleFactor
+     * @see #setPulsePeriod
      */
     void setScaleFactor(double factor) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -198,10 +232,11 @@
      * The scale factor also applies to the minimum and maximum scaled pulse periods
      * as respectively returned by {@link #getMinPulsePeriod getMinPulsePeriod}
      * and {@link #getMaxPulsePeriod getMaxPulsePeriod}.
-     * <p />
+     * <p>
      * If the pulse period scale factor was not set previously using
      * {@link #setScaleFactor setScaleFactor}, the device configuration-specific
      * default value is returned.
+     * </p>
      *
      * @return the scale factor.
      * @throws IOException
@@ -250,26 +285,30 @@
      * Generates a pulse train containing the specified count of pulses of the specified width.
      * The pulse width value is <em>scaled</em>; the <em>effective</em> pulse width can be calculated
      * from the currently set <em>scale factor</em> as can be retrieved using {@link #getScaleFactor getScaleFactor}.
-     * <p />
-     * To generate pulses of a specific duty cycle {@code dutyCycle}, this method may be called as follows: <br />
+     * <p>
+     * To generate pulses of a specific duty cycle {@code dutyCycle}, this method may be called as follows: </p>
+     * <blockquote>
      * <pre>
      * float dutyCycle = 0.5f;
      * pwmChannel.generate((pwmChannel.getPulsePeriod() * dutyCycle), count);
      * </pre>
+     * </blockquote>
+     * <p>
      * If the underlying platform or driver
      * does not support the requested width value
      * then {@code width} will be aligned to the closest lower supported discrete width value.
-     * <p />
+     * </p><p>
      * The operation will return only after generating all of the {@code count} requested pulses.
-     * <p />
+     * </p><p>
      * The pulses will be generated according to the current effective pulse period
      * as determined by the current scaled pulse period (see {@link #getPulsePeriod getPulsePeriod})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a synchronous output operation
      * upon this channel then an invocation of this method will block until the first operation is complete.
-     * <p />
+     * </p><p>
      * Only one output operation (synchronous or asynchronous) can be going on at any time.
+     * </p>
      *
      * @param width
      *            the scaled pulse width (in microseconds).
@@ -294,39 +333,40 @@
      * Generates a pulse train from the specified sequence of pulse widths. The provided buffer contains the
      * <em>scaled</em> widths of the pulses to generate; the <em>effective</em> pulse widths can be calculated
      * from the currently set <em>scale factor</em> as can be retrieved using {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * <p>
      * <i>r</i> pulses will be generated by this channel, where <i>r</i> is the number of integers (pulse widths)
      * remaining in the buffer, that is, {@code src.remaining()}, at the moment this method is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a pulse width integer value sequence of length <i>n</i> is provided, where <i>{@code 0 <= n <= r}
      * </i>. The sequence starts at index <i>p</i>, where <i>p</i> is the buffer's position at the moment this method is
      * invoked; the index of the last pulse width integer value written will be <i>{@code p + n - 1}</i>. Upon return
      * the buffer's position will be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <br />
+     * <br>
      * The operation will block until all of the <i>r</i> pulse width values
      * remaining in the provided {@code src} buffer have been written or otherwise
-     * transferred to the the driver/hardware. If this channel uses an internal output buffer and
+     * transferred to the driver/hardware. If this channel uses an internal output buffer and
      * is therefore working in <a href="#iomodes">buffering mode</a> this method will block until all the
      * <i>r</i> pulse width values have been copied to the internal output buffer.
-     * <p />
+     * </p><p>
      * The pulses will be generated according to the current effective pulse period
      * as determined by the current scaled pulse period (see {@link #getPulsePeriod getPulsePeriod})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a synchronous pulse generation
      * upon this channel, however, then an invocation of this method will block until the first operation is complete.
-     * <p />
+     * </p><p>
      * Only one pulse generation (synchronous or asynchronous) can be going on at any time.
-     * <p />
+     * </p><p>
      * This method does not throw an {@link IllegalArgumentException} if any of the designated pulse width values
      * is greater than the currently set period. If a pulse width value is not within range
      * the actual width of the pulse generated by the PWM device is hardware- or driver-specific: the pulse width
      * may for example be equal to the set period, corresponding to a 100% duty cycle.
-     * <br />
+     * <br>
      * If the underlying platform or driver
      * does not support the requested width value
      * then the actual width of the pulse generated by the PWM device is hardware- or driver-specific: the pulse width
      * may, for example, be aligned to the closest lower supported discrete width value.
+     * </p>
      *
      * @param src
      *            the buffer from which the scaled pulse width integer values can be retrieved.
@@ -350,18 +390,19 @@
      * until explicitly stopped.
      * The pulse width value is <em>scaled</em>; the <em>effective</em> pulse width can be calculated
      * from the currently set <em>scale factor</em> as can be retrieved using {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * <p>
      * The pulses will be generated according to the current effective pulse period
      * as determined by the current scaled pulse period (see {@link #getPulsePeriod getPulsePeriod})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * </p><p>
      * If the underlying platform or driver does not support the requested width value
      * then {@code width} will be aligned to the closest lower supported discrete width value.
-     * <p/>
+     * </p><p>
      * Pulse generation will immediately start and proceed asynchronously. It may be stopped prior to completion by a
      * call to {@link #stopGeneration stopGeneration}.
-     * <p />
+     * </p><p>
      * Only one pulse generation session can be going on at any time.
+     * </p>
      *
      * @param width
      *            the scaled pulse width (in microseconds).
@@ -387,18 +428,19 @@
      * the count of generated pulses reaches the specified count value.
      * The pulse width value is <em>scaled</em>; the <em>effective</em> pulse width can be calculated
      * from the currently set <em>scale factor</em> as can be retrieved using {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * <p>
      * The pulses will be generated according to the current effective pulse period
      * as determined by the current scaled pulse period (see {@link #getPulsePeriod getPulsePeriod})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}.
-     * <p />
+     * </p><p>
      * If the underlying platform or driver does not support the requested width value
      * then {@code width} will be aligned to the closest lower supported discrete width value.
-     * <p/>
+     * </p><p>
      * Pulse generation will immediately start and proceed asynchronously. It may be stopped prior to completion by a
      * call to {@link #stopGeneration stopGeneration}.
-     * <p />
+     * </p><p>
      * Only one pulse generation session can be going on at any time.
+     * </p>
      *
      * @param width
      *            the scaled pulse width (in microseconds).
@@ -435,57 +477,58 @@
      * instance once the initial count of pulses have been generated. The widths of the initial pulses to be generated
      * are read from the provided buffer; the widths of the pulses to generate during the subsequent rounds are read
      * from that very same buffer upon invocation of the provided {@link GenerationRoundListener} instance.
-     * <p />
+     * <p>
      * Pulse generation can be stopped by a call to {@link #stopGeneration stopGeneration}.
-     * <p />
+     * </p><p>
      * <i>r</i> integers will be written to this channel, where <i>r</i> is the number of integers remaining in the
      * buffer (possibly {@code 0}), that is, {@code src.remaining()}, at the moment this method is initially invoked and then subsequently when the listener is returning.
-     * <p />
+     * </p><p>
      * Suppose that an integer sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}</i>. This integer
      * sequence will be transferred from the buffer starting at index <i>p</i>, where <i>p</i> is the buffer's position
      * at the moment this method is invoked and then subsequently when the listener is returning; the index of the last integer written will be <i>{@code p + n - 1}</i>.
      * Upon invocation of the listener to fetch the widths of more pulses to generate the buffer's position will be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <br />
+     * <br>
      * If this channel
      * uses an internal output buffer and is therefore working in <a href="#iomodes">buffering mode</a> the listener will only be
      * invoked after all the <i>r</i> pulse width values have been copied to the
      * internal output buffer; otherwise the listener will only be invoked after all the
-     * <i>r</i> pulse width values have been transferred to the driver/hardware.<br />
+     * <i>r</i> pulse width values have been transferred to the driver/hardware.<br>
      * The buffer's position upon stopping this asynchronous operation by a call to {@link #stopGeneration stopGeneration}
      * is not predictable unless called from within the listener.
-     * <p />
+     * </p><p>
      * The pulses will be generated according to the current effective pulse period
      * as determined by the current scaled pulse period (see {@link #getPulsePeriod getPulsePeriod})
      * and the current scale factor {@link #getScaleFactor getScaleFactor}. The
      * pulse period can be changed by the provided {@link GenerationRoundListener} instance upon notification of each
      * pulse train subsequence.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code GenerationRoundListener}
      * the reference to the provided {@code src} buffer can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A buffer with {@code 0} integers remaining to be written (that is a buffer already empty) at the moment this method is initially
      * invoked or then subsequently when the listener is returning will not stop the asynchronous operation; the listener is
      * guaranteed to be called back again at the latest as soon as all other events pending at the time of notification have been dispatched.
      * The underrun condition resulting from the listener notification
      * returning with an empty buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one pulse generation (synchronous or asynchronous) can be going on at any time.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffer concurrently
      * may yield unpredictable results.
-     * <p />
+     * </p><p>
      * This method does not throw an {@link IllegalArgumentException} if any of the designated pulse width values
      * is greater than the currently set period. If a pulse width value is not within range
      * the actual width of the pulse generated by the PWM device is hardware- or driver-specific: the pulse width
      * may for example be equal to the set period, corresponding to a 100% duty cycle.
-     * <br />
+     * <br>
      * If the underlying platform or driver does not support a requested width value
      * then the actual width of the pulse generated by the PWM device is hardware- or driver-specific: the pulse width
      * may, for example, be aligned to the closest lower supported discrete width value.
+     * </p>
      *
      * @param src
      *            the buffer from which the scaled pulse width integer values can be retrieved.
@@ -494,6 +537,8 @@
      *            the width values remaining in the buffer.
      * @throws NullPointerException
      *             If {@code src} or {@code listener} is {@code null}.
+     * @throws IllegalArgumentException
+     *             if the provided buffer {@code src} has a zero-capacity.
      * @throws IllegalStateException
      *             if another synchronous or asynchronous output generation is already active.
      * @throws UnavailableDeviceException
@@ -510,7 +555,7 @@
 
     /**
      * Starts asynchronous pulse train generation in successive rounds.
-     * <p />
+     * <p>
      * This method behaves identically to {@link #startGeneration(IntBuffer, GenerationRoundListener)} excepts that it
      * uses double-buffering - the provided buffers must not have a zero-capacity and must not overlap
      * - that is the backing array sections or memory regions they refer to must not overlap.
@@ -520,33 +565,34 @@
      * the position of the current working buffer upon stopping this asynchronous operation by a call to
      * {@link #stopGeneration stopGeneration} is not predictable even if called from within the
      * listener.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code GenerationRoundListener}
      * the reference to the  current working buffer (initially {@code src1}) can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A working buffer with {@code 0} integers remaining to be written (that is a buffer already empty) at the moment this method is initially
      * invoked or then subsequently when the listener is returning will not stop the asynchronous operation; the listener is
      * guaranteed to be called back again at the latest as soon as all other events pending at the time of notification have been dispatched.
      * The underrun condition resulting from the listener notification
      * returning with an empty buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one pulse generation (synchronous or asynchronous) can be going on at any time.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffers until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffers concurrently
      * may yield unpredictable results.
-     * <p />
+     * </p><p>
      * This method does not throw an {@link IllegalArgumentException} if any of the designated pulse width values
      * is greater than the currently set period. If a pulse width value is not within range
      * the actual width of the pulse generated by the PWM device is hardware- or driver-specific: the pulse width
      * may for example be equal to the set period, corresponding to a 100% duty cycle.
-     * <br />
+     * <br>
      * If the underlying platform or driver does not support a requested width value
      * then the actual width of the pulse generated by the PWM device is hardware- or driver-specific: the pulse width
      * may, for example, be aligned to the closest lower supported discrete width value.
+     * </p>
      *
      * @param src1
      *            the first buffer from which the scaled pulse width integer values can be retrieved.
@@ -577,8 +623,9 @@
     /**
      * Stops (cancels) the currently active pulse generation session as started by a call to one
      * of the {@link #startGeneration startGeneration} methods.
-     * <p />
+     * <p>
      * This method return silently if no pulse generation session is currently active.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
@@ -591,10 +638,11 @@
 
     /**
      * Gets the output on which the pulses are generated.
-     * <p />
+     * <p>
      * A concurrent runtime change of the dynamic configuration parameters of the
      * output (such as of its direction) may result in {@code IOException} being
      * thrown by PWM operations.
+     * </p>
      *
      * @return the output on which the pulses are generated; or {@code null} if the output is implicit.
      *
--- a/src/share/classes/jdk/dio/pwm/PWMChannelConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/PWMChannelConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -46,16 +46,17 @@
 /**
  * The {@code PWMChannelConfig} class encapsulates the hardware addressing information, and static and dynamic
  * configuration parameters of a PWM channel.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code PWMChannelConfig} can be passed to the {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated PWM channel with the specified
  * configuration. A {@link InvalidDeviceConfigException} is thrown when attempting to open a device with
  * an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(Class, DeviceConfig)
@@ -157,7 +158,7 @@
          * Sets the channel number (default value is {@code UNASSIGNED} if not set).
          *
          * @param channelNumber the channel number (a positive or zero integer)
-         * or {@code DeviceConfig.UNASSIGNED}.
+         * or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code channelNumber} is not in
          * the defined range.
@@ -172,7 +173,7 @@
          * Sets the controller number (default value is {@code UNASSIGNED} if not set).
          *
          * @param controllerNumber the hardware converter's number (a positive
-         * or zero integer) or {@link #UNASSIGNED}.
+         * or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -185,13 +186,14 @@
 
         /**
          * Sets the configuration of the output (a GPIO output pin) on which the
-         * pulses are to be generated. (default value is {@code null} if not set).
+         * pulses are to be generated (default value is {@code null} if not set).
          *
          * @param outputConfig the configuration of the output (a GPIO output pin);
          * or {@code null} if the output is implicit.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputConfig} is not
-         * {@code null} and is not configured for output.
+         * {@code null} and {@code outputConfig}'s direction is not set to
+         * {@link GPIOPinConfig#DIR_OUTPUT_ONLY} or {@link GPIOPinConfig#DIR_BOTH_INIT_OUTPUT}.
          */
         public Builder setOutputConfig(GPIOPinConfig outputConfig) {
             if (outputConfig != null) {
@@ -205,7 +207,7 @@
          * Sets the idle output state (default value is {@code UNASSIGNED} if not
          * set).
          *
-         * @param idleState the idle output state: : {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED}.
+         * @param idleState the idle output state: : {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code idleState} is not in the
          * defined range.
@@ -222,7 +224,7 @@
          *
          * @param pulsePeriod the initial scaled output sampling interval
          * (the amount of time between two samples) in microseconds (a positive
-         * integer) or {@code DeviceConfig.UNASSIGNED}.
+         * integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code pulsePeriod} is not
          * in the defined range.
@@ -238,10 +240,11 @@
         /**
          * Sets the initial pulse period scale factor (default value is {@code 1.0} if not set).
          *
-         * @param scaleFactor the initial pulse period scale factor (a positive number).
+         * @param scaleFactor the sampling time and sampling interval scale
+         * factor (a number greater or equal to {@code 1.0}).
          * @return this {@code Builder} instance.
-         * @throws IllegalArgumentException if {@code scaleFactor} is not in the
-         * defined range.
+         * @throws IllegalArgumentException if {@code scaleFactor} is {@link Double#NaN NaN} or
+         * is less than {@code 1.0}.
          */
         public Builder setScaleFactor(double scaleFactor) {
             Utils.checkDoubleGreaterThanZero(scaleFactor);
@@ -253,7 +256,7 @@
          * Sets the pulse alignment - the alignment of the pulse within the pulse period (default value is {@code UNASSIGNED} if not
          * set).
          *
-         * @param pulseAlignment the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or {@link #UNASSIGNED}.
+         * @param pulseAlignment the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code pulseAlignment} is not in the
          * defined range.
@@ -269,7 +272,7 @@
          *
          * @param outputBufferSize the requested output buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputBufferSize} is not in
          * the defined range.
@@ -289,20 +292,23 @@
     /**
      * Creates a new {@code PWMChannelConfig} with the specified hardware addressing information and configuration parameters. The output of
      * the PWM channel is implicit (such as a dedicated output pin).
-     * <p />
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested output buffer size is set to {@code UNASSIGNED}.
      * The pulse period time scale factor is set to {@code 1.0}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware PWM controller (or generator)'s number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware PWM controller (or generator)'s number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param idleState
-     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED}.
+     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulsePeriod
-     *            the default pulse period in microseconds (a positive integer) or {@link #UNASSIGNED}.
+     *            the initial pulse period in microseconds (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulseAlignment
      *            the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      *
      * @throws IllegalArgumentException
      *             if any of the following is true:
@@ -328,26 +334,29 @@
 
     /**
      * Creates a new {@code PWMChannelConfig} the specified hardware addressing information, configuration parameters and GPIO pin output.
-     * <p />
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested output buffer size is set to {@code UNASSIGNED}.
      * The pulse period time scale factor is set to {@code 1.0}.
-     * <p />
+     * </p><p>
      * If the access modes (exclusive or shared) supported by the designated
      * GPIO pin output are incompatible with those required by the underlying {@code PWMChannel}
      * device or device driver, attempting to open
      * the {@code PWMChannel} device using this configuration may result in a
      * {@link InvalidDeviceConfigException} to be thrown.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware PWM controller (or generator)'s number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware PWM controller (or generator)'s number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param idleState
-     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED}.
+     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulsePeriod
-     *            the default pulse period in microseconds (a positive integer) or {@link #UNASSIGNED}.
+     *            the initial pulse period in microseconds (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulseAlignment
      *            the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @param output
      *            the configuration of the output (a GPIO output pin) on which the pulses are to be generated.
      *
@@ -357,9 +366,10 @@
      *             <li>{@code controllerNumber} is not in the defined range;</li>
      *             <li>{@code channelNumber} is not in the defined range;</li>
      *             <li>{@code idleState} is not in the defined range;</li>
-     *             <li>{@code pulsePeriod} is not in the defined range.</li>
-     *             <li>{@code pulseAlignment} is not in the defined range.</li>
-     *             <li>if the provided GPIO pin is not configured for output.</li>
+     *             <li>{@code pulsePeriod} is not in the defined range;</li>
+     *             <li>{@code pulseAlignment} is not in the defined range;</li>
+     *             <li>if the provided GPIO pin configuration's direction is not set to
+     *             {@link GPIOPinConfig#DIR_OUTPUT_ONLY} or {@link GPIOPinConfig#DIR_BOTH_INIT_OUTPUT}.</li>
      *             </ul>
      * @throws NullPointerException
      *             if {@code output} is {@code null}.
@@ -377,27 +387,30 @@
     /**
      * Creates a new {@code PWMChannelConfig} with the specified hardware addressing information and configuration parameters. The output of
      * the PWM channel is implicit (such as a dedicated output pin).
-     * <p />
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested output buffer size is set to {@code UNASSIGNED}.
      * The pulse period time scale factor is set to {@code 1.0}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param idleState
-     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED}.
+     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulsePeriod
-     *            the default pulse period in microseconds (a positive integer) or {@link #UNASSIGNED}.
+     *            the initial pulse period in microseconds (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulseAlignment
      *            the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      *
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
      *             <li>{@code channelNumber} is not in the defined range;</li>
      *             <li>{@code idleState} is not in the defined range;</li>
-     *             <li>{@code pulsePeriod} is not in the defined range.</li>
+     *             <li>{@code pulsePeriod} is not in the defined range;</li>
      *             <li>{@code pulseAlignment} is not in the defined range.</li>
      *             </ul>
      * @throws NullPointerException
@@ -415,26 +428,29 @@
 
     /**
      * Creates a new {@code PWMChannelConfig} the specified hardware addressing information, configuration parameters and GPIO pin output.
-     * <p />
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested output buffer size is set to {@code UNASSIGNED}.
      * The pulse period time scale factor is set to {@code 1.0}.
-     * <p />
+     * </p><p>
      * If the access modes (exclusive or shared) supported by the designated
      * GPIO pin output are incompatible with those required by the underlying {@code PWMChannel}
      * device or device driver, attempting to open
      * the {@code PWMChannel} device using this configuration may result in a
      * {@link InvalidDeviceConfigException} to be thrown.
+     * </p>
       *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware PWM channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param idleState
-     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED}.
+     *            the output idle state: {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulsePeriod
-     *            the default pulse period in microseconds (a positive integer) or {@link #UNASSIGNED}.
+     *            the initial pulse period in microseconds (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param pulseAlignment
      *            the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @param output
      *            the configuration of the output (a GPIO output pin) on which the pulses are to be generated.
      *
@@ -443,9 +459,10 @@
      *             <ul>
      *             <li>{@code channelNumber} is not in the defined range;</li>
      *             <li>{@code idleState} is not in the defined range;</li>
-     *             <li>{@code pulsePeriod} is not in the defined range.</li>
-     *             <li>{@code pulseAlignment} is not in the defined range.</li>
-     *             <li>if the provided GPIO pin is not configured for output.</li>
+     *             <li>{@code pulsePeriod} is not in the defined range;</li>
+     *             <li>{@code pulseAlignment} is not in the defined range;</li>
+     *             <li>if the provided GPIO pin configuration's direction is not set to
+     *             {@link GPIOPinConfig#DIR_OUTPUT_ONLY} or {@link GPIOPinConfig#DIR_BOTH_INIT_OUTPUT}.</li>
      *             </ul>
      * @throws NullPointerException
      *             if {@code controllerName} or {@code output} is {@code null}.
@@ -522,7 +539,7 @@
     /**
      * Gets the configured PWM channel number.
      *
-     * @return the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getChannelNumber() {
         return channelNumber;
@@ -531,7 +548,7 @@
     /**
      * Gets the configured controller number (the PWM controller or generator number).
      *
-     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -555,7 +572,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated output buffer size (a positive or zero integer).
+     * @return the requested or allocated output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -574,10 +591,11 @@
 
     /**
      * Gets the output on which the pulses are to be generated.
-     * <p />
+     * <p>
      * A concurrent runtime change of the
      * dynamic configuration parameters of the output (such as of its direction) may result in
      * {@code IOException} being thrown by PWM operations.
+     * </p>
      *
      * @return the output on which the pulses are to be generated; or {@code null} if the output is implicit
      * or if this {@code PWMChannelConfig} instance is not associated to an actual {@code PWMChannel} instance.
@@ -590,9 +608,9 @@
     }
 
     /**
-     * Gets the configured default/initial <em>scaled</em> pulse period (in microseconds).
+     * Gets the configured initial <em>scaled</em> pulse period (in microseconds).
      *
-     * @return the default/initial pulse period in microseconds (a positive integer) or {@link #UNASSIGNED}.
+     * @return the initial pulse period in microseconds (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getPulsePeriod() {
         return pulsePeriod;
@@ -601,7 +619,7 @@
     /**
      * Gets the configured idle output state.
      *
-     * @return the idle output state: : {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED}.
+     * @return the idle output state: : {@link #IDLE_STATE_HIGH}, {@link #IDLE_STATE_LOW} or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getIdleState() {
         return idleState;
@@ -610,16 +628,16 @@
     /**
      * Gets the configured pulse alignment. The alignment of the pulse within the pulse period.
      *
-     * @return the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or {@link #UNASSIGNED}
+     * @return the pulse alignment: {@link #ALIGN_CENTER}, {@link #ALIGN_LEFT}, {@link #ALIGN_RIGHT} or {@link #UNASSIGNED UNASSIGNED}
      */
     public int getPulseAlignment() {
         return pulseAlignment;
     }
 
     /**
-     * Gets the default/initial configured pulse period scale factor.
+     * Gets the configured initial pulse period scale factor.
      *
-     * @return the default/initial pulse period scale factor (a positive number).
+     * @return the initial pulse period scale factor (a number greater or equal to {@code 1.0}).
      *
      * @since 1.1
      */
--- a/src/share/classes/jdk/dio/pwm/PWMPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/PWMPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code PWMPermission} class defines permissions for PWM channel access.
- * <p />
+ * <p>
  * A {@code PWMPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the base {@link DevicePermission} class
- * with the following addition:
+ * with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>
@@ -45,7 +46,10 @@
  * {@link PWMChannelConfig#getChannelNumber PWMChannelConfig.getChannelNumber}. The characters in the string must all be decimal digits.
  * </dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
@@ -101,4 +105,3 @@
         Utils.checkDevicePermissionChannelFormat(name, Utils.DECIMAL_DIGITS);
     }
 }
-
--- a/src/share/classes/jdk/dio/pwm/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/pwm/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,51 +24,52 @@
  */
 /**
  * Interfaces and classes for generating width-modulated pulses - Pulse Width Modulation (PWM) - on a digital output line.
- * <p />
+ * <p>
  * In order to access and control a specific PWM channel, an application should first open and obtain an
  * {@link jdk.dio.pwm.PWMChannel} instance for the PWM generator's channel the application wants to
- * access and control, using its numeric ID, name, type (interface) and/or properties:
+ * access and control, using its numeric ID, name, type (interface) and/or properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * PWMChannel channel = (PWMChannel) DeviceManager.open(8);
  * </pre>
- *
  * </blockquote></dd>
  * <dt>Using its name and interface</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * PWMChannel channel = DeviceManager.open(&quot;DIMMER&quot;, PWMChannel.class, null);
  * </pre>
- *
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * Once opened, an application can set the period of generated pulses using the
  * {@link jdk.dio.pwm.PWMChannel#setPulsePeriod} method ; then generate pulses of a specified width or
  * duty cycle by calling one of the {@link jdk.dio.pwm.PWMChannel#generate} or
- * {@link jdk.dio.pwm.PWMChannel#startGeneration}. <blockquote>
- *
+ * {@link jdk.dio.pwm.PWMChannel#startGeneration}.</p>
+ * <blockquote>
  * <pre>
  * channel.setPulsePeriod(1000000); <i>// Pulse period = 1 second</i>
  * channel.generate(500000, 10); <i>// Generate 10 pulses with a width of 0.5 second</i>
  * </pre>
- *
- * </blockquote> When done, the application should call the {@link jdk.dio.pwm.PWMChannel#close
- * PWMChannel.close} method to close PWM channel. <blockquote>
- *
+ * </blockquote>
+ * <p>
+ * When done, the application should call the {@link jdk.dio.pwm.PWMChannel#close
+ * PWMChannel.close} method to close PWM channel.</p>
+ * <blockquote>
  * <pre>
  * channel.close();
  * </pre>
- *
- * </blockquote> The following sample code gives an example of using the PWM channel API to progressively dim the light
+ * </blockquote>
+ * <p>
+ * The following sample code gives an example of using the PWM channel API to progressively dim the light
  * of a LED (for example) starting from its maximum intensity (100% duty cycle) in 10 successive steps of 10 seconds
- * each: <blockquote>
- *
+ * each:</p>
+ * <blockquote>
  * <pre>
  * class VaryingDimmer implements GenerationRoundListener {
  *
@@ -106,12 +107,21 @@
  *     }
  * }
  * </pre>
- *
- * </blockquote> Because of performance issue, procedures handling PWM events, and especially event listeners, should be
+ * </blockquote>
+ * <p>
+ * Because of performance issue, procedures handling PWM events, and especially event listeners, should be
  * implemented to be as fast as possible.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p><p>
+ * This package requires the {@link jdk.dio.gpio} package.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/spi/AbstractDevice.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spi/AbstractDevice.java	Thu Aug 13 12:59:51 2015 +0300
@@ -34,10 +34,11 @@
 /**
  * The {@code AbstractDevice} class is the base implementation for
  * {@code Device}-implementing classes instantiated by {@link DeviceProvider}.
- * <br />
+ * <br>
  * This class encapsulates the low-level machinery required to implement
- * platform-wide locking for exclusive access. It also provides methods that
- * allow for retrieving the {@link DeviceDescriptor} of {@code Device} instances.
+ * locking for exclusive access (see
+ * <a href="{@docRoot}/jdk/dio/Device.html#locking">Platform Dependencies of the Locking Facility</a>).
+ * It also provides methods that allow for retrieving the {@link DeviceDescriptor} of {@code Device} instances.
  *
  * @param <P> the device type the descriptor is defined for.
  * @since 1.0
@@ -47,14 +48,15 @@
 public abstract class AbstractDevice<P extends Device<? super P>> implements Device<P> {
 
     /**
-     * Attempts to lock for (platform-wide) exclusive access the underlying
+     * Attempts to lock for exclusive access the underlying
      * device resource. This method will block until the designated
      * device resource becomes available for exclusive access or the
      * specified amount of real time has elapsed. A {@code timeout} of {@code 0}
      * means to wait forever.
-     * <p />
+     * <p>
      * This method returns silently if the underlying device resource
      * is currently acquired for exclusive access.
+     * </p>
      *
      * @param timeout the timeout in milliseconds.
      * @throws IllegalArgumentException if {@code timeout} is negative.
@@ -68,12 +70,13 @@
     }
 
     /**
-     * Releases from (platform-wide) exclusive access the underlying device
+     * Releases from exclusive access the underlying
      * device resource.
-     * <p />
+     * <p>
      * This method returns silently if the underlying device resource
      * is not currently acquired for exclusive access or has already been
      * closed.
+     * </p>
      *
      * @throws IOException if any other I/O error occurred.
      */
--- a/src/share/classes/jdk/dio/spi/DeviceProvider.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spi/DeviceProvider.java	Thu Aug 13 12:59:51 2015 +0300
@@ -26,7 +26,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-
 import jdk.dio.Device;
 import jdk.dio.DeviceConfig;
 import jdk.dio.DeviceNotFoundException;
@@ -38,15 +37,15 @@
 /**
  * The {@code DeviceProvider} interface provides methods to open {@link Device} instances of a certain type
  * and optionally with a specific configuration and a list of properties.
- * <p />
+ * <p>
  * {@code DeviceProvider} classes are <em>Service Provider</em> classes that must conform to the
  * <em>Service-Provider Loading</em> facility requirements so that they can be located and instantiated on demand when
  * they are deployed as part of libraries.
- * <p />
+ * </p><p>
  * When a device of a specific <i>type</i> (or configuration <i>type</i>) is looked up using a specific
  * set of <i>properties</i> the {@link jdk.dio.DeviceManager DeviceManager} looks up a suitable
  * {@code DeviceProvider} using the <em>Service-Provider Loading</em> facility. It iterates over all the
- * {@code DeviceProvider} classes registered as <em>Service Providers</em> until all the following steps succeed:
+ * {@code DeviceProvider} classes registered as <em>Service Providers</em> until all the following steps succeed:</p>
  * <ol>
  * <li>check that the {@code DeviceProvider} is of the proper <i>type</i> by first invoking its {@link #getType()
  * getType} method and/or is supporting the proper <i>configuration type</i> by invoking its {@link #getConfigType()
@@ -58,18 +57,30 @@
  * {@link #open(DeviceConfig, java.lang.String[], int) open} method with the specified
  * <i>configuration</i>, <i>properties</i> and access mode; note that this step may fail with an exception.</li>
  * </ol>
- * <p />
+ * <p>
+ * A compliant implementation of the {@code DeviceManager} specification MUST catch undeclared
+ * unchecked exceptions, unexpected values (such as {@code null}) or mismatching value types that may be
+ * thrown or respectively returned at any of these steps and MUST report these conditions to the caller
+ * as a {@code DeviceNotFoundException}.
+ * When iterating over {@code DeviceProvider}s as per the iterative lookup procedure described above
+ * a compliant implementation of the {@code DeviceManager} specification MUST, upon failure
+ * to locate a device, ultimately report to the caller by throwing the most suitable exception
+ * that occurred during the iterative process according to the following priority order
+ * {@code UnavailableDeviceException}, {@code InvalidDeviceConfigException}, {@code UnsupportedAccessModeException},
+ * {@code DeviceNotFoundException}, {@code IOException}, {@code SecurityException}.
+ * </p><p>
  * Classes implementing the {@code DeviceProvider} interface MUST have a zero-argument constructor so that they
  * can be instantiated by the device manager (as per the <em>Service-Provider Loading</em> facility specification
  * requirements).
- * <p />
- * A library JAR file containing a {@code DeviceProvider} implementation MUST contain a file named:
+ * </p><p>
+ * A library JAR file containing a {@code DeviceProvider} implementation MUST contain a file named:</p>
  * <blockquote>
  * {@code META-INF/services/jdk.dio.spi.DeviceProvider}
  * </blockquote>
+ * <p>
  * This file MUST contain the fully qualified name of the class implementing the {@code DeviceProvider} interface.
  * For example, for a JAR file containing the driver for the Real-Time Clock sample, this file
- * may contain the following single line:
+ * may contain the following single line:</p>
  * <blockquote>
  * {@code jdk.dio.samples.rtc.RealTimeClockProvider #Real-Time Clock sample}
  * </blockquote>
@@ -89,16 +100,17 @@
 
     /**
      * Opens a {@link Device} instance with the specified properties, configuration and access mode.
-     * <p />
+     * <p>
      * Property-based lookup only uses exact (case-insensitive) matching and does not perform any semantic
      * interpretation.
-     * <p />
+     * </p><p>
      * Prior to opening the {@code Device} instance the permission (subclass of {@link DevicePermission})
      * specific to that {@code Device} instance must be checked, if any defined. For example,
      * if this provider opens {@link jdk.dio.gpio.GPIOPin GPIOPin} instances the
      * {@link jdk.dio.gpio.GPIOPinPermission GPIOPinPermission} must be checked with a target name
      * composed of the relevant hardware addressing information (the device name or device
      * number and the pin number) and with the action {@link jdk.dio.gpio.GPIOPinPermission#OPEN GPIOPinPermission.OPEN}.
+     * </p>
      *
      * @param config
      *            the device configuration or {@code null} if none is defined.
@@ -144,12 +156,13 @@
     /**
      * Checks whether this {@code DeviceProvider} can open an instance of {@link Device} with the specified
      * properties.
-     * <p />
+     * <p>
      * The properties, if specified, are matched against the properties of the devices this
      * {@code DeviceProvider} can open instances of.
-     * <p />
+     * </p><p>
      * Property-based lookup only uses exact (case-insensitive) matching and does not perform any semantic
      * interpretation.
+     * </p>
      *
      * @param properties
      *            the device properties or {@code null} to stand for any properties.
@@ -172,6 +185,6 @@
      * @see jdk.dio.DeviceConfig#serialize(java.io.OutputStream)
      * @since 1.1
      */
-    DeviceConfig<? super P> deserialize(InputStream  in) throws IOException;
+    DeviceConfig<? super P> deserialize(InputStream in) throws IOException;
 
 }
--- a/src/share/classes/jdk/dio/spi/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spi/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -26,9 +26,15 @@
  * Service-provider classes for the {@link jdk.dio} package.
  *
  * Only developers who are defining new device driver providers should need to make direct use of this package.
- * <p />
+ * <p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/spibus/InvalidWordLengthException.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spibus/InvalidWordLengthException.java	Thu Aug 13 12:59:51 2015 +0300
@@ -46,7 +46,7 @@
      * {@code message} can later be retrieved by the {@link Throwable#getMessage() getMessage} method.
      *
      * @param message
-     *            the detailed reason of the exception
+     *            the detailed reason of the exception (may be {@code null}).
      */
     public InvalidWordLengthException(String message) {
         super(message);
--- a/src/share/classes/jdk/dio/spibus/SPICompositeMessage.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spibus/SPICompositeMessage.java	Thu Aug 13 12:59:51 2015 +0300
@@ -34,9 +34,9 @@
  * composite message. A composite message may be constituted of a sequence of read
  * and/or write operations to a single SPI slave device that will be performed as
  * a single transaction.
- * <p />
- * Here is an example of a composite message to a single slave: <blockquote>
- *
+ * <p>
+ * Here is an example of a composite message to a single slave:</p>
+ * <blockquote>
  * <pre>
  * try (SPIDevice slave = DeviceManager.open("SPI1", SPIDevice.class, null)) {
  *    ByteBuffer sndBuf1 = ByteBuffer.wrap(new byte[] {0x01});
@@ -51,10 +51,12 @@
  *     <i>// Handle exception</i>
  * }
  * </pre>
- * </blockquote> The preceding example is using a
+ * </blockquote>
+ * <p>
+ * The preceding example is using a
  * <em>try-with-resources</em> statement; the
  * {@link SPIDevice#close SPIDevice.close} method is automatically invoked by
- * the platform at the end of the statement.
+ * the platform at the end of the statement.</p>
  *
  * @since 1.0.1
  */
@@ -65,14 +67,15 @@
      * Appends a read message/operation from the targeted SPI slave device.
      * Reads up to {@code rxBuf.remaining()} bytes of data from the targeted slave
      * device into the buffer {@code rxBuf}.
-     * <p />
+     * <p>
      * Upon the invocation of the {@link #transfer transfer} method
      * the appended operation will have a behavior equivalent to that of the invocation of the
      * {@link SPIDevice#read(java.nio.ByteBuffer)} method on the targeted {@code SPIDevice}.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@code transfer} method has been invoked and has returned.
+     * </p>
      *
      * @param rxBuf the buffer into which the data is read.
      * @return a reference to this {@code SPICompositeMessage} object.
@@ -89,14 +92,15 @@
      * Reads up to {@code rxBuf.remaining()} bytes of data from the targeted slave
      * device into the buffer skipping {@code rxBuf} the first {@code rxSkip}
      * bytes read.
-     * <p />
+     * <p>
      * Upon the invocation of the {@link #transfer transfer} method
      * the appended operation will have a behavior equivalent to that of the invocation of the
      * {@link SPIDevice#read(int, java.nio.ByteBuffer)} method on the targeted {@code SPIDevice}.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@code transfer} method has been invoked and has returned.
+     * </p>
      *
      * @param rxSkip the number of read bytes that must be ignored/skipped
      * before filling in the {@code rxBuf} buffer.
@@ -115,14 +119,15 @@
      * Appends a write message/operation from the targeted SPI slave device.
      * Writes to the targeted slave device {@code txBuf.remaining()} bytes from the
      * buffer {@code txBuf}.
-     * <p />
+     * <p>
      * Upon the invocation of the {@link #transfer transfer} method
      * the appended operation will have a behavior equivalent to that of the invocation of the
      * {@link SPIDevice#write(java.nio.ByteBuffer)} method on the targeted {@code SPIDevice}.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@code transfer} method has been invoked and has returned.
+     * </p>
      *
      * @param txBuf the buffer containing the bytes to write.
      * @return a reference to this {@code SPICompositeMessage} object.
@@ -137,19 +142,20 @@
     /**
      * Appends an exchange message/operation from the targeted SPI slave device.
      * Exchanges (transmits and receives) data with the targeted slave device.
-     * <p />
+     * <p>
      * Upon the invocation of the {@link #transfer transfer} method
      * the appended operation will have a behavior equivalent to that of the invocation of the
      * {@link SPIDevice#writeAndRead(java.nio.ByteBuffer, java.nio.ByteBuffer)}
      * method on the targeted {@code SPIDevice}.
-     * <p />
+     * </p><p>
      * The designated portions of the sending and receiving byte buffers may not have the same length. When sending more
      * than is being received the extra received bytes are ignored/discarded. Conversely, when sending less than is
      * being received extra dummy data will be sent.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@code transfer} method has been invoked and has returned.
+     * </p>
      *
      * @param src
      *            The buffer from which bytes are to be retrieved.
@@ -168,19 +174,20 @@
     /**
      * Appends an exchange message/operation with the targeted SPI slave device.
      * Exchanges (transmits and receives) data with the targeted slave device skipping the specified number of bytes received.
-     * <p />
+     * <p>
      * Upon the invocation of the {@link #transfer transfer} method
      * the appended operation will have a behavior equivalent to that of the invocation of the
      * {@link SPIDevice#writeAndRead(java.nio.ByteBuffer, int, java.nio.ByteBuffer)}
      * method on the targeted {@code SPIDevice}.
-     * <p />
+     * </p><p>
      * The designated portions of the sending and receiving byte buffers may not have the same length. When sending more
      * than is being received the extra received bytes are ignored/discarded. Conversely, when sending less than is
      * being received extra dummy data will be sent.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation has completed - that
      * is: until the {@code transfer} method has been invoked and has returned.
+     * </p>
      *
      * @param src
      *            The buffer from which bytes are to be retrieved.
@@ -204,14 +211,15 @@
     /**
      * Appends a delay (in microseconds).
      * Delays the next appended operation by the specified amount of microseconds.
-     * <p />
+     * <p>
      * Upon the invocation of the {@link #transfer transfer} method
      * the next operation (or the completion of this composite message transfer if this
      * is the last operation) will be delayed by the specified amount of microseconds.
-     * <p />
+     * </p><p>
      * If the underlying platform or driver does not support a microsecond timer resolution
      * or does not support the requested delay value then {@code delay} will be <em>rounded up</em>
      * to accommodate the supported timer resolution or the closest greater supported discrete delay value, if any.
+     * </p>
      *
      * @param delay
      *            the amount (in microseconds) to delay the next operation.
@@ -231,11 +239,11 @@
      * Transfers this composite message to the targeted {@code SPIDevice}. This will result in each of the
      * contained messages/operations to be sent/executed in the same order they
      * have been appended to this composite message.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a transaction
      * (see {@link jdk.dio.Transactional}) or, a read or write operation upon the targeted slave device,
      * however, then an invocation of this method will block until the first operation is complete.
-     * <p />
+     * </p><p>
      * Once transferred no additional operation can be appended anymore to this
      * composite message. Any such attempt will result in a
      * {@link IllegalStateException} to be thrown.
@@ -243,9 +251,10 @@
      * the same sequence of operations. The data transferred
      * to or from each of the provided {@code ByteBuffer}s is determined by their respective current {@code position}
      * and {@code remaining} attributes at the time this method is call.
-     * <br />
+     * <br>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffers until the transfer has completed.
+     * </p>
      *
      * @return an array (possibly empty) containing the number of bytes read for each of the read
      * operations of this composite message; the results of each read operations
--- a/src/share/classes/jdk/dio/spibus/SPIDevice.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spibus/SPIDevice.java	Thu Aug 13 12:59:51 2015 +0300
@@ -37,7 +37,7 @@
 
 /**
  * The {@code SPIDevice} interface provides methods for transmitting and receiving data to/from an SPI slave device.
- * <p />
+ * <p>
  * An SPI slave device may be identified by the numeric ID and by the name (if any defined) that correspond to its
  * registered configuration. An {@code SPIDevice} instance can be opened by a call to one of the
  * {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using its ID or by a call to one of the
@@ -46,20 +46,20 @@
  * {@link SPIDeviceConfig} configuration (which includes its hardware addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig) DeviceManager.open(config,...)} methods it is not
  * assigned any ID nor name.
- * <p />
+ * </p><p>
  * On an SPI bus, data is transferred between the SPI master device and an SPI slave device in full duplex. That is,
  * data is transmitted by the SPI master to the SPI slave device at the same time data is received from the SPI slave
  * device by the SPI master.
- * <p />
+ * </p><p>
  * To perform such a bidirectional exchange of data with an SPI slave device, an application may use one of the
- * {@link #writeAndRead(ByteBuffer, ByteBuffer) writeAndRead} methods. <br />
+ * {@link #writeAndRead(ByteBuffer, ByteBuffer) writeAndRead} methods. <br>
  * When an application only wants to send data to or receive data from an SPI slave device, it may use the
  * {@link #write(ByteBuffer) write} or the {@link #read(ByteBuffer) read} method, respectively. When writing only, the
  * data received from the SPI slave device will be ignored/discarded. When reading only, dummy data will be sent to the
  * slave.
- * <p/>
+ * </p><p>
  * A data exchange consists of words of a certain length which may vary from SPI
- * slave device to SPI slave device. <br />
+ * slave device to SPI slave device. <br>
  * Words in the sending and receiving byte buffers are not packed (bit-wise) and
  * must be byte-aligned; bytes are copied out or in, respectively, from/to these
  * buffers according to their byte orders (see
@@ -72,21 +72,22 @@
  * the designated portion of a sending or receiving byte buffer cannot contain a (positive) integral number of words
  * then an {@link InvalidWordLengthException} will be thrown. For example, if the word length is 16bits and the
  * designated portion of buffer is only 1-byte long or is 3-byte long an {@link InvalidWordLengthException} will be
- * thrown. <br />
+ * thrown. <br>
  * Assuming a word length <em>w</em>, the length <em>l</em> of the designated portion of the sending or receiving byte
- * buffer must be such that:
+ * buffer must be such that:</p>
  * <blockquote>
  * <pre>
  * {@code ((l % (((w - 1) / 8) + 1)) == 0)}
  * </pre>
  * </blockquote>
+ * <p>
  * Since the SPI master device controls the serial transmission clock read and write operations are never blocked nor delayed by
  * unresponsive slave devices. Not though that a read or write operation may be blocked if another read or write operation
  * is concurrently being performed on the same {@code SPIDevice} instance.
- * <p />
+ * </p><p>
  * When the data exchange is over, an application should call the {@link #close SPIDevice.close} method to close the
  * SPI slave device. Any further attempt to transmit/write or receive/read to/from an SPI slave device which has been
- * closed will result in a {@link ClosedDeviceException} been thrown.
+ * closed will result in a {@link ClosedDeviceException} been thrown.</p>
  * <h3>SPI Transactions</h3>
  * Depending on the underlying platform and driver capabilities an {@code SPIDevice} instance may additionally implement
  * the {@link jdk.dio.Transactional Transactional} interface to indicate that it supports SPI transactions. In such a case the {@link jdk.dio.Transactional#begin Transactional.begin}
@@ -95,9 +96,9 @@
  * transaction. It is the responsibility of the application to appropriately control the timing between a call to the {@code begin} method which
  * may assert the Chip Select (depending on the configuration, see {@link SPIDeviceConfig#CS_NOT_CONTROLLED}) and
  * subsequent calls to the {@link #read read}, {@link #write write} and {@link #writeAndRead writeAndRead} methods.
- * <p />
+ * <p>
  * An application can alternatively perform a sequence of reads and/or writes - from/to one or several slaves, that
- * are guaranteed to be performed as a single transaction using an {@link SPICompositeMessage} object.
+ * are guaranteed to be performed as a single transaction using an {@link SPICompositeMessage} object.</p>
  * <h3>Device Probing Limitations</h3>
  * Opening an {@code SPIDevice} instance with hardware addressing information and configuration
  * may be subject to <a href="{@docRoot}/jdk/dio/DeviceManager.html#probing">device probing limitations </a>.
@@ -140,10 +141,11 @@
 
     /**
      * Reads one data word of up to 32 bits from this slave device.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @return the data word read.
      * @throws IOException
@@ -160,24 +162,25 @@
 
     /**
      * Reads a sequence of bytes from this slave device into the given buffer.
-     * <p />
+     * <p>
      * Dummy data will be sent to this slave device by the platform.
-     * <p />
+     * </p><p>
      * An attempt is made to read up to <i>r</i> bytes from the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code dst.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is read, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred into the buffer so that the first byte in the sequence
      * is at index <i>p</i> and the last byte is at index <i>{@code p + n - 1}</i>, where <i>p</i>
      * is the buffer's position at the moment this method is invoked. Upon return the buffer's
      * position will be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A read operation will block until the requested <i>r</i> bytes are read.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param dst
      *            the buffer into which bytes are to be transferred
@@ -202,11 +205,12 @@
 
     /**
      * Reads a sequence of bytes from this device into the given buffer, skipping the first {@code skip} bytes read.
-     * <p />
+     * <p>
      * Dummy data will be sent to this slave device by the platform.
-     * <p />
+     * </p><p>
      * Apart from skipping the first {@code skip} bytes, this method behaves identically to
      * {@link #read(java.nio.ByteBuffer)}.
+     * </p>
      *
      * @param skip
      *            the number of read bytes that must be ignored/skipped before filling in the {@code dst} buffer.
@@ -234,22 +238,23 @@
 
     /**
      * Writes a sequence of bytes to this slave device from the given buffer.
-     * <p />
+     * <p>
      * An attempt is made to write up to <i>r</i> bytes to the device, where <i>r</i> is the number
      * of bytes remaining in the buffer, that is, {@code src.remaining()}, at the moment this method
      * is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred from the buffer starting at index <i>p</i>, where
      * <i>p</i> is the buffer's position at the moment this method is invoked; the index of the last
      * byte written will be <i>{@code p + n - 1}</i>. Upon return the buffer's position will be
      * equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A write operation will return only after writing all of the <i>r</i> requested bytes.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param src
      *            the buffer from which bytes are to be retrieved.
@@ -272,10 +277,11 @@
 
     /**
      * Writes one data word of up to 32 bits to this slave device.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param txData
      *            the data word to be written.
@@ -293,13 +299,14 @@
 
     /**
      * Exchanges (transmits and receives) data with this slave device.
-     * <p />
+     * <p>
      * The designated portions of the sending and receiving byte buffers may not have the same length. When sending more
      * than is being received the extra received bytes are ignored/discarded. Conversely, when sending less than is
      * being received extra dummy data will be sent.
-     * <p />
+     * </p><p>
      * This method behaves as a combined {@link SPIDevice#write(java.nio.ByteBuffer)} and
      * {@link SPIDevice#read(java.nio.ByteBuffer)}.
+     * </p>
      *
      * @param src
      *            the buffer from which bytes are to be retrieved.
@@ -323,13 +330,14 @@
 
     /**
      * Exchanges (transmits and receives) data with this slave device skipping the specified number of bytes received.
-     * <p />
+     * <p>
      * The designated portions of the sending and receiving byte buffers may not have the same length. When sending more
      * than is being received the extra received bytes are ignored/discarded. Conversely, when sending less than is
      * being received extra dummy data will be sent.
-     * <p />
+     * </p><p>
      * This method behaves as a combined {@link SPIDevice#write(java.nio.ByteBuffer)} and
      * {@link SPIDevice#read(java.nio.ByteBuffer)}.
+     * </p>
      *
      * @param src
      *            the buffer from which bytes are to be retrieved.
@@ -357,10 +365,11 @@
 
     /**
      * Exchanges (transmits and receives) one data word of up to 32 bits with this slave device.
-     * <p />
+     * <p>
      * This method may be invoked at any time. If another thread has already initiated a read or write
      * operation upon this slave device, however, then an invocation of this method will block until
      * the first operation is complete.
+     * </p>
      *
      * @param txData
      *            the word to send.
--- a/src/share/classes/jdk/dio/spibus/SPIDeviceConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spibus/SPIDeviceConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -43,15 +43,15 @@
 /**
  * The {@code SPIDeviceConfig} class encapsulates the hardware addressing information, and static and dynamic
  * configuration parameters of an SPI slave device.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p>
  * <h3><a name="mode">SPI Clock Modes</a></h3>
  * The clock mode is a number from 0 to 3 which represents the combination of the CPOL (SPI Clock Polarity Bit) and CPHA
  * (SPI Clock Phase Bit) signals where CPOL is the high order bit and CPHA is the low order bit:
- * <table style="border:1px solid black;border-collapse:collapse;" summary="The clock mode is a number which represents the combination of the CPOL (SPI Clock Polarity Bit) and CPHA (SPI Clock Phase Bit) signals.">
+ * <blockquote><table style="border:1px solid black;border-collapse:collapse;" summary="The clock mode is a number which represents the combination of the CPOL (SPI Clock Polarity Bit) and CPHA (SPI Clock Phase Bit) signals.">
  * <tr style="border:1px solid black;">
  * <th id="t1" style="border:1px solid black;">Mode</th>
  * <th id="t2" style="border:1px solid black;">CPOL</th>
@@ -77,13 +77,14 @@
  * <td headers="t2" style="border:1px solid black;">1 = Active-low clocks selected.</td>
  * <td headers="t3" style="border:1px solid black;">1 = Sampling of data occurs at even edges of the SCK clock</td>
  * </tr>
- * </table>
- * <p />
+ * </table></blockquote>
+ * <p>
  * An instance of {@code SPIDeviceConfig} can be passed to the {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated SPI slave device with the
  * specified configuration. A {@link InvalidDeviceConfigException} is thrown when attempting to open a
  * device with an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -206,7 +207,7 @@
          * value is {@code UNASSIGNED} if not set).
          *
          * @param controllerNumber the number of the bus the slave device is
-         * connected to (a positive or zero integer) or {@link #UNASSIGNED}.
+         * connected to (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -223,7 +224,7 @@
          *
          * @param inputBufferSize the requested input buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@code UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code inputBufferSize} is not in
          * the defined range.
@@ -240,7 +241,7 @@
          *
          * @param outputBufferSize the requested output buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@code UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputBufferSize} is not
          * in the defined range.
@@ -257,7 +258,7 @@
          *
          * @param csActive the Chip Select active level, one of {@link #CS_ACTIVE_LOW},
          *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or
-         * {@link #UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code csActive} is not in the
          * defined range.
@@ -275,7 +276,7 @@
          * @param bitOrdering the bit (shifting) ordering of the slave device,
          * one of: {@link SPIDevice#BIG_ENDIAN},
          *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or
-         * {@link #UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code bitOrdering} is not in the
          * defined range.
@@ -290,7 +291,7 @@
          * Sets the clock mode (default value is {@code 0} if not set).
          *
          * @param clockMode the clock mode, one of:
-         * {@code 0}, {@code 1}, {@code 2} or {@code 4} (see <a href="#mode">SPI
+         * {@code 0}, {@code 1}, {@code 2} or {@code 3} (see  <a href="{@docRoot}/jdk/dio/spibus/SPIDeviceConfig.html#mode">SPI
          * Clock Modes</a>).
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code clockMode} is not in the
@@ -307,7 +308,7 @@
          * {@code UNASSIGNED} if not set).
          *
          * @param wordLength the word length of the slave device (a positive
-         * integer) or {@link #UNASSIGNED}.
+         * integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code wordLength} is not in the
          * defined range.
@@ -323,7 +324,7 @@
          * {@code UNASSIGNED} if not set).
          *
          * @param clockFrequency the clock frequency of the slave device in Hz
-         * (a positive integer) or {@link #UNASSIGNED}.
+         * (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code clockFrequency} is not in
          * the defined range.
@@ -341,23 +342,27 @@
 
     /**
      * Creates a new {@code SPIDeviceConfig} with the specified hardware addressing information and configuration
-     * parameters. The Chip Select active level is platform and/or driver-dependent (i.e. {@link #UNASSIGNED}).
+     * parameters. The Chip Select active level is platform and/or driver-dependent (i.e. {@link #UNASSIGNED UNASSIGNED}).
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerNumber
      *            the number of the bus the slave device is connected to (a positive or zero integer) or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @param address
      *            the Chip Select address of the slave device on the bus (a positive or zero integer).
      * @param clockFrequency
-     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED}.
+     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param clockMode
-     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 4} (see <a href="#mode">SPI Clock
+     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 3} (see <a href="#mode">SPI Clock
      *            Modes</a>).
      * @param wordLength
-     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED}.
+     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param bitOrdering
      *            the bit (shifting) ordering of the slave device, one of: {@link SPIDevice#BIG_ENDIAN},
-     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED}.
+     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -380,25 +385,29 @@
     /**
      * Creates a new {@code SPIDeviceConfig} with the specified hardware addressing information and configuration
      * parameters.
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerNumber
      *            the number of the bus the slave device is connected to (a positive or zero integer) or
-     *            {@link #UNASSIGNED}.
+     *            {@link #UNASSIGNED UNASSIGNED}.
      * @param address
      *            the Chip Select address of the slave device on the bus (a positive or zero integer).
      * @param csActive
      *            the Chip Select active level, one of {@link #CS_ACTIVE_LOW},
-     *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or {@link #UNASSIGNED}.
+     *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or {@link #UNASSIGNED UNASSIGNED}.
      * @param clockFrequency
-     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED}.
+     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param clockMode
-     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 4} (see <a href="#mode">SPI Clock
+     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 3} (see <a href="#mode">SPI Clock
      *            Modes</a>).
      * @param wordLength
-     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED}.
+     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param bitOrdering
      *            the bit (shifting) ordering of the slave device, one of: {@link SPIDevice#BIG_ENDIAN},
-     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED}.
+     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -427,22 +436,26 @@
 
     /**
      * Creates a new {@code SPIDeviceConfig} with the specified hardware addressing information and configuration
-     * parameters. The Chip Select active level is platform and/or driver-dependent (i.e. {@link #UNASSIGNED}).
+     * parameters. The Chip Select active level is platform and/or driver-dependent (i.e. {@link #UNASSIGNED UNASSIGNED}).
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param address
      *            the Chip Select address of the slave device on the bus (a positive or zero integer).
      * @param clockFrequency
-     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED}.
+     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param clockMode
-     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 4} (see <a href="#mode">SPI Clock
+     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 3} (see <a href="#mode">SPI Clock
      *            Modes</a>).
      * @param wordLength
-     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED}.
+     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param bitOrdering
      *            the bit (shifting) ordering of the slave device, one of: {@link SPIDevice#BIG_ENDIAN},
-     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED}.
+     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -466,6 +479,10 @@
     /**
      * Creates a new {@code SPIDeviceConfig} with the specified hardware addressing information and configuration
      * parameters.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
@@ -473,17 +490,17 @@
      *            the Chip Select address of the slave device on the bus (a positive or zero integer).
      * @param csActive
      *            the Chip Select active level, one of {@link #CS_ACTIVE_LOW},
-     *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or {@link #UNASSIGNED}.
+     *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or {@link #UNASSIGNED UNASSIGNED}.
      * @param clockFrequency
-     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED}.
+     *            the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param clockMode
-     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 4} (see <a href="#mode">SPI Clock
+     *            the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 3} (see <a href="#mode">SPI Clock
      *            Modes</a>).
      * @param wordLength
-     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED}.
+     *            the word length of the slave device (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param bitOrdering
      *            the bit (shifting) ordering of the slave device, one of: {@link SPIDevice#BIG_ENDIAN},
-     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED}.
+     *            {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if any of the following is true:
      *             <ul>
@@ -550,7 +567,7 @@
     /**
      * Gets the configured controller number (the controller number of the SPI bus adapter the slave device is connected to).
      *
-     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
@@ -574,7 +591,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated input buffer size (a positive or zero integer).
+     * @return the requested or allocated input buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -589,7 +606,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated output buffer size (a positive or zero integer).
+     * @return the requested or allocated output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      *
      * @since 1.1
      */
@@ -601,7 +618,7 @@
      * Gets the configured bit (shifting) ordering of the SPI slave device.
      *
      * @return the bit ordering of the slave device, one of: {@link SPIDevice#BIG_ENDIAN},
-     *         {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED}.
+     *         {@link SPIDevice#LITTLE_ENDIAN}, {@link SPIDevice#MIXED_ENDIAN} or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getBitOrdering() {
         return bitOrdering;
@@ -610,7 +627,7 @@
     /**
      * Gets the clock frequency (in Hz) supported by the SPI slave device.
      *
-     * @return the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED}.
+     * @return the clock frequency of the slave device in Hz (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getClockFrequency() {
         return clockFrequency;
@@ -619,7 +636,7 @@
     /**
      * Gets the configured clock mode (combining clock polarity and phase) for communicating with the SPI slave device.
      *
-     * @return the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 4} (see <a href="#mode">SPI Clock
+     * @return the clock mode, one of: {@code 0}, {@code 1}, {@code 2} or {@code 3} (see <a href="#mode">SPI Clock
      *         Modes</a>).
      */
     public int getClockMode() {
@@ -630,7 +647,7 @@
      * Gets the configured Chip Select active level for selecting the SPI slave device.
      *
      * @return the Chip Select active level,one of {@link #CS_ACTIVE_LOW},
-     *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or {@link #UNASSIGNED}.
+     *            {@link #CS_ACTIVE_HIGH}, {@link #CS_NOT_CONTROLLED} or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getCSActiveLevel() {
         return csActive;
@@ -639,7 +656,7 @@
     /**
      * Gets the configured word length for communicating with the SPI slave device.
      *
-     * @return the word length of the slave device (a positive integer) or {@link #UNASSIGNED}.
+     * @return the word length of the slave device (a positive integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getWordLength() {
         return wordLength;
--- a/src/share/classes/jdk/dio/spibus/SPIPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spibus/SPIPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code SPIPermission} class defines permissions for SPI slave device access.
- * <p />
+ * <p>
  * A {@code SPIPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the base {@link DevicePermission} class
- * with the following addition:
+ * with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>
@@ -45,7 +46,10 @@
  * {@link SPIDeviceConfig#getAddress SPIDeviceConfig.getAddress}. The characters in the string must all be hexadecimal digits.
  * </dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
@@ -101,4 +105,3 @@
        Utils.checkDevicePermissionChannelFormat(name, Utils.HEXADECIMAL_DIGITS);
     }
 }
-
--- a/src/share/classes/jdk/dio/spibus/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/spibus/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,51 +24,49 @@
  */
 /**
  * Interfaces and classes for SPI (Serial Peripheral Interface Bus) device access.
- * <p />
+ * <p>
  * The functionalities supported by this API are those of an SPI master.
- * <p />
+ * </p><p>
  * In order to communicate with a specific slave, an application should first open and obtain an
  * {@link jdk.dio.spibus.SPIDevice} instance for the SPI slave device the application wants to exchange
- * data with, using its numeric ID, name, type (interface) and/or properties:
+ * data with, using its numeric ID, name, type (interface) and/or properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * SPIDevice slave = (SPIDevice) DeviceManager.open(3);
  * </pre>
- *
  * </blockquote></dd>
  * <dt>Using its name and interface</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * SPIDevice slave = DeviceManager.open(&quot;RTC1&quot;, SPIDevice.class, null);
  * </pre>
- *
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * Once the device opened, the application can exchange data with the SPI slave device using methods of the
  * {@link jdk.dio.spibus.SPIDevice} interface such as the
- * {@link jdk.dio.spibus.SPIDevice#writeAndRead(ByteBuffer, ByteBuffer) writeAndRead} method.
+ * {@link jdk.dio.spibus.SPIDevice#writeAndRead(ByteBuffer, ByteBuffer) writeAndRead} method.</p>
  * <blockquote>
- *
  * <pre>
  * slave.writeAndRead(sndBuf, 0, 1, rcvBuf, 0, 1);
  * </pre>
- *
- * </blockquote> When the data exchange is over, the application should call the
- * {@link jdk.dio.spibus.SPIDevice#close() } method to close the SPI slave device. <blockquote>
- *
+ * </blockquote>
+ * <p>When the data exchange is over, the application should call the
+ * {@link jdk.dio.spibus.SPIDevice#close() } method to close the SPI slave device.
+ * </p>
+ * <blockquote>
  * <pre>
  * slave.close();
  * </pre>
- *
- * </blockquote> The following sample code gives an example of using the SPI API to communicate with SPI slaves:
+ * </blockquote>
+ * <p>The following sample code gives an example of using the SPI API to communicate with SPI slaves:</p>
  * <blockquote>
- *
  * <pre>
  * try (SPIDevice slave = DeviceManager.open("SPI1", SPIDevice.class, null)) {
  *    ByteBuffer sndBuf1 = ByteBuffer.wrap(new byte[] {0x01});
@@ -82,17 +80,24 @@
  *     <i>// handle exception</i>
  * }
  * </pre>
- *
- * </blockquote> The preceding example is using a <em>try-with-resources</em> statement; the
+ * </blockquote>
+ * <p>
+ * The preceding example is using a <em>try-with-resources</em> statement; the
  * {@link jdk.dio.spibus.SPIDevice#close SPIDevice.close} method is automatically invoked by the
  * platform at the end of the statement.
- * <p />
+ * </p><p>
  * Information about the SPI-bus specification can be found at <a
  * href="http://www.freescale.com/files/microcontrollers/doc/ref_manual/M68HC11RM.pdf"
  * >http://www.freescale.com/files/microcontrollers/doc/ref_manual/M68HC11RM.pdf</a>.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/uart/ModemUART.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/ModemUART.java	Thu Aug 13 12:59:51 2015 +0300
@@ -30,12 +30,13 @@
 /**
  * The {@code ModemUART} interface provides methods for controlling and accessing a UART (Universal Asynchronous
  * Receiver/Transmitter) with Modem control lines.
- * <p />
+ * <p>
  * Even if CTS/RTS hardware flow control is enabled (see {@link UARTConfig#getFlowControlMode UARTConfig.getFlowControlMode}), registering
  * for notification of CTS signal state changes (see
  * {@link ModemSignalsControl#setSignalChangeListener ModemSignalsControl.setSignalChangeListener} may not
  * always be supported. Additionally, when supported and because of latency, CTS signal state change notification may
  * only be indicative: CTS flow control may be handled directly by the hardware or by the native driver.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/uart/UART.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/UART.java	Thu Aug 13 12:59:51 2015 +0300
@@ -39,7 +39,7 @@
 /**
  * The {@code UART} interface provides methods for controlling and accessing a UART (Universal Asynchronous
  * Receiver/Transmitter).
- * <p />
+ * <p>
  * A UART device may be identified by the numeric ID and by the name (if any defined) that correspond to its
  * registered configuration. A {@code UART} instance can be opened by a call to one of the
  * {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using its ID or by a call to one of the
@@ -48,22 +48,22 @@
  * {@link UARTConfig} configuration (which includes its hardware addressing information) using one of the
  * {@link DeviceManager#open(jdk.dio.DeviceConfig) DeviceManager.open(config,...)} methods it is not
  * assigned any ID nor name.
- * <p />
+ * </p><p>
  * Once opened, an application can read the received data bytes and write the data bytes to be transmitted through the
  * UART using methods of the {@link ByteChannel} interface.
- * <p/>
+ * </p><p>
  * An application can register a {@link UARTEventListener} instance which will get asynchronously notified of input data
  * availability, input buffer overrun and/or empty output buffer conditions. The input and output buffers for
  * which these events may be notified may not necessarily correspond to the transmit and receive FIFO buffers of the
  * UART hardware but may be buffers allocated by the underlying native driver. To register a {@link UARTEventListener}
  * instance, the application must call the {@link #setEventListener setEventListener} method. The registered
  * listener can later on be removed by calling the same method with a {@code null} listener parameter.
- * <p />
+ * </p><p>
  * When done, an application should call the {@link #close UART.close} method to close the UART. Any further attempt
- * to access or control a UART which has been closed will result in a {@link ClosedDeviceException} been thrown.
+ * to access or control a UART which has been closed will result in a {@link ClosedDeviceException} been thrown.</p>
  * <h3><a name="iomodes">Buffered I/O and Direct I/O Transfers</a></h3>
  * A UART may support buffered I/O or direct I/O operations depending on
- * the capabilities of the underlying device hardware and driver. <br />
+ * the capabilities of the underlying device hardware and driver. <br>
  * Buffered input (resp. output) - input (resp. output) in buffering mode - may be requested by setting the
  * input (resp. output) buffer size parameter of the {@link UARTConfig} configuration to
  * a value greater than {@code 0} ; whether or not the UART will indeed work
@@ -71,7 +71,7 @@
  * is up to the device driver. An application may check whether a UART is
  * working in buffering mode by calling the
  * {@link UARTConfig#getInputBufferSize UARTConfig.getInputBufferSize}
- * (resp. {@link UARTConfig#getOutputBufferSize UARTConfig.getOutputBufferSize}) method. <br />
+ * (resp. {@link UARTConfig#getOutputBufferSize UARTConfig.getOutputBufferSize}) method. <br>
  * When a UART is not working in buffering mode, direct I/O may be
  * enabled by providing direct {@code Buffer}s to the input (resp. output) methods; whether
  * efficient direct input (resp. output) transfers will be used depends on the underlying
@@ -100,11 +100,15 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setBaudRate
      */
     int getBaudRate() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Gets the current number of bits per character.
+     * Gets the current number of bits per character. If the bits per character
+     * was not set previously using {@link #setDataBits setDataBits} the
+     * device configuration-specific default value is returned.
      *
      * @return the number bits per character: {@link UARTConfig#DATABITS_5}, {@link UARTConfig#DATABITS_6},
      *         {@link UARTConfig#DATABITS_7}, {@link UARTConfig#DATABITS_8} or {@link UARTConfig#DATABITS_9}.
@@ -114,11 +118,15 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setDataBits
      */
     int getDataBits() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Gets the current flow control mode.
+     * Gets the current flow control mode. If the flow control mode
+     * was not set previously using {@link #setFlowControlMode setFlowControlMode} the
+     * device configuration-specific default value is returned.
      *
      * @return the flow control mode: {@link UARTConfig#FLOWCONTROL_NONE} if flow control is disabled; or a valid bit-wise OR combination of
      *         {@link UARTConfig#FLOWCONTROL_RTSCTS_IN}, {@link UARTConfig#FLOWCONTROL_RTSCTS_OUT}, {@link UARTConfig#FLOWCONTROL_XONXOFF_IN} or
@@ -129,11 +137,15 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setFlowControlMode
      */
     int getFlowControlMode() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Gets the current parity.
+     * Gets the current parity. If the parity
+     * was not set previously using {@link #setParity setParity} the
+     * device configuration-specific default value is returned.
      *
      * @return the speed parity: {@link UARTConfig#PARITY_ODD}, {@link UARTConfig#PARITY_EVEN},
      *         {@link UARTConfig#PARITY_MARK}, {@link UARTConfig#PARITY_SPACE}, or {@link UARTConfig#PARITY_NONE}.
@@ -143,11 +155,15 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setParity
      */
     int getParity() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
-     * Gets the current number of stop bits per character.
+     * Gets the current number of stop bits per character. If the stop bit number
+     * was not set previously using {@link #setStopBits setStopBits} the
+     * device configuration-specific default value is returned.
      *
      * @return the number of stop bits per character: {@link UARTConfig#STOPBITS_1}, {@link UARTConfig#STOPBITS_1_5}, or
      *         {@link UARTConfig#STOPBITS_2}.
@@ -157,6 +173,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setStopBits
      */
     int getStopBits() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -164,8 +182,10 @@
      * Sets the baud rate.
      *
      * @param baudRate
-     *            the baud rate to set.
+     *            the baud rate to set (a positive integer).
      *
+     * @throws IllegalArgumentException
+     *             if {@code baudRate} is negative or zero.
      * @throws UnsupportedOperationException
      *             if this UART cannot be configured with the requested baud rate.
      * @throws UnavailableDeviceException
@@ -174,6 +194,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getBaudRate
      */
     void setBaudRate(int baudRate) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -193,6 +215,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getDataBits
      */
     void setDataBits(int dataBits) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -200,17 +224,18 @@
      * Registers a {@link UARTEventListener} instance to monitor input data availability, input buffer overrun and/or
      * empty output buffer conditions. While the listener can be triggered by hardware interrupts, there are no
      * real-time guarantees of when the listener will be called.
-     * <p />
+     * <p>
      * A list of event type IDs is defined in {@link UARTEvent}.
-     * <p />
+     * </p><p>
      * If this {@code UART} is open in {@link DeviceManager#SHARED} access mode
      * the listeners registered by all the applications sharing the underlying device will get
      * notified of the events they registered for.
-     * <p />
+     * </p><p>
      * If {@code listener} is {@code null} then the listener previously registered for the specified event type will be
      * removed.
-     * <p />
+     * </p><p>
      * Only one listener can be registered at a particular time for a particular event type.
+     * </p>
      *
      * @param eventId
      *            ID of the native event to listen to: {@link UARTEvent#INPUT_DATA_AVAILABLE},
@@ -251,6 +276,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getFlowControlMode
      */
     void setFlowControlMode(int flowcontrol) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -270,6 +297,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getParity
      */
     void setParity(int parity) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -289,6 +318,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getStopBits
      */
     void setStopBits(int stopBits) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -298,14 +329,14 @@
      * instance once the initial data have been written. The initial data to be written
      * is retrieved from the provided buffer; the data to write during the subsequent rounds is retrieved
      * from that very same buffer upon invocation of the provided {@link OutputRoundListener} instance.
-     * <p />
+     * <p>
      * Writing can be stopped by a call to {@link #stopWriting stopWriting}.
-     * <p />
+     * </p><p>
      * <i>r</i> bytes will be written to this {@code UART},
      * where <i>r</i> is the number of bytes remaining in the buffer (possibly {@code 0}), that is,
      * <code>src.remaining()</code>, at the moment this method is initially invoked
      * and then subsequently when the listener is returning.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is written, where
      * <i>{@code 0 <= n <= r}</i>.
      * This byte sequence will be transferred from the buffer starting at index
@@ -315,41 +346,42 @@
      * <i>{@code p + n - 1}</i>.
      * Upon invocation of the listener for fetching more data to write the buffer's position will be equal to
      * <i>{@code p + n}</i>; its limit will not have changed.
-     *  <br />
+     *  <br>
      * If this channel
      * uses an internal output buffer and is therefore working in <a href="#iomodes">buffering mode</a> the listener will only be
      * invoked after all the <i>r</i> bytes have been copied to the
      * internal output buffer; otherwise the listener will only be invoked after all the
-     * <i>r</i> bytes have been transferred to the driver/hardware.<br />
+     * <i>r</i> bytes have been transferred to the driver/hardware.<br>
      * The buffer's position upon stopping this asynchronous operation by a call to {@link #stopWriting stopWriting}
      * is not predictable unless called from within the listener.
-     * <p />
+     * </p><p>
      * The data will be written according to the current baud rate as returned by {@link #getBaudRate getBaudRate}. The
      * baud rate and other configuration parameters can be changed by the provided {@link OutputRoundListener} instance
      * upon notification of each round.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code OutputRoundListener}
      * the reference to the provided {@code src} buffer can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A buffer with {@code 0} bytes remaining to be written (that is a buffer already empty) at the moment this method is initially
      * invoked or then subsequently when the listener is returning will not stop the asynchronous operation; the listener is
      * guaranteed to be called back again at the latest as soon as all other events pending at the time of notification have been dispatched.
      * The underrun condition resulting from the listener notification
      * returning with an empty buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one write operation (synchronous or asynchronous) can be going on at any time.
-     * <br />
+     * <br>
      * Note therefore that while empty output buffer conditions ({@link UARTEvent#OUTPUT_BUFFER_EMPTY}) may be
      * notified to the registered {@code UARTEventListener}
      * independently to the invocation of the provided {@code OutputRoundListener} attempting to call
      * the {@code write} method from within the registered {@code UARTEventListener} will result in an exception.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffer concurrently
      * may yield unpredictable results.
+     * </p>
      *
      * @param src
      *            the buffer for the data to be written.
@@ -362,6 +394,8 @@
      *             if this device is not currently available - such as it is locked by another application.
      * @throws ClosedDeviceException
      *             if the device has been closed.
+     * @throws IllegalArgumentException
+     *             if the provided buffer {@code src} has a zero-capacity.
      * @throws IllegalStateException
      *             if another synchronous or asynchronous output operation is already active.
      * @throws IOException
@@ -371,7 +405,7 @@
 
     /**
      * Starts asynchronous writing in successive rounds.
-     * <p />
+     * <p>
      * This method behaves identically to {@link #startWriting(ByteBuffer, OutputRoundListener)} excepts that it
      * uses double-buffering - the provided buffers must not have a zero-capacity and must not overlap
      * - that is their backing arrays or the memory regions they refer to must not overlap.
@@ -381,29 +415,30 @@
      * the position of the current working buffer upon stopping this asynchronous operation by a call to
      * {@link #stopWriting stopWriting} is not predictable even if called from within the
      * listener.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code OutputRoundListener}
      * the reference to the  current working buffer (initially {@code src1}) can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A working buffer with {@code 0} bytes remaining to be written (that is a buffer already empty) at the moment this method is initially
      * invoked or then subsequently when the listener is returning will not stop the asynchronous operation; the listener is
      * guaranteed to be called back again at the latest as soon as all other events pending at the time of notification have been dispatched.
      * The underrun condition resulting from the listener notification
      * returning with an empty buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one write operation (synchronous or asynchronous) can be going on at any time.
-     * <br />
+     * <br>
      * Note therefore that while empty output buffer conditions ({@link UARTEvent#OUTPUT_BUFFER_EMPTY}) may be
      * notified to the registered {@code UARTEventListener}
      * independently from the invocation of the provided {@code OutputRoundListener} attempting to call
      * the {@code write} method from within the registered {@code UARTEventListener} will result in an exception.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffers until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffers concurrently
      * may yield unpredictable results.
+     * </p>
      *
      * @param src1
      *            the first buffer for the data to be written.
@@ -432,8 +467,9 @@
     /**
      * Stops (cancels) the currently active asynchronous writing session as started by a call to one
      * of the {@link #startWriting startWriting} methods.
-     * <p />
+     * <p>
      * This method return silently if no writing session is currently active.
+     * </p>
      *
      * @throws UnavailableDeviceException
      *             if this device is not currently available - such as it is locked by another application.
@@ -450,12 +486,12 @@
      * with input data. Reading into the buffer and notification will only resume once the
      * event has been handled. Reading and notification will immediately start and will repeat until it is stopped by a
      * call to {@link #stopReading stopReading}.
-     * <p />
+     * <p>
      * <i>r</i> bytes will be read from this {@code UART},
      * where <i>r</i> is the number of bytes remaining in the buffer (possibly {@code 0}), that is,
      * <tt>dst.remaining()</tt>, at the moment this method is initially invoked
      * and then subsequently when the listener is returning.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is read, where {@code 0 <= n <= r}.
      * This byte sequence will be transferred into the buffer so that the first
      * byte in the sequence is at index <i>p</i> and the last byte is at index
@@ -465,41 +501,42 @@
      * and then subsequently when the listener is returning.
      * Upon invocation of the listener for fetching more data to write the buffer's position will be equal to
      * <i>{@code p + n}</i>; its limit will not have changed.
-     * <br />
+     * <br>
      * If this channel
      * uses an internal input buffer and is therefore working in <a href="#iomodes">buffering mode</a> the listener will only be
      * invoked after all the <i>r</i> bytes have been copied from the
      * internal input buffer; otherwise the listener will only be invoked after all the
-     * <i>r</i> bytes have been transferred from the driver/hardware.<br />
+     * <i>r</i> bytes have been transferred from the driver/hardware.<br>
      * The buffer's position upon stopping this asynchronous operation by a call to {@link #stopReading stopReading}
      * is not predictable unless called from within the listener.
-     * <p />
+     * </p><p>
      * The data will be read according to the current baud rate as returned by {@link #getBaudRate getBaudRate}. The
      * baud rate and other configuration parameters can be changed by the provided {@link InputRoundListener} instance
      * upon notification of each round.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code InputRoundListener}
      * the reference to the provided {@code dst} buffer can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A buffer with {@code 0} bytes remaining to be read (that is a buffer already full) at the moment this method is initially
      * invoked or then subsequently when the listener is returning will not stop the asynchronous operation; the listener is
      * guaranteed to be called back again at the latest as soon as all other events pending at the time of notification have been dispatched.
      * The overrun condition resulting from the listener notification
      * returning with an already-full buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one read operation (synchronous or asynchronous) can be going on at any time.
-     * <br />
+     * <br>
      * Note therefore that while the availability of new input data ({@link UARTEvent#INPUT_DATA_AVAILABLE}) may be
      * notified to the registered {@code UARTEventListener}
      * independently from the invocation of the provided {@code InputRoundListener} attempting to call
      * the {@code read} method from within the registered {@code UARTEventListener} will result in an exception.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffer until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffer concurrently
      * may yield unpredictable results.
+     * </p>
      *
      * @param dst
      *            the buffer for the data to be read.
@@ -512,6 +549,8 @@
      *             if this device is not currently available - such as it is locked by another application.
      * @throws ClosedDeviceException
      *             if the device has been closed.
+     * @throws IllegalArgumentException
+     *             if the provided buffer {@code dst} has a zero-capacity.
      * @throws IllegalStateException
      *             if another synchronous or asynchronous input operation is already active.
      * @throws IOException
@@ -521,7 +560,7 @@
 
     /**
      * Starts asynchronous reading in successive rounds.
-     * <p />
+     * <p>
      * This method behaves identically to {@link #startReading(ByteBuffer, InputRoundListener)} excepts that it
      * uses double-buffering - the provided buffers must not have a zero-capacity and must not overlap
      * - that is the backing array sections or memory regions they refer to must not overlap.
@@ -531,29 +570,30 @@
      * the position of the current working buffer upon stopping this asynchronous operation by a call to
      * {@link #stopReading stopReading} is not predictable even if called from within the
      * listener.
-     * <p />
+     * </p><p>
      * Upon notification of the provided {@code InputRoundListener}
      * the reference to the  current working buffer (initially {@code dst1}) can be retrieved from the
      * {@code RoundCompletionEvent} using the {@link jdk.dio.RoundCompletionEvent#getBuffer() getBuffer} method.
-     * <br />
+     * <br>
      * A buffer with {@code 0} bytes remaining to be read (that is a buffer already full) at the moment this method is initially
      * invoked or then subsequently when the listener is returning will not stop the asynchronous operation; the listener is
      * guaranteed to be called back again at the latest as soon as all other events pending at the time of notification have been dispatched.
      * The overrun condition resulting from the listener notification
      * returning with an already-full buffer will be reported on the subsequent notifications through
      * the {@link jdk.dio.RoundCompletionEvent#isOnError() RoundCompletionEvent.isOnError} method.
-     * <p />
+     * </p><p>
      * Only one read operation (synchronous or asynchronous) can be going on at any time.
-     * <br />
+     * <br>
      * Note therefore that while the availability of new input data ({@link UARTEvent#INPUT_DATA_AVAILABLE}) may be
      * notified to the registered {@code UARTEventListener}
      * independently from the invocation of the provided {@code InputRoundListener} attempting to call
      * the {@code read} method from within the registered {@code UARTEventListener} will result in an exception.
-     * <p />
+     * </p><p>
      * Buffers are not safe for use by multiple concurrent threads so care should
      * be taken to not access the provided buffers until the operation (or a round thereof) has completed.
      * Interfering with the asynchronous operation by accessing and modifying the provided buffers concurrently
      * may yield unpredictable results.
+     * </p>
      *
      * @param dst1
      *            the first buffer for the data to be read.
@@ -582,8 +622,9 @@
     /**
      * Stops (cancels) the currently active asynchronous reading session as started by a call to one
      * of the {@link #startReading startReading} methods.
-     * <p />
+     * <p>
      * This method return silently if no reading session is currently active.
+     * </p>
      *
      * @throws UnavailableDeviceException
      *             if this device is not currently available - such as it is locked by another application.
@@ -596,13 +637,14 @@
 
     /**
      * Generates a line break for the specified duration.
-     * <p />
+     * <p>
      * The operation will return only after the generation of the line break.
-     * <p />
+     * </p><p>
      * The line break duration is expressed in milliseconds; if the underlying platform or driver
      * does not support a milliseconds resolution or does not support the requested duration value
      * then {@code duration} will be <em>rounded down</em> to accommodate the supported resolution
      * or respectively aligned to the closest lower supported discrete duration value.
+     * </p>
      *
      * @param duration duration of the line break to generate, in milliseconds.
      * @throws IllegalArgumentException
@@ -624,8 +666,9 @@
      * the specified number of bytes have been received in the input buffer.
      * If a synchronous read operation is on-going it may then immediately return
      * with the number of bytes already read.
-     * <p />
+     * <p>
      * If {@code level} is zero then <em>receive trigger</em> is disabled.
+     * </p>
      *
      * @param level the trigger level, in bytes.
      *
@@ -639,6 +682,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getReceiveTriggerLevel
      */
     void setReceiveTriggerLevel(int level) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -656,6 +701,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setReceiveTriggerLevel
      */
     int getReceiveTriggerLevel() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -665,16 +712,17 @@
      * there is at least one byte in the input buffer and the specified timeout has elapsed.
      * If a synchronous read operation is on-going when the timeout has elapsed
      * it will immediately return with the number of bytes already read, possibly zero.
-     * <p />
+     * <p>
      * The receive timeout is expressed in milliseconds; if the underlying platform or driver
      * does not support a milliseconds resolution or does not support the requested timeout value
      * then {@code timeout} will be <em>rounded down</em> to accommodate the supported resolution
      * or respectively aligned to the closest lower supported discrete timeout value. The resulting, actual
      * timeout can be retrieved by a call to {@link #getReceiveTimeout() getReceiveTimeout}.
-     * <p />
+     * </p><p>
      * If {@code timeout} is equal to zero then a synchronous read operation will not block; it will read
      * from the bytes already available (possibly zero) and will return immediately.
      * If {@code timeout} is equal to {@link Integer#MAX_VALUE} then receive timeout is disabled.
+     * </p>
      *
      * @param timeout the timeout, in milliseconds.
      *
@@ -688,6 +736,8 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #getReceiveTimeout
      */
     void setReceiveTimeout(int timeout) throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
@@ -707,16 +757,18 @@
      *             if the device has been closed.
      * @throws IOException
      *             if some other I/O error occurs.
+     *
+     * @see #setReceiveTimeout
      */
     int getReceiveTimeout() throws IOException, UnavailableDeviceException, ClosedDeviceException;
 
     /**
      * Reads a sequence of bytes from this UART into the given buffer.
-     * <p />
+     * <p>
      * <i>r</i> bytes will be read from this device, where
      * <i>r</i> is the number of bytes remaining in the buffer, that is,
      * {@code dst.remaining()}, at the moment this method is invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is read, where
      * <i>{@code 0 <= n <= r}
      * </i>. This byte sequence will be transferred into the buffer so that the
@@ -724,7 +776,7 @@
      * index <i>{@code p + n - 1}</i>, where <i>p</i> is the buffer's position at
      * the moment this method is invoked. Upon return the buffer's position will
      * be equal to <i>{@code p + n}</i>; its limit will not have changed.
-     * <p />
+     * </p><p>
      * A read operation might not fill the buffer. It is guaranteed, however, that
      * if there is at least one byte remaining in the buffer then this method will
      * block until the requested number of bytes are read or
@@ -734,7 +786,7 @@
      * working in <a href="#iomodes">buffering mode</a> this method will block
      * under the same conditions until the requested number of bytes have been
      * copied from the internal input buffer, or the receive trigger level (if
-     * set) has been reached, or the receive timeout (if set) has elapsed.<br />
+     * set) has been reached, or the receive timeout (if set) has elapsed.<br>
      * The availability of new input data may be notified through an
      * {@link UARTEvent} with ID {@link UARTEvent#INPUT_DATA_AVAILABLE} according
      * to the receive trigger level or receive timeout (if set); if this method is
@@ -743,13 +795,14 @@
      * any concurrent synchronous read operation that may have also been unblocked by
      * that event and that may have already read all or part of the received bytes
      * that triggered the event.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already
      * initiated a synchronous read upon this device, however, then an invocation
      * of this method will block until the first operation is complete.
-     * <p />
+     * </p><p>
      * Only one read operation (synchronous or asynchronous) can be going on at
      * any time.
+     * </p>
      *
      * @param dst
      *            The buffer into which bytes are to be transferred
@@ -776,34 +829,35 @@
 
     /**
      * Writes a sequence of bytes to this UART from the given buffer.
-     * <p />
+     * <p>
      * <i>r</i> bytes will be written to this device, where <i>r</i> is the number of bytes
      * remaining in the buffer, that is, {@code src.remaining()}, at the moment this method is
      * invoked.
-     * <p />
+     * </p><p>
      * Suppose that a byte sequence of length <i>n</i> is written, where <i>{@code 0 <= n <= r}
      * </i>. This byte sequence will be transferred from the buffer starting at index <i>p</i>,
      * where <i>p</i> is the buffer's position at the moment this method is invoked; the index of
      * the last byte written will be <i>{@code p + n - 1}</i>. Upon return the buffer's position
-     * will be equal to <i>{@code p + n}</i>; its limit will not have changed. <br />
+     * will be equal to <i>{@code p + n}</i>; its limit will not have changed. <br>
      * This operation will block until the requested <i>r</i> bytes
      * have been written or otherwise transferred to the driver/hardware. If this
      * channel uses an internal output buffer and is therefore
      * working in <a href="#iomodes">buffering mode</a> this method will block
      * until all the <i>r</i> bytes have been copied to the internal
-     * output buffer. <br />
+     * output buffer. <br>
      * An empty output buffer condition may be notified through an {@link UARTEvent} with ID
      * {@link UARTEvent#OUTPUT_BUFFER_EMPTY}; if this method is
      * invoked within a listener to handle an {@code OUTPUT_BUFFER_EMPTY} event
      * then care should be taken to account for any concurrent synchronous write operation
      * that may have also been unblocked by that same condition and that may have already
      * written bytes filling all or part of the available buffer space.
-     * <p />
+     * </p><p>
      * This method may be invoked at any time. If another thread has already initiated a synchronous
      * write operation upon this device, however, then an invocation of this method will block
      * until the first operation is complete.
-     * <p />
+     * </p><p>
      * Only one write operation (synchronous or asynchronous) can be going on at any time.
+     * </p>
      *
      * {@inheritDoc}
      *
--- a/src/share/classes/jdk/dio/uart/UARTConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/UARTConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -44,16 +44,17 @@
 /**
  * The {@code UARTConfig} class encapsulates the hardware addressing information, and static and dynamic configuration
  * parameters of a UART.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code UARTConfig} can be passed to the {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated UART with the specified
  * configuration. A {@link InvalidDeviceConfigException} is thrown when attempting to open a device with
  * an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -91,26 +92,32 @@
     public static final int FLOWCONTROL_NONE = 0;
     /**
      * RTS/CTS (hardware) flow control on input.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other output flow control bit flags.
+     * </p>
      */
     public static final int FLOWCONTROL_RTSCTS_IN = 1;
     /**
      * RTS/CTS (hardware) flow control on output.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other output flow control bit flags.
+     * </p>
      */
     public static final int FLOWCONTROL_RTSCTS_OUT = 2;
     /**
      * XON/XOFF (software) flow control on input.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other input flow control bit flags.
+     * The actual XON and XOFF characters used for software flow control are device hardware and driver-dependent.
+     * </p>
      */
     public static final int FLOWCONTROL_XONXOFF_IN = 4;
     /**
      * XON/XOFF (software) flow control on output.
-     * <p />
+     * <p>
      * This bit flag can be bitwise-combined (OR) with other input flow control bit flags.
+     * The actual XON and XOFF characters used for software flow control are device hardware and driver-dependent.
+     * </p>
      */
     public static final int FLOWCONTROL_XONXOFF_OUT = 8;
     /**
@@ -217,7 +224,7 @@
          * set).
          *
          * @param channelNumber the channel number (a positive or zero integer)
-         * or {@code DeviceConfig.UNASSIGNED}.
+         * or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code channelNumber} is not in
          * the defined range.
@@ -233,7 +240,7 @@
          * not set).
          *
          * @param controllerNumber the hardware converter's number (a positive
-         * or zero integer) or {@link #UNASSIGNED}.
+         * or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code controllerNumber} is not
          * in the defined range.
@@ -298,7 +305,7 @@
          *
          * @param inputBufferSize the requested input buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code inputBufferSize} is not in
          * the defined range.
@@ -315,7 +322,7 @@
          *
          * @param outputBufferSize the requested output buffer size in number of
          * samples (a positive or zero integer) or
-         * {@code DeviceConfig.UNASSIGNED}.
+         * {@link #UNASSIGNED UNASSIGNED}.
          * @return this {@code Builder} instance.
          * @throws IllegalArgumentException if {@code outputBufferSize} is not
          * in the defined range.
@@ -364,11 +371,15 @@
 
     /**
      * Creates a new {@code UARTConfig} with the specified hardware addressing information and configuration parameters.
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware UART controller's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware UART controller's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param baudRate
      *            the speed in Bauds (a positive integer).
      * @param dataBits
@@ -407,11 +418,15 @@
     /**
      * Creates a new {@code UARTConfig} with the specified hardware addressing information and configuration parameters.
      * The platform/underlying driver may or may not allocate the requested sizes for the input and output buffers.
+     * <p>
+     * The controller name is set to {@code null}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerNumber
-     *            the hardware UART controller's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware UART controller's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param channelNumber
-     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param baudRate
      *            the speed in Bauds (a positive integer).
      * @param dataBits
@@ -428,9 +443,9 @@
      *            {@link #FLOWCONTROL_RTSCTS_IN}, {@link #FLOWCONTROL_RTSCTS_OUT}, {@link #FLOWCONTROL_XONXOFF_IN} or
      *            {@link #FLOWCONTROL_XONXOFF_OUT}.
      * @param inputBufferSize
-     *            the input buffer size (a positive or zero integer) or {@link #UNASSIGNED} - (advisory only).
+     *            the input buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED} - (advisory only).
      * @param outputBufferSize
-     *            the output buffer size (a positive or zero integer) or {@link #UNASSIGNED} - (advisory only).
+     *            the output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED} - (advisory only).
      *
      * @throws IllegalArgumentException
      *             if any of the following is true:
@@ -465,11 +480,15 @@
 
     /**
      * Creates a new {@code UARTConfig} with the specified hardware addressing information and configuration parameters.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param baudRate
      *            the speed in Bauds (a positive integer).
      * @param dataBits
@@ -509,11 +528,15 @@
     /**
      * Creates a new {@code UARTConfig} with the specified hardware addressing information and configuration parameters.
      * The platform/underlying driver may or may not allocate the requested sizes for the input and output buffers.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * The requested input and output buffer sizes are set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param channelNumber
-     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware UART channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param baudRate
      *            the speed in Bauds (a positive integer).
      * @param dataBits
@@ -530,9 +553,9 @@
      *            {@link #FLOWCONTROL_RTSCTS_IN}, {@link #FLOWCONTROL_RTSCTS_OUT}, {@link #FLOWCONTROL_XONXOFF_IN} or
      *            {@link #FLOWCONTROL_XONXOFF_OUT}.
      * @param inputBufferSize
-     *            the input buffer size (a positive or zero integer) or {@link #UNASSIGNED} - (advisory only).
+     *            the input buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED} - (advisory only).
      * @param outputBufferSize
-     *            the output buffer size (a positive or zero integer) or {@link #UNASSIGNED} - (advisory only).
+     *            the output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED} - (advisory only).
      *
      * @throws IllegalArgumentException
      *             if any of the following is true:
@@ -621,18 +644,18 @@
     }
 
     /**
-     * Gets the configured default/initial speed in Bauds.
+     * Gets the configured initial speed in Bauds.
      *
-     * @return the default/initial speed in Bauds (a positive integer).
+     * @return the initial speed in Bauds (a positive integer).
      */
     public int getBaudRate() {
         return baudRate;
     }
 
     /**
-     * Gets the configured default/initial number of bits per character.
+     * Gets the configured initial number of bits per character.
      *
-     * @return the default/initial number of bits per character, one of: {@link #DATABITS_5}, {@link #DATABITS_6},
+     * @return the initial number of bits per character, one of: {@link #DATABITS_5}, {@link #DATABITS_6},
      *         {@link #DATABITS_7}, {@link #DATABITS_8} or {@link #DATABITS_9}.
      */
     public int getDataBits() {
@@ -640,7 +663,7 @@
     }
 
     /**
-     * Gets the configured default/initial flow control mode.
+     * Gets the configured initial flow control mode.
      *
      * @return the flow control mode: {@link #FLOWCONTROL_NONE} if flow control is disabled; or a valid bit-wise OR combination of
      *         {@link #FLOWCONTROL_RTSCTS_IN}, {@link #FLOWCONTROL_RTSCTS_OUT}, {@link #FLOWCONTROL_XONXOFF_IN} or
@@ -657,7 +680,7 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated input buffer size (a positive or zero integer).
+     * @return the requested or allocated input buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getInputBufferSize() {
         return inputBufferSize;
@@ -670,16 +693,16 @@
      * When querying the configuration of an opened or registered device the
      * allocated buffer size is returned.
      *
-     * @return the requested or allocated output buffer size (a positive or zero integer).
+     * @return the requested or allocated output buffer size (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getOutputBufferSize() {
         return outputBufferSize;
     }
 
     /**
-     * Gets the configured default/initial parity.
+     * Gets the configured initial parity.
      *
-     * @return the default/initial parity, one of: {@link #PARITY_ODD}, {@link #PARITY_EVEN}, {@link #PARITY_MARK},
+     * @return the initial parity, one of: {@link #PARITY_ODD}, {@link #PARITY_EVEN}, {@link #PARITY_MARK},
      *         {@link #PARITY_SPACE}, or {@link #PARITY_NONE}.
      */
     public int getParity() {
@@ -687,9 +710,9 @@
     }
 
     /**
-     * Gets the configured default/initial number of stop bits per character.
+     * Gets the configured initial number of stop bits per character.
      *
-     * @return the default/initial number of stop bits per character, on of: {@link #STOPBITS_1}, {@link #STOPBITS_1_5},
+     * @return the initial number of stop bits per character, on of: {@link #STOPBITS_1}, {@link #STOPBITS_1_5},
      *         or {@link #STOPBITS_2}.
      */
     public int getStopBits() {
@@ -698,7 +721,7 @@
     /**
      * Gets the configured UART channel number.
      *
-     * @return the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware channel's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getChannelNumber() {
         return channelNumber;
@@ -707,7 +730,7 @@
     /**
      * Gets the configured UART controller number.
      *
-     * @return the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the hardware controller's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
--- a/src/share/classes/jdk/dio/uart/UARTEvent.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/UARTEvent.java	Thu Aug 13 12:59:51 2015 +0300
@@ -71,7 +71,7 @@
      * Creates a new {@link UARTEvent} with the specified value and time-stamped
      * with the current time.
      *
-     * @param uart the source uart.
+     * @param uart the source UART.
      * @param id the event ID: {@link #INPUT_DATA_AVAILABLE}, {@link #INPUT_BUFFER_OVERRUN},
      *         {@link #OUTPUT_BUFFER_EMPTY}, {@link #BREAK_INTERRUPT},
      *         {@link #FRAMING_ERROR} or {@link #PARITY_ERROR}.
@@ -85,7 +85,7 @@
     /**
      * Creates a new {@link UARTEvent} with the specified value and timestamp.
      *
-     * @param uart the source uart.
+     * @param uart the source UART.
      * @param id the event ID: {@link #INPUT_DATA_AVAILABLE}, {@link #INPUT_BUFFER_OVERRUN},
      *         {@link #OUTPUT_BUFFER_EMPTY}, {@link #BREAK_INTERRUPT},
      *         {@link #FRAMING_ERROR} or {@link #PARITY_ERROR}.
@@ -93,7 +93,8 @@
      * @param timeStampMicros the additional microseconds to the timestamp.
      * @throws NullPointerException if {@code uart} is {@code null}.
      * @throws IllegalArgumentException if {@code id} is not a valid event ID or
-     * if {@code timeStamp} or {@code timeStampMicros} is negative.
+     * if {@code timeStamp} is negative or
+     *             {@code timeStampMicros} is not in the range {@code [0 - 999]}.
      */
     public UARTEvent(UART uart, int id, long timeStamp, int timeStampMicros) {
         if(null == uart){
@@ -126,4 +127,4 @@
     public int getID() {
         return id;
     }
-}
+}
\ No newline at end of file
--- a/src/share/classes/jdk/dio/uart/UARTEventListener.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/UARTEventListener.java	Thu Aug 13 12:59:51 2015 +0300
@@ -29,8 +29,9 @@
 /**
  * The {@code UARTEventListener} interface defines methods for getting notified of events fired by devices
  * that implement the {@link UART} interface.
- * <p />
+ * <p>
  * A {@code UARTEventListener} can be registered using the {@link UART#setEventListener UART.setEventListener} method.
+ * </p>
  *
  * @see UART#setEventListener UART.setEventListener
  * @see UARTEvent
--- a/src/share/classes/jdk/dio/uart/UARTPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/UARTPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -33,11 +33,12 @@
 
 /**
  * The {@code UARTPermission} class defines permissions for UART channel access.
- * <p />
+ * <p>
  * A {@code UARTPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the base {@link DevicePermission} class
- * with the following addition:
+ * with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>
@@ -46,7 +47,10 @@
  * {@link UARTConfig#getChannelNumber UARTConfig.getChannelNumber}. The characters in the string must all be decimal digits.
  * </dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
@@ -102,4 +106,3 @@
         Utils.checkDevicePermissionChannelFormat(name, Utils.DECIMAL_DIGITS);
     }
 }
-
--- a/src/share/classes/jdk/dio/uart/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/uart/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -25,37 +25,38 @@
 /**
  * Interfaces and classes for controlling and reading and writing from/to Universal Asynchronous Receiver/Transmitter
  * (UART), with optional Modem signals control.
- * <p />
+ * <p>
  * In order to access and control a specific UART device, an application should first open and obtain an
  * {@link jdk.dio.uart.UART} instance for the UART device using its numeric ID, name, type (interface)
- * and/or properties:
+ * and/or properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * UART uart = (UART) DeviceManager.open(14);
+ * </pre>
+ * </blockquote>
  * </dd>
  * <dt>Using its name and interface</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * UART uart = DeviceManager.open(&quot;HOST&quot;, UART.class, null);
  * </pre>
- *
  * </blockquote> Or (with modem signals control properties), <blockquote>
- *
  * <pre>
  * ModemUART uart = DeviceManager.open(&quot;MODEM&quot;, ModemUART.class, null);
  * </pre>
- *
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * Once opened, an application can read the received data bytes and write the data bytes to be transmitted through the
- * UART using methods of the {@link java.nio.channels.ByteChannel ByteChannel} interface. <blockquote>
- *
+ * UART using methods of the {@link java.nio.channels.ByteChannel ByteChannel} interface.
+ * </p>
+ * <blockquote>
  * <pre>
  * ByteBuffer buffer = new ByteBuffer();
  * ...
@@ -64,17 +65,18 @@
  * uart.write(buffer);
  * ...
  * </pre>
- *
- * </blockquote> When done, the application should call the {@link jdk.dio.uart.UART#close() } method to
- * close the UART device. <blockquote>
- *
+ * </blockquote>
+ * <p>
+ * When done, the application should call the {@link jdk.dio.uart.UART#close() } method to
+ * close the UART device.</p>
+ * <blockquote>
  * <pre>
  * uart.close();
  * </pre>
- *
- * </blockquote> The following sample code gives an example of using the UART API to communicate with some host
- * terminal: <blockquote>
- *
+ * </blockquote>
+ * <p>The following sample code gives an example of using the UART API to communicate with some host
+ * terminal:</p>
+ * <blockquote>
  * <pre>
  * try (UART host = DeviceManager.open(&quot;HOST&quot;, UART.class, (String) null);
  *         InputStream is = Channels.newInputStream(host);
@@ -98,10 +100,10 @@
  *     <i>// Handle exception</i>
  * }
  * </pre>
- *
- * </blockquote> The following sample codes give examples of using the ModemUART API to additionally control the MODEM
- * signals: <blockquote>
- *
+ * </blockquote>
+ * <p>The following sample codes give examples of using the ModemUART API to additionally control the MODEM
+ * signals:</p>
+ * <blockquote>
  * <pre>
  * try (ModemUART modem = DeviceManager.open(&quot;HOST&quot;, ModemUART.class, (String) null);
  *         InputStream is = Channels.newInputStream(modem);
@@ -121,16 +123,21 @@
  *     <i>// Handle exception</i>
  * }
  * </pre>
- *
- * </blockquote> The preceding example is using a <em>try-with-resources</em> statement; the
+ * </blockquote><p> The preceding example is using a <em>try-with-resources</em> statement; the
  * {@link jdk.dio.uart.UART#close UART.close}, {@link java.io.InputStream#close
  * InputStream.close} and {@link java.io.OutputStream#close OutputStream.close} methods are automatically invoked
  * by the platform at the end of the statement.
- * <p />
+ * </p><p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
- * <p />
+ * </p><p>
  * This package requires the {@link jdk.dio.modem} package.
+ * </p>
  *
  * @since 1.0
  */
--- a/src/share/classes/jdk/dio/watchdog/WatchdogTimer.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/watchdog/WatchdogTimer.java	Thu Aug 13 12:59:51 2015 +0300
@@ -34,35 +34,36 @@
 /**
  * The {@code WatchdogTimer} interface provides methods for controlling a watchdog timer that can be used to force the
  * device to reboot (or depending on the platform, the Java Virtual Machine to restart).
- * <p />
+ * <p>
  * A {@code WatchdogTimer} instance may represent a virtual watchdog timer. If the device has a single physical watchdog
  * timer, all of the virtual watchdog timers are mapped onto this one physical watchdog timer. It gets set to expire
  * when the virtual watchdog with the earliest timeout is scheduled to expire. The corresponding watchdog timer
  * device is therefore shared and several applications can concurrently acquire the same watchdog timer device.
- * <p />
+ * </p><p>
  * A watchdog timer may be identified by the numeric ID and by the name (if any defined) that correspond to its
  * registered configuration. A {@code WatchdogTimer} instance can be opened by a call to one of the
  * {@link DeviceManager#open(int) DeviceManager.open(id,...)} methods using its ID or by a call to one of the
  * {@link DeviceManager#open(java.lang.String, java.lang.Class, java.lang.String[])
- * DeviceManager.open(name,...)} methods using its name. <br />
+ * DeviceManager.open(name,...)} methods using its name. <br>
  * If a watchdog timer is virtualized, a particular platform implementation may allow for several {@code WatchdogTimer}
  * instances representing each a virtual instance of that same physical watchdog timer to be opened concurrently using
  * the same device ID, or,
- * alternatively, it may assign each virtual watchdog timer instance a distinct device ID (and a common name). <br />
- * <p />
+ * alternatively, it may assign each virtual watchdog timer instance a distinct device ID (and a common name). <br>
+ * </p><p>
  * Once the device opened, the application can start using it and can especially start the timer using the
  * {@link jdk.dio.watchdog.WatchdogTimer#start(long) WatchdogTimer.start} method and subsequently
  * refresh the timer repeatedly/regularly using the {@link jdk.dio.watchdog.WatchdogTimer#refresh
  * WatchdogTimer.refresh} method to prevent the timeout from elapsing.
- * <p />
+ * </p><p>
  * When done, an application should call the {@link #close WatchdogTimer.close} method to close the watchdog timer.
  * Any further attempt to access or control a watchdog timer which has been closed will result in a
  * {@link ClosedDeviceException} been thrown.
- * <p />
+ * </p><p>
  * This specification does not specify nor require any deterministic behavior or
  * strict time constraint compliance from the underlying platform or driver.
  * Therefore the use by applications of watchdog timers must account for the latencies
  * inherent to such platforms.
+ * </p>
  *
  * @since 1.0
  */
@@ -117,8 +118,9 @@
     /**
      * Refreshes the watchdog timer. This method must be called periodically to prevent the watchdog from timing out and
      * rebooting the device (or restarting the JVM).
-     * <p />
+     * <p>
      * This method has no effect if the timer is currently disabled.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
@@ -132,15 +134,16 @@
     /**
      * Starts the watchdog timer with the specified timeout. If the watchdog timer is not refreshed by a call to
      * {@link #refresh refresh} prior to the watchdog timing out, the device will be rebooted (or the JVM restarted).
-     * <p />
+     * <p>
      * The timeout is expressed in milliseconds; if the underlying platform or driver
      * does not support a millisecond resolution or does not support the requested time interval value
      * then {@code timeout} will be <em>rounded up</em> to accommodate the supported timer resolution
      * or respectively aligned to the closest greater supported discrete time interval value. The resulting, actual
      * timeout can be retrieved by a call to {@link #getTimeout() getTimeout}.
-     * <p />
+     * </p><p>
      * Calling this method twice is equivalent to stopping the timer as per a call to {@link #stop stop} and starting
      * it again with the new specified timeout.
+     * </p>
      *
      * @param timeout
      *            the time interval (in milliseconds) until watchdog times out.
@@ -158,8 +161,9 @@
 
     /**
      * Stops this watchdog timer.
-     * <p />
+     * <p>
      * This method returns silently if the timer is already disabled.
+     * </p>
      *
      * @throws IOException
      *             if some other I/O error occurs.
--- a/src/share/classes/jdk/dio/watchdog/WatchdogTimerConfig.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/watchdog/WatchdogTimerConfig.java	Thu Aug 13 12:59:51 2015 +0300
@@ -42,16 +42,17 @@
 /**
  * The {@code WatchdogTimerConfig} class encapsulates the hardware addressing information, and static and dynamic
  * configuration parameters of a watchdog timer.
- * <p />
+ * <p>
  * Some hardware addressing, static or dynamic configuration parameters may be
- * set to {@link #UNASSIGNED} or {@code null} (see
+ * set to {@link #UNASSIGNED UNASSIGNED} or {@code null} (see
  * <a href="{@docRoot}/jdk/dio/DeviceConfig.html#default_unassigned">Unassigned, Default or Unused Parameter Values</a>).
- * <p />
+ * </p><p>
  * An instance of {@code WatchdogTimerConfig} can be passed to the {@link DeviceManager#open(DeviceConfig) open(DeviceConfig, ...)} and
  * {@link DeviceManager#open(Class, DeviceConfig) open(Class, DeviceConfig, ...)}
  * methods of the {@link DeviceManager} to open the designated watchdog timer with the specified
  * configuration. A {@link InvalidDeviceConfigException} is thrown when attempting to open a device with
  * an invalid or unsupported configuration.
+ * </p>
  *
  * @see DeviceManager#open(DeviceConfig)
  * @see DeviceManager#open(DeviceConfig, int)
@@ -61,7 +62,7 @@
  */
 @SerializeMe
 @apimarker.API("device-io_1.1_watchdog")
-public class WatchdogTimerConfig implements DeviceConfig<WatchdogTimer>, DeviceConfig.HardwareAddressing {
+public final class WatchdogTimerConfig implements DeviceConfig<WatchdogTimer>, DeviceConfig.HardwareAddressing {
 
     private String controllerName;
 
@@ -75,11 +76,14 @@
 
     /**
      * Creates a new {@code WatchdogTimerConfig} with the specified hardware addressing information.
+     * <p>
+     * The controller number is set to {@code UNASSIGNED}.
+     * </p>
      *
      * @param controllerName
      *            the controller name (such as its <em>device file</em> name on UNIX systems).
      * @param timerNumber
-     *            the hardware timer's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware timer's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if {@code timerNumber} is not in the defined range.
      * @throws NullPointerException
@@ -97,11 +101,14 @@
 
     /**
      * Creates a new {@code WatchdogTimerConfig} with the specified hardware addressing information.
+     * <p>
+     * The controller name is set to {@code null}.
+     * </p>
      *
      * @param controllerNumber
-     *            the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @param timerNumber
-     *            the hardware timer's number (a positive or zero integer) or {@link #UNASSIGNED}.
+     *            the hardware timer's number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      * @throws IllegalArgumentException
      *             if {@code timerNumber} is not in the defined range.
      */
@@ -147,7 +154,7 @@
     /**
      * Gets the configured timer number.
      *
-     * @return the timer number (a positive or zero integer); or {@link #UNASSIGNED}.
+     * @return the timer number (a positive or zero integer); or {@link #UNASSIGNED UNASSIGNED}.
      */
     public int getTimerNumber() {
         return timerNumber;
@@ -156,7 +163,7 @@
     /**
      * Gets the configured controller number.
      *
-     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED}.
+     * @return the controller number (a positive or zero integer) or {@link #UNASSIGNED UNASSIGNED}.
      */
     @Override
     public int getControllerNumber() {
--- a/src/share/classes/jdk/dio/watchdog/WatchdogTimerPermission.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/watchdog/WatchdogTimerPermission.java	Thu Aug 13 12:59:51 2015 +0300
@@ -32,11 +32,12 @@
 
 /**
  * The {@code WatchdogTimerPermission} class defines permissions for watchdog timer access.
- * <p />
+ * <p>
  * A {@code WatchdogTimerPermission} permission has a target name and a list of actions.
- * <p />
+ * </p><p>
  * The target name contains hardware addressing information. The format is the one defined for the base {@link DevicePermission} class
- * with the following addition:
+ * with the following addition:</p>
+ * <blockquote>
  * <dl>
  * <dt><code>{channel-desc}</code></dt>
  * <dd>
@@ -45,8 +46,10 @@
  * {@link WatchdogTimerConfig#getTimerNumber WatchdogTimerConfig.getTimerNumber}. The characters in the string must all be decimal digits.
  * </dd>
  * </dl>
- * <p />
+ * </blockquote>
+ * <p>
  * The supported actions are {@code open} and {@code powermanage} as defined in {@link DevicePermission}.
+ * </p>
  *
  * @see DeviceManager#open DeviceManager.open
  * @see jdk.dio.power.PowerManaged
@@ -102,4 +105,3 @@
         Utils.checkDevicePermissionChannelFormat(name, Utils.DECIMAL_DIGITS);
     }
 }
-
--- a/src/share/classes/jdk/dio/watchdog/WindowedWatchdogTimer.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/watchdog/WindowedWatchdogTimer.java	Thu Aug 13 12:59:51 2015 +0300
@@ -31,17 +31,18 @@
 /**
  * The {@code WindowedWatchdogTimer} interface provides methods for controlling a watchdog timer that can be used to
  * force the device to reboot (or depending on the platform, the Java Virtual Machine to restart).
- * <p />
+ * <p>
  * The windowed watchdog timer must be refreshed within an open time window. If the watchdog is refreshed too soon -
  * during the closed window - or if it is refreshed too late - after the watchdog timeout has expired - the device will
  * be rebooted (or the JVM restarted).
- * <p />
+ * </p><p>
  * A {@code WindowedWatchdogTimer} instance may represent a virtual windowed watchdog timer. If the device has a single
  * physical windowed watchdog timer, all of the virtual watchdog timers are mapped onto this one physical watchdog
  * timer. It gets set with a refresh window starting when the virtual windowed watchdog with the longest closed window
  * delay is scheduled to end and ending when the virtual windowed watchdog with the earliest timeout is scheduled to
  * expire. The corresponding watchdog timer device is therefore shared and several applications can concurrently
  * acquire the same watchdog timer device.
+ * </p>
  *
  * @since 1.0
  */
@@ -71,15 +72,16 @@
      * Starts the watchdog timer with the specified timeout and with a closed window delay set to {@code 0}. If the
      * watchdog timer is not refreshed by a call to {@link #refresh refresh} prior to the watchdog timing out, the device will
      * be rebooted (or the JVM restarted).
-     * <p />
+     * <p>
      * The timeout is expressed in milliseconds; if the underlying platform or driver
      * does not support a millisecond resolution or does not support the requested time interval value
      * then {@code timeout} will be <em>rounded up</em> to accommodate the supported timer resolution
      * or respectively aligned to the closest greater supported discrete time interval value. The resulting, actual
      * timeout can be retrieved by a call to {@link #getTimeout() getTimeout}.
-     * <p />
+     * </p><p>
      * Calling this method twice is equivalent to stopping the timer as per a call to {@link #stop stop} and starting
      * it again with the new specified timeout and with a closed window delay set to {@code 0}.
+     * </p>
      *
      * @param timeout
      *            the time interval (in milliseconds) until watchdog times out.
@@ -98,21 +100,22 @@
      * Starts the windowed watchdog timer with the specified closed window delay and timeout. If the {@link #refresh refresh}
      * method is called too soon, that is within the closed window delay, or too late, that is not called prior to the
      * watchdog timing out, the device will be rebooted (or the JVM restarted).
-     * <p />
+     * <p>
      * The timeout is expressed in milliseconds; if the underlying platform or driver
      * does not support a millisecond resolution or does not support the requested time interval value
      * then {@code timeout} will be <em>rounded up</em> to accommodate the supported timer resolution
      * or respectively aligned to the closest greater supported discrete time interval value. The resulting, actual
      * timeout can be retrieved by a call to {@link #getTimeout() getTimeout}.
-     * <br />
+     * <br>
      * Similarly, the closed window delay is expressed in milliseconds; if the underlying platform or driver
      * does not support a millisecond resolution or does not support the requested time interval value
      * then {@code closedWindowDelay} will be <em>rounded down</em> to accommodate the supported timer resolution
      * or respectively aligned to the closest lower supported discrete time interval value. The resulting, actual
      * timeout can be retrieved by a call to {@link #getClosedWindowTimeout() getClosedWindowTimeout}.
-     * <p />
+     * </p><p>
      * Calling this method twice is equivalent to stopping the timer as per a call to {@link #stop stop} and starting
      * it again with the new specified closed window delay and timeout.
+     * </p>
      *
      * @param closedWindowDelay
      *            the delay (in milliseconds) until the watchdog timer can be refreshed.
--- a/src/share/classes/jdk/dio/watchdog/package-info.java	Tue Aug 11 20:12:41 2015 +0300
+++ b/src/share/classes/jdk/dio/watchdog/package-info.java	Thu Aug 13 12:59:51 2015 +0300
@@ -24,68 +24,65 @@
  */
 /**
  * Interfaces and classes for using system watchdog timers (WDT).
- * <p />
+ * <p>
  * A watchdog timer is used to reset/reboot the system in case of hang or critical failure. This is used to reset the
  * system from a unresponsive state to a normal state. A watchdog timer can be set with a time interval for the
  * reset/reboot. Continuously refreshing the watchdog timer within the specified time interval prevents the
  * reset/reboot. If the watchdog timer has not been refreshed within the specified time interval a critical failure is
- * assumed and a system reset/reboot is carried out. <br />
+ * assumed and a system reset/reboot is carried out. <br>
  * A windowed watchdog timer must be refreshed within an open time window. If the watchdog is refreshed too soon -
  * during the closed window - or if it is refreshed too late - after the watchdog timeout has expired - the device will
  * be rebooted.
- * <p />
+ * </p><p>
  * In order to use with a specific watchdog timer, an application should first open and obtain an
  * {@link jdk.dio.watchdog.WatchdogTimer} instance for the watchdog timer the application wants to use,
- * using its numeric ID, name, type (interface) and/or properties:
+ * using its numeric ID, name, type (interface) and/or properties:</p>
+ * <blockquote>
  * <dl>
  * <dt>Using its ID</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * WatchdogTimer wdt = DeviceManager.open(8);
  * </pre>
- *
  * </blockquote></dd>
  * <dt>Using its name and interface</dt>
  * <dd>
  * <blockquote>
- *
  * <pre>
  * WatchdogTimer wdt = DeviceManager.open(&quot;WDT&quot;, WatchdogTimer.class, null);
  * </pre>
- *
  * </blockquote> Or for a windowed watchdog timer, <blockquote>
- *
  * <pre>
  * WindowedWatchdogTimer wdt = DeviceManager.open(&quot;WWDT&quot;, WindowedWatchdogTimer.class, null);
  * </pre>
- *
  * </blockquote></dd>
  * </dl>
+ * </blockquote>
+ * <p>
  * Once the device opened, the application can start using it and can especially start the timer using the
  * {@link jdk.dio.watchdog.WatchdogTimer#start(long) WatchdogTimer.start} method and subsequently
  * refresh the timer periodically using the {@link jdk.dio.watchdog.WatchdogTimer#refresh
- * WatchdogTimer.refresh} method <blockquote>
- *
+ * WatchdogTimer.refresh} method:</p>
+ * <blockquote>
  * <pre>
  * wdt.start(1000);
  * ...
  * wdt.refresh();
  * </pre>
- *
- * </blockquote> When done, the application should call the
+ * </blockquote>
+ * <p>
+ * When done, the application should call the
  * {@link jdk.dio.watchdog.WatchdogTimer#close WatchdogTimer.close} method to close the watchdog
- * timer. <blockquote>
- *
+ * timer.
+ * </p>
+ * <blockquote>
  * <pre>
  * wdt.close();
  * </pre>
- *
  * </blockquote>
- * <p />
- * The following sample codes give examples of using the watchdog timer API: <blockquote>
- *
+ * <p>
+ * The following sample codes give examples of using the watchdog timer API:</p> <blockquote>
  * <pre>
  * public class WatchdogSample {
  *     public boolean checkSomeStatus() {
@@ -113,11 +110,16 @@
  *     }
  * }
  * </pre>
- *
  * </blockquote>
- * <p />
+ * <p>
+ * Unless otherwise noted, permission and security checks that may cause
+ * a {@link java.lang.SecurityException SecurityException} to be thrown must be performed
+ * in priority to any other checks or operations once performed the checking of the input parameters
+ * from which the permission target names and action lists are retrieved and assembled.
+ * </p><p>
  * Unless otherwise noted, passing a {@code null} argument to a constructor or method in any class
  * or interface in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown.
+ * <p>
  *
  * @since 1.0
  */