diff --git a/darwin-x86/bin/appletviewer b/darwin-x86/bin/appletviewer
index 333753e..6725f56 100755
--- a/darwin-x86/bin/appletviewer
+++ b/darwin-x86/bin/appletviewer
Binary files differ
diff --git a/darwin-x86/bin/extcheck b/darwin-x86/bin/extcheck
index d18ef4e..9d25496 100755
--- a/darwin-x86/bin/extcheck
+++ b/darwin-x86/bin/extcheck
Binary files differ
diff --git a/darwin-x86/bin/idlj b/darwin-x86/bin/idlj
index 00b6703..a7df061 100755
--- a/darwin-x86/bin/idlj
+++ b/darwin-x86/bin/idlj
Binary files differ
diff --git a/darwin-x86/bin/jar b/darwin-x86/bin/jar
index f33de87..20975c8 100755
--- a/darwin-x86/bin/jar
+++ b/darwin-x86/bin/jar
Binary files differ
diff --git a/darwin-x86/bin/jarsigner b/darwin-x86/bin/jarsigner
index b057531..fe42a7d 100755
--- a/darwin-x86/bin/jarsigner
+++ b/darwin-x86/bin/jarsigner
Binary files differ
diff --git a/darwin-x86/bin/java b/darwin-x86/bin/java
index 8bfdf5a..886384d 100755
--- a/darwin-x86/bin/java
+++ b/darwin-x86/bin/java
Binary files differ
diff --git a/darwin-x86/bin/javac b/darwin-x86/bin/javac
index 11d387f..68fd891 100755
--- a/darwin-x86/bin/javac
+++ b/darwin-x86/bin/javac
Binary files differ
diff --git a/darwin-x86/bin/javadoc b/darwin-x86/bin/javadoc
index 9ed9959..4250d2d 100755
--- a/darwin-x86/bin/javadoc
+++ b/darwin-x86/bin/javadoc
Binary files differ
diff --git a/darwin-x86/bin/javah b/darwin-x86/bin/javah
index 0f9716e..ad8bf02 100755
--- a/darwin-x86/bin/javah
+++ b/darwin-x86/bin/javah
Binary files differ
diff --git a/darwin-x86/bin/javap b/darwin-x86/bin/javap
index 8e487bd..e734adc 100755
--- a/darwin-x86/bin/javap
+++ b/darwin-x86/bin/javap
Binary files differ
diff --git a/darwin-x86/bin/jcmd b/darwin-x86/bin/jcmd
index d142c68..2df1ed2 100755
--- a/darwin-x86/bin/jcmd
+++ b/darwin-x86/bin/jcmd
Binary files differ
diff --git a/darwin-x86/bin/jconsole b/darwin-x86/bin/jconsole
index cf99224..c52b4f4 100755
--- a/darwin-x86/bin/jconsole
+++ b/darwin-x86/bin/jconsole
Binary files differ
diff --git a/darwin-x86/bin/jdb b/darwin-x86/bin/jdb
index e15f0e6..10aac4e 100755
--- a/darwin-x86/bin/jdb
+++ b/darwin-x86/bin/jdb
Binary files differ
diff --git a/darwin-x86/bin/jdeps b/darwin-x86/bin/jdeps
index 8b3c622..27b85d5 100755
--- a/darwin-x86/bin/jdeps
+++ b/darwin-x86/bin/jdeps
Binary files differ
diff --git a/darwin-x86/bin/jhat b/darwin-x86/bin/jhat
index 10fb724..77f97ed 100755
--- a/darwin-x86/bin/jhat
+++ b/darwin-x86/bin/jhat
Binary files differ
diff --git a/darwin-x86/bin/jinfo b/darwin-x86/bin/jinfo
index 9565f4c..edb7e55 100755
--- a/darwin-x86/bin/jinfo
+++ b/darwin-x86/bin/jinfo
Binary files differ
diff --git a/darwin-x86/bin/jjs b/darwin-x86/bin/jjs
index 130e6c6..2fe6f47 100755
--- a/darwin-x86/bin/jjs
+++ b/darwin-x86/bin/jjs
Binary files differ
diff --git a/darwin-x86/bin/jmap b/darwin-x86/bin/jmap
index 7ac011e..8511322 100755
--- a/darwin-x86/bin/jmap
+++ b/darwin-x86/bin/jmap
Binary files differ
diff --git a/darwin-x86/bin/jps b/darwin-x86/bin/jps
index 3b31702..c2f4670 100755
--- a/darwin-x86/bin/jps
+++ b/darwin-x86/bin/jps
Binary files differ
diff --git a/darwin-x86/bin/jrunscript b/darwin-x86/bin/jrunscript
index 9de88fd..b6e7d97 100755
--- a/darwin-x86/bin/jrunscript
+++ b/darwin-x86/bin/jrunscript
Binary files differ
diff --git a/darwin-x86/bin/jsadebugd b/darwin-x86/bin/jsadebugd
index 365e384..a205ebe 100755
--- a/darwin-x86/bin/jsadebugd
+++ b/darwin-x86/bin/jsadebugd
Binary files differ
diff --git a/darwin-x86/bin/jstack b/darwin-x86/bin/jstack
index 94adb61..c7b9cad 100755
--- a/darwin-x86/bin/jstack
+++ b/darwin-x86/bin/jstack
Binary files differ
diff --git a/darwin-x86/bin/jstat b/darwin-x86/bin/jstat
index cdc3c01..9bda6dc 100755
--- a/darwin-x86/bin/jstat
+++ b/darwin-x86/bin/jstat
Binary files differ
diff --git a/darwin-x86/bin/jstatd b/darwin-x86/bin/jstatd
index ef65958..7fe1738 100755
--- a/darwin-x86/bin/jstatd
+++ b/darwin-x86/bin/jstatd
Binary files differ
diff --git a/darwin-x86/bin/keytool b/darwin-x86/bin/keytool
index 38423c4..f33144f 100755
--- a/darwin-x86/bin/keytool
+++ b/darwin-x86/bin/keytool
Binary files differ
diff --git a/darwin-x86/bin/native2ascii b/darwin-x86/bin/native2ascii
index ae36417..40a8c9d 100755
--- a/darwin-x86/bin/native2ascii
+++ b/darwin-x86/bin/native2ascii
Binary files differ
diff --git a/darwin-x86/bin/orbd b/darwin-x86/bin/orbd
index e1fcc76..f00cef6 100755
--- a/darwin-x86/bin/orbd
+++ b/darwin-x86/bin/orbd
Binary files differ
diff --git a/darwin-x86/bin/pack200 b/darwin-x86/bin/pack200
index a537337..726cca5 100755
--- a/darwin-x86/bin/pack200
+++ b/darwin-x86/bin/pack200
Binary files differ
diff --git a/darwin-x86/bin/policytool b/darwin-x86/bin/policytool
index 5c6c1c9..7f23ef1 100755
--- a/darwin-x86/bin/policytool
+++ b/darwin-x86/bin/policytool
Binary files differ
diff --git a/darwin-x86/bin/rmic b/darwin-x86/bin/rmic
index c59f4f2..6af4cf0 100755
--- a/darwin-x86/bin/rmic
+++ b/darwin-x86/bin/rmic
Binary files differ
diff --git a/darwin-x86/bin/rmid b/darwin-x86/bin/rmid
index 629849e..b572dd0 100755
--- a/darwin-x86/bin/rmid
+++ b/darwin-x86/bin/rmid
Binary files differ
diff --git a/darwin-x86/bin/rmiregistry b/darwin-x86/bin/rmiregistry
index eb411de..78ebf2c 100755
--- a/darwin-x86/bin/rmiregistry
+++ b/darwin-x86/bin/rmiregistry
Binary files differ
diff --git a/darwin-x86/bin/schemagen b/darwin-x86/bin/schemagen
index a48aa45..2057dcd 100755
--- a/darwin-x86/bin/schemagen
+++ b/darwin-x86/bin/schemagen
Binary files differ
diff --git a/darwin-x86/bin/serialver b/darwin-x86/bin/serialver
index d3b80e1..f0f2b05 100755
--- a/darwin-x86/bin/serialver
+++ b/darwin-x86/bin/serialver
Binary files differ
diff --git a/darwin-x86/bin/servertool b/darwin-x86/bin/servertool
index af12e53..d273d86 100755
--- a/darwin-x86/bin/servertool
+++ b/darwin-x86/bin/servertool
Binary files differ
diff --git a/darwin-x86/bin/tnameserv b/darwin-x86/bin/tnameserv
index dc5af76..e516c42 100755
--- a/darwin-x86/bin/tnameserv
+++ b/darwin-x86/bin/tnameserv
Binary files differ
diff --git a/darwin-x86/bin/unpack200 b/darwin-x86/bin/unpack200
index dca8c4b..e72457c 100755
--- a/darwin-x86/bin/unpack200
+++ b/darwin-x86/bin/unpack200
Binary files differ
diff --git a/darwin-x86/bin/wsgen b/darwin-x86/bin/wsgen
index f4fac59..7bf7c12 100755
--- a/darwin-x86/bin/wsgen
+++ b/darwin-x86/bin/wsgen
Binary files differ
diff --git a/darwin-x86/bin/wsimport b/darwin-x86/bin/wsimport
index 1d1a238..5c07119 100755
--- a/darwin-x86/bin/wsimport
+++ b/darwin-x86/bin/wsimport
Binary files differ
diff --git a/darwin-x86/bin/xjc b/darwin-x86/bin/xjc
index 04bcea0..ca92a4c 100755
--- a/darwin-x86/bin/xjc
+++ b/darwin-x86/bin/xjc
Binary files differ
diff --git a/darwin-x86/jre/bin/java b/darwin-x86/jre/bin/java
index 8bfdf5a..886384d 100755
--- a/darwin-x86/jre/bin/java
+++ b/darwin-x86/jre/bin/java
Binary files differ
diff --git a/darwin-x86/jre/bin/jjs b/darwin-x86/jre/bin/jjs
index 130e6c6..2fe6f47 100755
--- a/darwin-x86/jre/bin/jjs
+++ b/darwin-x86/jre/bin/jjs
Binary files differ
diff --git a/darwin-x86/jre/bin/keytool b/darwin-x86/jre/bin/keytool
index 38423c4..f33144f 100755
--- a/darwin-x86/jre/bin/keytool
+++ b/darwin-x86/jre/bin/keytool
Binary files differ
diff --git a/darwin-x86/jre/bin/orbd b/darwin-x86/jre/bin/orbd
index e1fcc76..f00cef6 100755
--- a/darwin-x86/jre/bin/orbd
+++ b/darwin-x86/jre/bin/orbd
Binary files differ
diff --git a/darwin-x86/jre/bin/pack200 b/darwin-x86/jre/bin/pack200
index a537337..726cca5 100755
--- a/darwin-x86/jre/bin/pack200
+++ b/darwin-x86/jre/bin/pack200
Binary files differ
diff --git a/darwin-x86/jre/bin/policytool b/darwin-x86/jre/bin/policytool
index 5c6c1c9..7f23ef1 100755
--- a/darwin-x86/jre/bin/policytool
+++ b/darwin-x86/jre/bin/policytool
Binary files differ
diff --git a/darwin-x86/jre/bin/rmid b/darwin-x86/jre/bin/rmid
index 629849e..b572dd0 100755
--- a/darwin-x86/jre/bin/rmid
+++ b/darwin-x86/jre/bin/rmid
Binary files differ
diff --git a/darwin-x86/jre/bin/rmiregistry b/darwin-x86/jre/bin/rmiregistry
index eb411de..78ebf2c 100755
--- a/darwin-x86/jre/bin/rmiregistry
+++ b/darwin-x86/jre/bin/rmiregistry
Binary files differ
diff --git a/darwin-x86/jre/bin/servertool b/darwin-x86/jre/bin/servertool
index af12e53..d273d86 100755
--- a/darwin-x86/jre/bin/servertool
+++ b/darwin-x86/jre/bin/servertool
Binary files differ
diff --git a/darwin-x86/jre/bin/tnameserv b/darwin-x86/jre/bin/tnameserv
index dc5af76..e516c42 100755
--- a/darwin-x86/jre/bin/tnameserv
+++ b/darwin-x86/jre/bin/tnameserv
Binary files differ
diff --git a/darwin-x86/jre/bin/unpack200 b/darwin-x86/jre/bin/unpack200
index dca8c4b..e72457c 100755
--- a/darwin-x86/jre/bin/unpack200
+++ b/darwin-x86/jre/bin/unpack200
Binary files differ
diff --git a/darwin-x86/jre/lib/charsets.jar b/darwin-x86/jre/lib/charsets.jar
index 14c7889..26c548c 100644
--- a/darwin-x86/jre/lib/charsets.jar
+++ b/darwin-x86/jre/lib/charsets.jar
Binary files differ
diff --git a/darwin-x86/jre/lib/ext/nashorn.jar b/darwin-x86/jre/lib/ext/nashorn.jar
index e735c69..ed912c4 100644
--- a/darwin-x86/jre/lib/ext/nashorn.jar
+++ b/darwin-x86/jre/lib/ext/nashorn.jar
Binary files differ
diff --git a/darwin-x86/jre/lib/jce.jar b/darwin-x86/jre/lib/jce.jar
index 7556a27..16eb259 100644
--- a/darwin-x86/jre/lib/jce.jar
+++ b/darwin-x86/jre/lib/jce.jar
Binary files differ
diff --git a/darwin-x86/jre/lib/jli/libjli.dylib b/darwin-x86/jre/lib/jli/libjli.dylib
index 131cec8..9c4e007 100755
--- a/darwin-x86/jre/lib/jli/libjli.dylib
+++ b/darwin-x86/jre/lib/jli/libjli.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/jspawnhelper b/darwin-x86/jre/lib/jspawnhelper
index 2607e9d..bc53767 100755
--- a/darwin-x86/jre/lib/jspawnhelper
+++ b/darwin-x86/jre/lib/jspawnhelper
Binary files differ
diff --git a/darwin-x86/jre/lib/jsse.jar b/darwin-x86/jre/lib/jsse.jar
index fd3bfcc..eb0a1b8 100644
--- a/darwin-x86/jre/lib/jsse.jar
+++ b/darwin-x86/jre/lib/jsse.jar
Binary files differ
diff --git a/darwin-x86/jre/lib/libAppleScriptEngine.dylib b/darwin-x86/jre/lib/libAppleScriptEngine.dylib
index 75e0809..600c948 100755
--- a/darwin-x86/jre/lib/libAppleScriptEngine.dylib
+++ b/darwin-x86/jre/lib/libAppleScriptEngine.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libattach.dylib b/darwin-x86/jre/lib/libattach.dylib
index 4197c07..45fa97a 100755
--- a/darwin-x86/jre/lib/libattach.dylib
+++ b/darwin-x86/jre/lib/libattach.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libawt.dylib b/darwin-x86/jre/lib/libawt.dylib
index 2a782d7..2b28a0d 100755
--- a/darwin-x86/jre/lib/libawt.dylib
+++ b/darwin-x86/jre/lib/libawt.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libawt_lwawt.dylib b/darwin-x86/jre/lib/libawt_lwawt.dylib
index 637db99..a56c6e6 100755
--- a/darwin-x86/jre/lib/libawt_lwawt.dylib
+++ b/darwin-x86/jre/lib/libawt_lwawt.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libdt_socket.dylib b/darwin-x86/jre/lib/libdt_socket.dylib
index 60f8995..9c01176 100755
--- a/darwin-x86/jre/lib/libdt_socket.dylib
+++ b/darwin-x86/jre/lib/libdt_socket.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libfontmanager.dylib b/darwin-x86/jre/lib/libfontmanager.dylib
index e9ed3ce..707aacf 100755
--- a/darwin-x86/jre/lib/libfontmanager.dylib
+++ b/darwin-x86/jre/lib/libfontmanager.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libfreetype.dylib.6 b/darwin-x86/jre/lib/libfreetype.dylib.6
index b93137f..990c2ba 100755
--- a/darwin-x86/jre/lib/libfreetype.dylib.6
+++ b/darwin-x86/jre/lib/libfreetype.dylib.6
Binary files differ
diff --git a/darwin-x86/jre/lib/libhprof.dylib b/darwin-x86/jre/lib/libhprof.dylib
index 33c8f63..ccee50a 100755
--- a/darwin-x86/jre/lib/libhprof.dylib
+++ b/darwin-x86/jre/lib/libhprof.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libinstrument.dylib b/darwin-x86/jre/lib/libinstrument.dylib
index 1c28e0b..87e5eda 100755
--- a/darwin-x86/jre/lib/libinstrument.dylib
+++ b/darwin-x86/jre/lib/libinstrument.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libj2gss.dylib b/darwin-x86/jre/lib/libj2gss.dylib
index 13a0233..fcffdde 100755
--- a/darwin-x86/jre/lib/libj2gss.dylib
+++ b/darwin-x86/jre/lib/libj2gss.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libj2pcsc.dylib b/darwin-x86/jre/lib/libj2pcsc.dylib
index 7b3cae9..856ecfc 100755
--- a/darwin-x86/jre/lib/libj2pcsc.dylib
+++ b/darwin-x86/jre/lib/libj2pcsc.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libj2pkcs11.dylib b/darwin-x86/jre/lib/libj2pkcs11.dylib
index 2867d53..f7d5251 100755
--- a/darwin-x86/jre/lib/libj2pkcs11.dylib
+++ b/darwin-x86/jre/lib/libj2pkcs11.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjaas_unix.dylib b/darwin-x86/jre/lib/libjaas_unix.dylib
index 3b166d2..d17f676 100755
--- a/darwin-x86/jre/lib/libjaas_unix.dylib
+++ b/darwin-x86/jre/lib/libjaas_unix.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjava.dylib b/darwin-x86/jre/lib/libjava.dylib
index 0685268..b32cdff 100755
--- a/darwin-x86/jre/lib/libjava.dylib
+++ b/darwin-x86/jre/lib/libjava.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjava_crw_demo.dylib b/darwin-x86/jre/lib/libjava_crw_demo.dylib
index 5cada36..ac4ea80 100755
--- a/darwin-x86/jre/lib/libjava_crw_demo.dylib
+++ b/darwin-x86/jre/lib/libjava_crw_demo.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjawt.dylib b/darwin-x86/jre/lib/libjawt.dylib
index 5c10806..6aeb3fe 100755
--- a/darwin-x86/jre/lib/libjawt.dylib
+++ b/darwin-x86/jre/lib/libjawt.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjdwp.dylib b/darwin-x86/jre/lib/libjdwp.dylib
index a0ee225..24ccd78 100755
--- a/darwin-x86/jre/lib/libjdwp.dylib
+++ b/darwin-x86/jre/lib/libjdwp.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjpeg.dylib b/darwin-x86/jre/lib/libjpeg.dylib
index 1e4607c..fb53c86 100755
--- a/darwin-x86/jre/lib/libjpeg.dylib
+++ b/darwin-x86/jre/lib/libjpeg.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjsdt.dylib b/darwin-x86/jre/lib/libjsdt.dylib
index 65140d4..6db259c 100755
--- a/darwin-x86/jre/lib/libjsdt.dylib
+++ b/darwin-x86/jre/lib/libjsdt.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjsig.dylib b/darwin-x86/jre/lib/libjsig.dylib
index 7704f4f..4e3633c 100755
--- a/darwin-x86/jre/lib/libjsig.dylib
+++ b/darwin-x86/jre/lib/libjsig.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libjsound.dylib b/darwin-x86/jre/lib/libjsound.dylib
index 5f0a769..2bdae90 100755
--- a/darwin-x86/jre/lib/libjsound.dylib
+++ b/darwin-x86/jre/lib/libjsound.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/liblcms.dylib b/darwin-x86/jre/lib/liblcms.dylib
index 2569f89..31fcea0 100755
--- a/darwin-x86/jre/lib/liblcms.dylib
+++ b/darwin-x86/jre/lib/liblcms.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libmanagement.dylib b/darwin-x86/jre/lib/libmanagement.dylib
index 797b65b..6516eb7 100755
--- a/darwin-x86/jre/lib/libmanagement.dylib
+++ b/darwin-x86/jre/lib/libmanagement.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libmlib_image.dylib b/darwin-x86/jre/lib/libmlib_image.dylib
index 54ce006..1a3e352 100755
--- a/darwin-x86/jre/lib/libmlib_image.dylib
+++ b/darwin-x86/jre/lib/libmlib_image.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libnet.dylib b/darwin-x86/jre/lib/libnet.dylib
index b1edc51..6649bdb 100755
--- a/darwin-x86/jre/lib/libnet.dylib
+++ b/darwin-x86/jre/lib/libnet.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libnio.dylib b/darwin-x86/jre/lib/libnio.dylib
index 11e30d2..9dd100a 100755
--- a/darwin-x86/jre/lib/libnio.dylib
+++ b/darwin-x86/jre/lib/libnio.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libnpt.dylib b/darwin-x86/jre/lib/libnpt.dylib
index 49b08bf..5b05a4a 100755
--- a/darwin-x86/jre/lib/libnpt.dylib
+++ b/darwin-x86/jre/lib/libnpt.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libosx.dylib b/darwin-x86/jre/lib/libosx.dylib
index bfe9849..1662548 100755
--- a/darwin-x86/jre/lib/libosx.dylib
+++ b/darwin-x86/jre/lib/libosx.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libosxapp.dylib b/darwin-x86/jre/lib/libosxapp.dylib
index c31a2da..d177f70 100755
--- a/darwin-x86/jre/lib/libosxapp.dylib
+++ b/darwin-x86/jre/lib/libosxapp.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libosxkrb5.dylib b/darwin-x86/jre/lib/libosxkrb5.dylib
index 6553679..04f22fb 100755
--- a/darwin-x86/jre/lib/libosxkrb5.dylib
+++ b/darwin-x86/jre/lib/libosxkrb5.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libosxui.dylib b/darwin-x86/jre/lib/libosxui.dylib
index a359309..332a3d2 100755
--- a/darwin-x86/jre/lib/libosxui.dylib
+++ b/darwin-x86/jre/lib/libosxui.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libsaproc.dylib b/darwin-x86/jre/lib/libsaproc.dylib
index df366ae..d86203e 100755
--- a/darwin-x86/jre/lib/libsaproc.dylib
+++ b/darwin-x86/jre/lib/libsaproc.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libsplashscreen.dylib b/darwin-x86/jre/lib/libsplashscreen.dylib
index 6295ba0..3994d09 100755
--- a/darwin-x86/jre/lib/libsplashscreen.dylib
+++ b/darwin-x86/jre/lib/libsplashscreen.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libsunec.dylib b/darwin-x86/jre/lib/libsunec.dylib
index fbf0453..16a9a6e 100755
--- a/darwin-x86/jre/lib/libsunec.dylib
+++ b/darwin-x86/jre/lib/libsunec.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libunpack.dylib b/darwin-x86/jre/lib/libunpack.dylib
index b751801..06d4523 100755
--- a/darwin-x86/jre/lib/libunpack.dylib
+++ b/darwin-x86/jre/lib/libunpack.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libverify.dylib b/darwin-x86/jre/lib/libverify.dylib
index fcd204c..ddc4e10 100755
--- a/darwin-x86/jre/lib/libverify.dylib
+++ b/darwin-x86/jre/lib/libverify.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/libzip.dylib b/darwin-x86/jre/lib/libzip.dylib
index c6a759e..1b0e053 100755
--- a/darwin-x86/jre/lib/libzip.dylib
+++ b/darwin-x86/jre/lib/libzip.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/resources.jar b/darwin-x86/jre/lib/resources.jar
index 36e7ed3..289cf9d 100644
--- a/darwin-x86/jre/lib/resources.jar
+++ b/darwin-x86/jre/lib/resources.jar
Binary files differ
diff --git a/darwin-x86/jre/lib/rt.jar b/darwin-x86/jre/lib/rt.jar
index 1b234fd..d7f6474 100644
--- a/darwin-x86/jre/lib/rt.jar
+++ b/darwin-x86/jre/lib/rt.jar
Binary files differ
diff --git a/darwin-x86/jre/lib/security/java.security b/darwin-x86/jre/lib/security/java.security
index 30ef845..2a08b6f 100644
--- a/darwin-x86/jre/lib/security/java.security
+++ b/darwin-x86/jre/lib/security/java.security
@@ -736,67 +736,70 @@
 
 # Cryptographic Jurisdiction Policy defaults
 #
-# Due to the import control restrictions of some countries, the default
-# JCE policy files allow for strong but "limited" cryptographic key
-# lengths to be used.  If your country's cryptographic regulations allow,
-# the "unlimited" strength policy files can be used instead, which contain
-# no restrictions on cryptographic strengths.
+# Import and export control rules on cryptographic software vary from
+# country to country.  By default, the JDK provides two different sets of
+# cryptographic policy files:
 #
-# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY
-# TO DETERMINE THE EXACT REQUIREMENTS.
+#     unlimited:  These policy files contain no restrictions on cryptographic
+#                 strengths or algorithms.
 #
-# <java-home> (below) refers to the directory where the JRE was
-# installed. It is determined based on whether you are running JCE
-# on a JRE or a JRE contained within the Java Development Kit, or
-# JDK(TM). The JDK contains the JRE, but at a different level in the
-# file hierarchy. For example, if the JDK is installed in
-# /home/user1/jdk1.8.0 on Unix or in C:\jdk1.8.0 on Windows, then
-# <java-home> is:
+#     limited:    These policy files contain more restricted cryptographic
+#                 strengths, and are still available if your country or
+#                 usage requires the traditional restrictive policy.
 #
-#  /home/user1/jdk1.8.0/jre           [Unix]
-#  C:\jdk1.8.0\jre                    [Windows]
+# The JDK JCE framework uses the unlimited policy files by default.
+# However the user may explicitly choose a set either by defining the
+# "crypto.policy" Security property or by installing valid JCE policy
+# jar files into the traditional JDK installation location.  To better
+# support older JDK Update releases, the "crypto.policy" property is not
+# defined by default.  See below for more information.
 #
-# If on the other hand the JRE is installed in /home/user1/jre1.8.0
-# on Unix or in C:\jre1.8.0 on Windows, and the JDK is not
-# installed, then <java-home> is:
+# The following logic determines which policy files are used:
 #
-#  /home/user1/jre1.8.0               [Unix]
-#  C:\jre1.8.0                        [Windows]
+#         <java-home> refers to the directory where the JRE was
+#         installed and may be determined using the "java.home"
+#         System property.
 #
-# On Windows, for each JDK installation, there may be additional
-# JREs installed under the "Program Files" directory. Please make
-# sure that you install the unlimited strength policy JAR files
-# for all JREs that you plan to use.
+# 1.  If the Security property "crypto.policy" has been defined,
+#     then the following mechanism is used:
 #
-# The policy files are jar files organized into subdirectories of
+#     The policy files are stored as jar files in subdirectories of
 # <java-home>/lib/security/policy.  Each directory contains a complete
 # set of policy files.
 #
-# The "crypto.policy" Security property controls the directory selection,
-# and thus the effective cryptographic policy.
+#     The "crypto.policy" Security property controls the directory
+#     selection, and thus the effective cryptographic policy.
 #
 # The default set of directories is:
 #
 #     limited | unlimited
 #
-# however other directories can be created and configured.
-#
-# To support older JDK Update releases, the crypto.policy property
-# is not defined by default. When the property is not defined, an
-# update release binary aware of the new property will use the following
-# logic to decide what crypto policy files get used :
-#
-# * If the US_export_policy.jar and local_policy.jar files are located
-# in the (legacy) <java-home>/lib/security directory, then the rules
-# embedded in those jar files will be used. This helps preserve compatibility
+# 2.  If the "crypto.policy" property is not set and the traditional
+#     US_export_policy.jar and local_policy.jar files
+#     (e.g. limited/unlimited) are found in the legacy
+#     <java-home>/lib/security directory, then the rules embedded within
+#     those jar files will be used. This helps preserve compatibility
 # for users upgrading from an older installation.
 #
-# * If crypto.policy is not defined and no such jar files are present in
-# the legacy locations, then the JDK will use the limited settings
-# (equivalent to crypto.policy=limited)
+# 3.  If the jar files are not present in the legacy location
+#     and the "crypto.policy" Security property is not defined,
+#     then the JDK will use the unlimited settings (equivalent to
+#     crypto.policy=unlimited)
 #
 # Please see the JCA documentation for additional information on these
 # files and formats.
+#
+# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY
+# TO DETERMINE THE EXACT REQUIREMENTS.
+#
+# Please note that the JCE for Java SE, including the JCE framework,
+# cryptographic policy files, and standard JCE providers provided with
+# the Java SE, have been reviewed and approved for export as mass market
+# encryption item by the US Bureau of Industry and Security.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
 #crypto.policy=unlimited
 
 #
diff --git a/darwin-x86/jre/lib/server/libjsig.dylib b/darwin-x86/jre/lib/server/libjsig.dylib
index 7704f4f..4e3633c 100755
--- a/darwin-x86/jre/lib/server/libjsig.dylib
+++ b/darwin-x86/jre/lib/server/libjsig.dylib
Binary files differ
diff --git a/darwin-x86/jre/lib/server/libjvm.dylib b/darwin-x86/jre/lib/server/libjvm.dylib
index 1da3832..03fc9e4 100755
--- a/darwin-x86/jre/lib/server/libjvm.dylib
+++ b/darwin-x86/jre/lib/server/libjvm.dylib
Binary files differ
diff --git a/darwin-x86/lib/ct.sym b/darwin-x86/lib/ct.sym
index a4a0e58..7791820 100644
--- a/darwin-x86/lib/ct.sym
+++ b/darwin-x86/lib/ct.sym
Binary files differ
diff --git a/darwin-x86/lib/jconsole.jar b/darwin-x86/lib/jconsole.jar
index a25d502..c301a7e 100644
--- a/darwin-x86/lib/jconsole.jar
+++ b/darwin-x86/lib/jconsole.jar
Binary files differ
diff --git a/darwin-x86/lib/sa-jdi.jar b/darwin-x86/lib/sa-jdi.jar
index 97ebf83..e91c217 100644
--- a/darwin-x86/lib/sa-jdi.jar
+++ b/darwin-x86/lib/sa-jdi.jar
Binary files differ
diff --git a/darwin-x86/lib/tools.jar b/darwin-x86/lib/tools.jar
index 462c900..e45b586 100644
--- a/darwin-x86/lib/tools.jar
+++ b/darwin-x86/lib/tools.jar
Binary files differ
diff --git a/darwin-x86/sample/README b/darwin-x86/sample/README
new file mode 100644
index 0000000..ae56b64
--- /dev/null
+++ b/darwin-x86/sample/README
@@ -0,0 +1,6 @@
+The source code provided with samples and demos for the JDK is meant
+to illustrate the usage of a given feature or technique and has been
+deliberately simplified. Additional steps required for a
+production-quality application, such as security checks, input
+validation, and proper error handling, might not be present in the
+sample code.
diff --git a/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Device.java b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Device.java
new file mode 100644
index 0000000..f4fd2c5
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Device.java
@@ -0,0 +1,66 @@
+package checker;
+
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+
+/**
+ * Represents the device configuration. The values are loaded from an XML file by JAXB.
+ */
+@XmlRootElement
+public class Device {
+
+    @XmlElement()
+    private Map<Module, Integer> supportedModules = new EnumMap<>(Module.class);
+
+    /**
+     * Returns map of supported modules. The map key is module. The map value is version.
+     *
+     * @return map of supported modules.
+     */
+    public Map<Module, Integer> getSupportedModules() {
+        return Collections.unmodifiableMap(supportedModules);
+    }
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Kettle.xml b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Kettle.xml
new file mode 100644
index 0000000..2e0357d
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Kettle.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+    - Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    - Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+    - Neither the name of Oracle nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+  This source code is provided to illustrate the usage of a given feature
+  or technique and has been deliberately simplified. Additional steps
+  required for a production-quality application, such as security checks,
+  input validation and proper error handling, might not be present in
+  this sample code.
+
+  -->
+
+<device>
+    <supportedModules>
+        <entry>
+            <key>DISPLAY</key>
+            <value>2</value>
+        </entry>
+        <entry>
+            <key>THERMOMETER</key>
+            <value>1</value>
+        </entry>
+        <entry>
+            <key>CLOCK</key>
+            <value>4</value>
+        </entry>
+    </supportedModules>
+</device>
\ No newline at end of file
diff --git a/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Module.java b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Module.java
new file mode 100644
index 0000000..2b97b4e
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Module.java
@@ -0,0 +1,49 @@
+package checker;
+
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * Represents available modules.
+ */
+public enum Module {
+
+    DISPLAY, CLOCK, THERMOMETER, HEATER, SPEAKER, GSM, LED;
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/PluginChecker.java b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/PluginChecker.java
new file mode 100644
index 0000000..6db5bae
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/PluginChecker.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package checker;
+
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.TypeElement;
+import javax.tools.Diagnostic;
+import javax.xml.bind.JAXBContext;
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.bind.JAXBException;
+
+/**
+ * Reads the device configuration from the XML file specified by -Adevice=device.xml.
+ * For each class in a project, checks required modules. If the device doesn't have
+ * the required module, then a compilation error will be shown.
+ */
+@SupportedAnnotationTypes("checker.RequireContainer")
+@SupportedSourceVersion(SourceVersion.RELEASE_8)
+public class PluginChecker extends javax.annotation.processing.AbstractProcessor {
+
+    /**
+     * Name of the option to get the path to the xml with device configuration.
+     */
+    public static final String DEVICE_OPTION = "device";
+    private Device device;
+
+    /**
+     * Only the device option is supported.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<String> getSupportedOptions() {
+        return new HashSet<>(Arrays.asList(DEVICE_OPTION));
+    }
+
+    /**
+     * Initializes the processor by loading the device configuration.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public synchronized void init(ProcessingEnvironment processingEnv) {
+        super.init(processingEnv);
+        try {
+            String deviceOption = processingEnv.getOptions().get(DEVICE_OPTION);
+            device = (Device) JAXBContext.newInstance(Device.class)
+                    .createUnmarshaller().unmarshal(new File(deviceOption));
+        } catch (JAXBException e) {
+            throw new RuntimeException(
+                    "Please specify device by -Adevice=device.xml\n"
+                    + e.toString(), e);
+        }
+    }
+
+    /**
+     * Processes @Require annotations and checks that Device meets requirements.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations,
+            RoundEnvironment roundEnv) {
+        for (Element el : roundEnv.getElementsAnnotatedWith(RequireContainer.class)) {
+            for (Require req : el.getAnnotationsByType(Require.class)) {
+                //for every Require annotation checks if device has module of required version.
+                Integer version = device.getSupportedModules().get(req.value());
+
+                if (version == null
+                        || version < req.minVersion()
+                        || version > req.maxVersion()) {
+                    //if module is optional then show only warning not error
+                    if (req.optional()) {
+                        processingEnv.getMessager()
+                                .printMessage(Diagnostic.Kind.WARNING,
+                                        "Plugin [" + el + "] requires " + req
+                                        + "\n but device " + (version == null
+                                        ? "doesn't have such module."
+                                        + " This module is optional."
+                                        + " So plugin will work but miss"
+                                        + " some functionality"
+                                        : "has " + version
+                                        + " version of that module"));
+                    } else {
+                        processingEnv.getMessager()
+                                .printMessage(Diagnostic.Kind.ERROR,
+                                        "Plugin [" + el + "] requires " + req
+                                        + "\n but device "
+                                        + (version == null
+                                        ? "doesn't have such module"
+                                        : "has " + version
+                                        + " version of that module"));
+                    }
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Require.java b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Require.java
new file mode 100644
index 0000000..6681c28
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Require.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package checker;
+
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates that a plug-in depends on a module.
+ */
+@Retention(RetentionPolicy.CLASS)
+@Repeatable(RequireContainer.class)
+public @interface Require {
+
+    /**
+     * Returns the required module.
+     *
+     * @return required module.
+     */
+    Module value();
+
+    /**
+     * Returns the minimum supported version of a module.
+     *
+     * @return minimum supported version of a module.
+     */
+    int minVersion() default 1;
+
+    /**
+     * Returns the maximum supported version of a module.
+     *
+     * @return maximum supported version of a module.
+     */
+    int maxVersion() default Integer.MAX_VALUE;
+
+    /**
+     * Returns true if a module is optional. A module is optional if a system
+     * works without that module but is missing some functionality. Returns false if a system
+     * won't work without the specified module.
+     *
+     * @return true if module is optional. False otherwise.
+     */
+    boolean optional() default false;
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/RequireContainer.java b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/RequireContainer.java
new file mode 100644
index 0000000..d18e0d5
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/RequireContainer.java
@@ -0,0 +1,51 @@
+package checker;
+
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * A container for the repeatable @Require annotation.
+ */
+@Retention(RetentionPolicy.CLASS)
+public @interface RequireContainer {
+
+    Require[] value();
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/BoilerPlugin.java b/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/BoilerPlugin.java
new file mode 100644
index 0000000..3a9d842
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/BoilerPlugin.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package plugins;
+
+import checker.Module;
+import checker.Require;
+
+/**
+ * BoilerPlugin provides support for boiling water and keeping water warm.
+ */
+@Require(value = Module.CLOCK, maxVersion = 3)
+@Require(value = Module.THERMOMETER)
+@Require(value = Module.HEATER)
+@Require(value = Module.LED, optional = true) //will use if present
+public class BoilerPlugin {
+
+    /**
+     * Heats water up to 100 degrees Celsius.
+     */
+    public void boil() {
+        boil(100);
+    }
+
+    /**
+     * Heats water up to temperature.
+     *
+     * @param temperature - desired temperature of the water in the boiler
+     */
+    public void boil(int temperature) {
+        /*
+         * Turn on heater and wait while temperature reaches desired temperature
+         * in Celsius. Finally, turn off heater.
+         * If present, the LED light changes color according to the temperature.
+         */
+    }
+
+    /**
+     * Keeps desired temperature.
+     *
+     * @param temperature - desired temperature of the water in the boiler
+     * @param seconds - period of time for checking temperature in seconds
+     */
+    public void keepWarm(int temperature, int seconds) {
+        //Every n seconds check temperature and warm up, if necessary.
+    }
+
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/ExtendedBoilerPlugin.java b/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/ExtendedBoilerPlugin.java
new file mode 100644
index 0000000..b7be610
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/ExtendedBoilerPlugin.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package plugins;
+
+import checker.Module;
+import checker.Require;
+import java.util.Calendar;
+
+/**
+ * Introduces new features for BoilerPlugin. Features are boiling water by an
+ * SMS and boiling water by date with notification by a phone call.
+ */
+@Require(value = Module.SPEAKER)
+@Require(value = Module.GSM, minVersion = 3)
+@Require(value = Module.DISPLAY)
+public class ExtendedBoilerPlugin extends BoilerPlugin {
+
+    /**
+     * Boils water at the appointed time and wakes you up by a ring and phone
+     * call. Shows "Good morning" and a quote of the day from the Internet on the
+     * display.
+     *
+     * @param calendar - date and time when water should be boiled
+     * @param phoneNumber - phone number to call
+     */
+    public void boilAndWakeUp(Calendar calendar, int phoneNumber) {
+        //implementation
+    }
+
+    /**
+     * Boils water at the appointed time by getting an SMS of fixed format.
+     * Sends an SMS on finish.
+     *
+     * @param sms - text of SMS
+     */
+    public void boilBySMS(String sms) {
+        //implementation
+    }
+}
diff --git a/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/TimerPlugin.java b/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/TimerPlugin.java
new file mode 100644
index 0000000..678785c
--- /dev/null
+++ b/darwin-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/TimerPlugin.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package plugins;
+
+import checker.Module;
+import checker.Require;
+
+/**
+ * Timer plug-in is used to support an alarm and a timer. It depends on Display and
+ * Clock modules.
+ */
+@Require(Module.DISPLAY)
+@Require(value = Module.CLOCK, maxVersion = 3)
+public class TimerPlugin {
+
+    /**
+     * Sets timer.
+     *
+     * @param time - the remaining time.
+     */
+    public void timer(long time) {
+        //start timer
+        //show the remaining time on display
+    }
+
+    /**
+     * Sets alarm.
+     *
+     * @param time - the alarm time.
+     */
+    public void alarm(long time) {
+        //start alarm
+        //show current time and alarm time on display
+    }
+}
diff --git a/darwin-x86/sample/annotations/Validator/src/PositiveIntegerSupplier.java b/darwin-x86/sample/annotations/Validator/src/PositiveIntegerSupplier.java
new file mode 100644
index 0000000..0a14913
--- /dev/null
+++ b/darwin-x86/sample/annotations/Validator/src/PositiveIntegerSupplier.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import java.util.function.Supplier;
+
+/**
+ * Supplies a positive number.
+ */
+@Validate(value = Validator.INTEGER_NUMBER,
+        description = "It's not an Integer ")
+@Validate(value = Validator.POSITIVE_NUMBER,
+        description = "It's not a positive Number")
+public class PositiveIntegerSupplier implements Supplier<String> {
+
+    /**
+     * Returns a string representation of a positive integer.
+     *
+     * @return string representation of a positive integer.
+     */
+    @Override
+    public String get() {
+        return "20005"; //random number
+    }
+}
diff --git a/darwin-x86/sample/annotations/Validator/src/SupplierValidator.java b/darwin-x86/sample/annotations/Validator/src/SupplierValidator.java
new file mode 100644
index 0000000..479ac86
--- /dev/null
+++ b/darwin-x86/sample/annotations/Validator/src/SupplierValidator.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import javax.xml.bind.ValidationException;
+import java.util.function.Supplier;
+
+/**
+ * Validates the supplier.
+ */
+public class SupplierValidator {
+
+    /**
+     * Validates the supplier.
+     *
+     * @param supplier - Supplier that needs to be validated.
+     * @return true if supplier has passed validation check. False otherwise.
+     */
+    public static boolean validate(Supplier<?> supplier) {
+        for (Validate annotation
+                : supplier.getClass().getAnnotationsByType(Validate.class)) {
+            try {
+                annotation.value().validate(supplier);
+            } catch (ValidationException e) {
+                System.out.println(annotation.description());
+                e.printStackTrace();
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/darwin-x86/sample/annotations/Validator/src/Validate.java b/darwin-x86/sample/annotations/Validator/src/Validate.java
new file mode 100644
index 0000000..e0404ea
--- /dev/null
+++ b/darwin-x86/sample/annotations/Validator/src/Validate.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates that the class should be validated by the specified validator.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(ValidateContainer.class)
+public @interface Validate {
+
+    /**
+     * Returns the validator that should validate the annotated class.
+     *
+     * @return Validator that should validate annotated class.
+     */
+    Validator value();
+
+    /**
+     * Returns text to describe the failure of the validation check.
+     *
+     * @return text to describe the failure of the validation check.
+     */
+    String description() default "";
+}
+
+/**
+ * A container for the repeatable @Validate annotation.
+ *
+ * @author Andrey Nazarov
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@interface ValidateContainer {
+
+    Validate[] value();
+}
diff --git a/darwin-x86/sample/annotations/Validator/src/Validator.java b/darwin-x86/sample/annotations/Validator/src/Validator.java
new file mode 100644
index 0000000..9e074f5
--- /dev/null
+++ b/darwin-x86/sample/annotations/Validator/src/Validator.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import javax.xml.bind.ValidationException;
+import java.util.function.Supplier;
+
+/**
+ * Enum of Validator implementations.
+ */
+public enum Validator {
+
+    /**
+     * This validator checks that the string represents an integer.
+     */
+    INTEGER_NUMBER {
+                /**
+                 * Checks that the string represents an integer.
+                 *
+                 * @param string - a string supplier
+                 * @throws ValidationException if the validation check fails
+                 */
+                @Override
+                void validate(Supplier<?> string) throws ValidationException {
+                    try {
+                        Integer.parseInt((String) string.get());
+                    } catch (NumberFormatException ex) {
+                        throw new ValidationException("Error while validating "
+                                + string.get());
+                    }
+                }
+            },
+    /**
+     * This validator checks that the string represents a positive number.
+     */
+    POSITIVE_NUMBER {
+                /**
+                 * Checks that the string represents a positive number.
+                 *
+                 * @param string - an string supplier
+                 * @throws ValidationException if the validation check fails
+                 */
+                @Override
+                void validate(Supplier<?> string) throws ValidationException {
+                    try {
+                        if (Double.compare(0.0, Double.parseDouble(
+                                        (String) string.get())) > 0) {
+                            throw new Exception();
+                        }
+                    } catch (Exception ex) {
+                        throw new ValidationException("Error while validating "
+                                + string.get());
+                    }
+                }
+            };
+
+    /**
+     * Checks that the supplier is valid.
+     *
+     * @param string - a string supplier
+     * @throws ValidationException if validation check fails
+     */
+    abstract void validate(Supplier<?> string) throws ValidationException;
+
+}
diff --git a/darwin-x86/sample/annotations/index.html b/darwin-x86/sample/annotations/index.html
new file mode 100644
index 0000000..804c83d
--- /dev/null
+++ b/darwin-x86/sample/annotations/index.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Repeating Annotations Demo</title>
+</head>
+<body>
+<h2>Repeating Annotations Demo</h2>
+
+<p>
+    This demo shows how to use repeating annotations at runtime and at compile time.
+</p>
+
+<ul>
+    <li><h3>Dependency checker.</h3>
+
+        <p>
+            Shows how to define repeating annotations and process them at compile time.
+            The problem domain is some code that performs useful operations on hardware devices.
+            The code relies on "modules" to be present on the devices. Applicability of the code to a particular
+            device is checked while compiling the code for a particular device.
+            A set of modules provided by a device is listed in an xml file that turns red during the compilation
+            phase and is compared with the required module set specified by annotations.
+            For instance, there is kettle with hardware modules: thermometer, display, and clock.
+            There is also a boiler plug-in that requires clock, thermometer, heater, and optionally an LED light.
+
+            Build the PluginChecker annotation processor first.
+            Then, run javac with the annotation processor against plug-in sources using the following command: </p>
+
+        <code>javac -cp "PluginChecker.jar" -processor checker.PluginChecker -Adevice=Kettle.xml -proc:only &lt;source
+            files&gt;</code>
+
+        <p>
+            where <code>PluginChecker.jar</code> - path to jar file that contains PluginChecker annotation processor
+            class. </br>
+            <code>Kettle.xml</code> - path to device descriptor Kettle.xml                                         </br>
+            <code>&lt;source files&gt;</code> - source files in Plugins/src
+        </p>
+        For more information, see the source files.
+        </p>
+        <ul>
+            <li>Annotation processor sources: <a href="DependencyChecker/PluginChecker/src/">DependencyChecker/PluginChecker/src</a>
+            <li>Processing of repeating annotations can be found in <a href="DependencyChecker/PluginChecker/src/checker/PluginChecker.java">PluginChecker.java</a>
+            <li>Usage of repeating annotation is shown in modules sources.<a href="DependencyChecker/Plugins/src">DependencyChecker/Plugins/src</a>
+        </ul>
+
+    <li><h3>Validator.</h3>
+
+        <p>
+            Shows how to define repeating annotations and process them at runtime.
+            A problem domain is code that needs to validate provided Suppliers for conformance to some criteria.
+            The criteria are implemented by the Validator class which is applied by using annotations that are placed in
+            the code whenever validation is needed. For more information, see the
+            source files.
+        </p>
+
+        <p>
+        <ul>
+            <li>Usage of repeating annotation is described in <a href="Validator/src/PositiveIntegerSupplier.java">PositiveIntegerSupplier.java</a>
+            <li> Example of how to define a repeating annotation type can be found in
+                <a href="Validator/src/Validate.java">Validate.java</a>
+            <li> Usages of the new reflective methods can be found in <a href="Validator/src/SupplierValidator.java">SupplierValidator.java</a>
+        </ul>
+        </p>
+        Sources: <a href="Validator/src/">Validator/src/</a>
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/darwin-x86/sample/dtrace/README.txt b/darwin-x86/sample/dtrace/README.txt
new file mode 100644
index 0000000..c3d12b2
--- /dev/null
+++ b/darwin-x86/sample/dtrace/README.txt
@@ -0,0 +1,43 @@
+DTrace HotSpot probes samples
+=============================
+
+This directory contains the list of D scripts which could be used to trace
+Java application with help of Solaris(tm) 10 Dynamic Tracing (DTrace)
+probes.
+
+The directory is organized as:
+
+* helpers/
+
+  This directory contains the auxiliary script to launch Java application
+  with D script to debug. See more comments in the scripts.
+
+* hotspot/
+  
+  This directory contains D scripts which demonstrate usage of 'hotspot'
+  provider probes.
+
+
+* hotspot_jni/
+
+  This directory contains D scripts which demonstrate usage of 'hotspot_jni'
+  provider probes.
+
+
+
+Requirements to run DTrace
+==========================
+
+1. dtrace framework should be installed; (check if /usr/sbin/dtrace exists)
+
+2. the user should have the following rights: 
+   dtrace_proc, dtrace_user, dtrace_kernel
+
+    To give a user a privilege on login, insert a line into the 
+    /etc/user_attr file of the form: 
+    user-name::::defaultpriv=basic,dtrace_proc,dtrace_user,dtrace_kernel
+
+    or
+
+    To give a running process an DTrace privilege, use the ppriv(1) command:
+    # ppriv -s A+privilege process-ID
diff --git a/darwin-x86/sample/dtrace/helpers/dtrace_helper.d b/darwin-x86/sample/dtrace/helpers/dtrace_helper.d
new file mode 100644
index 0000000..896b175
--- /dev/null
+++ b/darwin-x86/sample/dtrace/helpers/dtrace_helper.d
@@ -0,0 +1,87 @@
+#!/usr/sbin/dtrace -s
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Description:
+ * dtrace -c option launches the command specified in the -c argument and
+ * starts tracing the process. Typically, you can run a D script and trace
+ * a Java application as follows:
+ *    dscript.d -Zc "java HelloWorld"
+ *
+ * The -Z option is needed to permit probe descriptions that match zero
+ * probes because Hotspot probes definitions are located in libjvm.so which
+ * has not been yet loaded and thus can't be enabled until the application
+ * is started.
+ *
+ * Straightforward attempt to run D script may fail, e.g.: 
+ *    dscript.d -c "java HelloWorld" 
+ *    "probe description hotspotPID:::probename does not match any probes"
+ *
+ * This is because DTrace tries to enable probes before libjvm.so is loaded.
+ * The -Z option requires Solaris patch 118822-30 installed on your system.
+ *
+ * In case you don't have this Solaris patch use dtrace_helper.d script.
+ * This script waits until the Hotspot DTrace probes are loaded and then
+ * stops the Java process (passed as '-c' options). After the process is
+ * stopped, another D script (passed as first argument) is called to do real
+ * trace of Java process.
+ *
+ * Usage example:
+ *   dtrace_helper.d -c "java ..." ../hotspot/class_loading_stat.d
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+
+
+pid$target::dlopen:entry
+{
+    self->filename = arg0;
+}
+
+
+pid$target::dlopen:return
+/self->filename && basename(copyinstr(self->filename)) == "libjvm.so"/
+{
+    printf(" loaded %s\n", basename(copyinstr(self->filename)));
+    self->filename = 0;
+
+    stop();
+    printf(" stopped java process with pid=%d \n", $target);
+
+    printf(" run: %s -p %d &", $1, $target);
+    system("(%s -p %d) &", $1, $target);
+    exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/README.txt b/darwin-x86/sample/dtrace/hotspot/README.txt
new file mode 100644
index 0000000..b511b9c
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/README.txt
@@ -0,0 +1,87 @@
+============================
+'hotspot' PROBES DESCRIPTION
+============================
+
+This directory contains D scripts which demonstrate usage of 'hotspot' provider probes.
+
+The 'hotspot' provider makes available probes that can be used to track the
+lifespan of the VM, thread start and stop events, GC and memory pool
+statistics, method compilations, and monitor activity. With a startup flag,
+additional probes are enabled which can be used to monitor the running Java
+program, such as method enter and return probes, and object allocations. All
+of the hotspot probes originate in the VM library (libjvm.so), so they are
+also provided from programs which embed the VM.
+
+Many of the probes in the provider have arguments that can be examined to
+provide further details on the state of the VM. Many of these probes'
+arguments are opaque IDs which can be used to link probe firings to each
+other, however strings and other data are also provided. When string values
+are provided, they are always present as a pair: a pointer to unterminated
+modified UTF-8 data (see JVM spec: 4.4.7) , and a length value which
+indicates the extent of that data. Because the string data (even when none
+of the characters are outside the ASCII range) is not guaranteed to be
+terminated by a NULL character, it is necessary to use the length-terminated
+copyinstr() intrinsic to read the string data from the process.
+
+You can find more information about HotSpot probes here:
+http://java.sun.com/javase/6/docs/technotes/guides/vm/dtrace.html
+
+
+===========
+THE SCRIPTS
+===========
+
+The following scripts/samples which demonstrate 'hotspot' probes usage are
+available:
+
+- class_loading_stat.d 
+  The script collects statistics about loaded and unloaded Java classes and
+  dump current state to stdout every N seconds.
+
+- gc_time_stat.d
+  The script measures the duration of a time spent in GC.
+  The duration is measured for every memory pool every N seconds.
+
+- hotspot_calls_tree.d
+  The script prints calls tree of fired 'hotspot' probes.
+
+- method_compile_stat.d
+  The script prints statistics about N methods with largest/smallest
+  compilation time every M seconds.
+
+- method_invocation_stat.d
+  The script collects statistics about Java method invocations.
+
+- method_invocation_stat_filter.d
+  The script collects statistics about Java method invocations.
+  You can specify package, class or method name to trace.
+
+- method_invocation_tree.d
+  The script prints tree of Java and JNI method invocations.
+
+- monitors.d
+  The script traces monitor related probes.
+
+- object_allocation_stat.d
+  The script collects statistics about N object allocations every M seconds.
+
+
+==========
+HOW TO RUN
+==========
+
+To run any D script from hotspot directory you can do either:
+
+ # dscript.d -c "java ..."
+
+ or if you don't have Solaris 10 patch which allows to specify probes that
+ don't yet exist ( Hotspot DTrace probes are defined in libjvm.so and as
+ result they could be not been yet loaded when you try to attach D script to
+ the Java process) do:
+
+ # ../helpers/dtrace_helper.d -c "java ..." dscript.d
+
+ or if your application is already running you can just simply attach
+ the D script like:
+
+ # dscript.d -p JAVA_PID 
diff --git a/darwin-x86/sample/dtrace/hotspot/class_loading_stat.d b/darwin-x86/sample/dtrace/hotspot/class_loading_stat.d
new file mode 100644
index 0000000..7197620
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/class_loading_stat.d
@@ -0,0 +1,157 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. class_loading_stat.d -c "java ..." INTERVAL_SECS
+ *    2. class_loading_stat.d -p JAVA_PID INTERVAL_SECS
+ *
+ * This script collects statistics about loaded and unloaded Java classes
+ * and dump current state to stdout every INTERVAL_SECS seconds.  If
+ * INTERVAL_SECS is not set then 10 seconds interval is used.
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option aggrate=100ms
+
+
+self char *str_ptr;
+self string class_name;
+self string package_name;
+
+int INTERVAL_SECS;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot class loadin tracing";
+
+    INTERVAL_SECS = $1 ? $1 : 10;
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+
+    LOADED_CLASSES_CNT = 0;
+    UNLOADED_CLASSES_CNT = 0;
+
+    LINE_SEP =
+    "------------------------------------------------------------------------";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+/*
+ * hotspot:::class-loaded, hotspot:::class-unloaded probe arguments:
+ *  arg0: char*,        class name passed as mUTF8 string
+ *  arg1: uintptr_t,    class name length
+ *  arg2: void*,        class loader ID, which is unique identifier for
+ *                      a class loader in the VM.
+ *  arg3: uintptr_t,    class is shared or not
+ */
+hotspot$target:::class-loaded
+{
+    LOADED_CLASSES_CNT ++;
+
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->package_name = dirname(self->class_name);
+
+    @classes_loaded[self->package_name] = count();
+}
+
+hotspot$target:::class-unloaded
+{
+    UNLOADED_CLASSES_CNT ++;
+
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->package_name = dirname(self->class_name);
+
+    @classes_unloaded[self->package_name] = count();
+}
+
+
+tick-1sec
+/timestamp > SAMPLING_TIME/
+{
+    printf("%s\n", LINE_SEP);
+    printf("%Y\n", walltimestamp);
+    printf("%s\n", LINE_SEP);
+
+    printf("Loaded classes by package:\n");
+    printa("%10@d %s\n", @classes_loaded);
+
+    printf("\n");
+    printf("Unloaded classes by package:\n");
+    printa("%10@d %s\n", @classes_unloaded);
+
+    printf("\n");
+    printf("Number of loaded classes: %10d\n", LOADED_CLASSES_CNT);
+    printf("Number of unloaded classes: %10d\n", UNLOADED_CLASSES_CNT);
+
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+}
+
+
+:::END
+{
+    printf("%s\n", LINE_SEP);
+    printf("%Y\n", walltimestamp);
+    printf("%s\n", LINE_SEP);
+
+    printf("Loaded classes by package:\n");
+    printa("%10@d %s\n", @classes_loaded);
+
+    printf("\n");
+    printf("Unloaded classes by package:\n");
+    printa("%10@d %s\n", @classes_unloaded);
+
+    printf("\n");
+    printf("Number of loaded classes: %10d\n", LOADED_CLASSES_CNT);
+    printf("Number of unloaded classes: %10d\n", UNLOADED_CLASSES_CNT);
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/gc_time_stat.d b/darwin-x86/sample/dtrace/hotspot/gc_time_stat.d
new file mode 100644
index 0000000..c35b87d
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/gc_time_stat.d
@@ -0,0 +1,203 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. gc_time_stat.d -c "java ..." INTERVAL_SECS
+ *    2. gc_time_stat.d -p JAVA_PID INTERVAL_SECS
+ *
+ * This script measures the duration of a time spent in GC.  The duration is
+ * measured for every memory pool every INTERVAL_SECS seconds.  If
+ * INTERVAL_SECS is not set then 10 seconds interval is used.
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option aggrate=100ms
+
+
+string TEST_NAME;
+self char *str_ptr;
+self string mgr_name;
+self string pool_name;
+
+int INTERVAL_SECS;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot GC tracing";
+
+    START_TIME = timestamp;
+    gc_total_time = 0;
+    gc_total_count = 0;
+
+    INTERVAL_SECS = $1 ? $1 : 10;
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+
+    LINE_SEP = "--------------------------------------------------------";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+
+/*
+ * hotspot:::gc-begin
+ *  arg0: uintptr_t,    boolean value which indicates
+ *                      if this is to be a full GC or not
+ */
+hotspot$target:::gc-begin
+{
+    self->gc_ts = timestamp;
+    printf("\nGC started: %Y\n", walltimestamp);
+    printf("%20s | %-20s | %10s\n", "manager", "pool", "time (ms)");
+    printf(" %s\n", LINE_SEP);
+}
+
+hotspot$target:::gc-end
+/self->gc_ts/
+{
+    self->time = (timestamp - self->gc_ts) / 1000;
+
+    printf(" %s\n", LINE_SEP);
+    printf("   %40s | %10d\n", "GC total", self->time);
+
+    gc_total_time += self->time;
+    gc_total_count ++;
+    self->gc_ts = 0;
+}
+
+/*
+ * hotspot:::mem-pool-gc-begin, hotspot:::mem-pool-gc-end
+ *  arg0: char*,        a pointer to mUTF-8 string data which contains the name
+ *                          of the manager which manages this memory pool
+ *  arg1: uintptr_t,    the length of the manager name (in bytes
+ *  arg2: char*,        a pointer to mUTF-8 string data which contains the name
+ *                          of the memory pool
+ *  arg3: uintptr_t,    the length of the memory pool name (in bytes)
+ *  arg4: uintptr_t,    the initial size of the memory pool (in bytes)
+ *  arg5: uintptr_t,    the amount of memory in use in the memory pool
+ *                          (in bytes)
+ *  arg6: uintptr_t,    the the number of committed pages in the memory pool
+ *  arg7: uintptr_t,    the the maximum size of the memory pool
+ */
+hotspot$target:::mem-pool-gc-begin
+{
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    self->mgr_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg2, arg3+1);
+    self->str_ptr[arg3] = '\0';
+    self->pool_name = (string) self->str_ptr;
+
+    self->mem_pool_ts[self->mgr_name, self->pool_name] = timestamp;
+}
+
+hotspot$target:::mem-pool-gc-end
+{
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    self->mgr_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg2, arg3+1);
+    self->str_ptr[arg3] = '\0';
+    self->pool_name = (string) self->str_ptr;
+
+    self->time =
+        (timestamp - self->mem_pool_ts[self->mgr_name, self->pool_name]) / 1000;
+
+    printf(
+        "%20s | %-20s | %10d\n", self->mgr_name, self->pool_name, self->time);
+
+    @mem_pool_total_time[self->mgr_name, self->pool_name] = sum(self->time);
+    self->mem_pool_ts[self->mgr_name, self->pool_name] = 0;
+
+    @mem_pool_count[self->mgr_name, self->pool_name] = count();
+}
+
+tick-1sec
+/timestamp > SAMPLING_TIME/
+{
+    trace_time = (timestamp - START_TIME) / 1000;
+
+    printf(" %s\n", LINE_SEP);
+    printf("\nGC statistics, time: %Y\n\n", walltimestamp);
+    printf("%20s | %-20s | %10s\n", "manager", "pool", "total time");
+    printf(" %s\n", LINE_SEP);
+    printa("%20s | %-20s | %10@d\n", @mem_pool_total_time);
+    printf(" %s\n", LINE_SEP);
+    printf("   %40s | %10d\n", "total", gc_total_time);
+
+    printf("\n");
+    printf("%20s | %-20s | %10s\n", "manager", "pool", "# of calls");
+    printf(" %s\n", LINE_SEP);
+    printa("%20s | %-20s | %10@d\n", @mem_pool_count);
+    printf(" %s\n", LINE_SEP);
+    printf("   %40s | %10d\n", "total", gc_total_count);
+
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+}
+
+:::END
+{
+    trace_time = (timestamp - START_TIME) / 1000;
+
+    printf(" %s\n", LINE_SEP);
+    printf("\nGC statistics, time: %Y\n\n", walltimestamp);
+    printf("%20s | %-20s | %10s\n", "manager", "pool", "total time");
+    printf(" %s\n", LINE_SEP);
+    printa("%20s | %-20s | %10@d\n", @mem_pool_total_time);
+    printf(" %s\n", LINE_SEP);
+    printf("   %40s | %10d\n", "total", gc_total_time);
+
+    printf("\n");
+    printf("%20s | %-20s | %10s\n", "manager", "pool", "# of calls");
+    printf(" %s\n", LINE_SEP);
+    printa("%20s | %-20s | %10@d\n", @mem_pool_count);
+    printf(" %s\n", LINE_SEP);
+    printf("   %40s | %10d\n", "total", gc_total_count);
+
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/hotspot_calls_tree.d b/darwin-x86/sample/dtrace/hotspot/hotspot_calls_tree.d
new file mode 100644
index 0000000..a5af496
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/hotspot_calls_tree.d
@@ -0,0 +1,117 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *   1. hotspot_calls_tree.d -c "java ..."
+ *   2. hotspot_calls_tree.d -p JAVA_PID
+ *
+ * This script prints calls tree of fired 'hotspot' probes.
+ *
+ * Notes: 
+ *    The script uses 'monitors' probes which are disabled by default since
+ *    it incurs performance overhead to the application. To enable them, you
+ *    need to turn on the ExtendedDTraceProbes VM option. You can either
+ *    start the application with -XX:+ExtendedDTraceProbes option or use the
+ *    jinfo command to enable it at runtime as follows:
+ *
+ *       jinfo -flag +ExtendedDTraceProbes <java_pid>
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option aggrate=100ms
+
+self int indent;
+string PAUSE_AT_STARTUP_FILE;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot probes tracing";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+
+    self->indent = 10;
+}
+
+hotspot$target:::class-loaded,
+hotspot$target:::class-unloaded,
+hotspot$target:::compiled-method-load,
+hotspot$target:::compiled-method-unload,
+hotspot$target:::monitor-notify,
+hotspot$target:::monitor-notifyAll
+{
+    printf("%d %*s <-> %s\n", curcpu->cpu_id, self->indent, "", probename);
+}
+
+hotspot$target:::vm-init-begin,
+hotspot$target:::gc-begin,
+hotspot$target:::mem-pool-gc-begin,
+hotspot$target:::thread-start,
+hotspot$target:::method-compile-begin,
+hotspot$target:::monitor-contended-enter,
+hotspot$target:::monitor-wait
+{
+    self->indent ++;
+    printf("%d %*s -> %s\n", curcpu->cpu_id, self->indent, "", probename);
+}
+
+hotspot$target:::vm-init-end,
+hotspot$target:::vm-shutdown,
+hotspot$target:::gc-end,
+hotspot$target:::mem-pool-gc-end,
+hotspot$target:::thread-stop,
+hotspot$target:::method-compile-end,
+hotspot$target:::monitor-contended-entered,
+hotspot$target:::monitor-contended-exit,
+hotspot$target:::monitor-waited
+{
+    printf("%d %*s <- %s\n", curcpu->cpu_id, self->indent, "", probename);
+    self->indent --;
+}
+
+:::END
+{
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+    exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/method_compile_stat.d b/darwin-x86/sample/dtrace/hotspot/method_compile_stat.d
new file mode 100644
index 0000000..0d3812e
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/method_compile_stat.d
@@ -0,0 +1,274 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *   1. method_compile_stat.d -c "java ..." TOP_RESULTS_COUNT INTERVAL_SECS
+ *   2. method_compile_stat.d -p JAVA_PID TOP_RESULTS_COUNT INTERVAL_SECS
+ *
+ * This script prints statistics about TOP_RESULTS_COUNT (default is 25)
+ * methods with largest/smallest compilation time every INTERVAL_SECS
+ * (default is 60) seconds.
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option aggrate=100ms
+
+
+self char *str_ptr;
+self string class_name;
+self string method_name;
+self string signature;
+
+int INTERVAL_SECS;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot methods compilation tracing";
+
+    TOP_RESULTS_COUNT = $1 ? $1 : 25;
+    INTERVAL_SECS = $2 ? $2 : 60;
+
+    COMPILED_METHODS_COUNT = 0;
+    LOADED_METHODS_CNT = 0;
+    UNLOADED_METHODS_CNT = 0;
+
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+
+    LINE_SEP =
+    "------------------------------------------------------------------------";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+/*
+ * hotspot:::method-compile-begin
+ *  arg0: char*,        a pointer to mUTF-8 string containing the name of
+ *                          the compiler
+ *  arg1: uintptr_t,    the length of the compiler name (in bytes)
+ *  arg2: char*,        a pointer to mUTF-8 string containing the class name of
+ *                          the method being compiled
+ *  arg3: uintptr_t,    the length of the class name (in bytes)
+ *  arg4: char*,        a pointer to mUTF-8 string containing the method name of
+ *                          the method being compiled
+ *  arg5: uintptr_t,    the length of the method name (in bytes)
+ *  arg6: char*,        a pointer to mUTF-8 string containing the signature of
+ *                          the method being compiled
+ *  arg7: uintptr_t,    the length of the signature(in bytes)
+ */
+hotspot$target:::method-compile-begin
+{
+    /*compiler_name, len, class_name, len, method_name, len, signature, len*/
+
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    compiler_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg2, arg3+1);
+    self->str_ptr[arg3] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg4, arg5+1);
+    self->str_ptr[arg5] = '\0';
+    self->method_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg6, arg7+1);
+    self->str_ptr[arg7] = '\0';
+    self->signature = (string) self->str_ptr;
+
+    self->ts[self->class_name, self->method_name, self->signature] = timestamp;
+}
+
+/*
+ * hotspot:::method-compile-end
+ *  arg0: char*,        a pointer to mUTF-8 string containing the name of
+ *                          the compiler
+ *  arg1: uintptr_t,    the length of the compiler name (in bytes)
+ *  arg2: char*,        a pointer to mUTF-8 string containing the class name of
+ *                          the method being compiled
+ *  arg3: uintptr_t,    the length of the class name (in bytes)
+ *  arg4: char*,        a pointer to mUTF-8 string containing the method name of
+ *                          the method being compiled
+ *  arg5: uintptr_t,    the length of the method name (in bytes)
+ *  arg6: char*,        a pointer to mUTF-8 string containing the signature of
+ *                          the method being compiled
+ *  arg7: uintptr_t,    the length of the signature(in bytes)
+ *  arg8: uintptr_t,    boolean value which indicates if method
+ *                          has been compiled successfuly
+ */
+hotspot$target:::method-compile-end
+{
+    /* compiler_name, len, class_name, len, method_name, len,
+       signature, len, isSuccess */
+
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    compiler_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg2, arg3+1);
+    self->str_ptr[arg3] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg4, arg5+1);
+    self->str_ptr[arg5] = '\0';
+    self->method_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg6, arg7+1);
+    self->str_ptr[arg7] = '\0';
+    self->signature = (string) self->str_ptr;
+}
+
+/*
+ * Method was successfuly compiled
+ */
+hotspot$target:::method-compile-end
+/arg8 && self->ts[self->class_name, self->method_name, self->signature]/
+{
+    /* compiler_name, len, class_name, len, method_name, len,
+       signature, len, isSuccess */
+
+    COMPILED_METHODS_COUNT++;
+
+    @compile_time_top[self->class_name, self->method_name, self->signature] =
+     avg((timestamp -
+      self->ts[self->class_name, self->method_name, self->signature]) / 1000);
+
+    @compile_time_last[self->class_name, self->method_name, self->signature] =
+     avg((timestamp -
+      self->ts[self->class_name, self->method_name, self->signature]) / 1000);
+
+    self->ts[self->class_name, self->method_name, self->signature] = 0;
+}
+
+/*
+ * Method compilation was failed
+ */
+hotspot$target:::method-compile-end
+/arg8 != 1 && self->ts[self->class_name, self->method_name, self->signature]/
+{
+    /* compiler_name, len, class_name, len, method_name, len,
+       signature, len, isSuccess */
+
+    @fail_compile_count[self->class_name,
+                        self->method_name, self->signature] = count();
+}
+
+hotspot$target:::compiled-method-load
+{
+    /* class_name, len, method_name, len, signature, len, code_address, size */
+
+    LOADED_METHODS_CNT ++;
+}
+
+hotspot$target:::compiled-method-unload
+{
+    /* class_name, len, method_name, len, signature, len, code_address, size */
+
+    UNLOADED_METHODS_CNT ++;
+}
+
+
+tick-1sec
+/timestamp > SAMPLING_TIME/
+{
+    trunc(@compile_time_top, TOP_RESULTS_COUNT);
+    trunc(@compile_time_last, -TOP_RESULTS_COUNT);
+
+    printf("\n");
+    printf("%s\n", LINE_SEP);
+    printf("%Y\n", walltimestamp);
+    printf("%s\n", LINE_SEP);
+
+    printf(
+        "\nTop %d methods with largest compilation time (in milleseconds):\n",
+        TOP_RESULTS_COUNT);
+    printa("%10@d %s::%s%s\n", @compile_time_top);
+
+    printf(
+        "\nTop %d methods with smallest compilation time (in milleseconds):\n",
+        TOP_RESULTS_COUNT);
+    printa("%10@d %s::%s%s\n", @compile_time_last);
+
+    printf("\n");
+    printf("Compiled methods:         %10d\n", COMPILED_METHODS_COUNT);
+    printf("Loaded compiled methods:  %10d\n", LOADED_METHODS_CNT);
+    printf("Unoaded compiled methods: %10d\n", UNLOADED_METHODS_CNT);
+
+    printf("\nFailed compilation:\n");
+    printa("%10@d %s::%s%s\n", @fail_compile_count);
+
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+}
+
+:::END
+{
+    trunc(@compile_time_top, TOP_RESULTS_COUNT);
+    trunc(@compile_time_last, -TOP_RESULTS_COUNT);
+
+    printf("\n");
+    printf("%s\n", LINE_SEP);
+    printf("%Y\n", walltimestamp);
+    printf("%s\n", LINE_SEP);
+
+    printf(
+        "\nTop %d methods with largest compilation time (in milleseconds):\n",
+        TOP_RESULTS_COUNT);
+    printa("%10@d %s::%s%s\n", @compile_time_top);
+
+    printf(
+        "\nTop %d methods with smallest compilation time (in milleseconds):\n",
+        TOP_RESULTS_COUNT);
+    printa("%10@d %s::%s%s\n", @compile_time_last);
+
+    printf("\n");
+    printf("Compiled methods:         %10d\n", COMPILED_METHODS_COUNT);
+    printf("Loaded compiled methods:  %10d\n", LOADED_METHODS_CNT);
+    printf("Unoaded compiled methods: %10d\n", UNLOADED_METHODS_CNT);
+
+    printf("\nFailed compilations:\n");
+    printa("%10@d %s::%s%s\n", @fail_compile_count);
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/method_invocation_stat.d b/darwin-x86/sample/dtrace/hotspot/method_invocation_stat.d
new file mode 100644
index 0000000..1b64b8b
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/method_invocation_stat.d
@@ -0,0 +1,210 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. method_invocation_stat.d -c "java ..."
+ *    2. method_invocation_stat.d -p JAVA_PID
+ *
+ * This script collects statistics about Java method invocations.
+ *
+ * Notes:
+ *  - These probes are disabled by default since it incurs performance
+ *    overhead to the application. To trace the method-entry and
+ *    method-exit probes, you need to turn on the ExtendedDTraceProbes VM
+ *    option.  
+ *    You can either start the application with -XX:+ExtendedDTraceProbes
+ *    option or use the jinfo command to enable it at runtime as follows:
+ *
+ *       jinfo -flag +ExtendedDTraceProbes <java_pid>
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+self char *str_ptr;
+self string class_name;
+self string method_name;
+self string signature;
+self string package_name;
+self string last_class_name;
+
+long long JAVA_CALLS;
+long long JNI_CALLS;
+long long SYS_CALLS;
+
+int SYS_DEEP;
+long long LAST_SYS_TS;
+
+long long START_TIME;
+long long JAVA_TIME;
+long long RUN_TIME;
+long long SYS_TIME;
+
+BEGIN
+{
+    SAMPLE_NAME = "hotspot method invocation tracing";
+
+    START_TIME = timestamp;
+    SYS_TIME = 0;
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+/*
+ * hotspot:::method-entry, hotspot:::method-return probe arguments:
+ *  arg0: uintptr_t,    Java thread id
+ *  arg1: char*,        a pointer to mUTF-8 string containing the name of
+ *                          the class of the method being entered
+ *  arg2: uintptr_t,    the length of the class name (in bytes)
+ *  arg3: char*,        a pointer to mUTF-8 string data which contains the
+ *                          name of the method being entered
+ *  arg4: uintptr_t,    the length of the method name (in bytes)
+ *  arg5: char*,        a pointer to mUTF-8 string data which contains the
+ *                          signature of the method being entered
+ *  arg6: uintptr_t,    the length of the signature(in bytes)
+ */
+hotspot$target:::method-entry
+{
+    self->str_ptr = (char*) copyin(arg1, arg2+1);
+    self->str_ptr[arg2] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg3, arg4+1);
+    self->str_ptr[arg4] = '\0';
+    self->method_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg5, arg6+1);
+    self->str_ptr[arg6] = '\0';
+    self->signature = (string) self->str_ptr;
+
+
+    self->package_name = dirname(self->class_name);
+
+    JAVA_CALLS ++;
+    @method_calls[self->class_name,
+                  self->method_name, self->signature] = count();
+    @class_calls[self->class_name] = count();
+    @package_calls[self->package_name] = count();
+}
+
+
+hotspot_jni$target:::*-entry
+{
+    JNI_CALLS ++;
+
+    @jni_calls[probename] = count();
+}
+
+syscall:::entry
+/pid == $target && SYS_DEEP == 0/
+{
+    LAST_SYS_TS = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+    SYS_DEEP ++;
+    @sys_calls[probefunc] = count();
+    SYS_CALLS ++;
+}
+
+syscall:::return
+/pid == $target/
+{
+    SYS_DEEP --;
+}
+
+syscall:::return
+/pid == $target && SYS_DEEP == 0/
+{
+    SYS_TIME += (timestamp - LAST_SYS_TS);
+}
+
+
+:::END
+{
+    RUN_TIME = (timestamp - START_TIME);
+    JAVA_TIME = (RUN_TIME - SYS_TIME);
+
+    printf("System calls:\n");
+    printa("%10@d %s\n", @sys_calls);
+    printf("\n");
+
+    printf("JNI calls:\n");
+    printa("%10@d %s\n", @jni_calls);
+    printf("\n");
+
+    printf("Top packages calls:\n");
+    printa("%10@d %s\n", @package_calls);
+    printf("\n");
+
+    printf("Top class calls:\n");
+    printa("%10@d %s\n", @class_calls);
+    printf("\n");
+
+    printf("Top method calls:\n");
+    printa("%10@d %s:%s:%s\n", @method_calls);
+    printf("\n");
+
+    printf("=======================================\n");
+    printf("JAVA_CALLS: %10d\n", JAVA_CALLS);
+    printf(" JNI_CALLS: %10d\n", JNI_CALLS);
+    printf(" SYS_CALLS: %10d\n", SYS_CALLS);
+    printf("\n");
+
+    printf("Run time:       %15d\n", RUN_TIME);
+    printf("Syscall time:   %15d\n", SYS_TIME);
+    printf("Java+JNI time:  %15d\n", JAVA_TIME);
+    printf("\n");
+}
+
+:::END
+{
+    printf("\nEND %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+    exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/method_invocation_stat_filter.d b/darwin-x86/sample/dtrace/hotspot/method_invocation_stat_filter.d
new file mode 100644
index 0000000..a36d365
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/method_invocation_stat_filter.d
@@ -0,0 +1,204 @@
+#!/usr/sbin/dtrace -Zs
+
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *   1. method_invocation_stat_filter.d -c "java ..." p|c|m package|class_name|method_name
+ *   2. method_invocation_stat_filter.d -p JAVA_PID  p|c|m package|class_name|method_name
+ *
+ * example:
+ *      method_invocation_stat_filter.d -c "java -version" '"p"' '"sun/util"'
+ *
+ * This script collects statistics about Java method invocations.
+ *
+ * Notes:
+ *  - These probes are disabled by default since it incurs performance
+ *    overhead to the application. To trace the method-entry and
+ *    method-exit probes, you need to turn on the ExtendedDTraceProbes VM
+ *    option.  
+ *    You can either start the application with -XX:+ExtendedDTraceProbes
+ *    option or use the jinfo command to enable it at runtime as follows:
+ *
+ *       jinfo -flag +ExtendedDTraceProbes <java_pid>
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+self char *str_ptr;
+self string class_name;
+self string method_name;
+self string signature;
+self string package_name;
+self string last_class_name;
+
+long long JAVA_CALLS;
+
+long long START_TIME;
+long long JAVA_TIME;
+long long RUN_TIME;
+
+string FILTER_TYPE;
+string FILTER_VALUE;
+
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot method invocation tracing";
+
+    START_TIME = timestamp;
+
+    FILTER_TYPE = $1;
+    FILTER_VALUE = $2;
+
+    START_TIME = timestamp;
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+/*
+ * hotspot:::method-entry, hotspot:::method-return probe arguments:
+ *  arg0: uintptr_t,    Java thread id
+ *  arg1: char*,        a pointer to mUTF-8 string containing the name of
+ *                          the class of the method being entered
+ *  arg2: uintptr_t,    the length of the class name (in bytes)
+ *  arg3: char*,        a pointer to mUTF-8 string data which contains the
+ *                          name of the method being entered
+ *  arg4: uintptr_t,    the length of the method name (in bytes)
+ *  arg5: char*,        a pointer to mUTF-8 string data which contains the
+ *                          signature of the method being entered
+ *  arg6: uintptr_t,    the length of the signature(in bytes)
+ */
+hotspot$target:::method-entry
+{
+    self->str_ptr = (char*) copyin(arg1, arg2+1);
+    self->str_ptr[arg2] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg3, arg4+1);
+    self->str_ptr[arg4] = '\0';
+    self->method_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg5, arg6+1);
+    self->str_ptr[arg6] = '\0';
+    self->signature = (string) self->str_ptr;
+
+
+    self->package_name = dirname(self->class_name);
+}
+
+hotspot$target:::method-entry
+/FILTER_TYPE == ""/
+{
+    JAVA_CALLS ++;
+    @method_calls[self->class_name,
+                  self->method_name, self->signature] = count();
+    @class_calls[self->class_name] = count();
+    @package_calls[self->package_name] = count();
+}
+
+hotspot$target:::method-entry
+/FILTER_TYPE == "p"  && self->package_name == FILTER_VALUE/
+{
+    JAVA_CALLS ++;
+    @method_calls[self->class_name,
+                  self->method_name, self->signature] = count();
+    @class_calls[self->class_name] = count();
+    @package_calls[self->package_name] = count();
+}
+
+hotspot$target:::method-entry
+/FILTER_TYPE == "c"  && self->class_name == FILTER_VALUE/
+{
+    JAVA_CALLS ++;
+    @method_calls[self->class_name,
+                  self->method_name, self->signature] = count();
+    @class_calls[self->class_name] = count();
+    @package_calls[self->package_name] = count();
+}
+
+hotspot$target:::method-entry
+/FILTER_TYPE == "m"  && self->method_name == FILTER_VALUE/
+{
+    JAVA_CALLS ++;
+    @method_calls[self->class_name,
+                  self->method_name, self->signature] = count();
+    @class_calls[self->class_name] = count();
+    @package_calls[self->package_name] = count();
+}
+
+
+:::END
+{
+    RUN_TIME = (timestamp - START_TIME);
+    JAVA_TIME = RUN_TIME;
+
+    printf("Top packages calls:\n");
+    printa("%10@d %s\n", @package_calls);
+    printf("\n");
+
+    printf("Top class calls:\n");
+    printa("%10@d %s\n", @class_calls);
+    printf("\n");
+
+    printf("Top method calls:\n");
+    printa("%10@d %s:%s:%s\n", @method_calls);
+    printf("\n");
+
+    printf("=======================================\n");
+    printf("JAVA_CALLS: %10d\n", JAVA_CALLS);
+    printf("\n");
+
+    printf("Run time:       %15d\n", RUN_TIME);
+    printf("\n");
+}
+
+:::END
+{
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+    exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/method_invocation_tree.d b/darwin-x86/sample/dtrace/hotspot/method_invocation_tree.d
new file mode 100644
index 0000000..d27fe27
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/method_invocation_tree.d
@@ -0,0 +1,142 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *   1. method_invocation_tree.d -c "java ..."
+ *   2. method_invocation_tree.d -p JAVA_PID
+ *
+ * This script prints tree of Java and JNI method invocations.
+ *
+ * Notes:
+ *  - These probes are disabled by default since it incurs performance
+ *    overhead to the application. To trace the method-entry and
+ *    method-exit probes, you need to turn on the ExtendedDTraceProbes VM
+ *    option.  
+ *    You can either start the application with -XX:+ExtendedDTraceProbes
+ *    option or use the jinfo command to enable it at runtime as follows:
+ *
+ *       jinfo -flag +ExtendedDTraceProbes <java_pid>
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+self char *str_ptr;
+self string class_name;
+self string method_name;
+self string signature;
+
+self int indent;
+
+BEGIN
+{
+    SAMPLE_NAME = "hotspot method invocation tracing";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+hotspot$target:::*
+/!self->indent/
+{
+    self->indent = 0;
+}
+
+/*
+ * hotspot:::method-entry, hotspot:::method-return probe arguments:
+ *  arg0: uintptr_t,    Java thread id
+ *  arg1: char*,        a pointer to mUTF-8 string containing the name of
+ *                          the class of the method being entered
+ *  arg2: uintptr_t,    the length of the class name (in bytes)
+ *  arg3: char*,        a pointer to mUTF-8 string data which contains the
+ *                          name of the method being entered
+ *  arg4: uintptr_t,    the length of the method name (in bytes)
+ *  arg5: char*,        a pointer to mUTF-8 string data which contains the
+ *                          signature of the method being entered
+ *  arg6: uintptr_t,    the length of the signature(in bytes)
+ */
+
+hotspot$target:::method-return
+{
+    self->indent --;
+    METHOD_RETURN_CNT ++
+}
+
+hotspot$target:::method-entry
+{
+    self->indent ++;
+    METHOD_ENTRY_CNT ++;
+
+    self->str_ptr = (char*) copyin(arg1, arg2+1);
+    self->str_ptr[arg2] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg3, arg4+1);
+    self->str_ptr[arg4] = '\0';
+    self->method_name = (string) self->str_ptr;
+
+    self->str_ptr = (char*) copyin(arg5, arg6+1);
+    self->str_ptr[arg6] = '\0';
+    self->signature = (string) self->str_ptr;
+
+    printf("%-10u%*s%s:%s:%s\n",
+        tid, self->indent, "", self->class_name,
+        self->method_name, self->signature);
+
+}
+
+hotspot_jni$target:::*_entry
+{
+    printf("%-10u%*sJNI:%s\n", tid, self->indent+1, "", probename);
+}
+
+:::END
+{
+    printf("METHOD_ENTRY_CNT:  %10d\n", METHOD_ENTRY_CNT);
+    printf("METHOD_RETURN_CNT: %10d\n", METHOD_RETURN_CNT);
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/monitors.d b/darwin-x86/sample/dtrace/hotspot/monitors.d
new file mode 100644
index 0000000..fba030e
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/monitors.d
@@ -0,0 +1,152 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *   1. monitors.d -c "java ..."
+ *   2. monitors.d -p JAVA_PID
+ *
+ * The script traces monitor related probes.
+ *
+ * Notes:
+ *  - These probes are disabled by default since it incurs performance
+ *    overhead to the application. To trace the monitor-* probes, you need
+ *    to turn on the ExtendedDTraceProbes VM option.
+ *    You can either start the application with -XX:+ExtendedDTraceProbes
+ *    option or use the jinfo command to enable it at runtime as follows:
+ *
+ *       jinfo -flag +ExtendedDTraceProbes <java_pid>
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option aggrate=100ms
+
+
+self string thread_name;
+self char* str_ptr;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot monitors tracing";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+/*
+ * hotspot:::thread-start, hotspot:::thread-stop probe arguments:
+ *  arg0: char*,        thread name passed as mUTF8 string
+ *  arg1: uintptr_t,    thread name length
+ *  arg2: uintptr_t,    Java thread id
+ *  arg3: uintptr_t,    native/OS thread id
+ *  arg4: uintptr_t,    is a daemon or not
+ */
+hotspot$target:::thread-start
+{
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    self->thread_name = (string) self->str_ptr;
+
+    printf("thread-start: id=%d, is_daemon=%d, name=%s, os_id=%d\n",
+            arg2, arg4, self->thread_name, arg3);
+
+    threads[arg2] = self->thread_name;
+}
+
+
+hotspot$target:::thread-stop
+{
+    self->str_ptr = (char*) copyin(arg0, arg1+1);
+    self->str_ptr[arg1] = '\0';
+    self->thread_name = (string) self->str_ptr;
+
+
+    printf("thread-stop: id=%d, is_daemon=%d, name=%s, os_id=%d\n",
+            arg2, arg4, self->thread_name, arg3);
+}
+
+/*
+ *
+ * hotspot::monitor-contended-enter, hotspot::monitor-contended-entered
+ *
+ *  arg0: uintptr_t,    the Java thread identifier for the thread peforming
+ *                          the monitor operation
+ *  arg1: uintptr_t,    a unique, but opaque identifier for the specific
+ *                          monitor that the action is performed upon
+ *  arg2: char*,        a pointer to mUTF-8 string data which contains the
+ *                          name of the class of the object being acted upon
+ *  arg3: uintptr_t,    the length of the class name (in bytes)
+ */
+
+hotspot$target:::monitor-contended-enter
+{
+    /* (uintptr_t thread_id, uintptr_t monitor_id,
+       char* obj_class_name, uintptr_t obj_class_name_len) */
+
+    self->str_ptr = (char*) copyin(arg2, arg3+1);
+    self->str_ptr[arg3] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+    monitors[arg1] = self->class_name;
+
+    monitors_enter[arg1] = arg0;
+    printf("%s: -> enter monitor (%d) %s\n",
+        threads[arg0], arg1, monitors[arg1]);
+}
+
+hotspot$target:::monitor-contended-entered
+{
+    /* (uintptr_t thread_id, uintptr_t monitor_id, char* obj_class_name,
+        uintptr_t obj_class_name_len) */
+
+    monitors_entered[arg1] = arg0;
+    printf("%s: <- entered monitor (%d) %s\n",
+        threads[arg0], arg1, monitors[arg1]);
+}
+
+
+:::END
+{
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot/object_allocation_stat.d b/darwin-x86/sample/dtrace/hotspot/object_allocation_stat.d
new file mode 100644
index 0000000..bfb8981
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot/object_allocation_stat.d
@@ -0,0 +1,162 @@
+#!/usr/sbin/dtrace -Zs
+
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. object_allocation_stat.d -c "java ..." TOP_RESULTS_COUNT INTERVAL_SECS
+ *    2. object_allocation_stat.d -p JAVA_PID TOP_RESULTS_COUNT INTERVAL_SECS
+ *
+ * This script collects statistics about TOP_RESULTS_COUNT (default is 25)
+ * object allocations every INTERVAL_SECS (default is 60) seconds.
+ *
+ * The results are displayed in ascending order which means that the highest
+ * allocated type is listed last. The script can be improved to sort the
+ * results in reverse order when DTrace supports it.
+ *
+ * Notes:
+ *  - The object-alloc probe is disabled by default since it incurs
+ *    performance overhead to the application. To trace object-alloc probe,
+ *    you need to turn on the ExtendedDTraceProbes VM option.
+ *    You can either start the application with -XX:+ExtendedDTraceProbes
+ *    option or use the jinfo command to enable it at runtime as follows:
+ *
+ *       jinfo -flag +ExtendedDTraceProbes <java_pid>
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+self char *str_ptr;
+self string class_name;
+
+long long ALLOCATED_OBJECTS_CNT;
+
+int INTERVAL_SECS;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "hotspot object allocation tracing";
+
+    TOP_RESULTS_COUNT = $1 ? $1 : 25;
+    INTERVAL_SECS = $2 ? $2 : 60;
+
+    ALLOCATED_OBJECTS_CNT = 0;
+
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+
+    LINE_SEP =
+    "------------------------------------------------------------------------";
+
+    printf("BEGIN %s\n\n", SAMPLE_NAME);
+}
+
+/*
+ * hotspot:::object-alloc probe arguments:
+ *  arg0: uintptr_t,    Java thread id
+ *  arg1: char*,        a pointer to mUTF-8 string containing the name of
+ *                          the class of the object being allocated
+ *  arg2: uintptr_t,    the length of the class name (in bytes)
+ *  arg3: uintptr_t,    the size of the object being allocated
+ */
+hotspot$target:::object-alloc
+{
+    ALLOCATED_OBJECTS_CNT ++;
+
+    self->str_ptr = (char*) copyin(arg1, arg2+1);
+    self->str_ptr[arg2] = '\0';
+    self->class_name = (string) self->str_ptr;
+
+
+    @allocs_count[self->class_name] = count();
+    @allocs_size[self->class_name] = sum(arg3);
+}
+
+tick-1sec
+/timestamp > SAMPLING_TIME/
+{
+    printf("\n");
+    printf("%s\n", LINE_SEP);
+    printf("%Y\n", walltimestamp);
+    printf("%s\n", LINE_SEP);
+
+    printf("\n");
+    printf("Top %d allocations by size:\n", TOP_RESULTS_COUNT);
+    trunc(@allocs_size, TOP_RESULTS_COUNT);
+    printa("%10@d %s\n", @allocs_size);
+
+    printf("\n");
+    printf("Top %d allocations by count:\n", TOP_RESULTS_COUNT);
+    trunc(@allocs_count, TOP_RESULTS_COUNT);
+    printa("%10@d %s\n", @allocs_count);
+
+    printf("\nTotal number of allocated objects: %d\n", ALLOCATED_OBJECTS_CNT);
+
+    SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
+}
+
+:::END
+{
+    printf("\n");
+    printf("%s\n", LINE_SEP);
+    printf("%Y\n", walltimestamp);
+    printf("%s\n", LINE_SEP);
+
+    printf("\n");
+    printf("Top %d allocations by size:\n", TOP_RESULTS_COUNT);
+    trunc(@allocs_size, TOP_RESULTS_COUNT);
+    printa("%10@d %s\n", @allocs_size);
+
+    printf("\n");
+    printf("Top %d allocations by count:\n", TOP_RESULTS_COUNT);
+    trunc(@allocs_count, TOP_RESULTS_COUNT);
+    printa("%10@d %s\n", @allocs_count);
+
+    printf("\nTotal number of allocated objects: %d\n", ALLOCATED_OBJECTS_CNT);
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot_jni/CriticalSection.d b/darwin-x86/sample/dtrace/hotspot_jni/CriticalSection.d
new file mode 100644
index 0000000..510784f
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot_jni/CriticalSection.d
@@ -0,0 +1,136 @@
+#!/usr/sbin/dtrace -Zs
+
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. CriticalSection.d -c "java ..."
+ *    2. CriticalSection.d -p JAVA_PID
+ *
+ * The script inspect a JNI application for Critical Section violations.
+ *
+ * Critical section is the space between calls to JNI methods:
+ *   - GetPrimitiveArrayCritical and ReleasePrimitiveArrayCritical; or
+ *   - GetStringCritical and ReleaseStringCritical.
+ *
+ * Inside a critical section, native code must not call other JNI functions,
+ * or any system call that may cause the current thread to block and wait
+ * for another Java thread. (For example, the current thread must not call
+ * read on a stream being written by another Java thread.)
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+self int in_critical_section;
+self string critical_section_name;
+
+int CRITICAL_SECTION_VIOLATION_CNT;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "critical section violation checks";
+
+    printf("BEGIN %s\n", SAMPLE_NAME);
+}
+
+/*
+ *   Multiple pairs of GetPrimitiveArrayCritical/ReleasePrimitiveArrayCritical,
+ *   GetStringCritical/ReleaseStringCritical may be nested
+ */
+hotspot_jni$target:::*_entry
+/self->in_critical_section > 0 &&
+  probename != "GetPrimitiveArrayCritical_entry" &&
+  probename != "GetStringCritical_entry" &&
+  probename != "ReleasePrimitiveArrayCritical_entry" &&
+  probename != "ReleaseStringCritical_entry" &&
+  probename != "GetPrimitiveArrayCritical_return" &&
+  probename != "GetStringCritical_return" &&
+  probename != "ReleasePrimitiveArrayCritical_return" &&
+  probename != "ReleaseStringCritical_return"/
+{
+    printf("\nJNI call %s made from JNI critical region '%s'\n",
+        probename, self->critical_section_name);
+
+    printf("Jstack:\n");
+    jstack(50, 500);
+
+    CRITICAL_SECTION_VIOLATION_CNT ++;
+}
+
+syscall:::entry
+/pid == $target && self->in_critical_section > 0/
+{
+    printf("\nSystem call %s made in JNI critical region '%s'\n",
+        probefunc, self->critical_section_name);
+
+    printf("Jstack:\n");
+    jstack(50, 500);
+
+    CRITICAL_SECTION_VIOLATION_CNT ++;
+}
+
+hotspot_jni$target:::ReleasePrimitiveArrayCritical_entry,
+hotspot_jni$target:::ReleaseStringCritical_entry
+/self->in_critical_section > 0/
+{
+    self->in_critical_section --;
+}
+
+hotspot_jni$target:::GetPrimitiveArrayCritical_return
+{
+    self->in_critical_section ++;
+    self->critical_section_name = "GetPrimitiveArrayCritical";
+}
+
+hotspot_jni$target:::GetStringCritical_return
+{
+    self->in_critical_section ++;
+    self->critical_section_name = "GetStringCritical";
+}
+
+
+:::END
+{
+    printf("%d critical section violations have been discovered\n",
+        CRITICAL_SECTION_VIOLATION_CNT);
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot_jni/CriticalSection_slow.d b/darwin-x86/sample/dtrace/hotspot_jni/CriticalSection_slow.d
new file mode 100644
index 0000000..a676aa3
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot_jni/CriticalSection_slow.d
@@ -0,0 +1,178 @@
+#!/usr/sbin/dtrace -Zs
+
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. CriticalSection_slow.d -c "java ..."
+ *    2. CriticalSection_slow.d -p JAVA_PID
+ *
+ * The script inspect a JNI application for Critical Section violations.
+ *
+ * Critical section is the space between calls to JNI methods:
+ *   - GetPrimitiveArrayCritical and ReleasePrimitiveArrayCritical; or
+ *   - GetStringCritical and ReleaseStringCritical.
+ *
+ * Inside a critical section, native code must not call other JNI functions,
+ * or any system call that may cause the current thread to block and wait
+ * for another Java thread. (For example, the current thread must not call
+ * read on a stream being written by another Java thread.)
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+self int in_critical_section;
+self string critical_section_name;
+
+self char *str_ptr;
+self string class_name;
+self string method_name;
+self string signature;
+
+self int indent;
+self int JAVA_STACK_DEEP;
+
+int CRITICAL_SECTION_VIOLATION_CNT;
+
+:::BEGIN
+{
+    SAMPLE_NAME = "critical section violation checks";
+
+    printf("BEGIN %s\n", SAMPLE_NAME);
+}
+
+hotspot$target:::*
+/!self->JAVA_STACK_DEEP/
+{
+    self->JAVA_STACK_DEEP = 0;
+}
+
+
+hotspot$target:::method-return
+/self->JAVA_STACK_DEEP > 0/
+{
+    self->JAVA_STACK_DEEP --;
+}
+
+hotspot$target:::method-entry
+{
+    self->JAVA_STACK_DEEP ++;
+
+    self->str_ptr = (char*) copyin(arg1, arg2+1);
+    self->str_ptr[arg2] = '\0';
+    self->method_name = strjoin( (string) self->str_ptr, ":");
+
+    self->str_ptr = (char*) copyin(arg3, arg4+1);
+    self->str_ptr[arg4] = '\0';
+    self->method_name = strjoin(self->method_name, (string) self->str_ptr);
+    self->method_name = strjoin(self->method_name, ":");
+
+    self->str_ptr = (char*) copyin(arg5, arg6+1);
+    self->str_ptr[arg6] = '\0';
+    self->method_name = strjoin(self->method_name, (string) self->str_ptr);
+
+    self->JAVA_STACK[self->JAVA_STACK_DEEP] = self->method_name;
+
+/*    printf("%-10u%*s%s\n",
+ *      curcpu->cpu_id, self->indent, "", self->method_name);
+ */
+}
+
+
+/*
+ *   Multiple pairs of GetPrimitiveArrayCritical/ReleasePrimitiveArrayCritical,
+ *   GetStringCritical/ReleaseStringCritical may be nested
+ */
+hotspot_jni$target:::*_entry
+/self->in_critical_section > 0 &&
+  probename != "GetPrimitiveArrayCritical_entry" &&
+  probename != "GetStringCritical_entry" &&
+  probename != "ReleasePrimitiveArrayCritical_entry" &&
+  probename != "ReleaseStringCritical_entry" &&
+  probename != "GetPrimitiveArrayCritical_return" &&
+  probename != "GetStringCritical_return" &&
+  probename != "ReleasePrimitiveArrayCritical_return" &&
+  probename != "ReleaseStringCritical_return"/
+{
+    printf("JNI call %s made from JNI critical region '%s' from %s\n",
+        probename, self->critical_section_name,
+        self->JAVA_STACK[self->JAVA_STACK_DEEP]);
+
+    CRITICAL_SECTION_VIOLATION_CNT ++;
+}
+
+syscall:::entry
+/pid == $target && self->in_critical_section > 0/
+{
+    printf("system call %s made in JNI critical region '%s' from %s\n",
+        probefunc, self->critical_section_name,
+        self->JAVA_STACK[self->JAVA_STACK_DEEP]);
+
+    CRITICAL_SECTION_VIOLATION_CNT ++;
+}
+
+hotspot_jni$target:::ReleasePrimitiveArrayCritical_entry,
+hotspot_jni$target:::ReleaseStringCritical_entry
+/self->in_critical_section > 0/
+{
+    self->in_critical_section --;
+}
+
+hotspot_jni$target:::GetPrimitiveArrayCritical_return
+{
+    self->in_critical_section ++;
+    self->critical_section_name = "GetPrimitiveArrayCritical";
+}
+
+hotspot_jni$target:::GetStringCritical_return
+{
+    self->in_critical_section ++;
+    self->critical_section_name = "GetStringCritical";
+}
+
+
+:::END
+{
+    printf("%d critical section violations have been discovered\n",
+        CRITICAL_SECTION_VIOLATION_CNT);
+
+    printf("\nEND of %s\n", SAMPLE_NAME);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot_jni/README.txt b/darwin-x86/sample/dtrace/hotspot_jni/README.txt
new file mode 100644
index 0000000..0c15a94
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot_jni/README.txt
@@ -0,0 +1,64 @@
+================================
+'hotspot_jni' PROBES DESCRIPTION
+================================
+
+This directory contains D scripts which demonstrate usage of 'hotspot_jni'
+provider probes. 
+
+In order to call from native code to Java code, due to embedding of the VM
+in an application or execution of native code within a Java application, the
+native code must make a call through the JNI interface. The JNI interface
+provides a number of methods for invoking Java code and examining the state
+of the VM. DTrace probes are provided at the entry point and return point
+for each of these methods. The probes are provided by the hotspot_jni
+provider. The name of the probe is the name of the JNI method, appended with
+"-entry" for entry probes, and "-return" for return probes. The arguments
+available at each entry probe are the arguments that were provided to the
+function (with the exception of the Invoke* methods, which omit the
+arguments that are passed to the Java method). The return probes have the
+return value of the method as an argument (if available).
+
+You can find more information about HotSpot probes here:
+http://java.sun.com/javase/6/docs/technotes/guides/vm/dtrace.html
+
+===========
+THE SCRIPTS
+===========
+
+The following scripts/samples which demonstrate hotspot_jni probes usage are
+available:
+
+- CriticalSection.d
+  Inspect a JNI application for Critical Section violations.
+
+- CriticalSection_slow.d
+  Do the same as CriticalSection.d but provide more debugging info.
+
+- hotspot_jni_calls_stat.d
+  This script collects statistics about how many times particular JNI method
+  has been called.
+
+- hotspot_jni_calls_tree.d
+  The script prints tree of JNI method calls.
+
+See more details in the scripts.
+
+
+==========
+HOW TO RUN
+==========
+To run any dscript from hotspot directory you can do either:
+
+ # dscript.d -c "java ..."
+
+ or if you don't have Solaris 10 patch which allows to specify probes that
+ don't yet exist ( Hotspot DTrace probes are defined in libjvm.so and as
+ result they could be not been yet loaded when you try to attach dscript to
+ the Java process) do:
+
+ # ../helpers/dtrace_helper.d -c "java ..." dscript.d
+
+ or if your application is already running you can just simply attach
+ the D script like:
+
+ # dscript.d -p JAVA_PID
diff --git a/darwin-x86/sample/dtrace/hotspot_jni/hotspot_jni_calls_stat.d b/darwin-x86/sample/dtrace/hotspot_jni/hotspot_jni_calls_stat.d
new file mode 100644
index 0000000..8db9e16
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot_jni/hotspot_jni_calls_stat.d
@@ -0,0 +1,81 @@
+#!/usr/sbin/dtrace -Zs
+
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *    1. hotspot_jni_calls_stat.d -c "java ..."
+ *    2. hotspot_jni_calls_stat.d -p JAVA_PID
+ *
+ * This script collects statistics about how many times particular JNI
+ * method has been called.
+ *
+ */
+
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+:::BEGIN
+{
+    printf("BEGIN hotspot_jni tracing\n");
+}
+
+
+hotspot_jni$target:::*-entry
+{
+    JNI_CALLS ++;
+    @jni_calls[probename] = count();
+}
+
+:::END
+{
+    printa("%10@d %s\n", @jni_calls);
+    printf("\n");
+    printf("Total number of JNI calls: %d\n", JNI_CALLS);
+
+    printf("\nEND hotspot_jni tracing.\n");
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/dtrace/hotspot_jni/hotspot_jni_calls_tree.d b/darwin-x86/sample/dtrace/hotspot_jni/hotspot_jni_calls_tree.d
new file mode 100644
index 0000000..7aeb208
--- /dev/null
+++ b/darwin-x86/sample/dtrace/hotspot_jni/hotspot_jni_calls_tree.d
@@ -0,0 +1,91 @@
+#!/usr/sbin/dtrace -Zs
+
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+*/
+
+/*
+ * Usage:
+ *   1. hotspot_jni_calls_tree.d -c "java ..."
+ *   2. hotspot_jni_calls_tree.d -p JAVA_PID
+ *
+ * The script prints tree of JNI method calls.
+ *
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option defaultargs
+#pragma D option bufsize=16m
+#pragma D option aggrate=100ms
+
+
+self int indent;
+
+:::BEGIN
+{
+    printf("BEGIN hotspot_jni tracing\n");
+}
+
+
+hotspot_jni$target:::*
+/!self->indent/
+{
+    self->indent = 11;
+}
+
+hotspot_jni$target:::*-entry
+{
+    self->indent++;
+    printf("%d %*s -> %s\n", curcpu->cpu_id, self->indent, "", probename);
+}
+
+
+hotspot_jni$target:::*-return
+{
+    printf("%d %*s <- %s\n", curcpu->cpu_id, self->indent, "", probename);
+    self->indent--;
+}
+
+:::END
+{
+   printf("\nEND hotspot_jni tracing.\n");
+
+}
+
+syscall::rexit:entry,
+syscall::exit:entry
+/pid == $target/
+{
+   exit(0);
+}
diff --git a/darwin-x86/sample/forkjoin/mergesort/MergeDemo.java b/darwin-x86/sample/forkjoin/mergesort/MergeDemo.java
new file mode 100644
index 0000000..528f383
--- /dev/null
+++ b/darwin-x86/sample/forkjoin/mergesort/MergeDemo.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.util.Arrays;
+import java.util.Random;
+
+import static java.lang.Integer.parseInt;
+
+/**
+ * MergeExample is a class that runs a demo benchmark of the {@code ForkJoin} framework
+ * by benchmarking a {@link MergeSort} algorithm that is implemented using
+ * {@link java.util.concurrent.RecursiveAction}.
+ * The {@code ForkJoin} framework is setup with different parallelism levels
+ * and the sort is executed with arrays of different sizes to see the
+ * trade offs by using multiple threads for different sizes of the array.
+ */
+public class MergeDemo {
+    // Use a fixed seed to always get the same random values back
+    private final Random random = new Random(759123751834L);
+    private static final int ITERATIONS = 10;
+
+    /**
+     * Represents the formula {@code f(n) = start + (step * n)} for n = 0 & n < iterations
+     */
+    private static class Range {
+        private final int start;
+        private final int step;
+        private final int iterations;
+
+        private Range(int start, int step, int iterations) {
+            this.start = start;
+            this.step = step;
+            this.iterations = iterations;
+        }
+
+        /**
+         * Parses start, step and iterations from args
+         * @param args the string array containing the arguments
+         * @param start which element to start the start argument from
+         * @return the constructed range
+         */
+        public static Range parse(String[] args, int start) {
+            if (args.length < start + 3) {
+                throw new IllegalArgumentException("Too few elements in array");
+            }
+            return new Range(parseInt(args[start]), parseInt(args[start + 1]), parseInt(args[start + 2]));
+        }
+
+        public int get(int iteration) {
+            return start + (step * iteration);
+        }
+
+        public int getIterations() {
+            return iterations;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            builder.append(start).append(" ").append(step).append(" ").append(iterations);
+            return builder.toString();
+        }
+    }
+
+    /**
+     * Wraps the different parameters that is used when running the MergeExample.
+     * {@code sizes} represents the different array sizes
+     * {@code parallelism} represents the different parallelism levels
+     */
+    private static class Configuration {
+        private final Range sizes;
+        private final Range parallelism;
+
+        private final static Configuration defaultConfig = new Configuration(new Range(20000, 20000, 10),
+                new Range(2, 2, 10));
+
+        private Configuration(Range sizes, Range parallelism) {
+            this.sizes = sizes;
+            this.parallelism = parallelism;
+        }
+
+        /**
+         * Parses the arguments and attempts to create a configuration containing the
+         * parameters for creating the array sizes and parallelism sizes
+         * @param args the input arguments
+         * @return the configuration
+         */
+        public static Configuration parse(String[] args) {
+            if (args.length == 0) {
+                return defaultConfig;
+            } else {
+                try {
+                    if (args.length == 6) {
+                        return new Configuration(Range.parse(args, 0), Range.parse(args, 3));
+                    }
+                } catch (NumberFormatException e) {
+                    System.err.println("MergeExample: error: Argument was not a number.");
+                }
+                System.err.println("MergeExample <size start> <size step> <size steps> <parallel start> <parallel step>" +
+                        " <parallel steps>");
+                System.err.println("example: MergeExample 20000 10000 3 1 1 4");
+                System.err.println("example: will run with arrays of sizes 20000, 30000, 40000" +
+                        " and parallelism: 1, 2, 3, 4");
+                return null;
+            }
+        }
+
+        /**
+         * Creates an array for reporting the test result time in
+         * @return an array containing {@code sizes.iterations * parallelism.iterations} elements
+         */
+        private long[][] createTimesArray() {
+            return new long[sizes.getIterations()][parallelism.getIterations()];
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder("");
+            if (this == defaultConfig) {
+                builder.append("Default configuration. ");
+            }
+            builder.append("Running with parameters: ");
+            builder.append(sizes);
+            builder.append(" ");
+            builder.append(parallelism);
+            return builder.toString();
+        }
+    }
+
+    /**
+     * Generates an array of {@code elements} random elements
+     * @param elements the number of elements requested in the array
+     * @return an array of {@code elements} random elements
+     */
+    private int[] generateArray(int elements) {
+        int[] array = new int[elements];
+        for (int i = 0; i < elements; ++i) {
+            array[i] = random.nextInt();
+        }
+        return array;
+    }
+
+    /**
+     * Runs the test
+     * @param config contains the settings for the test
+     */
+    private void run(Configuration config) {
+        Range sizes = config.sizes;
+        Range parallelism = config.parallelism;
+
+        // Run a couple of sorts to make the JIT compile / optimize the code
+        // which should produce somewhat more fair times
+        warmup();
+
+        long[][] times = config.createTimesArray();
+
+        for (int size = 0; size < sizes.getIterations(); size++) {
+            runForSize(parallelism, sizes.get(size), times, size);
+        }
+
+        printResults(sizes, parallelism, times);
+    }
+
+    /**
+     * Prints the results as a table
+     * @param sizes the different sizes of the arrays
+     * @param parallelism the different parallelism levels used
+     * @param times the median times for the different sizes / parallelism
+     */
+    private void printResults(Range sizes, Range parallelism, long[][] times) {
+        System.out.println("Time in milliseconds. Y-axis: number of elements. X-axis parallelism used.");
+        long[] sums = new long[times[0].length];
+        System.out.format("%8s  ", "");
+        for (int i = 0; i < times[0].length; i++) {
+            System.out.format("%4d ", parallelism.get(i));
+        }
+        System.out.println("");
+        for (int size = 0; size < sizes.getIterations(); size++) {
+            System.out.format("%8d: ", sizes.get(size));
+            for (int i = 0; i < times[size].length; i++) {
+                sums[i] += times[size][i];
+                System.out.format("%4d ", times[size][i]);
+            }
+            System.out.println("");
+        }
+        System.out.format("%8s: ", "Total");
+        for (long sum : sums) {
+            System.out.format("%4d ", sum);
+        }
+        System.out.println("");
+    }
+
+    private void runForSize(Range parallelism, int elements, long[][] times, int size) {
+        for (int step = 0; step < parallelism.getIterations(); step++) {
+            long time = runForParallelism(ITERATIONS, elements, parallelism.get(step));
+            times[size][step] = time;
+        }
+    }
+
+    /**
+     * Runs <i>iterations</i> number of test sorts of a random array of <i>element</i> length
+     * @param iterations number of iterations
+     * @param elements number of elements in the random array
+     * @param parallelism parallelism for the ForkJoin framework
+     * @return the median time of runs
+     */
+    private long runForParallelism(int iterations, int elements, int parallelism) {
+        MergeSort mergeSort = new MergeSort(parallelism);
+        long[] times = new long[iterations];
+
+        for (int i = 0; i < iterations; i++) {
+            // Suggest the VM to run a garbage collection to reduce the risk of getting one
+            // while running the test run
+            System.gc();
+            long start = System.currentTimeMillis();
+            mergeSort.sort(generateArray(elements));
+            times[i] = System.currentTimeMillis() - start;
+        }
+
+        return medianValue(times);
+    }
+
+    /**
+     * Calculates the median value of the array
+     * @param times array of times
+     * @return the median value
+     */
+    private long medianValue(long[] times) {
+        if (times.length == 0) {
+            throw new IllegalArgumentException("Empty array");
+        }
+        // Make a copy of times to avoid having side effects on the parameter value
+        Arrays.sort(times.clone());
+        long median = times[times.length / 2];
+        if (times.length > 1 && times.length % 2 != 0) {
+            median = (median + times[times.length / 2 + 1]) / 2;
+        }
+        return median;
+    }
+
+    /**
+     * Generates 1000 arrays of 1000 elements and sorts them as a warmup
+     */
+    private void warmup() {
+        MergeSort mergeSort = new MergeSort(Runtime.getRuntime().availableProcessors());
+        for (int i = 0; i < 1000; i++) {
+            mergeSort.sort(generateArray(1000));
+        }
+    }
+
+    public static void main(String[] args) {
+        Configuration configuration = Configuration.parse(args);
+        if (configuration == null) {
+            System.exit(1);
+        }
+        System.out.println(configuration);
+        new MergeDemo().run(configuration);
+    }
+}
diff --git a/darwin-x86/sample/forkjoin/mergesort/MergeSort.java b/darwin-x86/sample/forkjoin/mergesort/MergeSort.java
new file mode 100644
index 0000000..0ae48dc
--- /dev/null
+++ b/darwin-x86/sample/forkjoin/mergesort/MergeSort.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.util.Arrays;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.ForkJoinTask;
+import java.util.concurrent.RecursiveAction;
+
+/**
+ * A class for sorting an array of {@code ints} in parallel.
+ * A {@code ForkJoinPool} is used for the parallelism, using the merge sort
+ * algorithm the array is split into halves and a new sub task is created
+ * for each part. Each sub task is dispatched to the {@code ForkJoinPool}
+ * which will schedule the task to a {@code Thread}.
+ * This happens until the size of the array is at most 2
+ * elements long. At this point the array is sorted using a simple compare
+ * and possibly a swap. The tasks then finish by using insert sort to
+ * merge the two just sorted arrays.
+ *
+ * The idea of this class is to demonstrate the usage of RecursiveAction not
+ * to implement the best possible parallel merge sort. This version creates
+ * a small array for each merge (creating a lot of objects), this could
+ * be avoided by keeping a single array.
+ */
+public class MergeSort {
+    private final ForkJoinPool pool;
+
+    private static class MergeSortTask extends RecursiveAction {
+        private final int[] array;
+        private final int low;
+        private final int high;
+        private static final int THRESHOLD = 8;
+
+        /**
+         * Creates a {@code MergeSortTask} containing the array and the bounds of the array
+         *
+         * @param array the array to sort
+         * @param low the lower element to start sorting at
+         * @param high the non-inclusive high element to sort to
+         */
+        protected MergeSortTask(int[] array, int low, int high) {
+            this.array = array;
+            this.low = low;
+            this.high = high;
+        }
+
+        @Override
+        protected void compute() {
+            if (high - low <= THRESHOLD) {
+                Arrays.sort(array, low, high);
+            } else {
+                int middle = low + ((high - low) >> 1);
+                // Execute the sub tasks and wait for them to finish
+                invokeAll(new MergeSortTask(array, low, middle), new MergeSortTask(array, middle, high));
+                // Then merge the results
+                merge(middle);
+            }
+        }
+
+        /**
+         * Merges the two sorted arrays this.low, middle - 1 and middle, this.high - 1
+         * @param middle the index in the array where the second sorted list begins
+         */
+        private void merge(int middle) {
+            if (array[middle - 1] < array[middle]) {
+                return; // the arrays are already correctly sorted, so we can skip the merge
+            }
+            int[] copy = new int[high - low];
+            System.arraycopy(array, low, copy, 0, copy.length);
+            int copyLow = 0;
+            int copyHigh = high - low;
+            int copyMiddle = middle - low;
+
+            for (int i = low, p = copyLow, q = copyMiddle; i < high; i++) {
+                if (q >= copyHigh || (p < copyMiddle && copy[p] < copy[q]) ) {
+                    array[i] = copy[p++];
+                } else {
+                    array[i] = copy[q++];
+                }
+            }
+        }
+    }
+
+    /**
+     * Creates a {@code MergeSort} containing a ForkJoinPool with the indicated parallelism level
+     * @param parallelism the parallelism level used
+     */
+    public MergeSort(int parallelism) {
+        pool = new ForkJoinPool(parallelism);
+    }
+
+    /**
+     * Sorts all the elements of the given array using the ForkJoin framework
+     * @param array the array to sort
+     */
+    public void sort(int[] array) {
+        ForkJoinTask<Void> job = pool.submit(new MergeSortTask(array, 0, array.length));
+        job.join();
+    }
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/build.properties b/darwin-x86/sample/jmx/jmx-scandir/build.properties
new file mode 100644
index 0000000..cad4a6a
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/build.properties
@@ -0,0 +1,58 @@
+# IMPORTANT NOTE
+#
+# If you made a private copy of this project you may have to update the
+# nbjdk.home variable at the end of this file.
+#  
+# To be able to run the test-suite, you will also have to set the
+# variable:
+#
+# libs.junit.classpath=<junit.jar> 
+#
+
+main.dir=.
+
+src.dir=${main.dir}/src
+test.src.dir=${main.dir}/test
+
+build.dir=build
+classes.dir=${build.dir}/classes
+
+dist.dir=dist
+jar=${dist.dir}/jmx-scandir.jar
+javadoc.dir=${dist.dir}/javadoc
+
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+
+build.sysclasspath=ignore
+# E.g.: cp=lib/x.jar:lib/y.jar
+cp=
+extra.run.cp=
+
+# To be able to run the test-suite, set the following property:
+# libs.junit.classpath=...
+
+javac.test.classpath=\
+    ${classes.dir}:\
+    ${libs.junit.classpath}
+
+main.agent.class=com.sun.jmx.examples.scandir.ScanDirAgent
+main.client.class=com.sun.jmx.examples.scandir.ScanDirClient
+main.class=${main.client.class}
+
+run.jvmargs=-Djava.util.logging.config.file=logging.properties
+common.jvmargs=${run.jvmargs} -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=truststore -Djavax.net.ssl.trustStorePassword=trustword
+client.jvmargs=${common.jvmargs}
+agent.jvmargs=${common.jvmargs} -Dcom.sun.management.config.file=src/etc/management.properties -Dscandir.config.file=src/etc/testconfig.xml
+
+client.args=localhost 4545
+
+run.cp=${cp}:${classes.dir}:${extra.run.cp}
+run.test.classpath=${run.cp}:${build.test.classes.dir}
+
+debug=true
+deprecation=false
+
+# Update this variable if need be to point to the JDK 6 location.
+# 
+nbjdk.home=${basedir}/../../..
diff --git a/darwin-x86/sample/jmx/jmx-scandir/build.xml b/darwin-x86/sample/jmx/jmx-scandir/build.xml
new file mode 100644
index 0000000..e54fcec
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/build.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+
+<!-- 
+  This is ant (http://ant.apache.org) build script to build the
+  "jmx-scandir" sample. Either this build.xml can be used standalone 
+  with "ant" tool or can be opened as a project with NetBeans IDE
+  (http://www.netbeans.org).
+-->
+
+<project name="jmx-scandir" default="jar" basedir=".">
+
+    <import file="nbproject/jdk.xml"/>
+    
+
+    <target name="-prop-init">
+        <property file="user.build.properties"/>
+        <property file="build.properties"/>
+    </target>
+
+    <target name="-init" depends="-prop-init,-jdk-init"/>
+
+    <target name="compile" depends="-init" description="Compile main sources.">
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+        </javac>
+        <copy todir="${classes.dir}">
+            <fileset dir="${src.dir}"/>
+        </copy>
+    </target>
+
+    <target name="jar" depends="compile" description="Build JAR file for main sources.">
+        <mkdir dir="${dist.dir}" />
+        <jar jarfile="${jar}" compress="true">
+            <manifest>
+                <attribute name="Main-Class" value="${main.agent.class}"/>
+            </manifest>
+            <fileset dir="${classes.dir}"/>
+        </jar>
+    </target>
+
+    <target name="run-client" depends="compile" description="Run client.">
+        <fail unless="main.client.class">Must set property 'main.client.class' (e.g. in build.properties)</fail>
+        <java classname="${main.client.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg line="${client.jvmargs}" />
+            <arg line="${client.args}" />
+        </java>
+    </target>
+
+    <target name="run-agent" depends="compile" description="Run agent.">
+        <fail unless="main.agent.class">Must set property 'main.agent.class' (e.g. in build.properties)</fail>
+        <java classname="${main.agent.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg line="${agent.jvmargs}" />
+        </java>
+    </target>
+
+    <target name="run" depends="run-agent" description="Run agent." />
+
+    <target name="run-single" depends="-init,compile">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <java classname="${run.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+        </java>
+    </target>
+
+    <target name="javadoc" depends="-init" description="Build Javadoc.">
+        <mkdir dir="${javadoc.dir}"/>
+        <javadoc destdir="${javadoc.dir}">
+            <classpath path="${cp}"/>
+            <sourcepath>
+                <pathelement location="${src.dir}"/>
+            </sourcepath>
+            <fileset dir="${src.dir}"/>
+        </javadoc>
+    </target>
+
+    <target name="clean" depends="-init" description="Clean build products.">
+        <delete dir="${build.dir}"/>
+        <delete file="${jar}"/>
+        <delete dir="${dist.dir}"/>
+    </target>
+
+    <target name="profile">
+        <ant antfile="nbproject/netbeans-targets.xml" target="profile"/>
+    </target>
+
+    <!-- JUnit targets -->
+
+    <target name="compile-test" depends="-init,compile">
+        <fail unless="libs.junit.classpath">Must set libs.junit.classpath variable to the JUnit classpath in the build.properties file.</fail>
+        <mkdir dir="${build.test.classes.dir}"/>
+        <javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="${debug}" classpath="${javac.test.classpath}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="**/*.java"/>
+        </copy>
+    </target>
+
+    <target name="-do-test-run" depends="-init,compile-test">
+        <mkdir dir="${build.test.results.dir}"/>
+        <junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
+            <batchtest todir="${build.test.results.dir}">
+                <fileset dir="${test.src.dir}" includes="**/*Test.java"/>
+            </batchtest>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper type="glob" from="test-sys-prop.*" to="*"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+            <jvmarg line="${run.jvmargs}"/>
+        </junit>
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+    
+    <target name="test" depends="-init,compile-test,-do-test-run" description="Run unit tests."/>
+
+    <target name="-do-test-run-single" depends="-init,compile-test">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
+            <batchtest todir="${build.test.results.dir}">
+                <fileset dir="${test.src.dir}" includes="${test.includes}"/>
+            </batchtest>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper type="glob" from="test-sys-prop.*" to="*"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+            <jvmarg line="${run.jvmargs}"/>
+        </junit>
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+
+    <target name="test-single" depends="-init,compile-test,-do-test-run-single" description="Run single unit test."/>
+</project>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local-ant-run.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local-ant-run.jpg
new file mode 100644
index 0000000..6a58f0e
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local-ant-run.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local-java-jar.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local-java-jar.jpg
new file mode 100644
index 0000000..86add09
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local-java-jar.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local.jpg
new file mode 100644
index 0000000..0259e96
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/connect-local.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/remote-connection-failed.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/remote-connection-failed.jpg
new file mode 100644
index 0000000..001b0fa
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/remote-connection-failed.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/remote-connection.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/remote-connection.jpg
new file mode 100644
index 0000000..90d07a0
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/remote-connection.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-config.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-config.jpg
new file mode 100644
index 0000000..9e0a10c
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-config.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-result.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-result.jpg
new file mode 100644
index 0000000..75e7baf
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-result.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-start.jpg b/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-start.jpg
new file mode 100644
index 0000000..5bceae5
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/docfiles/scandir-start.jpg
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/index.html b/darwin-x86/sample/jmx/jmx-scandir/index.html
new file mode 100644
index 0000000..4fd2ae6
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/index.html
@@ -0,0 +1,2217 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+<!--
+ Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+    <title>JMX(TM) "scandir" Example</title>
+  </head>
+  <body>
+  
+  <h1><center>Java<font size="-1"><sup>TM</sup></font> Management Extensions (JMX<font size="-1"><sup>TM</sup></font>) <i>scandir</i> Example</center></h1>
+  
+  <h2><a name="h2-Introduction">Introduction</a></h2>
+  <ul>
+  <p>The JMX <i>scandir</i> example is an application that
+     scans parts of a filesystem - e.g. a set of directories
+     used by a number of lab machines when running tests - in
+     order to clean up and optimize disk space by removing
+     obsolete files - e.g. files that are leaked by the test
+     suites running on those machines, like coredump files, or
+     temporary files that might remain after a test crash.
+     It could also serve as a basis for an application that
+     would monitor disk usage and suggest removal of old big
+     long-unaccessed files.
+  </p>
+  <p>The JMX <i>scandir</i> example does not however implement
+     the full fledged logic that such an application might
+     have. It implements a subset of this logic which is
+     sufficient to demonstrate common patterns and
+     solutions used when implementing a monitoring and
+     management interface for an application with JMX
+     Technology.</p>
+  <p>This example is an advanced JMX example, which presents 
+     advanced JMX concepts. It is assumed that the reader is already
+     familiar with the JMX API. Newcomers to JMX Technology are
+     invited to have a look at the <a
+     href="http://java.sun.com/javase/6/docs/technotes/guides/jmx/"
+     >JMX API Overview, Tutorial and Examples</a> before going any further.
+  </p>
+  <p></p>
+      <hr>
+  <blockquote>
+    <u>Note:</u> This example was developed using <a 
+     href="http://www.netbeans.org">NetBeans 5.0 IDE</a>. The instructions
+     given in this document to build, run, and test the example assume that
+     you have at your disposal:
+     <ul><li>either <a href="http://www.netbeans.org">NetBeans 5.0 IDE</a>,</li>
+         <li>or <a href="http://ant.apache.org/">Apache Ant 1.6.5</a> and 
+             <a href="http://sourceforge.net/projects/junit/">JUnit 3.8.1 or
+             3.8.2</a><br>
+             (JUnit is only needed to run the example's unit tests).
+         </li>
+     </ul>
+     <p><a name="setup">In order to build the example</a>, 
+     <u>you may need to copy the jmx-scandir</u>
+     directory to somewhere where you have write permissions. 
+     <br>In that case, you will need to update the <i>nbjdk.home</i> variable
+     in the copied <i><a href="build.properties">build.properties</a></i> 
+     file located at the root of the copied project directory. 
+     Please make sure that this variable points to the JDK 6 home directory.
+     </p>
+     <p>If you wish to run the testsuite from within the <a 
+     href="http://www.netbeans.org">NetBeans IDE</a> you will also have
+     to set the <i>libs.junit.classpath</i> variable in 
+     <a href="build.properties">build.properties</a>. 
+     The <i>libs.junit.classpath</i>  variable should point to your
+     <a href="http://sourceforge.net/projects/junit/">junit.jar</a>, 
+     version 3.8.1 or 3.8.2.
+     </p>
+  </blockquote>
+     <hr>
+     <p></p>
+     <p><u>Table Of Contents:</u></p>
+  <p><center>[<a href="#h2-Generating">Generating&nbsp;the&nbsp;Java&nbsp;Documentation</a>]
+  [<a href="#h2-Overview">Overview&nbsp;of&nbsp;the&nbsp;<i>scandir</i>&nbsp;Example</a>]
+  [<a href="#h2-API-Doc">API&nbsp;Documentation&nbsp;and&nbsp;Sources</a>]
+  [<a href="#h2-Patterns">Patterns,&nbsp;Best&nbsp;Practices,&nbsp;and&nbsp;Common&nbsp;Pitfalls</a>]
+  [<a href="#h2-Testing">Testing&nbsp;the&nbsp;<i>scandir</i>&nbsp;Example</a>]
+  [<a href="#h2-Running">Running&nbsp;the&nbsp;<i>scandir</i>&nbsp;Example</a>]
+  [<a href="#h2-Playing">Playing&nbsp;with&nbsp;JConsole</a>]
+  [<a href="#h2-Turning">Turning&nbsp;the&nbsp;example&nbsp;into&nbsp;a&nbsp;Secure&nbsp;JMX&nbsp;Application</a>]
+  [<a href="#h2-Connecting">Connecting&nbsp;to&nbsp;the&nbsp;Secure&nbsp;JMX&nbsp;Application</a>]
+  [<a href="#h2-Conclusion">Conclusion</a>]
+  [<a href="#h2-References">References</a>]</center></p>
+
+  </ul>
+  <h2><a name="h2-Generating">Generating the Java Documentation</a></h2>
+
+    <ul>
+        <p>Before reading further, you will need to generate the 
+        Java Documentation for the example's sources.</p>
+        <p>In the example root directory (where the <code>build.xml</code> 
+           file is located) run the following command:
+           <pre>ant javadoc</pre>
+        </p>
+        <p>Alternatively you can open the jmx-scandir project with the 
+           NetBeans IDE and generate the Javadoc from its <code>Build</code>
+           menu.
+        </p>
+        <p>If building the documentation fails, please make sure to read the 
+           <a href="#setup">note</a> at the beginning of this document.</p> 
+    </ul>
+  
+  <h2><a name="h2-Overview">Overview of the <i>scandir</i> Example</a></h2>
+  
+  <ul>
+    <p>The JMX <i>scandir</i> example is built around the
+    following MBeans:</p>
+    <ul>
+        <li>The first MBean we will present here is the
+        <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBean</a>. <br>A
+        <code>DirectoryScannerMXBean</code> is an MBean that scans a
+        file system starting at a given root directory, and then looks
+        for files that match the given criteria.  When such a file is
+        found, the <code>DirectoryScannerMXBean</code> takes the
+        action for which it was configured: emit a notification,
+        <i>and/or</i> log a <code>record</code> for this file,
+        <i>and/or</i> delete that file. The code that would actually
+        delete the file is commented out - so that nothing valuable is
+        lost if the example is run by mistake on the wrong set of
+        directories.<br> <code>DirectoryScannerMXBeans</code> are
+        created by the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a> - see next item on the list, from its
+        configuration.
+        </li>
+        <li>
+            The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+            >ScanManagerMXBean</a> is the actual entry point of the
+            application. It reads the application's
+            configuration, and from that configuration,
+            will create a <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManager.html"
+title="The ResultLogManager is in charge of managing result logs"
+        >ResultLogManager</a> and some <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a>.
+            <br>The <code>ScanManagerMXBean</code> lets you start, stop, and
+            schedule directory scans. The
+            <code>ScanManagerMXBean</code> is a singleton
+            MBean: there can be at most one instance of such
+            an MBean registered in a given MBeanServer.
+        </li>
+        <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> is an MBean which is able to
+           load/save the configuration to/from an XML file. It
+           will also let you modify that configuration - by e.g.
+           creating new directory scanners in there.
+           The corresponding MBeans will be created later, only 
+           when you later
+           ask the <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> </code> to apply the
+           configuration again.<br>
+           The <code>ScanDirConfigMXBean</code> is created by the
+           <code>ScanManagerMXBean</code>, when the
+           <code>ScanManagerMXBean</code> is registered.
+           It is also possible to create an alternate
+           <code>ScanDirConfigMXBean</code>, and to switch the
+           <code>ScanDirConfigMXBean</code> to use one or the other
+           configuration.
+           <br>An example of XML configuration file is given
+           <a href="src/etc/testconfig.xml"
+           title="An Example Of Configuration"
+           >here</a>. Although you could edit such a file by
+           hand, it is easier to do it programmatically (or
+           with <a href="#JConsole">JConsole</a>) through
+           the <code>ScanDirConfigMXBean</code> interface.
+        </li>
+        <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a> is in charge of managing result logs.
+        <br>Directory Scanners can be configured to log a
+        <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/config/ResultRecord.html"
+title="A ResultRecord contains information about a file matching the criteria of a Directory Scanner"
+        >ResultRecord</a> whenever they take action upon a file that
+        matches their criteria. The <code>ResultLogManagerMXBean</code> is
+        responsible for logging these result records.
+        The <code>ResultLogManagerMXBean</code> can be configured to log
+        such records to a flat file, or into a log held in memory, or
+        both. Both logs (file and memory) can be configured with a
+        maximum capacity. 
+        <br>When the maximum capacity of the memory
+        log is reached, its first entry (i.e. its oldest entry) is
+        removed to make place for the latest one.
+        <br>When the maximum
+        capacity of the file log is reached, the file is
+        renamed by appending a tilde '~' to its name and a
+        new result log is created. 
+        <br>The <code>ResultLogManagerMXBean</code>
+        will let you interactively clear these result logs, change their
+        capacity, and decide where (memory or file) to log.
+        The memory log is useful in that its content can be interactively
+        returned by the <code>ResultLogManagerMXBean</code>, while
+        the file log doesn't have this facility.<br>
+        The result logs are intended to be used by e.g. an offline
+        program that would take some actions on the files that
+        matched the scan criteria:
+        <br>The <i>scandir</i> application
+        could be configured to only produce logs (i.e. takes no
+        action but logging the matching files), and the real
+        action could be performed by another program or module (e.g. mail the result log to the engineer who
+        maintains the lab, or parse that log and delete all the
+        files listed there, or parse the log and prepare and send
+        a single mail to each owner of matching files, containing
+        the list of files they should consider deleting).<br>
+        The <code>ResultLogManagerMXBean</code> is a singleton
+        MBean created by the <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> </code>
+        which reads and writes its configuration from the
+        <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code>.
+        </li>
+    </ul>
+    <p>An application <code>main()</code> method is
+       provided in the <a 
+       href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirAgent.html"
+       >ScanDirAgent</a> class. The <code>main()</code> simply registers 
+       a <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> </code> in the platform MBeanServer, and
+       then waits for someone to call <code>close()</code> on the
+       <code>ScanManagerMXBean</code>.
+    </p>
+     <p>When the <code>ScanManagerMXBean</code> is registered, it
+        will create a default <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code> bound
+        to a default XML config file.
+     </p>
+     <p>The application's default XML config file is determined as
+        follows:
+        <ol>
+            <li>If the property <code>scandir.config.file</code> is
+                defined, the default application file will be the
+                file pointed to by this property. If that file
+                doesn't exist, it will be created when 
+                <code>ScanDirConfigMXBean.save()</code> is
+                invoked.
+            </li>
+            <li>Otherwise the application config file is
+                assumed to be a file called <code>jmx-scandir.xml</code>,
+                located in the user's directory (as defined by
+                the System property <code>user.home</code>). 
+                If that file doesn't exists, it will be created when 
+                <code>ScanDirConfigMXBean.save()</code> is
+                invoked.
+            </li>
+        </ol>
+        <p>It is worth noting that this project is defined to
+           run with the following properties:
+           <pre>-Djava.util.logging.config.file=logging.properties</pre>
+           <pre>-Dscandir.config.file=src/etc/testconfig.xml</pre>
+           With <code>ScanDirAgent</code> defined as the project's
+           main class. Hence when you invoke from the NetBeans IDE 
+           <i>Run Project</i> on the <i>jmx-scandir</i> project, 
+           or <i>Run file</i> on the <code>ScanDirAgent</code>, the
+           application starts with the test configuration provided in
+           <a href="src/etc/testconfig.xml"
+           title="An Example Of Configuration"
+           >src/etc/testconfig.xml</a>
+        </p>
+  </ul>
+  <h2><a name="h2-API-Doc">API Documentation and Sources</a></h2>
+  <ul>
+      <p>Once generated, the Javadoc of example classes can
+      be found starting from <a href="dist/javadoc/index.html"
+      title="The API Documentation"
+      ><code>dist/javadoc/index.html</code></a>.</p>
+      <p>You can view the sources in the <a
+      href="src"
+      title="The Example Source Tree"
+      ><code>src</code></a> subdirectory.</p>
+  </ul>
+  <h2><a name="h2-Patterns">Patterns, Best Practices, and Common Pitfalls</a></h2>
+  <ul>  
+  <p>This section discusses some common patterns and
+     design choices that this example demonstrates, and some pitfalls that
+     it avoids.
+  </ul>
+  <h3>MBeans or MXBeans?</h3>
+  <ul>
+  <p>What is an MXBean? MXBeans made their appearance in
+     J2SE 5.0 (Tiger), with the Management and Monitoring
+     API of the JVM. However, Java SE 6 is the first
+     Java SE release that contains a standard framework which
+     makes it possible to create and register your own MXBeans.
+  </p>
+  <p>MXBeans are a special kind of MBean, which once registered
+     in the MBeanServer, get automatically transformed into
+     OpenMBeans. From a developer point of view, nothing changes:
+     A Wombat MBean can become an MXBean simply by renaming
+     its <code>WombatMBean</code> interface into <code>WombatMXBean</code>.</p>
+  <p>Using MXBeans rather than plain Standard MBean brings its
+     own advantages:</p>
+     <ul>
+         <li>
+             Generic tools, like JConsole, will be able to
+             display and interact with your MXBeans nicely, even
+             if your MXBean interfaces reference custom types
+             - e.g. custom Java enums. This is because all the types
+             exposed by your MXBeans are converted to Open Types.
+             Just look at the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+             >ScanDirConfigMXBean</a> with JConsole and you will
+             understand the benefits.
+         </li>
+         <li>
+             When writing a programmatic client, you can obtain
+             a proxy that implements the original MXBean interface,
+             and forget about the Open Type conversion.
+             The JUnit unit tests that come with this example
+             use this feature very widely. Have a look at them.
+         </li>
+         <li>
+            The MXBean framework also lets you nicely navigate
+            from one MXBean to another: your MXBeans can
+            have attributes and parameters which are proxies
+            to other MXBeans! We demonstrate this in the
+            <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+            >ScanManagerMXBean</a> which exposes a list
+            of <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBean</a></code> and points
+            towards a <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code>.
+         </li>
+     </ul>
+     <p>In short, MXBeans are so much easier to use that
+        this example doesn't even have a single regular
+        Standard MBean.
+     </p>
+     <p>See also <a
+href="http://weblogs.java.net/blog/emcmanus/archive/2006/02/what_is_an_mxbe.html"
+title="What is an MXBean?"
+     >What is an MXBean?</a>
+     and <a
+href="http://weblogs.java.net/blog/emcmanus/archive/2006/06/intermxbean_ref.html"
+title="Inter-MXBean references"
+     >Inter-MXBean References</a>.
+     </p>
+     <blockquote><u>Hint:</u> In order to simplify the task of coding a 
+        JMX programmatic client, we recommend that getters, setters, and
+        operations defined in MBean and MXBean interfaces throw 
+        <code>IOException</code>. Proxy objects will then be able
+        to rethrow directly any <code>IOException</code> received from
+        their underlying MBean Server connection, without wrapping
+        them into <code>UndeclaredThrowableExceptions</code>.<br>
+        Since the life cycle of the proxy object is not directly tied to 
+        the life cycle of the MBean it proxies, you may also want to
+        have all methods in the MBean or MXBean interface throw
+        <code>InstanceNotFoundException</code> or more generally
+        <code>JMException</code>.
+    </blockquote>
+  </ul>
+  <h3>MBean Names - aka ObjectNames</h3>
+  <ul>
+  <p>As you must know if you've been studying JMX, MBeans are
+     named objects. The names of MBeans are represented by
+     instances of <code>ObjectName</code>. An ObjectName is
+     composed of a <i>domain</i>, followed by a colon ':',
+     followed by a comma-separated list of <i>key=value</i>
+     pairs.<br>
+     The ordering of the <i>key=value</i> pairs is not
+     important, but <code>ObjectNames</code> are case sensitive
+     (both keys and values are case sensitive) and <b>white space
+     is not ignored</b>.<br>
+     A common pitfall for JMX beginners is to inadvertently
+     insert white space after commas into an ObjectName,
+     and expect that two ObjectNames which differ only by such white
+     space will be considered identical. This is not the
+     case.<br>
+     As an example, the ObjectName '<b><code>D:k1=v1, k2=v2, k3=v3</code></b>' has
+     three keys, which are '<b><code>k1</code></b>', '<b><code> k2</code></b>',
+     and '<b><code> k3</code></b>': beware
+     of the space in the name of the second and third
+     keys!<br>
+     It is therefore a different ObjectName from
+     '<b><code>D:k1=v1,k2=v2,k3=v3</code></b>' (the keys are now
+     '<b><code>k1</code></b>', '<b><code>k2</code></b>', and
+     '<b><code>k3</code></b>'), but the same ObjectName as
+     '<b><code>D: k2=v2, k3=v3,k1=v1</code></b>', and yet different
+     from '<b><code>D:k2=v2, k3=v3, k1=v1</code></b>'!
+     <p>In this example, we are following the rules
+        for ObjectName suggested in the <a
+href="http://java.sun.com/products/JavaManagement/best-practices.html"
+        >JMX Best Practices</a>:</p>
+     <ul>
+         <li>ObjectNames should be <a
+         href="http://java.sun.com/products/JavaManagement/best-practices.html#mozTocId654884"
+         >predictable</a>
+         </li>
+        <li>The domain part of our ObjectNames starts with a Java
+            package name
+        </li>
+        <li>Our ObjectNames contain a <code>type=</code>
+            key property. This property is different for every
+            object type in our domain.
+        </li>
+        <li>For every ObjectName with a given type, we have the same set of key
+            properties with the same syntax and semantics for their values - in
+            fact we only use an additional <code>name=</code> key.
+        </li>
+        <li>When there can only be one instance of a given type
+            there aren't any other key properties than <code>type=</code>.
+            The ObjectNames of the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+            >ScanManagerMXBean</a> and <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a>, which are both singleton MBeans, are
+        composed in this way.
+        </li>
+        <li>When there can be several instances of a given type,
+            we differentiate them by further key properties.
+            To achieve this, we are using the most usual key property
+            in addition to <code>type=</code>: the <code>name=</code> key.
+            In this example, a key property list of the form
+            <code>type=X,name=Y</code> is always enough to uniquely name
+            an MBean. Tools like jconsole are usually aware
+            of the semantics of the <code>type=</code> key and
+            <code>name=</code> key, and are therefore able to
+            display this form of name in a way that
+            is easier to read than other name forms.
+        </li>
+     </ul>
+     <p>The rules listed above are implemented by a couple
+        of static helper functions in the <a
+href="src/com/sun/jmx/examples/scandir/ScanManager.java"
+title="ScanManager.java"
+      >ScanManager</a> class. See the code of the
+      <b><code>makeSingletonName</code></b> and
+      <b><code>makeMBeanName</code></b> methods.
+     </p>
+  </ul>
+  <h3>Inter MBean Navigation</h3>
+  <ul>
+  <p>One of the most common problems that needs to be solved
+     when designing a management interface with JMX is to
+     choose a representation for inter-MBean relationships.<br>
+     Prior to Java 6, there were basically three possible
+     choices:</p>
+     <ul>
+         <li><b>Make the relation appear in the ObjectName</b>.
+             For instance, if MBean B was contained in
+             MBean A, you could choose to name MBean B so
+             that its parent relationship with MBean A
+             appeared in its name. <br>
+             The obvious limitation of this solution is that
+             it only allows to model one such relation (an
+             MBean has only one name) and the relation must
+             be fixed - it cannot change during the life of
+             the MBean since the name of an MBean cannot
+             change.<br>
+             This scheme is therefore mostly used when
+             the application MBeans are modeling objects
+             which are conceptually contained within
+             each other in a tree-like structure.
+             <br>For instance, most MBean names defined by 
+             <a href="http://jcp.org/en/jsr/detail?id=77"
+              >J2EE Management (JSR 77)</a> follow
+              this scheme.
+         </li>
+         <li><b>Design getters and setters (or operations) which
+             return <code>ObjectName</code> or
+             <code>ObjectName[]</code> values</b>. The ObjectNames
+             point to the MBeans which are related to that
+             object. For instance , <a 
+             href="http://glassfish.dev.java.net/"
+             title="Open Source Java EE 5 Application Server"
+             >GlassFish</a>
+             defines MBeans which also use this pattern.
+         </li>
+         <li><b>Use the JMX RelationService</b>. The JMX RelationService
+             is quite powerful, but simple relationships often
+             do not justify that overhead.
+         </li>
+     </ul>
+     <p>In Java 6, these three possibilities still remain, but
+        the new MXBean framework brings up an interesting
+        alternative. Instead of returning an ObjectName or
+        an ObjectName array, <b>an MXBean can return a proxy</b>
+        to its related MXBeans. This is how we have chosen to
+        implement our inter MBean relationships in this
+        example:
+        <br>For instance the
+        <code>ScanManagerMXBean</code>/<code>DirectoryScannerMXBean</code>
+        relationship and the
+        <code>ScanManagerMXBean</code>/<code>ScanDirConfigMXBean</code>
+        relationships are implemented in this way.
+        <p>
+        The additional benefit, as compared to returning ObjectNames or
+        using the RelationService is that interface type of the MBeans
+        which are pointed to by the relationship becomes directly
+        apparent. The method:
+        <pre>
+            public Map&lt;String,DirectoryScannerMXBean&gt; getDirectoryScanners();
+        </pre>
+        makes it immediately obvious that the MBeans to which we point are
+        <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a>. It would have been much less obvious in prior
+        versions of Java SE, were the returned type would have had to be
+        <code>Map&lt;String,ObjectName&gt;</code>, or
+        even worse just <code>Map</code>.
+     </p>
+     <p>However, it must be clear that the behaviour will be
+        quite different when an MXBean is returned as compared
+        to when a simple bean is returned.
+     </p>
+     <p>When an MXBean is returned, the remote client sees either
+        an ObjectName, if it is a generic client like jconsole, or
+        a proxy to a remote MXBean, if the client is working with the
+        MXBean interface. Invoking an operation on one of the
+        proxy returned by a method such as
+        <code>getDirectoryScanners</code> will cause the
+        MBean to be invoked on the remote server side.
+     </p>
+     <p>If <code>getDirectoryScanners</code> were
+        defined as:
+        <pre>
+            public Map&lt;String,DirectoryScannerConfig&gt; getDirectoryScanners();
+        </pre>
+        then invoking a method on one of the returned objects
+        would have absolutely no effect on the remote
+        server side - because the returned objects in this
+        case would simply be a bunch of serialized data objects.
+     </p>
+     <p>It is worth noting that although an MXBean interface
+        can have getters and operations which return an MXBean
+        interface, a regular standard MBean shouldn't have
+        any getters or methods which return MBean interfaces or
+        MXBean interfaces.
+     </p>
+     <p>For more information see also <a
+href="http://weblogs.java.net/blog/emcmanus/archive/2006/06/intermxbean_ref.html"
+title="Inter-MXBean references"
+     >Inter-MXBean References</a>.
+     </p>
+  </ul>
+  <h3>The MBeanRegistration interface, or how an MBean can
+      know or provide its own name</h3>
+  <ul>
+      <p>
+        Sometimes, an MBean needs to have a reference to the
+        MBeanServer in which it is registered, or needs to know
+        with which ObjectName it has been registered.
+      </p>
+      <p>
+         Sometimes also, an MBean may need to perform some
+         checks before being registered, or will need
+         to carry out some actions right after it has been 
+         successfully registered in the MBeanServer.
+      </p>
+      <p>
+        Sometimes again, an MBean may need to perform some
+        checks, or some cleaning actions, just before, or
+        just after, it is unregistered.
+      </p>
+      <p>
+      When an MBean has such needs, the easiest solution
+      for it is to implement the <code>MBeanRegistration</code>
+      interface.
+      </p>
+      <p>The <code>MBeanRegistration</code> interface is a callback 
+      interface which defines pre and post registration and 
+      unregistration callbacks.
+      </p>
+      <p>
+       When an MBean implementing this interface is created
+      (with <code>createMBean</code>) or registered 
+      (with <code>registerMBean</code>) in an MBeanServer,
+      the MBeanServer will call the <code>preRegister</code>
+      and <code>postRegister</code> method implemented by
+      the MBean. The <code>preRegister</code> method
+      has an <code>MBeanServer</code> and <code>ObjectName</code>
+      parameter, which are passed by the MBeanServer to the
+      MBean. The MBean can store the reference it is being passed
+      in a private instance variable for later use. 
+      </p>
+      <p>
+      Most of the MXBeans we have defined in this example
+      implement the <code>MBeanRegistration</code> interface. The table
+      below show how our MBeans use this interface to control
+      their own names, make sanity checks, perform 
+      initialization steps or cleanup actions.
+      </p>
+      <p><br><center>
+      <table border="1" cellpadding="4" cellspacing="2" 
+             bgcolor="#eeeeee" width="95%">
+          <thead>
+              <tr bgcolor="#cecece">
+                  <th width="20%">MBean Requirement</th>
+                  <th>callback</th>
+                  <th>use case example</th>
+              </tr>
+          </thead>
+          <tbody>
+              <tr>
+                  <td bgcolor="#dedede">get a reference to the MBeanServer</td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  needs a reference
+                  to the MBeanServer in order to create and
+                  register other MBeans, such as the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a>, and the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a>.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">reject registration if conditions are
+                      not met.
+                  </td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  will throw
+                  an IllegalArgumentException in <code>preRegister</code>
+                  if the ObjectName it is being passed is
+                  illegal. Throwing an exception in 
+                  <code>preRegister</code> makes the registration fail.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">get my client-assigned MBean name</td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> propagates the
+                  value of the <code>name=</code> property of 
+                  the ObjectName it is given into its
+                  ScanManagerConfig bean.  
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">provide my own default ObjectName if none
+                      was given to the MBeanServer
+                  </td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The name that is returned by <code>preRegister</code>
+                  is the ObjectName with which the MBean will be
+                  eventually registered. 
+                  The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> is able to suggest
+                  a value for its own ObjectName if none was
+                  provided. Similarly, the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> 
+                  always returns its singleton ObjectName
+                  defined by <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html#SCAN_MANAGER_NAME" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean.SCAN_MANAGER_NAME</a>.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">perform initialization steps</td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> uses <code>preRegister</code>
+                  to initialize its internal ScanManagerConfig bean.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">perform initialization steps, once it is
+                  known that the registration was successful.
+                  </td>
+                  <td><code>postRegister</code></td>
+                  <td bgcolor="#fafafa">The <code>postRegister</code> method 
+                  can be used to implement
+                  initialization steps that need to be done once it
+                  is known that the registration was successful, or to
+                  undo any action performed by <code>preRegister</code> once it
+                  is known that registration was not successful.
+                  The <code>postRegister</code> method has a Boolean parameter
+                  which tells the MBean whether it was or wasn't
+                  successfully registered in the MBeanServer.
+                  The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses <code>postRegister</code> to create
+                  and register other MBeans, such as the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a> and the default
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a>.
+                  Note that <code>postRegister</code> is not expected to throw any
+                  exception. If an exception needs to be thrown, it should
+                  be thrown in <code>preRegister</code>.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">check whether the MBean can be deregistered</td>
+                  <td><code>preDeregister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses this method to verify
+                   that its state allows it to be deregistered. 
+                   In particular, it will refuse to be deregistered
+                   if it is in the RUNNING or SCHEDULED state.
+                   If <code>preDeregister</code> throws an exception, the unregisterMBean
+                   call will fail and the MBean will remain registered in
+                   the MBeanServer. 
+                   Take particular care when implementing business logic
+                   in this method: if the logic you implement has an 
+                   unfortunate bug which makes it always throw an 
+                   exception, you will never be able to unregister
+                   that MBean.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">clean up resources, refusing to be deregistered if
+                      it fails
+                  </td>
+                  <td><code>preDeregister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses this method to unregister
+                  all the other MBeans it has created and registered in the
+                  MBeanServer. This includes the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a>, the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBeans</a> it has created, and the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a> it has created when
+                  applying its configuration.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">clean up resources which need to be released in
+                  a best-effort way, when it is known that the MBean is no
+                  longer registered.
+                  </td>
+                  <td><code>postDeregister</code></td>
+                  <td bgcolor="#fafafa"><code>postDeregister</code> is only called if the MBean was succesfully
+                  unregistered.
+                  The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses this method to cancel
+                  its internal java.util.Timer.
+                  </td>
+              </tr>
+          </tbody>
+      </table>
+      </center><br></p>
+  </ul>
+  <h3>The Singleton MBean Pattern</h3>
+  <ul>
+      <p>
+        A singleton MBean is an MBean which can only have one
+        instance registered in a given MBeanServer. <br>
+        A singleton MBean usually has a well-known name,
+        which can be defined as a constant. In that case,
+        clients no longer need to call <code>new ObjectName(...)</code> 
+        and catch the declared <code>MalformedObjectNameException</code>.
+      </p>
+      <p>There are already quite a few examples of singleton
+         MBeans in the java.lang.management API. The 
+         ThreadingMXBean, ClassLoadingMXBean, RuntimeMXBean, etc.
+         are all singleton MBeans.
+      </p>
+      <p>In this example, we have two singleton MBeans:
+         The <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a></code> and the 
+         <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a></code>. But in fact,
+         the only real singleton MBean is the 
+        <code>ScanManagerMXBean</code>. The 
+        <code>ResultLogManagerMXBean</code> just happens to
+        be a singleton MBean because it has a 1-1 relationship
+        with the <code>ScanManagerMXBean</code>.
+      </p>
+      <p>The <code>ScanManagerMXBean</code> implements the
+         singleton MBean pattern in this way:
+      </p>
+      <ul>
+          <li>The <code>ScanManagerMXBean</code> name has a single 
+              key property: <code>type=ScanManagerMXBean</code>.</li>
+          <li>Its name is defined by an ObjectName constant called
+              <code>SCAN_MANAGER_NAME</code> in the <code>ScanManager</code> class</li>
+          <li>The <code>ScanManagerMXBean</code> enforces its status of 
+              singleton MBean. It will refuse to be registered
+              with a name other than
+              the <code>SCAN_MANAGER_NAME</code>. You can therefore depend on
+              the fact that the <code>ScanManagerMXBean</code> will always 
+              be registered with its singleton <code>SCAN_MANAGER_NAME</code>
+              (see <code>preRegister</code>)
+          </li>
+          <li>You are not obliged to provide a name when you
+              register the <code>ScanManagerMXBean</code>: if you pass null,
+              then the <code>ScanManager</code> will be registered with
+              its singleton <code>SCAN_MANAGER_NAME</code>
+              (see <code>preRegister</code>).
+          </li>
+          <li>The <code>ScanManager</code> class has a no-arg static 
+              <code>register</code> method that will register
+              the singleton instance in the Platform MBeanServer.
+              This static <code>register</code> method returns
+              a proxy to the registered singleton.
+          </li>
+          <li>The <code>ScanManager</code> class has also a static 
+              <code>register</code> method that will create
+              a singleton instance in a (possibly remote)
+              MBeanServerConnection - using 
+              <code>createMBean</code>.
+              This static <code>register</code> method 
+              also returns a proxy to the registered singleton.
+          </li>
+          <li>Only the MBeanServer has a reference to the
+              singleton instance. The singleton instance is
+              not returned to the caller, and not kept
+              in any other static data structure.
+          </li>
+      </ul>
+      <p>
+      On the other hand, the <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a></code>
+      has a much more relaxed implementation of the pattern:
+      <br>It simply provides its own singleton name if it is
+      registered with a null ObjectName, but will not enforce 
+      the use of that name.
+      </p>
+      <p>Note that all singleton MBean names in this example
+      are created using the <code>ScanManager.makeSingletonName</code>
+      method, which implements the pattern for ObjectNames suggested
+      in the JMX Best Practices.
+      </p>
+  </ul>
+  <h3>Managing the Life Cycle of dependent MBeans</h3>
+  <ul>
+      <p>A common task that many JMX applications have
+        is to manage the life cycle of MBeans registered
+        in the MBeanServer.</p>
+      <p>In this example, we have decided to follow a simple
+      pattern:</p>
+      <ul>
+          <li>The application is initialized simply 
+              by registering the singleton 
+              <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> in 
+              the MBeanServer.
+          </li>
+          <li>The <code>ScanManagerMXBean</code> will then
+              in turn register any other MBean that the 
+              application might need:
+              <ul>
+                  <li>It creates and registers the singleton
+                      <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a></code>
+                  </li>
+                  <li>It creates and registers the default
+                      <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code>
+                      which loads the initial configuration
+                  </li>
+                  <li>It creates as many 
+                     <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a></code> as
+                     needed when the configuration is applied
+                  </li>
+                  <li>It lets you create alternate 
+                      <code>ScanDirConfigMXBean</code>, to
+                      which you can later switch in order
+                      to apply a new alternate configuration.
+                  </li>
+              </ul>
+          </li>
+          <li>When a new configuration is applied (or if the
+              current configuration is reapplied), the 
+              <code>ScanManagerMXBean</code> will unregister
+              any <code>DirectoryScannerMXBeans</code> it has
+              previously registered, and will re-create
+              brand new <code>DirectoryScannerMXBeans</code>
+              from the applied configuration.
+          </li>
+          <li>When you unregister the <code>ScanManagerMXBean</code>,
+              it does all the cleanup for you, by unregistering
+              all the MBeans that it has created during the
+              course of the application.
+          </li>
+      </ul>
+      <p>The <code>ScanManagerMXBean</code> makes use of its
+         <code>MBeanRegistration</code> interface in order
+         to register the other MBeans it needs (see the
+         <code>ScanManager.postRegister</code> method) and to unregister
+         every MBean it has created (see the <code>ScanManager.preDeregister</code>
+         method).
+      </p>
+      <p>You will note that the <code>ScanManagerMXBean</code>
+         will only allow itself to be deregistered if it can be 
+         closed - that is if there's no other action in
+         progress. 
+         This is to make sure that the deregistration of
+         dependent MBeans will work smoothly. 
+         <br>
+         The deregistration of related MBeans will happen
+         in the <code>ScanManager.preDeregister</code>
+         method.
+         <br>
+         If one of these MBeans could not be deregistered,
+         then the <code>ScanManagerMXBean</code> will throw
+         an exception, refusing to be deregistered.
+         <br>This leaves you a chance to try to deregister it
+         again later. Since the <code>ScanManagerMXBean</code>
+         has switched its state to CLOSED before starting
+         to unregister its dependent MBeans, it will refuse
+         any further actions, ensuring that e.g. nobody
+         can try to start it or schedule it while it
+         is in that partially-deregistered state.
+      </p>
+      <p>Handling the LifeCycle of all the application's
+         MBeans in a single MBean is usually a good design
+         pattern, especially if the application is a 
+         module which is intended to share a JVM - or
+         an MBeanServer - with other modules.
+      </p>
+      <p>This is specially useful if the application needs to
+         be loaded and unloaded on demand: in that 
+         case, simply registering or unregistering the top level 
+         MBean (in our example the <code>ScanManagerMXBean</code>) does
+         the trick.
+      </p>
+  </ul>
+  <h3>Emitting Notifications</h3>
+  <ul>
+       <p>In order to emit notifications, an MBean must be
+       an instance of <code>NotificationEmitter</code>. 
+       The <code>NotificationEmitter</code> interface defines methods 
+       that the MBeanServer will call on the MBean in order
+       to register <code>NotificationListeners</code> with the MBean.
+       </p>
+       <p>It is worth noting that the MBean may not be
+          invoked each time a JMX client wants to register
+          a listener. For instance, the RMIConnectorServer
+          registers <i>only once</i> a single listener with each MBean 
+          which is a <code>NotificationEmitter</code>.
+          In that specific case, the listener may even be registered
+          with the MBean before any client has actually subscribed
+          for notifications from that particular MBean.
+       </p>
+       <p>An MBean can therefore make no assumption about 
+          which client or how many clients have registered for
+          notifications.
+       </p>
+       <p>It is also worth noting that the logic of the
+       methods defined in <code>NotificationEmitter</code> would not
+       be trivial to implement from scratch. Fortunately
+       the JMX API defines a helper class, called 
+       <code>NotificationBroadcasterSupport</code>, which 
+       provides an implementation for these methods.
+       </p>
+       <p>There are actually three ways for an MBean to
+       implement <code>NotificationEmitter</code>, of which only two
+       are recommended.
+       </p>
+  </ul>
+
+  <h4>Extending NotificationBroadcasterSupport</h4>
+  <ul>
+    <p>This is the simplest way of coding an MBean which
+       is a <code>NotificationEmitter</code>:
+    </p>
+    <p>Simply extend <code>NotificationBroadcasterSupport</code>,
+    then override its <code>getNotificationInfo</code> method
+    which returns the <code>MBeanNotificationInfo[]</code> array
+    that should be included in your MBean's <code>MBeanInfo</code>
+    and that's it. 
+    <br>You just need to call the <code>sendNotification</code> method
+    inherited from <code>NotificationBroadcasterSupport</code> whenever
+    your MBean needs to send a notification.
+    </p>
+    <p>In our example, both the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> and <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a> extend 
+      <code>NotificationBroadcasterSupport</code> in order
+      to send notifications.
+    </p>
+  </ul>
+  <h4>The Delegation Pattern: delegating to a 
+      NotificationBroadcasterSupport delegate</h4>
+  <ul>
+      <p>There may be cases however where delegating to a
+      wrapped <code>NotificationBroadcasterSupport</code> 
+      object may be preferred to extending 
+      <code>NotificationBroadcasterSupport</code>.
+      </p>
+      <p>For instance, if your MBeans already derive from
+      some base class, extending <code>NotificationBroadcasterSupport</code>
+      might not be an option.
+      </p>
+      <p>Similarly, if you do not want to have the inherited 
+      <code>public void sendNotification(Notification notification)</code>
+      method appear in the Javadoc of the concrete class of your
+      MBean, you may want to consider using the delegation
+      pattern instead of extending 
+      <code>NotificationBroadcasterSupport</code>
+      </p>
+      <p>In our example both the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> and the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBean</a> use the delegation 
+       pattern rather than extending 
+       <code>NotificationBroadcasterSupport</code>.
+       In the end, choosing between one or the other method
+       is more a question of taste, although the delegation 
+       pattern could be considered more flexible since it
+       doesn't require extending any given superclass.
+      </p>
+      <p>It may be also worth noting that some tools like
+      the JMX Module of <a 
+href="http://www.netbeans.org"
+      >NetBeans IDE</a>, will be able to 
+      generate for you all the code that delegates to a
+      wrapped <code>NotificationBroadcasterSupport</code>.
+      </p>
+  </ul>
+      
+  <h4>Implementing NotificationEmitter from scratch</h4>
+  <ul>
+    <p>This is the last possibility for an MBean that
+    needs to send notifications: simply implement 
+    <code>NotificationEmitter</code> from scratch. This is highly
+    discouraged since that logic is not trivial, and 
+    already provided by 
+    <code>NotificationBroadcasterSupport</code> anyway.
+    </p>
+  </ul>
+    
+  <h4>Beware of Synchronization Locks</h4>
+  <ul>
+       
+       <p>One thing you must keep in mind when sending
+       notifications is not to send them from within
+       a synchronized block, or while holding a lock on
+       some resource.</p>
+       <p>Indeed, what happens when you send a notification
+          may vary greatly depending on whether the client
+          which has registered for notifications has done
+          so through a <code>JMXConnector</code> (like the 
+          <code>JMXRMIConnector</code>)
+          or through a direct reference to the MBeanServer
+          (by calling 
+          <code>MBeanServer.addNotificationListener</code>).
+       </p>
+       <p>In this latter case, the listener will be invoked
+       synchronously in the same thread that your MBean is
+       using to send its notification. If by misfortune, the
+       code of that listener now re-enters your MBean through a
+       call that flows through a JMXConnector, a deadlock
+       could occur. It is therefore very important to release
+       any lock you may have before calling 
+       <code>sendNotification</code>.</p>
+       <p>An easy way to do that is demonstrated in the
+          <code>ScanManager</code> class. The ScanManager
+          has an internal private queue of pending notifications.
+          When a notification needs to be sent (e.g. because the
+          ScanManager state is being switched), the notification
+          is simply prepared and put into the pending notification
+          queue. 
+          The notification queue is then processed later on, 
+          at the end of the method, when the processing is finally
+          completed and all the locks have been released.
+          <br>At this point the notification queue might already
+          have been emptied by another thread - in which case
+          the pending notifications will have already been
+          removed from the queue. Which thread actually gets 
+          to send the notifications is of no importance. The 
+          important point is that all the locks detained by
+          your MBean code in that thread were released before
+          the notification was sent.
+       </p>
+       <p>In our example the <code>ScanManager</code> class 
+          ensures this by:
+          <ul>
+              <li>Only calling <code>sendNotification</code>
+                  in its private <code>sendQueuedNotifications</code>
+                  method.
+              </li>
+              <li>Only calling <code>sendQueuedNotifications</code>
+                  when all locks have been released.
+              </li>
+              <li>Never calling a method that calls 
+                  <code>sendQueuedNotifications</code> from within
+                  a synchronized block.</li>
+          </ul>
+       </p>
+  </ul>
+       
+       
+
+  <h4>Don't subclass Notification</h4>
+  <ul>
+       <p>Another common best practice when you want
+          to improve interoperability is to use directly
+          the Notification base classes provided in the
+          JMX<sup>TM</sup> API. Do not create your own
+          subclasses of these standard classes.
+       </p>
+       <p>Indeed, if you code your own subclass, a generic
+       client, like jconsole, will not be able to receive
+       that notification unless it has that custom 
+       subclass in its classpath.
+       </p>
+       <p>
+       If you want your application to be interoperable, it is
+       therefore preferable not to subclass any of the standard
+       Notification classes. You can define your own 
+       Notification type string, and if you need to send
+       additional data, you can put a CompositeData, or a 
+       HashMap of serializable standard types in the 
+       Notification's user data fields.
+       </p>
+       <p>In this example, we are using directly the 
+       standard notification classes:
+       <ul>
+           <li>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> and the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+             >DirectoryScannerMXBean</a> both use directly
+             <code>AttributeChangeNotification</code> to notify
+             changes in their <code>State</code> attribute.
+           </li>
+           <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+             >DirectoryScannerMXBean</a>
+             also uses the base <code>Notification</code>
+             class directly in order to notify whenever
+             it finds a matching file.
+             <br>In that case, we simply use the base
+             <code>Notification</code>
+             class with a new 
+             <b><code>com.sun.jmx.examples.scandir.filematch</code></b>
+             type.
+           </li>
+           <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+             >ScanDirConfigMXBean</a> and <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+             >ResultLogManagerMXBean</a> also both use the base 
+             <code>Notification</code> class.
+           </li>
+       </ul>
+       <p>Careful readers will have noted that the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> and the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+             >DirectoryScannerMXBean</a> both use the 
+             <code>AttributeChangeNotification</code> class
+             to notify about their state change, whereas the
+             <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+             >ScanDirConfigMXBean</a> uses the base
+             <code>Notification</code> class.
+       </p>
+       <p>In fact, this is because the semantics of these
+          notifications is not exactly the same - although
+          both denote a state change:
+          <ul>
+              <p>In the case of <code>ScanManagerMXBean</code>
+              and <code>DirectoryScannerMXBean</code>, the 
+              notification which is emitted is more about a
+              state transition, from one state to another.
+              For instance, going from <code>RUNNING</code>
+              to <code>STOPPED</code>, or from 
+              <code>SCHEDULED</code> to <code>STOPPED</code>.
+              <br>In that case, the 
+              <code>AttributeChangeNotification</code> was
+              more appropriate because it made it possible
+              to send the previous and the new value of the 
+              state attribute, thus reflecting the whole
+              state transition.
+              </p>
+              <p>In the case of the <code>ScanDirConfigMXBean</code>
+              however, what is of interest is the state in
+              which the MBean has arrived. Using the base
+              <code>Notification</code> class with three different 
+              notification type strings -  
+              <b><code>com.sun.jmx.examples.scandir.config.loaded</code></b>,
+              <b><code>com.sun.jmx.examples.scandir.config.modified</code></b>,
+              and
+              <b><code>com.sun.jmx.examples.scandir.config.saved</code></b> - 
+              was therefore closer to what we wanted to model.
+              </p>
+          </ul>
+       </p>
+  </ul>
+       
+  <h3>Configuration MBeans</h3>
+    <ul>
+    <p>A common practice when designing a management application is
+    to have an MBean, or a set of MBeans, dedicated to configuration. 
+    Separating configuration from control and monitoring allows
+    more appropriate logic, and often simplifies the design and 
+    implementation of the management interface.
+    </p>
+    <p>
+    In our example, the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+     >ScanDirConfigMXBean</a> is dedicated to the application configuration.
+    </p>
+    <p>The <code>ScanDirConfigMXBean</code> will let you interactively 
+        modify, save, or load the application configuration. The modifications
+        will not be taken into account until it is applied, by invoking
+        <code>applyConfiguration</code> on the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a>. 
+    It is also possible to create many configurations, by creating as
+    many <code>ScanDirConfigMXBean</code>s, and then to choose and apply
+    one of these configurations by calling 
+    <code>ScanManagerMXBean.setConfigurationMBean</code> and then
+    <code>ScanManagerMXBean.applyConfiguration</code>.
+    </p>
+    <p>In this way, all configurations aspects are gathered and concentrated
+    inside the <code>ScanDirConfigMXBean</code> instead of being scattered
+    throughout all the MBeans that compose the application.
+    </p>
+    <p>In order to save and store the application configuration data, the
+    <code>ScanDirConfigMXBean</code> uses a set of XML serializable Java beans
+    defined in the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/config/package-summary.html" 
+title="The com.sun.jmx.examples.scandir.config package defines XML serializable beans"
+        >com.sun.jmx.examples.scandir.config</a> package. These beans are very
+   simple Java beans which have been lightly annotated for XML binding.
+    </p>
+    <p>It is worth noting that these same beans can also be handled by the
+    MXBean framework (our beans don't contain recursive data structures) and can 
+    therefore be used directly as attributes and parameters of MXBeans, without
+    needing to be Java-serializable (the MXBean framework transform them in
+    CompositeData objects - which <b>are</b> serializable).
+    </p>
+    <p>The same <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/config/ScanManagerConfig.html" 
+title="The com.sun.jmx.examples.scandir.config package defines XML serializable beans"
+        >ScanManagerConfig</a> bean that we use to read from and write to the
+        XML configuration file is thus also used as attribute of the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+     >ScanDirConfigMXBean</a>. It is transformed into a <code>CompositeData</code> 
+       by the MXBean framework, and can be easily introspected with
+       <a href="#JConsole">jconsole</a>.
+    </p>
+    </ul>
+  <h3>MBeans Must Be Thread-Safe</h3>
+    <ul>
+    <p>A question often asked by newcomers to JMX technology
+    is whether the MBeanServer is thread-safe. Well, the MBeanServer <b>is</b> 
+    thread safe, but it doesn't put any locks on the MBeans it contains. The
+    MBeans can be concurrently accessed by multiple threads, and must therefore
+    take care of their own thread safety.
+    </p>
+    <p>In this example, we have been using two methods to ensure thread
+    safety for our MBeans: synchronized blocks, and semaphores.
+    </p>
+    <p>Using synchronized blocks is probably the most common and easiest way
+    to implement thread safety in Java. When dealing with MBeans though, here
+    are a couple of rules to keep in mind:
+    <ul>
+        <li>Don't send notifications from within a synchronized block: there's
+        no way to tell whether the listener's code will be executed in the
+        same thread or a different thread, and holding a lock in these
+        conditions is therefore dangerous, as it could lead to deadlocks.</li>
+        <li>Also avoid invoking another MBean from a synchronized block
+        unless you are completely in control of both MBeans, and you can
+        ascertain that it won't lead to any deadlock. Indeed, if you invoke an
+        MBean exposed by another application, it can be sometime hard to
+        know with certainty whether holding a lock while invoking that
+        MBean will have any side effect. Maybe that MBean will make
+        further calls to other MBeans which will in turn try to call
+        your MBean, or maybe it will emit a
+        notification, and we'll be back to the considerations just 
+        above.</li>
+    </ul>
+    </p>
+    <p>Another means of implementing thread-safe code is to use semaphores.
+    The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a> uses a semaphore called
+        <code>sequencer</code> to ensure
+    that critical code sections are not executed concurrently. In this
+    MBean, we use <code>Semaphore.tryAcquire</code> to lock the sequencer
+    semaphore before entering the critical section. If the 
+    <code>Semaphore.tryAcquire</code> returns true then we enter the critical
+    section. If it returns false, we throw an IllegalStateException, stating
+    that we couldn't acquire the lock. The code looks like this:
+    <pre>
+        if (!sequencer.tryAcquire())
+            throw new IllegalStateException("resource locked");
+        try {
+            // critical code here ...
+        } finally {
+            // Always use try/finally to ensure that the semaphore
+            // will be released, even if exceptions or errors are raised!
+            sequencer.release();
+        }
+    </pre>
+    </p>
+    <p>Using <code>Semaphore.tryAcquire</code> and throwing an exception if
+        the semaphore is already locked makes it safer to call other MBeans
+        from within the critical section: in potential deadlock situations
+        the calling code will get the <code>IllegalStateException</code>
+        instead of being blocked on the deadlocked lock.
+    </p>
+    <p>It is worth noting that each of these techniques has its own 
+    advantages and disadvantages - which can make one of them more or less
+    appropriate depending on the inner logic of the MBean you're implementing.
+    </p>
+    <p>Careful readers will also have noted that we used 
+       <code>IllegalStateException</code> directly, instead of defining 
+       our own subclass of RuntimeException, which could have had a more
+       precise semantics. If you define a new exception for your JMX application,
+       you must keep in mind that your client will need to have the class
+       of your exception in its classpath to get that exception. 
+       Otherwise your client will get a completely different exception, indicating a
+       deserialization issue.
+    </p>
+    </ul>
+    
+  <h3>Waiting for Notifications</h3>
+    <ul>
+    <p>Implementing code that needs to wait for notifications is sometimes
+       difficult. Because notifications are asynchronous, doing something
+       like:
+        <pre>
+          // register a notification listener
+          ...
+          // start a management action
+          ...
+          // wait for a notification
+          ...
+          // do something based on whether the expected notification
+          // is received
+          ...
+        </pre>
+       is not always trivial. However, there's a very easy way to do that: use
+       a blocking queue of notifications.
+       <pre>
+       final BlockingQueue&lt;Notification&gt; notifQueue = 
+                new LinkedBlockingQueue&lt;Notification&gt;();
+                
+       final NotificationListener listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                                           Object handback) {
+                try {
+                    // Just put the received notification in the queue.
+                    // It will be consumed later on.
+                    //
+                    notifQueue.put(notification);
+                } catch (InterruptedException ex) {
+                    // OK
+                }
+            }
+          };
+
+       // register the listener - possibly also as a JMXConnectionNotification
+       // listener to get Notification Lost notification
+       ...
+       // start management action
+       ...
+       // wait for notification
+       while (expected notif not received and delay not expired) {
+            Notification n = notifQueue.poll(3,TimeUnit.SECONDS);
+            // if expected notif, do something
+            ...
+       }
+       // if expected notification not received do something else.
+       ....
+       </pre>
+    </p>
+    <p>You will note that this is a technique we've been using in the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirAgent.html" 
+title="The ScanDirAgent class defines a main method for the scandir application"
+        >ScanDirAgent</a> class and in the example unit tests.
+    </p>
+    </ul>
+    
+  <h3>Holding hard references to other MBeans: proxy or direct reference?</h3>
+  <ul>
+    <p>We have seen that MXBeans will let you return proxy references to other
+    MXBeans. But should that MXBean hold a direct reference to the MXBeans it
+    relates to, or would it be better for it to hold only a proxy?
+    </p>
+    <p>
+    As a general rule it is better when an MBean reference is
+    only held by the MBeanServer. It is a better design
+    to hold a reference to a proxy, rather than to hold
+    a hard reference to an MBean. However there are two cases
+    when holding a hard reference might be preferred: 
+     <ol>
+        <li>When MBean A needs to call a method of method B which
+           is not part of its MBean interface</li>
+        <li>When the overhead of going through the MBeanServer
+           plus the MXBean framework is too great (frequently-called
+           method, with creation of OpenType)</li>
+     </ol>
+    However - holding a hard reference is only advisable
+    when both MBeans are created by the same piece of code,
+    and the application can ensure that the life cycle
+    of each MBean is consistent with regard to the other.
+    </p>
+    <p>In our example, the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a> holds only proxy references to the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html" 
+        >ScanDirConfigMXBean</a> and the  <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html" 
+        >DirectoryScannerMXBeans</a>. <br>
+    However it holds a direct reference to the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManager.html" 
+        >ResultLogManager</a>. This makes it possible to pass a direct 
+        reference to the <code>DirectoryScannerMXBeans</code>, 
+        which can then log their results
+        more efficiently, and would also make it possible to remove
+        the <code>log</code> method from the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html" 
+        >ResultLogManagerMXBean</a> interface - leaving it in the 
+        <code>ResultLogManager</code> class (possibly as a package method)
+        should we wish to do so.
+    </p>
+    
+    </ul>
+
+  <h3>Agent Class</h3>
+    <ul>
+   <p>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirAgent.html" 
+title="The ScanDirAgent class defines a main method for the scandir application"
+     >ScanDirAgent</a> is the Agent class for the <i>scandir</i> application.
+    This class contains the <code>main</code> method to start a standalone  
+    <i>scandir</i> application.
+    </p>
+    <p>The <code>main</code> method simply registers a <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+       >ScanManagerMXBean</a> in the platform MBeanServer, and then waits
+    for someone to call <code>ScanManagerMXBean.close</code>.
+    </p>
+    <p>
+    When the <code>ScanManagerMXBean</code> state is switched to 
+    <code>ScanManagerMXBean.ScanState.CLOSED</code>, the 
+    <code>ScanManagerMXBean</code> is unregistered, and the application
+    terminates (i.e. the main thread completes).
+    </p>
+    <p>Standalone JMX applications usually have an Agent class that contain 
+       their <code>main</code> method, which performs all the MBean
+       registration steps.
+       However, it is usually not a bad idea if that class can
+       be easily turned into an MBean. Indeed, this will make your
+       application easier to integrate in an environment where it would
+       no longer be standalone and would no longer control the implementation
+       of <code>main</code>. In our example the Agent
+       class could be easily turned into an MBean, exposing its three
+    <code>init</code>, <code>waitForClose</code> and <code>cleanup</code> 
+    method. However we didn't go as far as turning it into an MBean since 
+    the application can be already easily started by registering an instance
+    of <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+       >ScanManagerMXBean</a>.
+    </p>
+    </ul>
+  <h3>Secure Client Class</h3>
+    <ul>
+   <p>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirClient.html" 
+title="The ScanDirClient class is a very short example of secure programmatic client"
+     >ScanDirClient</a> is an example class that shows how a
+    programmatic client can connect to a secured <i>scandir</i> application.
+    This class contains a <code>main</code> method which creates and
+    configures a <code>JMXConnector</code> client to connect with
+    a secured <i>scandir</i> daemon. This class will not work with
+    the default unsecured agent since it requires mutual authentication.
+    </p>
+    <p>How to secure a JMX <i>scandir</i> application and run
+    the secure <code>ScanDirClient</code> is discussed <a href="#secure"
+    >later</a> in this document.
+    </p>
+    <p>The <code>ScanDirClient</code> is not really part of the
+       application - and is given here only for the sake of
+       the example.
+    </p>
+    </ul>
+    
+  <h2><a name="h2-Testing">Testing the <i>scandir</i> Example</a></h2>
+    <ul>
+        <p>Make sure that you have access to junit.jar (either 3.8.1 or 3.8.2).
+           Make sure also that you have junit.jar in your 
+           <code>CLASSPATH</code>.<br>
+           Then in the example root directory (where the <code>build.xml</code> 
+           file is located) run the following command:
+           <pre>ant test -Dlibs.junit.classpath=<i><u>path to junit jar (either 3.8.1 or 3.8.2)</u></i></pre>
+        </p>
+        <p>Alternatively you can open the jmx-scandir project with the 
+           NetBeans IDE and test the jmx-scandir project from the 
+           <code>Run</code> menu.
+        </p>
+
+    </ul>
+
+  <h2><a name="h2-Running">Running the <i>scandir</i> Example</a></h2>
+    <ul>
+        <p>In the example root directory (where the <code>build.xml</code> 
+           file is located) run the following commands:
+        <pre>ant jar
+ant run-single -Drun.class=com.sun.jmx.examples.scandir.ScanDirAgent -Djavac.includes=src</pre>
+           or simply <pre>ant run</pre>
+        </p>
+        
+        <p>This will run the example using the configuration
+           file provided in the src/etc directory.
+        </p>
+        <p>Alternatively you can open the jmx-scandir project with the 
+           NetBeans IDE. You can run the example by 
+           selecting the <code>ScanDirAgent</code> file
+           and run it with <code>Run File</code> in the
+           <code>Run</code> menu or simply
+           set the <i>jmx-scandir</i> project as main project and
+           select <code>Run Main Project</code> from the
+           main menu. Both targets will use the configuration
+           file provided in the src/etc directory.
+        </p>
+        <p>When the application is started, you can connect to
+           it with <a href="#JConsole">jconsole</a>.
+        </p>
+        <blockquote>
+            <u>Note:</u> You can also run the <i>scandir</i> 
+            application directly from the <code>java</code> 
+            command line. Make sure to build the project jar
+            first. 
+            <br>On Unix systems:
+            <pre>ant jar
+java -Djava.util.logging.config.file=logging.properties \
+     -Dscandir.config.file=src/etc/testconfig.xml \
+     -jar dist/jmx-scandir.jar</pre>
+            <br>On Windows systems:
+            <p><code>ant jar<br>
+java &nbsp;-Djava.util.logging.config.file=logging.properties
+     &nbsp;-Dscandir.config.file=src\etc\testconfig.xml
+     &nbsp;-jar&nbsp;dist\jmx-scandir.jar</code></p>
+        </blockquote>
+    </ul>
+    
+    <h2><a name="h2-Playing">Playing with JConsole</a></h2>
+    <ul>
+    <p>Run the example as explained in the previous section, so
+    that it uses the provided <code>src/etc/testconfig.xml</code> 
+    configuration file. Then start
+    jconsole. In the connection window choose the process that runs
+    <code>com.sun.jmx.examples.scandir.ScanDirAgent</code> or
+    <code>jmx-scandir.jar</code>.
+    </p>
+    <p><center>
+        <table border="0" cellpadding="2" cellspacing="2">
+        <tr><td>
+    <a href="docfiles/connect-local-ant-run.jpg"
+    title="jconsole connection window - connect to local process"
+    ><img height="440"
+    src="docfiles/connect-local-ant-run.jpg"
+    alt="jconsole connection window - connect to local process"
+    /></a>
+    </td>
+    <td>
+    <a href="docfiles/connect-local-java-jar.jpg"
+    title="jconsole connection window - connect to local process"
+    ><img height="440"
+    src="docfiles/connect-local-java-jar.jpg"
+    alt="jconsole connection window - connect to local process"
+    /></a>
+    </td></tr></table>
+    </center>
+    </p>
+    <p>Open the MBeans tab, and look for the 
+       <code>ScanDirConfigMXBean</code>.
+       Click on its <code>Attributes</code> node and double click on its
+       <code>Configuration</code> attribute, to look at
+       the loaded configuration - values in bold can
+       be expanded by a double-click.
+    </p>
+    <p><center><a href="docfiles/scandir-config.jpg"
+    title="jconsole MBean tab: ScanDirConfigMXBean"
+    ><img 
+    src="docfiles/scandir-config.jpg"
+    alt="jconsole MBean tab: ScanDirConfigMXBean"
+    /></a></center>
+    </p>
+    <p>Now go to the <code>ScanManagerMXBean</code>, click on
+       its <code>Notifications</code> node, and subscribe
+       for notifications. Then click on the 
+       <code>Operations</code> node and invoke the
+       <code>start()</code> operation:
+    </p>
+    <p><center><a href="docfiles/scandir-start.jpg"
+    title="jconsole MBean tab: ScanDirConfigMXBean"
+    ><img 
+    src="docfiles/scandir-start.jpg"
+    alt="jconsole MBean tab: ScanDirConfigMXBean"
+    /></a></center>
+    </p>
+    <p>You can see that the notifications counter was 
+       incremented by three: you have just scheduled, 
+       run, and completed a batch of directory scans.
+    </p>
+    <p>Now go to the <code>ResultLogManagerMXBean</code>,
+       click on its <code>Attributes</code> node, and 
+       expand its <code>MemoryLog</code> attribute:
+    </p>
+    <p><center><a href="docfiles/scandir-result.jpg"
+    title="jconsole MBean tab: ScanDirConfigMXBean"
+    ><img 
+    src="docfiles/scandir-result.jpg"
+    alt="jconsole MBean tab: ScanDirConfigMXBean"
+    /></a></center>
+    </p>
+    <p>You can see that the directory scan results have
+       been logged.</p>
+    <p>To make the application terminate go back to the 
+       <code>ScanManagerMXBean</code> and invoke
+       <code>close()</code>. The <code>ScanDirAgent</code>
+       will receive the notification, step out of 
+       the application main thread, and the application
+       will terminate.
+    </p>
+    <p>This is of course a very limited scenario. Feel free
+    to improvise with all the features of the example, creating
+    a new configuration - 
+    <code>ScanManagerMXBean.createOtherConfigurationMBean</code> -
+    adding multiple directory scanners to that configuration -
+    <code>ScanDirConfigMXBean.addDirectoryScanner</code> -
+    then switching the <code>ScanManagerMXBean</code> current
+    configuration by changing the value of the <i>ConfigurationMBean</i>
+    attribute - <code>ScanManagerMXBean.setConfigurationMBean</code>
+    - then applying the new configuration - 
+    <code>ScanManagerMXBean.applyConfiguration(true)</code> - 
+    then scheduling repeated directory scans every 10 seconds - 
+    <code>ScanManagerMXBean.schedule(0,10000)</code> - 
+    subscribing for notifications, etc...
+    </p>
+    </ul>
+    
+  <a name="secure"></a>
+  <h2><a name="h2-Turning">Turning the example into a Secure JMX Application</a></h2>
+    <ul>
+    <p>In this section, we will see how to configure and
+    start the <i>scandir</i> example so that the JVM agent
+    is bootstrapped with a secure JMXConnectorServer. Indeed, until 
+    now we have only used the insecure local connection, 
+    which can only be used as long as both the client and
+    the server run on the same machine. This section will
+    explain how to start the <code>ScanDirAgent</code> so 
+    that a real secure RMIConnectorServer is started at bootstrap.
+    </p>
+    <p>To achieve this we will: <a href="#management.properties"
+        >provide our own management.properties</a>, <a 
+        href="#password-access">create our own password and access files</a>,
+        <a href="#keystore-truststore">provide a keystore and truststore</a>,
+        <a href="#start-secure-agent">start the ScanDirAgent with the
+        appropriate system properties</a>.
+    </ul>
+    <h3>Configuring the JVM Agent for Secure Remote Connection</h3>
+    <ul>
+        <p>The easiest way to <a name="management.properties">configure the 
+            JVM Agent</a> for Secure Remote 
+           Connection is to use your own <a
+           href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#properties"
+           title="This page describes the properties you can put in your management.properties file"
+           >management.properties</a> file.
+           In this example, we have copied the default 
+           <code>$JRE/lib/management/management.properties</code>
+           file to the example's <code>src/etc</code> directory and
+           modified it in <a href="src/etc/management.properties"
+           title="our modified management.properties"
+           >this way</a>:
+           <ul>
+               <li>We have set the RMI port to <u>4545</u> - this is just a 
+                   random port number we have picked up. Feel free to use your 
+                   own value suited to your environment.
+               <pre># For setting the JMX RMI agent port use the following line
+com.sun.management.jmxremote.port=<b>4545</b></pre>
+               </li>
+               <li>We have <u>switched on</u> SSL <u>mutual authentication</u>
+               <pre># For RMI monitoring with SSL client authentication use the following line
+com.sun.management.jmxremote.ssl.<b>need.client.auth</b>=<b>true</b></pre>
+               </li>
+               <li>We have also <u>secured the RMI Registry</u> with SSL
+               <pre># For using an SSL/TLS <b>protected</b> RMI Registry use the following line
+com.sun.management.jmxremote.<b>registry.ssl</b>=<b>true</b></pre>
+               </li>
+               <li>We have provided <a 
+                href="src/etc/password.properties">our own password file</a>
+               <pre># For a non-default password file location use the following line
+com.sun.management.jmxremote.password.file=<i>src/etc/password.properties</i></pre>
+               </li>
+               <li>We have provided <a 
+                href="src/etc/access.properties">our own access file</a>
+               <pre># For a non-default password file location use the following line
+com.sun.management.jmxremote.access.file=<i>src/etc/access.properties</i></pre>
+               </li>
+           </ul>
+           <p>You will note that we haven't provided any value
+              for the other security properties, like 
+              <code>com.sun.management.jmxremote.authenticate=true</code>,
+              because these properties already default to a value
+              which enables security by default. 
+              Note however that protecting the RMI Registry with SSL
+              improves the application security, but only as long as
+              mutual authentication is also switched on. Otherwise, just
+              anybody would be able to connect to the registry and 
+              get the RMIServer stub.
+           </p>
+           <p>We do recommend that you <u>use the most secure configuration
+              when you deploy a JMX agent</u> - which means <u>switching on
+              SSL protection for the RMI registry</u> <b>and</b> <u>requiring
+              mutual authentication</u>, as we show in this example.
+           </p>
+           <p>We will use the <code>com.sun.management.config.file</code>
+           system property to pass our <a 
+           href="src/etc/management.properties">management.properties</a>
+           file to the <code>ScanDirAgent</code>.
+           </p>
+    </ul>
+    
+    <h3>Creating a password and access file</h3>
+    <ul>
+        <p>As explained above, we have created our own
+        <a href="src/etc/password.properties">password file</a> 
+        and <a href="src/etc/access.properties">access file</a> 
+        for <a name="password-access">access control and authorization</a>.
+        </p>
+        <p>In the password file, we have defined two logins: 
+           <i>guest</i> and <i>admin</i>. The password for 
+           <i>guest</i> is <i>guestpasswd</i> and the password
+           for <i>admin</i> is <i>adminpasswd</i>.
+        </p>
+        <p>In the access file, we have mapped these two logins
+        to access rights: the <i>admin</i> login has <i>read-write</i>
+        access, while the <i>guest</i> login only has <i>read-only</i>.
+        </p>
+        <p>Before starting the <code>ScanDirAgent</code>, you will
+           need to restrict access permission to the password file, 
+           in such a way that nobody but you can read it. Otherwise, the
+           JVM Agent will refuse to start the JMXConnectorServer, as it will
+           fear that security can be compromised if other parties can
+           have read access to the password file. How to restrict
+           read access to the password file is explained in detail
+           <a href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#PasswordAccessFiles"
+           title="Using Password and Access Files"
+           >here</a>.
+        </p>
+        <p>As we have seen above, the location
+           of our access and password files is configured in our own <a 
+           href="src/etc/management.properties">management.properties</a>
+           file.
+        </p>
+    </ul>
+    <h3>Keystore and Truststore</h3>
+    <ul>
+        <p>Using SSL with mutual authentication means that both
+           client and server will need a <a name="keystore-truststore"
+           >keystore and a truststore</a>
+           to store their own certificates, and the certificates of
+           the parties they trust. Usually, client and server will 
+           have their own keystore and truststore. 
+        </p>
+        <p>For the sake of simplicity - and to get you started
+        without the tedious necessity of creating your own keystore
+        and truststore, we are providing a dummy keystore and 
+        truststore, containing a certificate self-signed by duke.
+        The password for our keystore is <i>password</i>, and the
+        password for our truststore is <i>trustword</i>.
+        We suggest that you first get the example running with the
+        keystore and truststore we are providing before attempting 
+        to use your own keystore and truststore.
+        </p>
+        <p>A secure application will obviously need to use its own
+        keystore and truststore, <b><u>and should not rely on the keystore
+        and truststore we are providing here!</u></b>
+        </p>
+        <p>How to create your own keystore and truststore, is explained
+        in <a
+href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#SSL_enabled"
+title="Monitoring and Management Using JMX"
+        >here</a>.          
+        As shown <a href="#start-secure-agent">later</a>, 
+        we will need to use <a 
+        href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#SSL_enabled"
+        >system properties</a> to pass our truststore
+        and keystore to the <code>ScanDirAgent</code>.
+        </p>
+    </ul>
+    <h3>Starting a Secure <i>scandir</i> agent</h3>
+    <ul>
+        <p>To start a <a name="start-secure-agent"
+        >secure <i>scandir</i> agent</a>, go to the
+        <i>scandir</i> example root directory and type the
+        following command:</p>
+        <p>On Unix Systems:
+<pre>ant jar
+java \
+    -Djava.util.logging.config.file=logging.properties \
+    -Djavax.net.ssl.keyStore=keystore \
+    -Djavax.net.ssl.keyStorePassword=password \
+    -Djavax.net.ssl.trustStore=truststore \
+    -Djavax.net.ssl.trustStorePassword=trustword \
+    -Dcom.sun.management.config.file=src/etc/management.properties \
+    -Dscandir.config.file=src/etc/testconfig.xml \
+    -jar dist/jmx-scandir.jar</pre>
+        </p>
+         <p>On Windows Systems:
+<p><code>ant jar<br>
+java 
+    &nbsp;-Djava.util.logging.config.file=logging.properties
+    &nbsp;-Djavax.net.ssl.keyStore=keystore
+    &nbsp;-Djavax.net.ssl.keyStorePassword=password
+    &nbsp;-Djavax.net.ssl.trustStore=truststore
+    &nbsp;-Djavax.net.ssl.trustStorePassword=trustword
+    &nbsp;-Dcom.sun.management.config.file=src\etc\management.properties
+    &nbsp;-Dscandir.config.file=src\etc\testconfig.xml
+    &nbsp;-jar&nbsp;dist\jmx-scandir.jar</code></p>
+         </p>
+    <p>If you start jconsole now, you will see that you
+       are still able to connect to the agent using the 
+       local connection. However, if you try to connect
+       through the remote connector, using 
+       <a href="docfiles/remote-connection.jpg">localhost:4545</a>, 
+       the connection will <a href="docfiles/remote-connection-failed.jpg"
+       >fail</a>, even if you provide a correct login/password
+       pair. Indeed, since the JMXConnectorServer is now protected with SSL,
+       jconsole must also be configured with the appropriate SSL parameters
+       so that it can authenticate the server and get authenticated by the
+       server too as the SSL configuration of the server requires mutual
+       authentication.
+    </p>
+    <p>The next section will discuss how to connect to the 
+    secure agent.
+    </p>
+   </ul>
+   
+  <h2><a name="h2-Connecting">Connecting to the Secure JMX Application</a></h2>
+    <ul>
+    <p>We will now see how to connect to the secure agent,
+       using jconsole, and using a programmatic client.
+    </p>
+    </ul>
+    
+    <h3>Using jconsole to connect to the secure agent</h3>
+    <ul>
+    <p>The only special thing you need to do in order to
+        be able to connect to your secure agent with
+        jconsole, is to give it a keystore (containing
+        its client certificate) and a truststore (containing
+        the certificates of the servers it can trust).
+        In our example, we use the same keystore/truststore
+        pair on the client and server side - but this is
+        not what a real application would do.
+        Indeed a real application would have different 
+        certificates for the client and the server, and 
+        thus use different keystores (and probably truststores).
+        More information on SSL authentication can be obtained from the <a
+        href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
+        title="How SSL Works"
+        >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>.
+    </p>
+    <p>To start jconsole with our provided keystore and
+    truststore, go to the scandir example root directory and 
+    type in the following command:
+    <p><code>jconsole 
+    &nbsp;-J-Djava.util.logging.config.file=logging.properties 
+    &nbsp;-J-Djavax.net.ssl.keyStore=keystore 
+    &nbsp;-J-Djavax.net.ssl.keyStorePassword=password 
+    &nbsp;-J-Djavax.net.ssl.trustStore=truststore 
+    &nbsp;-J-Djavax.net.ssl.trustStorePassword=trustword</code></p>
+    </p>
+    <p>The <code>-J-Djava.util.logging.config.file=logging.properties</code>
+       flag is not mandatory, but passing a <code>logging.properties</code>
+       may help you debug connection problems if anything goes wrong.
+    </p>
+    <p>In jconsole connection window, choose to connect to a 
+       remote process, using the address <i>localhost:4545</i>
+       and the guest login:
+    </p>
+    <p><center><a href="docfiles/remote-connection.jpg"
+       ><img src="docfiles/remote-connection.jpg"
+        alt="jconsole connection window"/></a></center>
+    </p>
+    <p>You will see that the agent will let view all the
+       MBeans and their attributes, but will reject any
+       attribute modification or remote method invocation.
+    </p>
+    <hr>
+    <p><u>Note:</u> if jconsole fails to connect and show
+    you <a href="docfiles/remote-connection-failed.jpg">this screen</a>
+    you have probably misspelled some of the properties on jconsole
+    command line, or you didn't start jconsole from the 
+    scandir example root directory where our <code>truststore</code>
+    and <code>keystore</code> files are located. This article - <a 
+    href="http://blogs.sun.com/roller/page/jmxetc?entry=troubleshooting_connection_problems_in_jconsole"
+    title="Troubleshooting connection problems in JConsole"
+    >Troubleshooting connection problems in JConsole</a> - may help
+    you figure out what is going wrong.
+    </p>
+    <hr>
+    </ul>
+    
+    <h3>Writing a programmatic client to connect to the secure agent</h3>
+    <ul>
+        <p>
+        In this section we will show the steps involved in writing 
+        a programmatic client that will connect to our secure agent.
+        </p>
+   <p>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirClient.html" 
+title="The ScanDirClient class is a very short example of secure programmatic client"
+     >ScanDirClient</a> is an example class that shows how a
+    programmatic client can connect to a secured <i>scandir</i> application.
+    This class contains a <code>main</code> method which creates and
+    configures a <code>JMXConnector</code> client to connect with
+    the secured <i>scandir</i> agent. 
+    </p>
+    <p>The secure client differs only from a non secure client in
+    so far as it needs to use SSL RMI Factories and credentials to
+    connect to the secure agent. The steps required mainly involve:
+       <ul>
+           <li>Creating an empty environment map:
+           <pre>            
+            // Create an environment map to hold connection properties
+            // like credentials etc... We will later pass this map
+            // to the JMX Connector.
+            //
+            System.out.println("\nInitialize the environment map");
+            final Map&lt;String,Object> env = new HashMap&lt;String,Object>();
+           </pre>
+           </li>
+           <li>Putting the client's credentials in that map:
+           <i>(here the client will log in as <b>guest</b>)</i>
+           <pre>            
+            // Provide the credentials required by the server
+            // to successfully perform user authentication
+            //
+            final String[] credentials = new String[] { "guest" , "guestpasswd" };
+            env.put("jmx.remote.credentials", credentials);
+           </pre>
+           </li>
+           <li>Providing an <code>SslRMIClientSocketFactory</code> to interact
+           with the secure RMI Registry:
+           <pre>            
+            // Provide the SSL/TLS-based RMI Client Socket Factory required
+            // by the JNDI/RMI Registry Service Provider to communicate with
+            // the SSL/TLS-protected RMI Registry
+            //
+            env.put("com.sun.jndi.rmi.factory.socket",
+                    new SslRMIClientSocketFactory());
+           </pre>
+           </li>
+           <li>Creating a JMXConnector and connecting with the
+               secure server:
+           <pre>
+            // Create the RMI connector client and
+            // connect it to the secure RMI connector server.
+            // args[0] is the server's host - localhost
+            // args[1] is the secure server port - 4545
+            //
+            System.out.println("\nCreate the RMI connector client and " +
+                    "connect it to the RMI connector server");
+            final JMXServiceURL url = new JMXServiceURL(
+                    "service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1]+ 
+                    "/jmxrmi");
+            final JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
+           </pre>
+           </li>
+       </ul>
+       <p>For this to work, we also need to start the <code>ScanDirClient</code>
+       with the appropriate system properties that will point to our 
+       <code>keystore</code> and <code>truststore</code>. To start the secure 
+       client, go to the <i>scandir</i> example root directory and type
+       the following command:
+       <p><code>ant jar<br>
+java 
+    &nbsp;-Djava.util.logging.config.file=logging.properties 
+    &nbsp;-Djavax.net.ssl.keyStore=keystore
+    &nbsp;-Djavax.net.ssl.keyStorePassword=password
+    &nbsp;-Djavax.net.ssl.trustStore=truststore
+    &nbsp;-Djavax.net.ssl.trustStorePassword=trustword
+    &nbsp;-classpath&nbsp;dist/jmx-scandir.jar
+     &nbsp;com.sun.jmx.examples.scandir.ScanDirClient&nbsp;localhost&nbsp;4545
+       </code></p>
+       </p>
+       <p>You should be seeing this trace:
+<center><table width="90%" border="0" bgcolor="#eeeeee">
+<tr><td>
+<pre>
+Initialize the environment map
+
+Create the RMI connector client and connect it to the RMI connector server
+Connecting to: service:jmx:rmi:///jndi/rmi://localhost:4545/jmxrmi
+
+Get the MBeanServerConnection
+
+Get ScanDirConfigMXBean from ScanManagerMXBean
+
+Get 'Configuration' attribute on ScanDirConfigMXBean
+
+Configuration:
+
+&lt;ScanManager xmlns="jmx:com.sun.jmx.examples.scandir.config" name="testconfig">
+    &lt;InitialResultLogConfig>
+        &lt;LogFileMaxRecords>2048&lt;/LogFileMaxRecords>
+        &lt;LogFileName>build/scandir.log&lt;/LogFileName>
+        &lt;MemoryMaxRecords>128&lt;/MemoryMaxRecords>
+    &lt;/InitialResultLogConfig>
+    &lt;DirectoryScannerList>
+        &lt;DirectoryScanner name="scan-build">
+            &lt;Actions>NOTIFY LOGRESULT&lt;/Actions>
+            &lt;ExcludeFiles/>
+            &lt;IncludeFiles>
+                &lt;FileFilter>
+                    &lt;FilePattern>.*\.class&lt;/FilePattern>
+                    &lt;SizeExceedsMaxBytes>4096&lt;/SizeExceedsMaxBytes>
+                &lt;/FileFilter>
+            &lt;/IncludeFiles>
+            &lt;RootDirectory>build&lt;/RootDirectory>
+        &lt;/DirectoryScanner>
+    &lt;/DirectoryScannerList>
+&lt;/ScanManager>
+
+Invoke 'close' on ScanManagerMXBean
+
+Got expected security exception: java.lang.SecurityException: Access denied! 
+Invalid access level for requested MBeanServer operation.
+
+Close the connection to the server
+
+Bye! Bye!
+</pre>
+</td></tr></table></center>
+    <p>If the <code>ScanDirClient</code> fails to connect with 
+       the secure agent, then this article - <a 
+    href="http://blogs.sun.com/roller/page/jmxetc?entry=troubleshooting_connection_problems_in_jconsole"
+    title="Troubleshooting connection problems in JConsole"
+    >Troubleshooting connection problems in JConsole</a> - may help
+    you figure out what is going wrong. Indeed the connection steps
+    performed by the <code>ScanDirClient</code> are very similar to
+    those performed by <code>jconsole</code>, and the problems you
+    could encounter are identical. Just remember that 
+   <code>jconsole</code> needs the extra <code>-J</code> flag to pass
+   system properties to the VM, which is not needed with regular
+   <code>java</code> launcher invocations.
+    </p>
+    </ul>
+    
+    <h2><a name="h2-Conclusion">Conclusion</a></h2>
+    <ul>
+    <p>
+        In this document, we have presented an advanced 
+        JMX example, and shown how to run a secure 
+        JMX agent in a production environment. 
+        We have also shown how to connect to such a 
+        secure agent with both jconsole and a programmatic 
+        client. We have also discuss various JMX 
+        design-patterns and best practices. 
+        Readers who would wish to learn more about JMX, and
+        Monitoring and Management of the JVM, are invited
+        to follow the links given in reference below.
+    </p>
+    </ul>
+  <h2><a name="h2-References">References</a></h2>
+  <ol>
+     <li><a href="http://java.sun.com/products/JavaManagement/best-practices.html"
+        >JMX Best Practices</a>: This document describes best practices that
+      have been identified for modeling using the JMX API. </li>
+     <li><a href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html"
+      >Monitoring and Management Using JMX</a>: How to enable, configure, and 
+      connect to the JVM JMX agent.</li> 
+     <li><a name="JConsole"><a 
+href="http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html"
+>Using JConsole</a>: JConsole is a JMX-Compliant monitoring tool which allows
+     you to interact graphically with your own MBeans.
+     </li>
+     <li><a href="http://java.sun.com/javase/6/docs/technotes/guides/management/"
+     >Monitoring and Management for the Java Platform</a>: The Java Platform 
+      Standard Edition (Java SE) 6 provides comprehensive monitoring and 
+      management support for the Java platform. </li>
+     <li><a href="http://java.sun.com/products/JavaManagement/community/jmx_blogs.html"
+         >List of JMX-related Blogs</a>: This page provides links to the 
+          different web logs written by members of the Sun team working on the 
+          JMX API.</li>
+     <li><a
+        href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
+        title="The JSSE Reference Guide"
+        >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>:
+        comprehensive documentation about the Java<sup>TM</sup> Secure Socket 
+        Extension (JSSE)
+     </li>
+     <li><a href="http://java.sun.com/javase/6/docs/"
+         >Java SE 6 Documentation Index</a>: This document covers the
+          Java<sup>TM</sup> Platform, Standard Edition 6 JDK.</li>
+  </ol>
+  <p>
+  <hr>
+  <p>
+  </body>
+</html>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/keystore b/darwin-x86/sample/jmx/jmx-scandir/keystore
new file mode 100644
index 0000000..05f5356
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/keystore
Binary files differ
diff --git a/darwin-x86/sample/jmx/jmx-scandir/logging.properties b/darwin-x86/sample/jmx/jmx-scandir/logging.properties
new file mode 100644
index 0000000..1714bee
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/logging.properties
@@ -0,0 +1,17 @@
+handlers= java.util.logging.ConsoleHandler
+
+.level=INFO
+
+
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+java.util.logging.ConsoleHandler.level = FINEST
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+javax.management.level=INFO
+com.sun.jmx.level=INFO
+com.sun.jmx.examples.level=FINE
+
diff --git a/darwin-x86/sample/jmx/jmx-scandir/manifest.mf b/darwin-x86/sample/jmx/jmx-scandir/manifest.mf
new file mode 100644
index 0000000..328e8e5
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/darwin-x86/sample/jmx/jmx-scandir/nbproject/file-targets.xml b/darwin-x86/sample/jmx/jmx-scandir/nbproject/file-targets.xml
new file mode 100644
index 0000000..42da880
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/nbproject/file-targets.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="jmx-scandir/file">
+    
+    <import file="../build.xml"/>
+    
+    <target name="compile-selected" depends="-init">
+        <fail unless="includes">Must set property 'includes'</fail>
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}" includes="${includes}">
+            <classpath path="${cp}"/>
+        </javac>
+    </target>
+    
+</project>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/nbproject/jdk.xml b/darwin-x86/sample/jmx/jmx-scandir/nbproject/jdk.xml
new file mode 100644
index 0000000..2b85b77
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/nbproject/jdk.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project name="jdk" basedir=".">
+
+    <target name="-jdk-preinit">
+        <condition property=".exe" value=".exe">
+            <os family="windows"/>
+        </condition>
+        <property name=".exe" value=""/>
+        <property name="nbjdk.javac" value="${nbjdk.home}/bin/javac${.exe}"/>
+        <property name="nbjdk.java" value="${nbjdk.home}/bin/java${.exe}"/>
+        <property name="nbjdk.javadoc" value="${nbjdk.home}/bin/javadoc${.exe}"/>
+        <property name="nbjdk.appletviewer" value="${nbjdk.home}/bin/appletviewer${.exe}"/>
+        <property name="nbjdk.bootclasspath" value="${nbjdk.home}/jre/lib/rt.jar"/>
+    </target>
+
+    <target name="-jdk-presetdef-basic" depends="-jdk-preinit" unless="nbjdk.presetdef.basic.done">
+        <macrodef name="javac-presetdef">
+            <attribute name="javacval"/>
+            <sequential>
+                <presetdef name="javac">
+                    <javac fork="yes" executable="@{javacval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javac-presetdef javacval="${nbjdk.javac}"/>
+        <macrodef name="java-presetdef">
+            <attribute name="javaval"/>
+            <sequential>
+                <presetdef name="java">
+                    <java fork="yes" jvm="@{javaval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <java-presetdef javaval="${nbjdk.java}"/>
+        <macrodef name="javadoc-presetdef">
+            <attribute name="javadocval"/>
+            <sequential>
+                <presetdef name="javadoc">
+                    <javadoc executable="@{javadocval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javadoc-presetdef javadocval="${nbjdk.javadoc}"/>
+        <property name="nbjdk.presetdef.basic.done" value="true"/>
+    </target>
+
+    <target name="-jdk-presetdef-nbjpdastart" depends="-jdk-preinit" unless="nbjdk.presetdef.nbjpdastart.done">
+        <macrodef name="nbjpdastart-presetdef">
+            <attribute name="bootcpval"/>
+            <sequential>
+                <presetdef name="nbjpdastart">
+                    <nbjpdastart>
+                        <bootclasspath>
+                            <path path="@{bootcpval}"/>
+                        </bootclasspath>
+                    </nbjpdastart>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <nbjpdastart-presetdef bootcpval="${nbjdk.bootclasspath}"/>
+        <property name="nbjdk.presetdef.nbjpdastart.done" value="true"/>
+    </target>
+
+    <target name="-jdk-init" depends="-jdk-preinit,-jdk-presetdef-basic"/>
+
+</project>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/nbproject/netbeans-targets.xml b/darwin-x86/sample/jmx/jmx-scandir/nbproject/netbeans-targets.xml
new file mode 100644
index 0000000..facdb4e
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/nbproject/netbeans-targets.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="jmx-scandir/NB">
+
+    <import file="../build.xml"/>
+
+    <target name="debug" depends="compile,-jdk-presetdef-nbjpdastart">
+        <nbjpdastart addressproperty="jpda.address" name="jmx-scandir" transport="dt_socket">
+            <classpath path="${run.cp}"/>
+        </nbjpdastart>
+        <java classname="${main.client.class}" failonerror="true" fork="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="-Xdebug"/>
+            <jvmarg value="-Xnoagent"/>
+            <jvmarg value="-Djava.compiler=none"/>
+            <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
+            <arg line="${client.args}" />
+        </java>
+    </target>
+    
+    <target name="debug-fix" depends="-init">
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+            <include name="${class}.java"/>
+        </javac>
+        <nbjpdareload>
+            <fileset dir="${classes.dir}">
+                <include name="${class}.class"/>
+            </fileset>
+        </nbjpdareload>
+    </target>
+    
+    <target name="show-info" depends="-init">
+        <nbbrowse file="${main.dir}/index.html"/>
+    </target>
+    
+    <target name="show-javadoc" depends="javadoc">
+        <nbbrowse file="${javadoc.dir}/index.html"/>
+    </target>
+    
+    <target name="profile" depends="compile">
+        <nbprofiledirect>
+            <classpath path="${run.cp}"/>
+        </nbprofiledirect>
+        <property environment="env"/>
+        <java classname="${main.client.class}" fork="true" failonerror="true" dir="${profiler.session.working.dir}" jvm="${profiler.info.jvm}">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <arg line="localhost 4545" />
+            <env key="LD_LIBRARY_PATH" path="${profiler.info.agentpath}:${env.LD_LIBRARY_PATH}"/>
+            <env key="Path" path="${profiler.info.agentpath}:${env.Path}"/>
+        </java>
+    </target>
+
+</project>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/nbproject/project.xml b/darwin-x86/sample/jmx/jmx-scandir/nbproject/project.xml
new file mode 100644
index 0000000..a988de6
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/nbproject/project.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>jmx-scandir</name>
+            <properties>
+                <property-file>user.build.properties</property-file>
+                <property-file>build.properties</property-file>
+                <property name="nbjdk.bootclasspath">${nbjdk.home}/jre/lib/rt.jar</property>
+            </properties>
+            <folders>
+                <source-folder>
+                    <label>JDK Demo</label>
+                    <location>${main.dir}</location>
+                </source-folder>
+                <source-folder>
+                    <label>Sources</label>
+                    <type>java</type>
+                    <location>${src.dir}</location>
+                </source-folder>
+                <source-folder>
+                    <label>test</label>
+                    <type>java</type>
+                    <location>test</location>
+                </source-folder>
+            </folders>
+            <ide-actions>
+                <action name="build">
+                    <target>jar</target>
+                </action>
+                <action name="clean">
+                    <target>clean</target>
+                </action>
+                <action name="rebuild">
+                    <target>clean</target>
+                    <target>jar</target>
+                </action>
+                <action name="run">
+                    <target>run</target>
+                </action>
+                <action name="ReadMe">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>show-info</target>
+                </action>
+                <action name="javadoc">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>show-javadoc</target>
+                </action>
+                <action name="debug">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                </action>
+                <action name="compile.single">
+                    <script>nbproject/file-targets.xml</script>
+                    <target>compile-selected</target>
+                    <context>
+                        <property>includes</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug-fix</target>
+                    <context>
+                        <property>class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="test">
+                    <target>test</target>
+                </action>
+            </ide-actions>
+            <export>
+                <type>folder</type>
+                <location>${classes.dir}</location>
+                <build-target>jar</build-target>
+            </export>
+            <export>
+                <type>jar</type>
+                <location>${jar}</location>
+                <build-target>jar</build-target>
+            </export>
+            <export>
+                <type>folder</type>
+                <location>${build.test.classes.dir}</location>
+                <build-target>jar</build-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="packages">
+                        <label>Sources</label>
+                        <location>${src.dir}</location>
+                    </source-folder>
+                    <source-folder style="packages">
+                        <label>test</label>
+                        <location>test</location>
+                    </source-folder>
+                    <source-file>
+                        <location>${main.dir}/index.html</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <ide-action name="ReadMe"/>
+                    <ide-action name="build"/>
+                    <ide-action name="clean"/>
+                    <ide-action name="rebuild"/>
+                    <ide-action name="javadoc"/>
+                    <ide-action name="debug"/>
+                    <!-- ide-action name="test"/ -->
+                    <separator/>
+                    <action>
+                        <label>Run Agent</label>
+                        <target>run-agent</target>
+                    </action>
+                    <action>
+                        <label>Run Client</label>
+                        <target>run-client</target>
+                    </action>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/2">
+            <compilation-unit>
+                <package-root>${src.dir}</package-root>
+                <classpath mode="compile">${cp}</classpath>
+                <classpath mode="execute">${run.cp}</classpath>
+                <classpath mode="boot">${nbjdk.bootclasspath}</classpath>
+                <built-to>${classes.dir}</built-to>
+                <built-to>${jar}</built-to>
+                <javadoc-built-to>${javadoc.dir}</javadoc-built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>test</package-root>
+                <unit-tests/>
+                <built-to>${build.test.classes.dir}</built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+        </java-data>
+    </configuration>
+</project>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScanner.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScanner.java
new file mode 100644
index 0000000..0ff58a2
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScanner.java
@@ -0,0 +1,591 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import static com.sun.jmx.examples.scandir.config.DirectoryScannerConfig.Action.*;
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig.Action;
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.AttributeChangeNotification;
+import javax.management.InstanceNotFoundException;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+
+/**
+ * A <code>DirectoryScanner</code> is an MBean that
+ * scans a file system starting at a given root directory,
+ * and then looks for files that match a given criteria.
+ * <p>
+ * When such a file is found, the <code>DirectoryScanner</code> takes
+ * the action for which it was configured: emit a notification,
+ * <i>and or</i> log a {@link
+ * com.sun.jmx.examples.scandir.config.ResultRecord} for this file,
+ * <i>and or</i> delete that file.
+ * </p>
+ * <p>
+ * The code that would actually delete the file is commented out - so that
+ * nothing valuable is lost if this example is run by mistake on the wrong
+ * set of directories.<br>
+ * Logged results are logged by sending them to the {@link ResultLogManager}.
+ * </p>
+ * <p>
+ * <code>DirectoryScannerMXBeans</code> are created, initialized, and
+ * registered by the {@link ScanManagerMXBean}.
+ * The {@link ScanManagerMXBean} will also schedule and run them in
+ * background by calling their {@link #scan} method.
+ * </p>
+ * <p>Client code is not expected to create or register directly any such
+ * MBean. Instead, clients are expected to modify the configuration, using
+ * the {@link ScanDirConfigMXBean}, and then apply it, using the {@link
+ * ScanManagerMXBean}. Instances of <code>DirectoryScannerMXBeans</code>
+ * will then be created and registered (or unregistered and garbage collected)
+ * as a side effect of applying that configuration.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class DirectoryScanner implements
+        DirectoryScannerMXBean, NotificationEmitter {
+
+    /**
+     * The type for <i>com.sun.jmx.examples.scandir.filematch</i> notifications.
+     * Notifications of this type will be emitted whenever a file that
+     * matches this {@code DirectoryScanner} criteria is found, but only if
+     * this {@code DirectoryScanner} was configured to {@link
+     * Action#NOTIFY notify} for matching files.
+     **/
+    public static final String FILE_MATCHES_NOTIFICATION =
+            "com.sun.jmx.examples.scandir.filematch";
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(DirectoryScanner.class.getName());
+
+    // Attribute : State
+    //
+    private volatile ScanState state = STOPPED;
+
+    // The DirectoryScanner delegates the implementation of
+    // the NotificationEmitter interface to a wrapped instance
+    // of NotificationBroadcasterSupport.
+    //
+    private final NotificationBroadcasterSupport broadcaster;
+
+    // The root directory at which this DirectoryScanner will start
+    // scanning. Constructed from config.getRootDirectory().
+    //
+    private final File rootFile;
+
+    // This DirectoryScanner config - this is a constant which is
+    // provided at construction time by the {@link ScanManager}.
+    //
+    private final DirectoryScannerConfig config;
+
+    // The set of actions for which this DirectoryScanner is configured.
+    // Constructed from config.getActions()
+    //
+    final Set<Action> actions;
+
+    // The ResultLogManager that this DirectoryScanner will use to log
+    // info. This is a hard reference to another MBean, provided
+    // at construction time by the ScanManager.
+    // The ScanManager makes sure that the life cycle of these two MBeans
+    // is consistent.
+    //
+    final ResultLogManager logManager;
+
+    /**
+     * Constructs a new {@code DirectoryScanner}.
+     * <p>This constructor is
+     * package protected, and this MBean cannot be created by a remote
+     * client, because it needs a reference to the {@link ResultLogManager},
+     * which cannot be provided from remote.
+     * </p>
+     * <p>This is a conscious design choice: {@code DirectoryScanner} MBeans
+     * are expected to be completely managed (created, registered, unregistered)
+     * by the {@link ScanManager} which does provide this reference.
+     * </p>
+     *
+     * @param config This {@code DirectoryScanner} configuration.
+     * @param logManager The info log manager with which to log the info
+     *        records.
+     * @throws IllegalArgumentException if one of the parameter is null, or if
+     *         the provided {@code config} doesn't have its {@code name} set,
+     *         or if the {@link DirectoryScannerConfig#getRootDirectory
+     *         root directory} provided in the {@code config} is not acceptable
+     *         (not provided or not found or not readable, etc...).
+     **/
+    public DirectoryScanner(DirectoryScannerConfig config,
+                            ResultLogManager logManager)
+        throws IllegalArgumentException {
+        if (logManager == null)
+            throw new IllegalArgumentException("log=null");
+        if (config == null)
+            throw new IllegalArgumentException("config=null");
+        if (config.getName() == null)
+            throw new IllegalArgumentException("config.name=null");
+
+         broadcaster = new NotificationBroadcasterSupport();
+
+         // Clone the config: ensure data encapsulation.
+         //
+         this.config = XmlConfigUtils.xmlClone(config);
+
+         // Checks that the provided root directory is valid.
+         // Throws IllegalArgumentException if it isn't.
+         //
+         rootFile = validateRoot(config.getRootDirectory());
+
+         // Initialize the Set<Action> for which this DirectoryScanner
+         // is configured.
+         //
+         if (config.getActions() == null)
+             actions = Collections.emptySet();
+         else
+             actions = EnumSet.copyOf(Arrays.asList(config.getActions()));
+         this.logManager = logManager;
+    }
+
+    // see DirectoryScannerMXBean
+    public void stop() {
+        // switch state to stop and send AttributeValueChangeNotification
+        setStateAndNotify(STOPPED);
+    }
+
+    // see DirectoryScannerMXBean
+    public String getRootDirectory() {
+        return rootFile.getAbsolutePath();
+    }
+
+
+    // see DirectoryScannerMXBean
+    public ScanState getState() {
+        return state;
+    }
+
+    // see DirectoryScannerMXBean
+    public DirectoryScannerConfig getConfiguration() {
+        return config;
+    }
+
+    // see DirectoryScannerMXBean
+    public String getCurrentScanInfo() {
+        final ScanTask currentOrLastTask = currentTask;
+        if (currentOrLastTask == null) return "Never Run";
+        return currentOrLastTask.getScanInfo();
+    }
+
+    // This variable points to the current (or latest) scan.
+    //
+    private volatile ScanTask currentTask = null;
+
+    // see DirectoryScannerMXBean
+    public void scan() {
+        final ScanTask task;
+
+        synchronized (this) {
+            final LinkedList<File> list;
+            switch (state) {
+                case RUNNING:
+                case SCHEDULED:
+                    throw new IllegalStateException(state.toString());
+                case STOPPED:
+                case COMPLETED:
+                    // only accept to scan if state is STOPPED or COMPLETED.
+                    list = new LinkedList<File>();
+                    list.add(rootFile);
+                    break;
+                default:
+                    throw new IllegalStateException(String.valueOf(state));
+            }
+
+            // Create a new ScanTask object for our root directory file.
+            //
+            currentTask = task = new ScanTask(list,this);
+
+            // transient state... will be switched to RUNNING when
+            // task.execute() is called. This code could in fact be modified
+            // to use java.util.concurent.Future and, to push the task to
+            // an executor. We would then need to wait for the task to
+            // complete before returning.  However, this wouldn't buy us
+            // anything - since this method should wait for the task to
+            // finish anyway: so why would we do it?
+            // As it stands, we simply call task.execute() in the current
+            // thread - brave and fearless readers may want to attempt the
+            // modification ;-)
+            //
+            setStateAndNotify(SCHEDULED);
+        }
+        task.execute();
+    }
+
+    // This method is invoked to carry out the configured actions on a
+    // matching file.
+    // Do not call this method from within synchronized() { } as this
+    // method may send notifications!
+    //
+    void actOn(File file) {
+
+        // Which action were actually taken
+        //
+        final Set<Action> taken = new HashSet<Action>();
+        boolean logresult = false;
+
+        // Check out which actions are configured and carry them out.
+        //
+        for (Action action : actions) {
+            switch (action) {
+                case DELETE:
+                    if (deleteFile(file)) {
+                        // Delete succeeded: add DELETE to the set of
+                        // actions carried out.
+                        taken.add(DELETE);
+                    }
+                    break;
+                case NOTIFY:
+                    if (notifyMatch(file)) {
+                        // Notify succeeded: add NOTIFY to the set of
+                        // actions carried out.
+                        taken.add(NOTIFY);
+                    }
+                    break;
+                case LOGRESULT:
+                    // LOGRESULT was configured - log actions carried out.
+                    // => we must execute this action as the last action.
+                    //    simply set logresult=true for now. We will do
+                    //    the logging later
+                    logresult = true;
+                    break;
+                default:
+                    LOG.fine("Failed to execute action: " +action +
+                            " - action not supported");
+                    break;
+            }
+        }
+
+        // Now is time for logging:
+        if (logresult) {
+            taken.add(LOGRESULT);
+            if (!logResult(file,taken.toArray(new Action[taken.size()])))
+                taken.remove(LOGRESULT); // just for the last trace below...
+        }
+
+        LOG.finest("File processed: "+taken+" - "+file.getAbsolutePath());
+    }
+
+    // Deletes a matching file.
+    private boolean deleteFile(File file) {
+        try {
+            // file.delete() is commented so that we don't do anything
+            // bad if the example is mistakenly run on the wrong set of
+            // directories.
+            //
+            /* file.delete(); */
+            System.out.println("DELETE not implemented for safety reasons.");
+            return true;
+        } catch (Exception x) {
+            LOG.fine("Failed to delete: "+file.getAbsolutePath());
+        }
+        return false;
+    }
+
+    // Notifies of a matching file.
+    private boolean notifyMatch(File file) {
+        try {
+            final Notification n =
+                    new Notification(FILE_MATCHES_NOTIFICATION,this,
+                    getNextSeqNumber(),
+                    file.getAbsolutePath());
+
+            // This method *is not* called from any synchronized block, so
+            // we can happily call broadcaster.sendNotification() here.
+            // Note that verifying whether a method is called from within
+            // a synchronized block demends a thoroughful code reading,
+            // examining each of the 'parent' methods in turn.
+            //
+            broadcaster.sendNotification(n);
+            return true;
+        } catch (Exception x) {
+            LOG.fine("Failed to notify: "+file.getAbsolutePath());
+        }
+        return false;
+    }
+
+    // Logs a result with the ResultLogManager
+    private boolean logResult(File file,Action[] actions) {
+        try {
+            logManager.log(new ResultRecord(config, actions,file));
+            return true;
+        } catch (Exception x) {
+            LOG.fine("Failed to log: "+file.getAbsolutePath());
+        }
+        return false;
+    }
+
+
+    // Contextual object used to store info about current
+    // (or last) scan.
+    //
+    private static class ScanTask {
+
+        // List of Files that remain to scan.
+        // When files are discovered they are added to the list.
+        // When they are being handled, they are removed from the list.
+        // When the list is empty, the scanning is finished.
+        //
+        private final LinkedList<File>   list;
+        private final DirectoryScanner scan;
+
+        // Some statistics...
+        //
+        private volatile long scanned=0;
+        private volatile long matching=0;
+
+        private volatile String info="Not started";
+
+        ScanTask(LinkedList<File> list, DirectoryScanner scan) {
+            this.list = list; this.scan = scan;
+        }
+
+        public void execute() {
+            scan(list);
+        }
+
+        private void scan(LinkedList<File> list) {
+             scan.scan(this,list);
+        }
+
+        public String getScanInfo() {
+            return info+" - ["+scanned+" scanned, "+matching+" matching]";
+        }
+    }
+
+    // The actual scan logic. Switches state to RUNNING,
+    // and scan the list of given dirs.
+    // The list is a live object which is updated by this method.
+    // This would allow us to implement methods like "pause" and "resume",
+    // since all the info needed to resume would be in the list.
+    //
+    private void scan(ScanTask task, LinkedList<File> list) {
+        setStateAndNotify(RUNNING);
+        task.info = "In Progress";
+        try {
+
+            // The FileFilter will tell us which files match and which don't.
+            //
+            final FileFilter filter = config.buildFileFilter();
+
+            // We have two condition to end the loop: either the list is
+            // empty, meaning there's nothing more to scan, or the state of
+            // the DirectoryScanner was asynchronously switched to STOPPED by
+            // another thread, e.g. because someone called "stop" on the
+            // ScanManagerMXBean
+            //
+            while (!list.isEmpty() && state == RUNNING) {
+
+                // Get and remove the first element in the list.
+                //
+                final File current = list.poll();
+
+                // Increment number of file scanned.
+                task.scanned++;
+
+                // If 'current' is a file, it's already been matched by our
+                // file filter (see below): act on it.
+                // Note that for the first iteration of this loop, there will
+                // be one single file in the list: the root directory for this
+                // scanner.
+                //
+                if (current.isFile()) {
+                    task.matching++;
+                    actOn(current);
+                }
+
+                // If 'current' is a directory, then
+                // find files and directories that match the file filter
+                // in this directory
+                //
+                if (current.isDirectory()) {
+
+                    // Gets matching files and directories
+                    final File[] content = current.listFiles(filter);
+                    if (content == null) continue;
+
+                    // Adds all matching file to the list.
+                    list.addAll(0,Arrays.asList(content));
+                }
+            }
+
+            // The loop terminated. If the list is empty, then we have
+            // completed our task. If not, then somebody must have called
+            // stop() on this directory scanner.
+            //
+            if (list.isEmpty()) {
+                task.info = "Successfully Completed";
+                setStateAndNotify(COMPLETED);
+            }
+        } catch (Exception x) {
+            // We got an exception: stop the scan
+            //
+            task.info = "Failed: "+x;
+            if (LOG.isLoggable(Level.FINEST))
+                LOG.log(Level.FINEST,"scan task failed: "+x,x);
+            else if (LOG.isLoggable(Level.FINE))
+                LOG.log(Level.FINE,"scan task failed: "+x);
+            setStateAndNotify(STOPPED);
+        } catch (Error e) {
+            // We got an Error:
+            // Should not happen unless we ran out of memory or
+            // whatever - don't even try to notify, but
+            // stop the scan anyway!
+            //
+            state=STOPPED;
+            task.info = "Error: "+e;
+
+            // rethrow error.
+            //
+            throw e;
+        }
+    }
+
+    /**
+     * MBeanNotification support - delegates to broadcaster.
+     */
+    public void addNotificationListener(NotificationListener listener,
+            NotificationFilter filter, Object handback)
+            throws IllegalArgumentException {
+        broadcaster.addNotificationListener(listener, filter, handback);
+    }
+
+    // Switch this object state to the desired value an send
+    // a notification. Don't call this method from within a
+    // synchronized block!
+    //
+    private final void setStateAndNotify(ScanState desired) {
+        final ScanState old = state;
+        if (old == desired) return;
+        state = desired;
+        final AttributeChangeNotification n =
+                new AttributeChangeNotification(this,
+                getNextSeqNumber(),System.currentTimeMillis(),
+                "state change","State",ScanState.class.getName(),
+                String.valueOf(old),String.valueOf(desired));
+        broadcaster.sendNotification(n);
+    }
+
+
+    /**
+     * The {@link DirectoryScannerMXBean} may send two types of
+     * notifications: filematch, and state attribute changed.
+     **/
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[] {
+            new MBeanNotificationInfo(
+                    new String[] {FILE_MATCHES_NOTIFICATION},
+                    Notification.class.getName(),
+                    "Emitted when a file that matches the scan criteria is found"
+                    ),
+            new MBeanNotificationInfo(
+                    new String[] {AttributeChangeNotification.ATTRIBUTE_CHANGE},
+                    AttributeChangeNotification.class.getName(),
+                    "Emitted when the State attribute changes"
+                    )
+        };
+    }
+
+    /**
+     * MBeanNotification support - delegates to broadcaster.
+     */
+    public void removeNotificationListener(NotificationListener listener)
+        throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener);
+    }
+
+    /**
+     * MBeanNotification support - delegates to broadcaster.
+     */
+    public void removeNotificationListener(NotificationListener listener,
+            NotificationFilter filter, Object handback)
+            throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener, filter, handback);
+    }
+
+    // Validates the given root directory, returns a File object for
+    // that directory.
+    // Throws IllegalArgumentException if the given root is not
+    // acceptable.
+    //
+    private static File validateRoot(String root) {
+        if (root == null)
+            throw new IllegalArgumentException("no root specified");
+        if (root.length() == 0)
+            throw new IllegalArgumentException("specified root \"\" is invalid");
+        final File f = new File(root);
+        if (!f.canRead())
+            throw new IllegalArgumentException("can't read "+root);
+        if (!f.isDirectory())
+            throw new IllegalArgumentException("no such directory: "+root);
+        return f;
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.java
new file mode 100644
index 0000000..2ca3548
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import java.io.IOException;
+import javax.management.InstanceNotFoundException;
+
+/**
+ * A <code>DirectoryScannerMXBean</code> is an MBean that
+ * scans a file system starting at a given root directory,
+ * and then looks for files that match a given criteria.
+ * <p>
+ * When such a file is found, the <code>DirectoryScannerMXBean</code> takes
+ * the actions for which it was configured: see {@link #scan scan()}.
+ * <p>
+ * <code>DirectoryScannerMXBeans</code> are created, initialized, and
+ * registered by the {@link ScanManagerMXBean}.
+ * The {@link ScanManagerMXBean} will also schedule and run them in
+ * background by calling their {@link #scan} method.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public interface DirectoryScannerMXBean {
+    /**
+     * Get The {@link DirectoryScanner} state.
+     * @return the current state of the <code>DirectoryScanner</code>.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanState getState()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Stops the current scan if {@link ScanState#RUNNING running}.
+     * After this method completes the state of the application will
+     * be {@link ScanState#STOPPED STOPPED}.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void stop()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Scans the file system starting at the specified {@link #getRootDirectory
+     * root directory}.
+     * <p>If a file that matches this <code>DirectoryScannerMXBean</code>
+     * {@link #getConfiguration} criteria is found,
+     * the <code>DirectoryScannerMXBean</code> takes the {@link
+     * DirectoryScannerConfig#getActions() actions} for which
+     * it was {@link #getConfiguration configured}: emit a notification,
+     * <i>and or</i> log a {@link
+     * com.sun.jmx.examples.scandir.config.ResultRecord} for this file,
+     * <i>and or</i> delete that file.
+     * </p>
+     * <p>
+     * The code that would actually delete the file is commented out - so that
+     * nothing valuable is lost if this example is run by mistake on the wrong
+     * set of directories.
+     * </p>
+     * <p>This method returns only when the directory scan is completed, or
+     *    if it was {@link #stop stopped} by another thread.
+     * </p>
+     * @throws IllegalStateException if already {@link ScanState#RUNNING}
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void scan()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the root directory at which this <code>DirectoryScannerMXBean</code>
+     * will start scanning the file system.
+     * <p>
+     * This is a shortcut to {@link #getConfiguration
+     * getConfiguration()}.{@link
+     * DirectoryScannerConfig#getRootDirectory
+     * getRootDirectory()}.
+     * </p>
+     * @return This <code>DirectoryScannerMXBean</code> root directory.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getRootDirectory()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * The configuration data from which this {@link DirectoryScanner} was
+     * created.
+     * <p>
+     * You cannot change this configuration here. You can however
+     * {@link ScanDirConfigMXBean#setConfiguration modify} the
+     * {@link ScanDirConfigMXBean} configuration, and ask the
+     * {@link ScanManagerMXBean} to {@link ScanManagerMXBean#applyConfiguration
+     * apply} it. This will get all <code>DirectoryScannerMXBean</code>
+     * replaced by new MBeans created from the modified configuration.
+     * </p>
+     *
+     * @return This <code>DirectoryScannerMXBean</code> configuration data.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public DirectoryScannerConfig getConfiguration()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * A short string describing what's happening in current/latest scan.
+     * @return a short info string.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getCurrentScanInfo()
+        throws IOException, InstanceNotFoundException;
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManager.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManager.java
new file mode 100644
index 0000000..a0a4bb9
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManager.java
@@ -0,0 +1,534 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber;
+import com.sun.jmx.examples.scandir.config.ResultLogConfig;
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Logger;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.ObjectName;
+import javax.xml.bind.JAXBException;
+
+/**
+ * The <code>ResultLogManager</code> is in charge of managing result logs.
+ * {@link DirectoryScanner DirectoryScanners} can be configured to log a
+ * {@link ResultRecord} whenever they take action upon a file that
+ * matches their set of matching criteria.
+ * The <code>ResultLogManagerMXBean</code> is responsible for storing these
+ * results in its result logs.
+ * <p>The <code>ResultLogManagerMXBean</code> can be configured to log
+ * these records to a flat file, or into a log held in memory, or both.
+ * Both logs (file and memory) can be configured with a maximum capacity.
+ * <br>When the maximum capacity of the memory log is reached - its first
+ * entry (i.e. its eldest entry) is removed to make place for the latest.
+ * <br>When the maximum capacity of the file log is reached, the file is
+ * renamed by appending a tilde '~' to its name and a new result log is created.
+ *
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ResultLogManager extends NotificationBroadcasterSupport
+        implements ResultLogManagerMXBean, MBeanRegistration {
+
+    /**
+     * The default singleton name of the {@link ResultLogManagerMXBean}.
+     **/
+    public static final ObjectName RESULT_LOG_MANAGER_NAME =
+            ScanManager.makeSingletonName(ResultLogManagerMXBean.class);
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ResultLogManager.class.getName());
+
+    // The memory log
+    //
+    private final List<ResultRecord> memoryLog;
+
+    // Whether the memory log capacity was reached. In that case every
+    // new entry triggers the deletion of the eldest one.
+    //
+    private volatile boolean memCapacityReached = false;
+
+    // The maximum number of record that the memory log can
+    // contain.
+    //
+    private volatile int memCapacity;
+
+    // The maximum number of record that the ResultLogManager can
+    // log in the log file before creating a new file.
+    //
+    private volatile long fileCapacity;
+
+    // The current log file.
+    //
+    private volatile File logFile;
+
+    // The OutputStream of the current log file.
+    //
+    private volatile OutputStream logStream = null;
+
+    // number of record that this object has logged in the log file
+    // since the log file was created. Creating a new file or clearing
+    // the log file reset this value to '0'
+    //
+    private volatile long logCount = 0;
+
+    // The ResultLogManager config - modified whenever
+    // ScanManager.applyConfiguration is called.
+    //
+    private volatile ResultLogConfig config;
+
+    /**
+     * Create a new ResultLogManagerMXBean. This constructor is package
+     * protected: only the {@link ScanManager} can create a
+     * <code>ResultLogManager</code>.
+     **/
+    ResultLogManager() {
+        // Instantiate the memory log - override the add() method so that
+        // it removes the head of the list when the maximum capacity is
+        // reached. Note that add() is the only method we will be calling,
+        // otherwise we would have to override all the other flavors
+        // of adding methods. Note also that this implies that the memoryLog
+        // will *always* remain encapsulated in this object and is *never*
+        // handed over (otherwise we wouldn't be able to ensure that
+        // add() is the only method ever called to add a record).
+        //
+        memoryLog =
+                Collections.synchronizedList(new LinkedList<ResultRecord>() {
+            public synchronized boolean add(ResultRecord e) {
+                final int max = getMemoryLogCapacity();
+                while (max > 0 && size() >= max) {
+                    memCapacityReached = true;
+                    removeFirst();
+                }
+                return super.add(e);
+            }
+        });
+
+        // default memory capacity
+        memCapacity = 2048;
+
+        // default file capacity: 0 means infinite ;-)
+        fileCapacity = 0;
+
+        // by default logging to file is disabled.
+        logFile = null;
+
+        // Until the ScanManager apply a new configuration, we're going to
+        // work with a default ResultLogConfig object.
+        config = new ResultLogConfig();
+        config.setMemoryMaxRecords(memCapacity);
+        config.setLogFileName(getLogFileName(false));
+        config.setLogFileMaxRecords(fileCapacity);
+    }
+
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * registered in the MBean server.
+     * <p>If the name of the MBean is not
+     * specified, the MBean can provide a name for its registration. If
+     * any exception is raised, the MBean will not be registered in the
+     * MBean server.</p>
+     * <p>The {@code ResultLogManager} uses this method to supply its own
+     * default singleton ObjectName (if <var>name</var> parameter is null).
+     * @param server The MBean server in which the MBean will be registered.
+     * @param name The object name of the MBean. This name is null if the
+     * name parameter to one of the createMBean or registerMBean methods in
+     * the MBeanServer interface is null. In that case, this method must
+     * return a non-null ObjectName for the new MBean.
+     * @return The name under which the MBean is to be registered. This value
+     * must not be null. If the name parameter is not null, it will usually
+     * but not necessarily be the returned value.
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name)
+    throws Exception {
+        if (name == null)
+            name = RESULT_LOG_MANAGER_NAME;
+        objectName = name;
+        mbeanServer = server;
+        return name;
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having
+     * been registered in the MBean server or after the registration has
+     * failed.
+     * <p>This implementation does nothing.</p>
+     * @param registrationDone Indicates whether or not the MBean has been
+     * successfully registered in the MBean server. The value false means
+     * that the registration has failed.
+     */
+    public void postRegister(Boolean registrationDone) {
+        // Don't need to do anything here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * unregistered by the MBean server.
+     * <p>This implementation does nothing.</p>
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        // Don't need to do anything here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having been
+     * unregistered in the MBean server.
+     * <p>Closes the log file stream, if it is still open.</p>
+     */
+    public void postDeregister() {
+        try {
+            if (logStream != null) {
+                synchronized(this)  {
+                    logStream.flush();
+                    logStream.close();
+                    logFile = null;
+                    logStream = null;
+                }
+            }
+        } catch (Exception x) {
+            LOG.finest("Failed to close log properly: "+x);
+        }
+    }
+
+    /**
+     * Create a new empty log file from the given basename, renaming
+     * previously existing file by appending '~' to its name.
+     **/
+    private File createNewLogFile(String basename) throws IOException {
+        return XmlConfigUtils.createNewXmlFile(basename);
+    }
+
+    /**
+     * Check whether a new log file should be created.
+     * If a new file needs to be created, creates it, renaming
+     * previously existing file by appending '~' to its name.
+     * Also reset the log count and file capacity.
+     * Sends a notification indicating that the log file was changed.
+     * Returns the new log stream;
+     * Creation of a new file can be forced by passing force=true.
+     **/
+    private OutputStream checkLogFile(String basename, long maxRecords,
+                                      boolean force)
+    throws IOException {
+        final OutputStream newStream;
+        synchronized(this) {
+            if ((force==false) && (logCount < maxRecords))
+                return logStream;
+            final OutputStream oldStream = logStream;
+
+            // First close the stream. On some platforms you cannot rename
+            // a file that has open streams...
+            //
+            if (oldStream != null) {
+                oldStream.flush();
+                oldStream.close();
+            }
+            final File newFile = (basename==null)?null:createNewLogFile(basename);
+
+            newStream = (newFile==null)?null:new FileOutputStream(newFile,true);
+            logStream = newStream;
+            logFile = newFile;
+            fileCapacity = maxRecords;
+            logCount = 0;
+        }
+        sendNotification(new Notification(LOG_FILE_CHANGED,objectName,
+                getNextSeqNumber(),
+                basename));
+        return newStream;
+    }
+
+    // see ResultLogManagerMXBean
+    public void log(ResultRecord record)
+    throws IOException {
+        if (memCapacity > 0) logToMemory(record);
+        if (logFile != null) logToFile(record);
+    }
+
+    // see ResultLogManagerMXBean
+    public ResultRecord[] getMemoryLog() {
+        return memoryLog.toArray(new ResultRecord[0]);
+    }
+
+    // see ResultLogManagerMXBean
+    public int getMemoryLogCapacity() {
+        return memCapacity;
+    }
+
+    // see ResultLogManagerMXBean
+    public void setMemoryLogCapacity(int maxRecords)  {
+        synchronized(this) {
+            memCapacity = maxRecords;
+            if (memoryLog.size() < memCapacity)
+                memCapacityReached = false;
+            config.setMemoryMaxRecords(maxRecords);
+        }
+    }
+
+    // see ResultLogManagerMXBean
+    public void setLogFileCapacity(long maxRecords)
+    throws IOException {
+        synchronized (this) {
+            fileCapacity = maxRecords;
+            config.setLogFileMaxRecords(maxRecords);
+        }
+        checkLogFile(getLogFileName(),fileCapacity,false);
+    }
+
+    // see ResultLogManagerMXBean
+    public long getLogFileCapacity()  {
+        return fileCapacity;
+    }
+
+    // see ResultLogManagerMXBean
+    public long getLoggedCount() {
+        return logCount;
+    }
+
+    // see ResultLogManagerMXBean
+    public void newLogFile(String logname, long maxRecord)
+    throws IOException {
+        checkLogFile(logname,maxRecord,true);
+        config.setLogFileName(getLogFileName(false));
+        config.setLogFileMaxRecords(getLogFileCapacity());
+    }
+
+    // see ResultLogManagerMXBean
+    public String getLogFileName() {
+        return getLogFileName(true);
+    }
+
+    // see ResultLogManagerMXBean
+    public void clearLogs() throws IOException {
+        clearMemoryLog();
+        clearLogFile();
+    }
+
+    // Clear the memory log, sends a notification indicating that
+    // the memory log was cleared.
+    //
+    private void clearMemoryLog()throws IOException {
+        synchronized(this) {
+            memoryLog.clear();
+            memCapacityReached = false;
+        }
+        sendNotification(new Notification(MEMORY_LOG_CLEARED,
+                objectName,
+                getNextSeqNumber(),"memory log cleared"));
+    }
+
+    // Clears the log file.
+    //
+    private void clearLogFile() throws IOException {
+        // simply force the creation of a new log file.
+        checkLogFile(getLogFileName(),fileCapacity,true);
+    }
+
+    // Log a record to the memory log. Send a notification if the
+    // maximum capacity of the memory log is reached.
+    //
+    private void logToMemory(ResultRecord record) {
+
+        final boolean before = memCapacityReached;
+        final boolean after;
+        synchronized(this) {
+            memoryLog.add(record);
+            after = memCapacityReached;
+        }
+        if (before==false && after==true)
+            sendNotification(new Notification(MEMORY_LOG_MAX_CAPACITY,
+                    objectName,
+                    getNextSeqNumber(),"memory log capacity reached"));
+    }
+
+
+    // Log a record to the memory log. Send a notification if the
+    // maximum capacity of the memory log is reached.
+    //
+    private void logToFile(ResultRecord record) throws IOException {
+        final String basename;
+        final long   maxRecords;
+        synchronized (this) {
+            if (logFile == null) return;
+            basename = getLogFileName(false);
+            maxRecords = fileCapacity;
+        }
+
+        // Get the stream into which we should log.
+        final OutputStream stream =
+                checkLogFile(basename,maxRecords,false);
+
+        // logging to file now disabled - too bad.
+        if (stream == null) return;
+
+        synchronized (this) {
+            try {
+                XmlConfigUtils.write(record,stream,true);
+                stream.flush();
+                // don't increment logCount if we were not logging in logStream.
+                if (stream == logStream) logCount++;
+            } catch (JAXBException x) {
+                final IllegalArgumentException iae =
+                        new IllegalArgumentException("bad record",x);
+                LOG.finest("Failed to log record: "+x);
+                throw iae;
+            }
+        }
+    }
+
+    /**
+     * The notification type which indicates that the log file was switched:
+     * <i>com.sun.jmx.examples.scandir.log.file.switched</i>.
+     * The message contains the name of the new file (or null if log to file
+     * is now disabled).
+     **/
+    public final static String LOG_FILE_CHANGED =
+            "com.sun.jmx.examples.scandir.log.file.switched";
+
+    /**
+     * The notification type which indicates that the memory log capacity has
+     * been reached:
+     * <i>com.sun.jmx.examples.scandir.log.memory.full</i>.
+     **/
+    public final static String MEMORY_LOG_MAX_CAPACITY =
+            "com.sun.jmx.examples.scandir.log.memory.full";
+
+    /**
+     * The notification type which indicates that the memory log was
+     * cleared:
+     * <i>com.sun.jmx.examples.scandir.log.memory.cleared</i>.
+     **/
+    public final static String MEMORY_LOG_CLEARED =
+            "com.sun.jmx.examples.scandir.log.memory.cleared";
+
+    /**
+     * This MBean emits three kind of notifications:
+     * <pre>
+     *    <i>com.sun.jmx.examples.scandir.log.file.switched</i>
+     *    <i>com.sun.jmx.examples.scandir.log.memory.full</i>
+     *    <i>com.sun.jmx.examples.scandir.log.memory.cleared</i>
+     * </pre>
+     **/
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[] {
+            new MBeanNotificationInfo(new String[] {
+                LOG_FILE_CHANGED},
+                    Notification.class.getName(),
+                    "Emitted when the log file is switched")
+                    ,
+            new MBeanNotificationInfo(new String[] {
+                MEMORY_LOG_MAX_CAPACITY},
+                    Notification.class.getName(),
+                    "Emitted when the memory log capacity is reached")
+                    ,
+            new MBeanNotificationInfo(new String[] {
+                MEMORY_LOG_CLEARED},
+                    Notification.class.getName(),
+                    "Emitted when the memory log is cleared")
+        };
+    }
+
+    // Return the name of the log file, or null if logging to file is
+    // disabled.
+    private String getLogFileName(boolean absolute) {
+        synchronized (this) {
+            if (logFile == null) return null;
+            if (absolute) return logFile.getAbsolutePath();
+            return logFile.getPath();
+        }
+    }
+
+    // This method is be called by the ScanManagerMXBean when a configuration
+    // is applied.
+    //
+    void setConfig(ResultLogConfig logConfigBean) throws IOException {
+        if (logConfigBean == null)
+            throw new IllegalArgumentException("logConfigBean is null");
+        synchronized (this) {
+            config = logConfigBean;
+            setMemoryLogCapacity(config.getMemoryMaxRecords());
+        }
+        final String filename = config.getLogFileName();
+        final String logname  = getLogFileName(false);
+        if ((filename != null && !filename.equals(logname))
+        || (filename == null && logname != null)) {
+            newLogFile(config.getLogFileName(),
+                    config.getLogFileMaxRecords());
+        } else {
+            setLogFileCapacity(config.getLogFileMaxRecords());
+        }
+    }
+
+    // This method is called by the ScanManagerMXBean when
+    // applyCurrentResultLogConfig() is called.
+    //
+    ResultLogConfig getConfig() {
+        return config;
+    }
+
+
+    // Set by preRegister().
+    private MBeanServer mbeanServer;
+    private ObjectName objectName;
+
+
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.java
new file mode 100644
index 0000000..eb1f0f6
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import java.io.IOException;
+import javax.management.InstanceNotFoundException;
+
+/**
+ * The <code>ResultLogManagerMXBean</code> is in charge of managing result logs.
+ * {@link DirectoryScanner DirectoryScanners} can be configured to log a
+ * {@link ResultRecord} whenever they take action upon a file that
+ * matches their set of matching criteria.
+ * The <code>ResultLogManagerMXBean</code> is responsible for storing these
+ * results in its result logs.
+ * <p>The <code>ResultLogManagerMXBean</code>
+ * will let you interactively clear these result logs, change their
+ * capacity, and decide where (memory or file or both) the
+ * {@link ResultRecord ResultRecords} should be stored.
+ * <p>The memory log is useful in so far that its content can be interactively
+ * returned by the <code>ResultLogManagerMXBean</code>.
+ * The file log doesn't have this facility.
+ * <p>The result logs are intended to be used by e.g. an offline program that
+ * would take some actions on the files that were matched by the scanners
+ * criteria:
+ * <p>The <i>scandir</i> application could be configured to only produce logs
+ * (i.e. takes no action but logging the matching files), and the real
+ * action (e.g. mail the result log to the engineer which maintains the lab,
+ * or parse the log and prepare and send a single mail to the matching
+ * files owners, containing the list of file he/she should consider deleting)
+ * could be performed by such another program/module.
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public interface ResultLogManagerMXBean {
+
+    /**
+     * Creates a new log file in which to store results.
+     * <p>When this method is called, the {@link ResultLogManager} will stop
+     * logging in its current log file and use the new specified file instead.
+     * If that file already exists, it will be renamed by appending a '~' to
+     * its name, and a new empty file with the name specified by
+     * <var>basename</var> will be created.
+     * </p>
+     * <p>Calling this method has no side effect on the {@link
+     * com.sun.jmx.examples.scandir.config.ScanManagerConfig#getInitialResultLogConfig
+     * InitialResultLogConfig} held in the {@link ScanDirConfigMXBean}
+     * configuration. To apply these new values to the
+     * {@link ScanDirConfigMXBean}
+     * configuration, you must call {@link
+     * ScanManagerMXBean#applyCurrentResultLogConfig
+     * ScanManagerMXBean.applyCurrentResultLogConfig}.
+     *<p>
+     * @param basename The name of the new log file. This will be the
+     *        new name returned by {@link #getLogFileName}.
+     * @param maxRecord maximum number of records to log in the specified file
+     *        before creating a new file. <var>maxRecord</var> will be the
+     *        new value returned by {@link #getLogFileCapacity}.
+     *        When that maximum number of
+     *        records is reached the {@link ResultLogManager} will rename
+     *        the file by appending a '~' to its name, and a new empty
+     *        log file will be created.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void newLogFile(String basename, long maxRecord)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Logs a result record to the active result logs (memory,file,both,or none)
+     * depending on how this MBean is currently configured.
+     * @see #getLogFileName()
+     * @see #getMemoryLogCapacity()
+     * @param record The result record to log.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void log(ResultRecord record)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the name of the current result log file.
+     * <p><code>null</code> means that no log file is configured: logging
+     * to file is disabled.
+     * </p>
+     * @return The name of the current result log file, or <code>null</code>
+     *         if logging to file is disabled.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getLogFileName()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the whole content of the memory log. This cannot exceed
+     * {@link #getMemoryLogCapacity} records.
+     *
+     * @return the whole content of the memory log.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ResultRecord[] getMemoryLog()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the maximum number of records that can be logged in the
+     * memory log.
+     * <p>
+     * A non positive value - <code>0</code> or negative - means that
+     * logging in memory is disabled.
+     * </p>
+     * <p>The memory log is a FIFO: when its maximum capacity is reached, its
+     *    head element is removed to make place for a new element at its tail.
+     * </p>
+     * @return The maximum number of records that can be logged in the
+     * memory log. A value {@code <= 0} means that logging in memory is
+     * disabled.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public int getMemoryLogCapacity()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Sets the maximum number of records that can be logged in the
+     * memory log.
+     * <p>The memory log is a FIFO: when its maximum capacity is reached, its
+     *    head element is removed to make place for a new element at its tail.
+     * </p>
+     * @param size The maximum number of result records that can be logged in the memory log.  <p>
+     * A non positive value - <code>0</code> or negative - means that
+     * logging in memory is disabled. It will also have the side
+     * effect of clearing the memory log.
+     * </p>
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void setMemoryLogCapacity(int size)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Sets the maximum number of records that can be logged in the result log
+     * file.
+     * <p>When that maximum number of
+     * records is reached the {@link ResultLogManager} will rename
+     * the result log file by appending a '~' to its name, and a new empty
+     * log file will be created.
+     * </p>
+     * <p>If logging to file is disabled calling this method
+     *    is irrelevant.
+     * </p>
+     * @param maxRecord maximum number of records to log in the result log file.
+     * @see #getLogFileName()
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void setLogFileCapacity(long maxRecord)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the maximum number of records that can be logged in the result log
+     * file.
+     * <p>When that maximum number of
+     * records is reached the {@link ResultLogManager} will rename
+     * the result log file by appending a '~' to its name, and a new empty
+     * log file will be created.
+     * </p>
+     * @see #getLogFileName()
+     * @return The maximum number of records that can be logged in the result
+     *         log file.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public long getLogFileCapacity()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets The number of records that have been logged in the
+     * current result log file. This will always be less than
+     * {@link #getLogFileCapacity()}.
+     * @return The number of records in the
+     *         current result log file.
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public long getLoggedCount()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Clears the memory log and result log file.
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void clearLogs()
+        throws IOException, InstanceNotFoundException;
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirAgent.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirAgent.java
new file mode 100644
index 0000000..f4bf1b6
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirAgent.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
+import javax.management.JMException;
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationListener;
+
+/**
+ * <p>
+ * The <code>ScanDirAgent</code> is the Agent class for the <i>scandir</i>
+ * application.
+ * This class contains the {@link #main} method to start a standalone
+ * <i>scandir</i> application.
+ * </p>
+ * <p>
+ * The {@link #main main()} method simply registers a {@link
+ * ScanManagerMXBean} in the platform MBeanServer - see {@link #init init},
+ * and then waits for someone to call {@link ScanManagerMXBean#close close}
+ * on that MBean.
+ * </p>
+ * <p>
+ * When the {@link ScanManagerMXBean} state is switched to {@link
+ * ScanManagerMXBean.ScanState#CLOSED CLOSED}, {@link #cleanup cleanup} is
+ * called, the {@link ScanManagerMXBean} is unregistered, and the application
+ * terminates (i.e. the main thread completes).
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+public class ScanDirAgent {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ScanDirAgent.class.getName());
+
+    // Proxy to the ScanManagerMXBean - created by init();
+    //
+    private volatile ScanManagerMXBean proxy = null;
+
+    // A queue to put received Notifications.
+    //
+    private final BlockingQueue<Notification> queue;
+
+    // A listener that will put notifications into the queue.
+    //
+    private final NotificationListener listener;
+
+    /**
+     * Creates a new instance of ScanDirAgent
+     * You will need to call {@link #init()} later on in order to initialize
+     * the application.
+     * @see #main
+     **/
+    public ScanDirAgent() {
+        // Initialize the notification queue
+        queue = new LinkedBlockingQueue<Notification>();
+
+        // Creates the listener.
+        listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                                           Object handback) {
+                try {
+                    // Just put the received notification in the queue.
+                    // It will be consumed later on by 'waitForClose()'
+                    //
+                    LOG.finer("Queuing received notification "+notification);
+                    queue.put(notification);
+                } catch (InterruptedException ex) {
+                    // OK
+                }
+            }
+        };
+    }
+
+    /**
+     * Initialize the application by registering a ScanManagerMXBean in
+     * the platform MBeanServer
+     * @throws java.io.IOException Registration failed for communication-related reasons.
+     * @throws javax.management.JMException Registration failed for JMX-related reasons.
+     */
+    public void init() throws IOException, JMException {
+
+        // Registers the ScanManagerMXBean singleton in the
+        // platform MBeanServer
+        //
+        proxy = ScanManager.register();
+
+        // Registers a NotificationListener with the ScanManagerMXBean in
+        // order to receive state changed notifications.
+        //
+        ((NotificationEmitter)proxy).addNotificationListener(listener,null,null);
+    }
+
+    /**
+     * Cleanup after close: unregister the ScanManagerMXBean singleton.
+     * @throws java.io.IOException Cleanup failed for communication-related reasons.
+     * @throws javax.management.JMException Cleanup failed for JMX-related reasons.
+     */
+    public void cleanup() throws IOException, JMException {
+        try {
+            ((NotificationEmitter)proxy).
+                    removeNotificationListener(listener,null,null);
+        } finally {
+            ManagementFactory.getPlatformMBeanServer().
+                unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+        }
+    }
+
+    /**
+     * Wait for someone to call 'close()' on the ScanManagerMXBean singleton.
+     * Every time its state changes, the ScanManagerMXBean emits a notification.
+     * We don't rely on the notification content (if we were using a remote
+     * connection, we could miss some notifications) - we simply use the
+     * state change notifications to react more quickly to state changes.
+     * We do so simply by polling the {@link BlockingQueue} in which our
+     * listener is pushing notifications, and checking the ScanManagerMXBean
+     * state every time that a notification is received.
+     * <p>
+     * We can do so because we know that once the ScanManagerMXBean state is
+     * switched to 'CLOSED', it will remain 'CLOSED' whatsoever. <br>
+     * Therefore we don't need to concern ourselves with the possibility of
+     * missing the window in which the ScanManagerMXBean state's will be
+     * CLOSED, because that particular window stays opened forever.
+     * <p>
+     * Had we wanted to wait for 'RUNNING', we would have needed to apply
+     * a different strategy - e.g. by taking into account the actual content
+     * of the state changed notifications we received.
+     * @throws java.io.IOException wait failed - a communication problem occurred.
+     * @throws javax.management.JMException wait failed - the MBeanServer threw an exception.
+     */
+    public void waitForClose() throws IOException, JMException {
+
+        // Wait until state is closed
+        while(proxy.getState() != ScanState.CLOSED ) {
+            try {
+                // Wake up at least every 30 seconds - if we missed a
+                // notification - we will at least get a chance to
+                // call getState(). 30 seconds is obviously quite
+                // arbitrary - if this were a real daemon - id'be tempted
+                // to wait 30 minutes - knowing that any incoming
+                // notification will wake me up anyway.
+                // Note: we simply use the state change notifications to
+                // react more quickly to state changes: see javadoc above.
+                //
+                queue.poll(30,TimeUnit.SECONDS);
+            } catch (InterruptedException ex) {
+                // OK
+            }
+        }
+    }
+
+    /**
+     * The agent's main: {@link #init registers} a {@link ScanManagerMXBean},
+     * {@link #waitForClose waits} until its state is {@link
+     * ScanManagerMXBean.ScanState#CLOSED CLOSED}, {@link #cleanup cleanup}
+     * and exits.
+     * @param args the command line arguments - ignored
+     * @throws java.io.IOException A communication problem occurred.
+     * @throws javax.management.JMException A JMX problem occurred.
+     */
+    public static void main(String[] args)
+        throws IOException, JMException {
+        System.out.println("Initializing ScanManager...");
+        final ScanDirAgent agent = new ScanDirAgent();
+        agent.init();
+        try {
+            System.out.println("Waiting for ScanManager to close...");
+            agent.waitForClose();
+        } finally {
+            System.out.println("Cleaning up...");
+            agent.cleanup();
+        }
+    }
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirClient.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirClient.java
new file mode 100644
index 0000000..442a607
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirClient.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.management.MBeanServerConnection;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.rmi.ssl.SslRMIClientSocketFactory;
+
+/**
+ * The ScanDirClient class is a very simple programmatic client example
+ * which is able to connect to a secured JMX <i>scandir</i> application.
+ * <p>The program initialize the connection environment map with the
+ * appropriate properties and credentials, and then connects to the
+ * secure JMX <i>scandir</i> daemon.</p>
+ * <p>It gets the application's current configuration and prints it on
+ * its <code>System.out</code>.</p>
+ * <p>The {@link #main main} method takes two arguments: the host on which
+ * the server is running (localhost), and the port number
+ * that was configured to start the server RMI Connector (4545).
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+public class ScanDirClient {
+
+    // This class has only a main.
+    private ScanDirClient() { }
+
+    /**
+     * The usage string for the ScanDirClient.
+     */
+    public static final String USAGE = ScanDirClient.class.getSimpleName() +
+            " <server-host> <rmi-port-number>";
+
+    /**
+     * Connects to a secured JMX <i>scandir</i> application.
+     * @param args The {@code main} method takes two parameters:
+     *        <ul>
+     *        <li>args[0] must be the server's host</li>
+     *        <li>args[1] must be the rmi port number at which the
+     *        JMX <i>scandir</i> daemon is listening for connections
+     *        - that is, the port number of its JMX RMI Connector which
+     *        was configured in {@code management.properties}
+     *        </li>
+     *        <ul>
+     **/
+    public static void main(String[] args) {
+        try {
+            // Check args
+            //
+            if (args==null || args.length!=2) {
+                System.err.println("Bad number of arguments: usage is: \n\t" +
+                        USAGE);
+                System.exit(1);
+            }
+            try {
+                InetAddress.getByName(args[0]);
+            } catch (UnknownHostException x) {
+                System.err.println("No such host: " + args[0]+
+                            "\n usage is: \n\t" + USAGE);
+                System.exit(2);
+            } catch (Exception x) {
+                System.err.println("Bad address: " + args[0]+
+                            "\n usage is: \n\t" + USAGE);
+                System.exit(2);
+            }
+            try {
+                if (Integer.parseInt(args[1]) <= 0) {
+                    System.err.println("Bad port value: " + args[1]+
+                            "\n usage is: \n\t" + USAGE);
+                    System.exit(2);
+                }
+            } catch (Exception x) {
+                System.err.println("Bad argument: " + args[1]+
+                        "\n usage is: \n\t" + USAGE);
+                System.exit(2);
+            }
+
+            // Create an environment map to hold connection properties
+            // like credentials etc... We will later pass this map
+            // to the JMX Connector.
+            //
+            System.out.println("\nInitialize the environment map");
+            final Map<String,Object> env = new HashMap<String,Object>();
+
+            // Provide the credentials required by the server
+            // to successfully perform user authentication
+            //
+            final String[] credentials = new String[] { "guest" , "guestpasswd" };
+            env.put("jmx.remote.credentials", credentials);
+
+            // Provide the SSL/TLS-based RMI Client Socket Factory required
+            // by the JNDI/RMI Registry Service Provider to communicate with
+            // the SSL/TLS-protected RMI Registry
+            //
+            env.put("com.sun.jndi.rmi.factory.socket",
+                    new SslRMIClientSocketFactory());
+
+            // Create the RMI connector client and
+            // connect it to the RMI connector server
+            // args[0] is the server's host - localhost
+            // args[1] is the secure server port - 4545
+            //
+            System.out.println("\nCreate the RMI connector client and " +
+                    "connect it to the RMI connector server");
+            final JMXServiceURL url = new JMXServiceURL(
+                    "service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1] +
+                    "/jmxrmi");
+
+            System.out.println("Connecting to: "+url);
+            final JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
+
+            // Get an MBeanServerConnection
+            //
+            System.out.println("\nGet the MBeanServerConnection");
+            final MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
+
+            // Create a proxy for the ScanManager MXBean
+            //
+            final ScanManagerMXBean proxy =
+                    ScanManager.newSingletonProxy(mbsc);
+
+            // Get the ScanDirConfig MXBean from the scan manager
+            //
+            System.out.println(
+                    "\nGet ScanDirConfigMXBean from ScanManagerMXBean");
+            final ScanDirConfigMXBean configMBean =
+                    proxy.getConfigurationMBean();
+
+            // Print the scan dir configuration
+            //
+            System.out.println(
+                    "\nGet 'Configuration' attribute on ScanDirConfigMXBean");
+            System.out.println("\nConfiguration:\n" +
+                    configMBean.getConfiguration());
+
+            // Try to invoke the "close" method on the ScanManager MXBean.
+            //
+            // Should get a SecurityException as the user "guest" doesn't
+            // have readwrite access.
+            //
+            System.out.println("\nInvoke 'close' on ScanManagerMXBean");
+            try {
+                proxy.close();
+            } catch (SecurityException e) {
+                System.out.println("\nGot expected security exception: " + e);
+            }
+
+            // Close MBeanServer connection
+            //
+            System.out.println("\nClose the connection to the server");
+            jmxc.close();
+            System.out.println("\nBye! Bye!");
+        } catch (Exception e) {
+            System.out.println("\nGot unexpected exception: " + e);
+            e.printStackTrace();
+            System.exit(3);
+        }
+    }
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfig.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfig.java
new file mode 100644
index 0000000..7ecd8a1
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfig.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber;
+import static com.sun.jmx.examples.scandir.ScanDirConfigMXBean.SaveState.*;
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.FileMatch;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.*;
+import javax.xml.bind.JAXBException;
+
+/**
+ * <p>The <code>ScanDirConfig</code> MBean is in charge of the
+ * <i>scandir</i> application configuration.
+ * </p>
+ * <p>The <code>ScanDirConfig</code> MBean is able to
+ * load and save the <i>scandir</i> application configuration to and from an
+ * XML file.
+ * </p>
+ * <p>
+ * It will let you also interactively modify that configuration, which you
+ * can later save to the file, by calling {@link #save}, or discard, by
+ * reloading the file without saving - see {@link #load}.
+ * </p>
+ * <p>
+ * There can be as many <code>ScanDirConfigMXBean</code> registered
+ * in the MBeanServer as you like, but only one of them will be identified as
+ * the current configuration of the {@link ScanManagerMXBean}.
+ * You can switch to another configuration by calling {@link
+ * ScanManagerMXBean#setConfigurationMBean
+ * ScanManagerMXBean.setConfigurationMBean}.
+ * </p>
+ * <p>
+ * Once the current configuration has been loaded (by calling {@link #load})
+ * or modified (by calling one of {@link #addDirectoryScanner
+ * addDirectoryScanner}, {@link #removeDirectoryScanner removeDirectoryScanner}
+ * or {@link #setConfiguration setConfiguration}) it can be pushed
+ * to the {@link ScanManagerMXBean} by calling {@link
+ * ScanManagerMXBean#applyConfiguration
+ * ScanManagerMXBean.applyConfiguration(true)} -
+ * <code>true</code> means that we apply the configuration from memory,
+ * without first reloading the file.
+ * </p>
+ * <p>
+ * The <code>ScanDirConfig</code> uses the XML annotated Java Beans defined
+ * in the {@link com.sun.jmx.examples.scandir.config} package.
+ * </p>
+ * <p>
+ * <u>Note:</u> The <code>ScanDirConfig</code> should probably use
+ * {@code java.nio.channels.FileLock} and lock its configuration file so that
+ * two <code>ScanDirConfig</code> object do not share the same file, but it
+ * doesn't. Feel free to improve the application in that way.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanDirConfig extends NotificationBroadcasterSupport
+        implements ScanDirConfigMXBean, MBeanRegistration {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ScanDirConfig.class.getName());
+
+    // We will emit a notification when the save state of this object
+    // chenges. We use directly the base notification class, with a
+    // notification type that indicates the new state at which the
+    // object has arrived.
+    //
+    // All these notification types will have the same prefix, which is
+    // 'com.sun.jmx.examples.scandir.config'.
+    //
+    private final static String NOTIFICATION_PREFIX =
+            ScanManagerConfig.class.getPackage().getName();
+
+    /**
+     * The <i>com.sun.jmx.examples.scandir.config.saved</i> notification
+     * indicates that the configuration data was saved.
+     **/
+    public final static String NOTIFICATION_SAVED =
+            NOTIFICATION_PREFIX+".saved";
+    /**
+     * The <i>com.sun.jmx.examples.scandir.config.loaded</i> notification
+     * indicates that the configuration data was loaded.
+     **/
+    public final static String NOTIFICATION_LOADED =
+            NOTIFICATION_PREFIX+".loaded";
+
+    /**
+     * The <i>com.sun.jmx.examples.scandir.config.modified</i> notification
+     * indicates that the configuration data was modified.
+     **/
+    public final static String NOTIFICATION_MODIFIED =
+            NOTIFICATION_PREFIX+".modified";
+
+    // The array of MBeanNotificationInfo that will be exposed in the
+    // ScanDirConfigMXBean MBeanInfo.
+    // We will pass this array to the NotificationBroadcasterSupport
+    // constructor.
+    //
+    private static MBeanNotificationInfo[] NOTIFICATION_INFO = {
+        new MBeanNotificationInfo(
+                new String[] {NOTIFICATION_SAVED},
+                Notification.class.getName(),
+                "Emitted when the configuration is saved"),
+        new MBeanNotificationInfo(
+                new String[] {NOTIFICATION_LOADED},
+                Notification.class.getName(),
+                "Emitted when the configuration is loaded"),
+        new MBeanNotificationInfo(
+                new String[] {NOTIFICATION_MODIFIED},
+                Notification.class.getName(),
+                "Emitted when the configuration is modified"),
+    };
+
+     // The ScanDirConfigMXBean configuration data.
+    private volatile ScanManagerConfig config;
+
+    // The name of the configuration file
+    private String filename = null;
+
+    // The name of this configuration. This is usually both equal to
+    // config.getName() and objectName.getKeyProperty(name).
+    private volatile String configname = null;
+
+    // This object save state. CREATED is the initial state.
+    //
+    private volatile SaveState status = CREATED;
+
+    /**
+     * Creates a new {@link ScanDirConfigMXBean}.
+     * <p>{@code ScanDirConfigMXBean} can be created by the {@link
+     * ScanManagerMXBean}, or directly by a remote client, using
+     * {@code createMBean} or {@code registerMBean}.
+     * </p>
+     * <p>{@code ScanDirConfigMXBean} created by the {@link
+     * ScanManagerMXBean} will be unregistered by the
+     * {@code ScanManagerMXBean}. {@code ScanDirConfigMXBean} created
+     * directly by a remote client will not be unregistered by the
+     * {@code ScanManagerMXBean} - this will remain to the responsibility of
+     * the code/client that created them.
+     * </p>
+     * <p>This object is created empty, you should call load() if you want it
+     *    to load its data from the configuration file.
+     * </p>
+     * @param  filename The configuration file used by this MBean.
+     *         Can be null (in which case load() and save() will fail).
+     *         Can point to a file that does not exists yet (in which case
+     *         load() will fail if called before save(), and save() will
+     *         attempt to create that file). Can point to an existing file,
+     *         in which case load() will load that file and save() will save
+     *         to that file.
+     *
+     **/
+    public ScanDirConfig(String filename) {
+        this(filename,null);
+    }
+
+    /**
+     * Create a new ScanDirConfig MBean with an initial configuration.
+     * @param filename The name of the configuration file.
+     * @param initialConfig an initial configuration.
+     **/
+    public ScanDirConfig(String filename, ScanManagerConfig initialConfig) {
+        super(NOTIFICATION_INFO);
+        this.filename = filename;
+        this.config = initialConfig;
+    }
+
+
+    // see ScanDirConfigMXBean
+    public void load() throws IOException {
+        if (filename == null)
+            throw new UnsupportedOperationException("load");
+
+        synchronized(this) {
+            config = new XmlConfigUtils(filename).readFromFile();
+            if (configname != null) config = config.copy(configname);
+            else configname = config.getName();
+
+            status=LOADED;
+        }
+        sendNotification(NOTIFICATION_LOADED);
+    }
+
+    // see ScanDirConfigMXBean
+    public void save() throws IOException {
+        if (filename == null)
+            throw new UnsupportedOperationException("load");
+        synchronized (this) {
+            new XmlConfigUtils(filename).writeToFile(config);
+            status = SAVED;
+        }
+        sendNotification(NOTIFICATION_SAVED);
+    }
+
+    // see ScanDirConfigMXBean
+    public ScanManagerConfig getConfiguration() {
+        synchronized (this) {
+            return XmlConfigUtils.xmlClone(config);
+        }
+    }
+
+
+    // sends a notification indicating the new save state.
+    private void sendNotification(String type) {
+        final Object source = (objectName==null)?this:objectName;
+        final Notification n = new Notification(type,source,
+                getNextSeqNumber(),
+                "The configuration is "+
+                type.substring(type.lastIndexOf('.')+1));
+        sendNotification(n);
+    }
+
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * registered in the MBean server. If the name of the MBean is not
+     * specified, the MBean can provide a name for its registration. If
+     * any exception is raised, the MBean will not be registered in the
+     * MBean server.
+     * @param server The MBean server in which the MBean will be registered.
+     * @param name The object name of the MBean. This name is null if the
+     * name parameter to one of the createMBean or registerMBean methods in
+     * the MBeanServer interface is null. In that case, this method will
+     * try to guess its MBean name by examining its configuration data.
+     * If its configuration data is null (nothing was provided in the
+     * constructor) or doesn't contain a name, this method returns {@code null},
+     * and registration will fail.
+     * <p>
+     * Otherwise, if {@code name} wasn't {@code null} or if a default name could
+     * be constructed, the name of the configuration will be set to
+     * the value of the ObjectName's {@code name=} key, and the configuration
+     * data will always be renamed to reflect this change.
+     * </p>
+     *
+     * @return The name under which the MBean is to be registered.
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name)
+        throws Exception {
+        if (name == null) {
+            if (config == null) return null;
+            if (config.getName() == null) return null;
+            name = ScanManager.
+                    makeMBeanName(ScanDirConfigMXBean.class,config.getName());
+        }
+        objectName = name;
+        mbeanServer = server;
+        synchronized (this) {
+            configname = name.getKeyProperty("name");
+            if (config == null) config = new ScanManagerConfig(configname);
+            else config = config.copy(configname);
+        }
+        return name;
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having
+     * been registered in the MBean server or after the registration has
+     * failed.
+     * <p>This implementation does nothing</p>
+     * @param registrationDone Indicates whether or not the MBean has been
+     * successfully registered in the MBean server. The value false means
+     * that the registration has failed.
+     */
+    public void postRegister(Boolean registrationDone) {
+        // Nothing to do here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * unregistered by the MBean server.
+     * <p>This implementation does nothing</p>
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        // Nothing to do here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having been
+     * unregistered in the MBean server.
+     * <p>This implementation does nothing</p>
+     */
+    public void postDeregister() {
+        // Nothing to do here.
+    }
+
+    // see ScanDirConfigMXBean
+    public String getConfigFilename() {
+        return filename;
+    }
+
+    // see ScanDirConfigMXBean
+    public void setConfiguration(ScanManagerConfig config) {
+        synchronized (this) {
+            if (config == null) {
+                this.config = null;
+                return;
+            }
+
+            if (configname == null)
+                configname = config.getName();
+
+            this.config = config.copy(configname);
+            status = MODIFIED;
+        }
+        sendNotification(NOTIFICATION_MODIFIED);
+    }
+
+    // see ScanDirConfigMXBean
+    public DirectoryScannerConfig
+            addDirectoryScanner(String name, String dir, String filePattern,
+                                long sizeExceedsMaxBytes, long sinceLastModified) {
+         final DirectoryScannerConfig scanner =
+                 new DirectoryScannerConfig(name);
+         scanner.setRootDirectory(dir);
+         if (filePattern!=null||sizeExceedsMaxBytes>0||sinceLastModified>0) {
+            final FileMatch filter = new FileMatch();
+            filter.setFilePattern(filePattern);
+            filter.setSizeExceedsMaxBytes(sizeExceedsMaxBytes);
+            if (sinceLastModified > 0)
+                filter.setLastModifiedBefore(new Date(new Date().getTime()
+                                                -sinceLastModified));
+            scanner.addIncludeFiles(filter);
+         }
+         synchronized (this) {
+            config.putScan(scanner);
+            status = MODIFIED;
+         }
+         LOG.fine("config: "+config);
+         sendNotification(NOTIFICATION_MODIFIED);
+         return scanner;
+    }
+
+    // see ScanDirConfigMXBean
+    public DirectoryScannerConfig removeDirectoryScanner(String name)
+        throws IOException, InstanceNotFoundException {
+        final DirectoryScannerConfig scanner;
+        synchronized (this) {
+            scanner = config.removeScan(name);
+            if (scanner == null)
+                throw new IllegalArgumentException(name+": scanner not found");
+            status = MODIFIED;
+        }
+        sendNotification(NOTIFICATION_MODIFIED);
+        return scanner;
+    }
+
+    // see ScanDirConfigMXBean
+    public SaveState getSaveState() {
+        return status;
+    }
+
+    // These methods are used by ScanManager to guess a configuration name from
+    // a configuration filename.
+    //
+    static String DEFAULT = "DEFAULT";
+
+    private static String getBasename(String name) {
+        final int dot = name.indexOf('.');
+        if (dot<0)  return name;
+        if (dot==0) return getBasename(name.substring(1));
+        return name.substring(0,dot);
+    }
+
+    static String guessConfigName(String configFileName,String defaultFile) {
+        try {
+            if (configFileName == null) return DEFAULT;
+            final File f = new File(configFileName);
+            if (f.canRead()) {
+                final String confname = XmlConfigUtils.read(f).getName();
+                if (confname != null && confname.length()>0) return confname;
+            }
+            final File f2 = new File(defaultFile);
+            if (f.equals(f2)) return DEFAULT;
+            final String guess = getBasename(f.getName());
+            if (guess == null) return DEFAULT;
+            if (guess.length()==0) return DEFAULT;
+            return guess;
+        } catch (Exception x) {
+            return DEFAULT;
+        }
+    }
+
+    // Set by preRegister()
+    private volatile MBeanServer mbeanServer;
+    private volatile ObjectName objectName;
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.java
new file mode 100644
index 0000000..eb4f375
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.IOException;
+import javax.management.InstanceNotFoundException;
+
+/**
+ * <p>The <code>ScanDirConfigMXBean</code> is in charge of the
+ * <i>scandir</i> application configuration.
+ * </p>
+ * <p>The <code>ScanDirConfigMXBean</code> is an MBean which is able to
+ * load and save the <i>scandir</i> application configuration to and from an
+ * XML file.
+ * </p>
+ * <p>
+ * It will let you also interactively modify that configuration, which you
+ * can later save to the file, by calling {@link #save}, or discard, by
+ * reloading the file without saving - see {@link #load}.
+ * </p>
+ * <p>
+ * There can be as many <code>ScanDirConfigMXBean</code> registered
+ * in the MBeanServer as you like, but only one of them will be identified as
+ * the current configuration of the {@link ScanManagerMXBean}.
+ * You can switch to another configuration by calling {@link
+ * ScanManagerMXBean#setConfigurationMBean
+ * ScanManagerMXBean.setConfigurationMBean}.
+ * </p>
+ * <p>
+ * Once the current configuration has been loaded (by calling {@link #load})
+ * or modified (by calling one of {@link #addDirectoryScanner
+ * addDirectoryScanner}, {@link #removeDirectoryScanner removeDirectoryScanner}
+ * or {@link #setConfiguration setConfiguration}) it can be pushed
+ * to the {@link ScanManagerMXBean} by calling {@link
+ * ScanManagerMXBean#applyConfiguration
+ * ScanManagerMXBean.applyConfiguration(true)} -
+ * <code>true</code> means that we apply the configuration from memory,
+ * without first reloading the file.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public interface ScanDirConfigMXBean {
+    /**
+     * This state tells whether the configuration reflected by the
+     * {@link ScanDirConfigMXBean} was loaded in memory, saved to the
+     * configuration file, or modified since last saved.
+     * Note that this state doesn't tell whether the configuration was
+     * applied by the {@link ScanManagerMXBean}.
+     **/
+    public enum SaveState {
+        /**
+         * Initial state: the {@link ScanDirConfigMXBean} is created, but
+         * neither {@link #load} or  {@link #save} was yet called.
+         **/
+        CREATED,
+
+        /**
+         * The configuration reflected by the {@link ScanDirConfigMXBean} has
+         * been loaded, but not modified yet.
+         **/
+        LOADED,
+
+        /**
+         * The configuration was modified. The modifications are held in memory.
+         * Call {@link #save} to save them to the file, or {@link #load} to
+         * reload the file and discard them.
+         **/
+        MODIFIED,
+
+        /**
+         * The configuration was saved.
+         **/
+        SAVED
+    };
+
+    /**
+     * Loads the configuration from the {@link
+     * #getConfigFilename configuration file}.
+     * <p>Any unsaved modification will be lost. The {@link #getSaveState state}
+     * is switched to {@link SaveState#LOADED LOADED}.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @see #getSaveState()
+     * @throws IOException The configuration couldn't be loaded from the file,
+     *                     e.g. because the file doesn't exist or isn't
+     *                     readable.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void load()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Saves the configuration to the {@link
+     * #getConfigFilename configuration file}.
+     *
+     * <p>If the configuration file doesn't exists, this method will
+     *    attempt to create it. Otherwise, the existing file will
+     *    be renamed by appending a '~' to its name, and a new file
+     *    will be created, in which the configuration will be saved.
+     * The {@link #getSaveState state}
+     * is switched to {@link SaveState#SAVED SAVED}.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean}.
+     * </p>
+     * @see #getSaveState()
+     *
+     * @throws IOException The configuration couldn't be saved to the file,
+     *                     e.g. because the file couldn't be created.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void save()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the name of the configuration file.
+     * <p>If the configuration file doesn't exists, {@link #load} will fail
+     * and {@link #save} will attempt to create the file.
+     * </p>
+     *
+     * @return The configuration file name for this MBean.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getConfigFilename()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the current configuration data.
+     * <p>
+     * This method returns the configuration data which is currently held
+     * in memory.
+     * </p>
+     * <p>Call {@link #load} to reload the data from the configuration
+     *    file, and {@link #save} to save the data to the configuration
+     *    file.
+     * </p>
+     * @see #getSaveState()
+     * @return The current configuration data in memory.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanManagerConfig getConfiguration()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Sets the current configuration data.
+     * <p>
+     * This method replaces the configuration data in memory.
+     * The {@link #getSaveState state} is switched to {@link
+     * SaveState#MODIFIED MODIFIED}.
+     * </p>
+     * <p>Calling {@link #load} will reload the data from the configuration
+     *    file, and all modifications will be lost.
+     *    Calling {@link #save} will save the modified data to the configuration
+     *    file.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @param config The new configuration data.
+     * @see #getSaveState()
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void setConfiguration(ScanManagerConfig config)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Adds a new directory scanner to the current configuration data.
+     * <p>
+     * This method updates the configuration data in memory, adding
+     * a {@link DirectoryScannerConfig} to the {@link
+     * ScanManagerConfig#getScanList directory scanner list}.
+     * The {@link #getSaveState state} is switched to {@link
+     * SaveState#MODIFIED MODIFIED}.
+     * </p>
+     * <p>Calling {@link #load} will reload the data from the configuration
+     *    file, and all modifications will be lost.
+     *    Calling {@link #save} will save the modified data to the configuration
+     *    file.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @param name A name for the new directory scanner. This is the value
+     *             that will be later used in the {@link DirectoryScannerMXBean}
+     *             ObjectName for the <code>name=</code> key.
+     * @param dir The root directory at which this scanner will start scanning.
+     * @param filePattern A {@link java.util.regex.Pattern regular expression}
+     *        to match against a selected file name.
+     * @param sizeExceedsMaxBytes Only file whose size exceeds that limit will
+     *        be selected. <code.0</code> or  a
+     *        negative value means no limit.
+     * @param sinceLastModified Select files which haven't been modified for
+     *        that number of milliseconds - i.e.
+     *        {@code sinceLastModified=3600000} will exclude files which
+     *        have been modified in the last hour.
+     *        The date of last modification is ignored if <code>0</code> or  a
+     *        negative value is provided.
+     * @see #getSaveState()
+     * @return The added <code>DirectoryScannerConfig</code>.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public DirectoryScannerConfig
+            addDirectoryScanner(String name, String dir, String filePattern,
+                                long sizeExceedsMaxBytes, long sinceLastModified)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Removes a directory scanner from the current configuration data.
+     * <p>
+     * This method updates the configuration data in memory, removing
+     * a {@link DirectoryScannerConfig} from the {@link
+     * ScanManagerConfig#getScanList directory scanner list}.
+     * The {@link #getSaveState state} is switched to {@link
+     * SaveState#MODIFIED MODIFIED}.
+     * </p>
+     * <p>Calling {@link #load} will reload the data from the configuration
+     *    file, and all modifications will be lost.
+     *    Calling {@link #save} will save the modified data to the configuration
+     *    file.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @param name The name of the new directory scanner. This is the value
+     *             that is used in the {@link DirectoryScannerMXBean}
+     *             ObjectName for the <code>name=</code> key.
+     * @return The removed <code>DirectoryScannerConfig</code>.
+     * @throws IllegalArgumentException if there's no directory scanner by
+     *         that name in the current configuration data.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public DirectoryScannerConfig
+            removeDirectoryScanner(String name)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the save state of the current configuration data.
+     * <p>
+     * {@link SaveState#CREATED CREATED} means that the configuration data was just
+     * created. It has not been loaded from the configuration file.
+     * Calling {@link #load} will load the data from the configuration file.
+     * Calling {@link #save} will write the empty data to the configuration
+     * file.
+     * </p>
+     * <p>
+     * {@link SaveState#LOADED LOADED} means that the configuration data
+     * was loaded from the configuration file.
+     * </p>
+     * <p>
+     * {@link SaveState#MODIFIED MODIFIED} means that the configuration data
+     * was modified since it was last loaded or saved.
+     * Calling {@link #load} will reload the data from the configuration file,
+     * and all modifications will be lost.
+     * Calling {@link #save} will write the modified data to the configuration
+     * file.
+     * </p>
+     * <p>
+     * {@link SaveState#SAVED SAVED} means that the configuration data
+     * was saved to the configuration file.
+     * </p>
+     * <p>
+     * This state doesn't indicate whether this MBean configuration data
+     * was {@link ScanManagerMXBean#applyConfiguration applied} by the
+     * {@link ScanManagerMXBean}.
+     * </p>
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     * @return The save state of the {@code ScanDirConfigMXBean}.
+     */
+    public SaveState getSaveState()
+        throws IOException, InstanceNotFoundException;
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManager.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManager.java
new file mode 100644
index 0000000..e34b12a
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManager.java
@@ -0,0 +1,1160 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.File;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.AttributeChangeNotification;
+import javax.management.InstanceNotFoundException;
+import javax.management.JMException;
+import javax.management.JMX;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+/**
+ * <p>
+ * The <code>ScanManager</code> is responsible for applying a configuration,
+ * starting and scheduling directory scans, and reporting application state.
+ * </p>
+ * <p>
+ * The ScanManager MBean is a singleton MBean which controls
+ * scan session. The ScanManager name is defined by
+ * {@link #SCAN_MANAGER_NAME ScanManager.SCAN_MANAGER_NAME}.
+ * </p>
+ * <p>
+ * The <code>ScanManager</code> MBean is the entry point of the <i>scandir</i>
+ * application management interface. It is from this MBean that all other MBeans
+ * will be created and registered.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanManager implements ScanManagerMXBean,
+        NotificationEmitter, MBeanRegistration {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ScanManager.class.getName());
+
+    /**
+     * The name of the ScanManager singleton MBean.
+     **/
+    public final static ObjectName SCAN_MANAGER_NAME =
+            makeSingletonName(ScanManagerMXBean.class);
+
+    /**
+     * Sequence number used for sending notifications. We use this
+     * sequence number throughout the application.
+     **/
+    private static long seqNumber=0;
+
+    /**
+     * The NotificationBroadcasterSupport object used to handle
+     * listener registration.
+     **/
+    private final NotificationBroadcasterSupport broadcaster;
+
+    /**
+     * The MBeanServer in which this MBean is registered. We obtain
+     * this reference by implementing the {@link MBeanRegistration}
+     * interface.
+     **/
+    private volatile MBeanServer mbeanServer;
+
+    /**
+     * A queue of pending notifications we are about to send.
+     * We're using a BlockingQueue in order to avoid sending
+     * notifications from within a synchronized block.
+     **/
+    private final BlockingQueue<Notification> pendingNotifs;
+
+    /**
+     * The state of the scan session.
+     **/
+    private volatile ScanState state = STOPPED;
+
+    /**
+     * The list of DirectoryScannerMBean that are run by a scan session.
+     **/
+    private final Map<ObjectName,DirectoryScannerMXBean> scanmap;
+
+    /**
+     * The list of ScanDirConfigMXBean that were created by this MBean.
+     **/
+    private final Map<ObjectName, ScanDirConfigMXBean> configmap;
+
+    // The ResultLogManager for this application.
+    private final ResultLogManager log;
+
+    /**
+     * We use a semaphore to ensure proper sequencing of exclusive
+     * action. The logic we have implemented is to fail - rather
+     * than block, if an exclusive action is already in progress.
+     **/
+    private final Semaphore sequencer = new Semaphore(1);
+
+    // A proxy to the current ScanDirConfigMXBean which holds the current
+    // configuration data.
+    //
+    private volatile ScanDirConfigMXBean config = null;
+
+    // Avoid to write parameters twices when creating a new ConcurrentHashMap.
+    //
+    private static <K, V> Map<K, V> newConcurrentHashMap() {
+        return new ConcurrentHashMap<K, V>();
+    }
+
+    // Avoid to write parameters twices when creating a new HashMap.
+    //
+    private static <K, V> Map<K, V> newHashMap() {
+        return new HashMap<K, V>();
+    }
+
+    /**
+     * Creates a default singleton ObjectName for a given class.
+     * @param clazz The interface class of the MBean for which we want to obtain
+     *        a default singleton name, or its implementation class.
+     *        Give one or the other depending on what you wish to see in
+     *        the value of the key {@code type=}.
+     * @return A default singleton name for a singleton MBean class.
+     * @throws IllegalArgumentException if the name can't be created
+     *         for some unfathomable reason (e.g. an unexpected
+     *         exception was raised).
+     **/
+    public final static ObjectName makeSingletonName(Class clazz) {
+        try {
+            final Package p = clazz.getPackage();
+            final String packageName = (p==null)?null:p.getName();
+            final String className   = clazz.getSimpleName();
+            final String domain;
+            if (packageName == null || packageName.length()==0) {
+                // We use a reference to ScanDirAgent.class to ease
+                // to keep track of possible class renaming.
+                domain = ScanDirAgent.class.getSimpleName();
+            } else {
+                domain = packageName;
+            }
+            final ObjectName name = new ObjectName(domain,"type",className);
+            return name;
+        } catch (Exception x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException(String.valueOf(clazz),x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Creates a default ObjectName with keys <code>type=</code> and
+     * <code>name=</code> for an instance of a given MBean interface class.
+     * @param clazz The interface class of the MBean for which we want to obtain
+     *        a default name, or its implementation class.
+     *        Give one or the other depending on what you wish to see in
+     *        the value of the key {@code type=}.
+     * @param name The value of the <code>name=</code> key.
+     * @return A default name for an instance of the given MBean interface class.
+     * @throws IllegalArgumentException if the name can't be created.
+     *         (e.g. an unexpected exception was raised).
+     **/
+    public static final ObjectName makeMBeanName(Class clazz, String name) {
+        try {
+            return ObjectName.
+                getInstance(makeSingletonName(clazz)
+                        .toString()+",name="+name);
+        } catch (MalformedObjectNameException x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException(String.valueOf(name),x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Return the ObjectName for a DirectoryScannerMXBean of that name.
+     * This is {@code makeMBeanName(DirectoryScannerMXBean.class,name)}.
+     * @param name The value of the <code>name=</code> key.
+     * @return the ObjectName for a DirectoryScannerMXBean of that name.
+     */
+    public static final ObjectName makeDirectoryScannerName(String name) {
+        return makeMBeanName(DirectoryScannerMXBean.class,name);
+    }
+
+    /**
+     * Return the ObjectName for a {@code ScanDirConfigMXBean} of that name.
+     * This is {@code makeMBeanName(ScanDirConfigMXBean.class,name)}.
+     * @param name The value of the <code>name=</code> key.
+     * @return the ObjectName for a {@code ScanDirConfigMXBean} of that name.
+     */
+    public static final ObjectName makeScanDirConfigName(String name) {
+        return makeMBeanName(ScanDirConfigMXBean.class,name);
+    }
+
+    /**
+     * Create and register a new singleton instance of the ScanManager
+     * MBean in the given {@link MBeanServerConnection}.
+     * @param mbs The MBeanServer in which the new singleton instance
+     *         should be created.
+     * @throws JMException The MBeanServer connection raised an exception
+     *         while trying to instantiate and register the singleton MBean
+     *         instance.
+     * @throws IOException There was a connection problem while trying to
+     *         communicate with the underlying MBeanServer.
+     * @return A proxy for the registered MBean.
+     **/
+    public static ScanManagerMXBean register(MBeanServerConnection mbs)
+        throws IOException, JMException {
+        final ObjectInstance moi =
+                mbs.createMBean(ScanManager.class.getName(),SCAN_MANAGER_NAME);
+        final ScanManagerMXBean proxy =
+                JMX.newMXBeanProxy(mbs,moi.getObjectName(),
+                                  ScanManagerMXBean.class,true);
+        return proxy;
+    }
+
+    /**
+     * Creates a new {@code ScanManagerMXBean} proxy over the given
+     * {@code MBeanServerConnection}. Does not check whether a
+     * {@code ScanManagerMXBean}
+     * is actually registered in that {@code MBeanServerConnection}.
+     * @return a new {@code ScanManagerMXBean} proxy.
+     * @param mbs The {@code MBeanServerConnection} which holds the
+     * {@code ScanManagerMXBean} to proxy.
+     */
+    public static ScanManagerMXBean
+            newSingletonProxy(MBeanServerConnection mbs) {
+        final ScanManagerMXBean proxy =
+                JMX.newMXBeanProxy(mbs,SCAN_MANAGER_NAME,
+                                  ScanManagerMXBean.class,true);
+        return proxy;
+    }
+
+    /**
+     * Creates a new {@code ScanManagerMXBean} proxy over the platform
+     * {@code MBeanServer}. This is equivalent to
+     * {@code newSingletonProxy(ManagementFactory.getPlatformMBeanServer())}.
+     * @return a new {@code ScanManagerMXBean} proxy.
+     **/
+    public static ScanManagerMXBean newSingletonProxy() {
+        return newSingletonProxy(ManagementFactory.getPlatformMBeanServer());
+    }
+
+    /**
+     * Create and register a new singleton instance of the ScanManager
+     * MBean in the given {@link MBeanServerConnection}.
+     * @throws JMException The MBeanServer connection raised an exception
+     *         while trying to instantiate and register the singleton MBean
+     *         instance.
+     * @throws IOException There was a connection problem while trying to
+     *         communicate with the underlying MBeanServer.
+     * @return A proxy for the registered MBean.
+     **/
+    public static ScanManagerMXBean register()
+        throws IOException, JMException {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        return register(mbs);
+    }
+
+    /**
+     * Create a new ScanManager MBean
+     **/
+    public ScanManager() {
+        broadcaster = new NotificationBroadcasterSupport();
+        pendingNotifs = new LinkedBlockingQueue<Notification>(100);
+        scanmap = newConcurrentHashMap();
+        configmap = newConcurrentHashMap();
+        log = new ResultLogManager();
+    }
+
+
+    // Creates a new DirectoryScannerMXBean, from the given configuration data.
+    DirectoryScannerMXBean createDirectoryScanner(DirectoryScannerConfig config) {
+            return new DirectoryScanner(config,log);
+    }
+
+    // Applies a configuration.
+    // throws IllegalStateException if lock can't be acquired.
+    // Unregisters all existing directory scanners, the create and registers
+    // new directory scanners according to the given config.
+    // Then pushes the log config to the result log manager.
+    //
+    private void applyConfiguration(ScanManagerConfig bean)
+        throws IOException, JMException {
+        if (bean == null) return;
+        if (!sequencer.tryAcquire()) {
+            throw new IllegalStateException("Can't acquire lock");
+        }
+        try {
+            unregisterScanners();
+            final DirectoryScannerConfig[] scans = bean.getScanList();
+            if (scans == null) return;
+            for (DirectoryScannerConfig scan : scans) {
+                addDirectoryScanner(scan);
+            }
+            log.setConfig(bean.getInitialResultLogConfig());
+        } finally {
+            sequencer.release();
+        }
+    }
+
+    // See ScanManagerMXBean
+    public void applyConfiguration(boolean fromMemory)
+        throws IOException, JMException {
+        if (fromMemory == false) config.load();
+        applyConfiguration(config.getConfiguration());
+    }
+
+    // See ScanManagerMXBean
+    public void applyCurrentResultLogConfig(boolean toMemory)
+        throws IOException, JMException {
+        final ScanManagerConfig bean = config.getConfiguration();
+        bean.setInitialResultLogConfig(log.getConfig());
+        config.setConfiguration(bean);
+        if (toMemory==false) config.save();
+    }
+
+    // See ScanManagerMXBean
+    public void setConfigurationMBean(ScanDirConfigMXBean config) {
+        this.config = config;
+    }
+
+    // See ScanManagerMXBean
+    public ScanDirConfigMXBean getConfigurationMBean() {
+        return config;
+    }
+
+    // Creates and registers a new directory scanner.
+    // Called by applyConfiguration.
+    // throws IllegalStateException if state is not STOPPED or COMPLETED
+    // (you cannot change the config while scanning is scheduled or running).
+    //
+    private DirectoryScannerMXBean addDirectoryScanner(
+                DirectoryScannerConfig bean)
+        throws JMException {
+        try {
+            final DirectoryScannerMXBean scanner;
+            final ObjectName scanName;
+            synchronized (this) {
+                if (state != STOPPED && state != COMPLETED)
+                   throw new IllegalStateException(state.toString());
+                scanner = createDirectoryScanner(bean);
+                scanName = makeDirectoryScannerName(bean.getName());
+            }
+            LOG.fine("server: "+mbeanServer);
+            LOG.fine("scanner: "+scanner);
+            LOG.fine("scanName: "+scanName);
+            final ObjectInstance moi =
+                mbeanServer.registerMBean(scanner,scanName);
+            final ObjectName moiName = moi.getObjectName();
+            final DirectoryScannerMXBean proxy =
+                JMX.newMXBeanProxy(mbeanServer,moiName,
+                DirectoryScannerMXBean.class,true);
+            scanmap.put(moiName,proxy);
+            return proxy;
+        } catch (RuntimeException x) {
+            final String msg = "Operation failed: "+x;
+            if (LOG.isLoggable(Level.FINEST))
+                LOG.log(Level.FINEST,msg,x);
+            else LOG.fine(msg);
+            throw x;
+        } catch (JMException x) {
+            final String msg = "Operation failed: "+x;
+            if (LOG.isLoggable(Level.FINEST))
+                LOG.log(Level.FINEST,msg,x);
+            else LOG.fine(msg);
+            throw x;
+        }
+    }
+
+    // See ScanManagerMXBean
+    public ScanDirConfigMXBean createOtherConfigurationMBean(String name,
+            String filename)
+        throws JMException {
+        final ScanDirConfig profile = new ScanDirConfig(filename);
+        final ObjectName profName = makeScanDirConfigName(name);
+        final ObjectInstance moi = mbeanServer.registerMBean(profile,profName);
+        final ScanDirConfigMXBean proxy =
+                JMX.newMXBeanProxy(mbeanServer,profName,
+                    ScanDirConfigMXBean.class,true);
+        configmap.put(moi.getObjectName(),proxy);
+        return proxy;
+    }
+
+
+    // See ScanManagerMXBean
+    public Map<String,DirectoryScannerMXBean> getDirectoryScanners() {
+        final Map<String,DirectoryScannerMXBean> proxyMap = newHashMap();
+        for (Entry<ObjectName,DirectoryScannerMXBean> item : scanmap.entrySet()){
+            proxyMap.put(item.getKey().getKeyProperty("name"),item.getValue());
+        }
+        return proxyMap;
+    }
+
+    // ---------------------------------------------------------------
+    // State Management
+    // ---------------------------------------------------------------
+
+    /**
+     * For each operation, this map stores a list of states from
+     * which the corresponding operation can be legally called.
+     * For instance, it is legal to call "stop" regardless of the
+     * application state. However, "schedule" can be called only if
+     * the application state is STOPPED, etc...
+     **/
+    private final static Map<String,EnumSet<ScanState>> allowedStates;
+    static {
+        allowedStates = newHashMap();
+        // You can always call stop
+        allowedStates.put("stop",EnumSet.allOf(ScanState.class));
+
+        // You can only call closed when stopped
+        allowedStates.put("close",EnumSet.of(STOPPED,COMPLETED,CLOSED));
+
+        // You can call schedule only when the current task is
+        // completed or stopped.
+        allowedStates.put("schedule",EnumSet.of(STOPPED,COMPLETED));
+
+        // switch reserved for background task: goes from SCHEDULED to
+        //    RUNNING when it enters the run() method.
+        allowedStates.put("scan-running",EnumSet.of(SCHEDULED));
+
+        // switch reserved for background task: goes from RUNNING to
+        //    SCHEDULED when it has completed but needs to reschedule
+        //    itself for specified interval.
+        allowedStates.put("scan-scheduled",EnumSet.of(RUNNING));
+
+        // switch reserved for background task:
+        //     goes from RUNNING to COMPLETED upon successful completion
+        allowedStates.put("scan-done",EnumSet.of(RUNNING));
+    }
+
+    // Get this object's state. No need to synchronize because
+    // state is volatile.
+    // See ScanManagerMXBean
+    public ScanState getState() {
+        return state;
+    }
+
+    /**
+     * Enqueue a state changed notification for the given states.
+     **/
+    private void queueStateChangedNotification(
+                    long sequence,
+                    long time,
+                    ScanState old,
+                    ScanState current) {
+        final AttributeChangeNotification n =
+                new AttributeChangeNotification(SCAN_MANAGER_NAME,sequence,time,
+                "ScanManager State changed to "+current,"State",
+                ScanState.class.getName(),old.toString(),current.toString());
+        // Queue the notification. We have created an unlimited queue, so
+        // this method should always succeed.
+        try {
+            if (!pendingNotifs.offer(n,2,TimeUnit.SECONDS)) {
+                LOG.fine("Can't queue Notification: "+n);
+            }
+        } catch (InterruptedException x) {
+                LOG.fine("Can't queue Notification: "+x);
+        }
+    }
+
+    /**
+     * Send all notifications present in the queue.
+     **/
+    private void sendQueuedNotifications() {
+        Notification n;
+        while ((n = pendingNotifs.poll()) != null) {
+            broadcaster.sendNotification(n);
+        }
+    }
+
+    /**
+     * Checks that the current state is allowed for the given operation,
+     * and if so, switch its value to the new desired state.
+     * This operation also enqueue the appropriate state changed
+     * notification.
+     **/
+    private ScanState switchState(ScanState desired,String forOperation) {
+        return switchState(desired,allowedStates.get(forOperation));
+    }
+
+    /**
+     * Checks that the current state is one of the allowed states,
+     * and if so, switch its value to the new desired state.
+     * This operation also enqueue the appropriate state changed
+     * notification.
+     **/
+    private ScanState switchState(ScanState desired,EnumSet<ScanState> allowed) {
+        final ScanState old;
+        final long timestamp;
+        final long sequence;
+        synchronized(this) {
+            old = state;
+            if (!allowed.contains(state))
+               throw new IllegalStateException(state.toString());
+            state = desired;
+            timestamp = System.currentTimeMillis();
+            sequence  = getNextSeqNumber();
+        }
+        LOG.fine("switched state: "+old+" -> "+desired);
+        if (old != desired)
+            queueStateChangedNotification(sequence,timestamp,old,desired);
+        return old;
+    }
+
+
+    // ---------------------------------------------------------------
+    // schedule() creates a new SessionTask that will be executed later
+    // (possibly right away if delay=0) by a Timer thread.
+    // ---------------------------------------------------------------
+
+    // The timer used by this object. Lazzy evaluation. Cleaned in
+    // postDeregister()
+    //
+    private Timer timer = null;
+
+    // See ScanManagerMXBean
+    public void schedule(long delay, long interval) {
+        if (!sequencer.tryAcquire()) {
+            throw new IllegalStateException("Can't acquire lock");
+        }
+        try {
+            LOG.fine("scheduling new task: state="+state);
+            final ScanState old = switchState(SCHEDULED,"schedule");
+            final boolean scheduled =
+                scheduleSession(new SessionTask(interval),delay);
+            if (scheduled)
+                LOG.fine("new task scheduled: state="+state);
+        } finally {
+            sequencer.release();
+        }
+        sendQueuedNotifications();
+    }
+
+    // Schedule a SessionTask. The session task may reschedule
+    // a new identical task when it eventually ends.
+    // We use this logic so that the 'interval' time is measured
+    // starting at the end of the task that finishes, rather than
+    // at its beginning. Therefore if a repeated task takes x ms,
+    // it will be repeated every x+interval ms.
+    //
+    private synchronized boolean scheduleSession(SessionTask task, long delay) {
+        if (state == STOPPED) return false;
+        if (timer == null) timer = new Timer("ScanManager");
+        tasklist.add(task);
+        timer.schedule(task,delay);
+        return true;
+    }
+
+    // ---------------------------------------------------------------
+    // start() is equivalent to schedule(0,0)
+    // ---------------------------------------------------------------
+
+    // See ScanManagerMXBean
+    public void start() throws IOException, InstanceNotFoundException {
+        schedule(0,0);
+    }
+
+    // ---------------------------------------------------------------
+    // Methods used to implement stop() -  stop() is asynchronous,
+    // and needs to notify any running background task that it needs
+    // to stop. It also needs to prevent scheduled task from being
+    // run.
+    // ---------------------------------------------------------------
+
+    // See ScanManagerMXBean
+    public void stop() {
+        if (!sequencer.tryAcquire())
+            throw new IllegalStateException("Can't acquire lock");
+        int errcount = 0;
+        final StringBuilder b = new StringBuilder();
+
+        try {
+            switchState(STOPPED,"stop");
+
+            errcount += cancelSessionTasks(b);
+            errcount += stopDirectoryScanners(b);
+        } finally {
+            sequencer.release();
+        }
+
+        sendQueuedNotifications();
+        if (errcount > 0) {
+            b.insert(0,"stop partially failed with "+errcount+" error(s):");
+            throw new RuntimeException(b.toString());
+        }
+    }
+
+    // See ScanManagerMXBean
+    public void close() {
+        switchState(CLOSED,"close");
+        sendQueuedNotifications();
+    }
+
+    // Appends exception to a StringBuilder message.
+    //
+    private void append(StringBuilder b,String prefix,Throwable t) {
+        final String first = (prefix==null)?"\n":"\n"+prefix;
+        b.append(first).append(String.valueOf(t));
+        Throwable cause = t;
+        while ((cause = cause.getCause())!=null) {
+            b.append(first).append("Caused by:").append(first);
+            b.append('\t').append(String.valueOf(cause));
+        }
+    }
+
+    // Cancels all scheduled session tasks
+    //
+    private int cancelSessionTasks(StringBuilder b) {
+        int errcount = 0;
+        // Stops scheduled tasks if any...
+        //
+        for (SessionTask task : tasklist) {
+            try {
+                task.cancel();
+                tasklist.remove(task);
+            } catch (Exception ex) {
+                errcount++;
+                append(b,"\t",ex);
+            }
+        }
+        return errcount;
+    }
+
+    // Stops all DirectoryScanners configured for this object.
+    //
+    private int stopDirectoryScanners(StringBuilder b) {
+        int errcount = 0;
+        // Stops directory scanners if any...
+        //
+        for (DirectoryScannerMXBean s : scanmap.values()) {
+            try {
+                s.stop();
+            } catch (Exception ex) {
+                errcount++;
+                append(b,"\t",ex);
+            }
+        }
+        return errcount;
+    }
+
+
+    // ---------------------------------------------------------------
+    // We start scanning in background in a Timer thread.
+    // The methods below implement that logic.
+    // ---------------------------------------------------------------
+
+    private void scanAllDirectories()
+        throws IOException, InstanceNotFoundException {
+
+        int errcount = 0;
+        final StringBuilder b = new StringBuilder();
+        for (ObjectName key : scanmap.keySet()) {
+            final DirectoryScannerMXBean s = scanmap.get(key);
+            try {
+                if (state == STOPPED) return;
+                s.scan();
+            } catch (Exception ex) {
+                LOG.log(Level.FINE,key + " failed to scan: "+ex,ex);
+                errcount++;
+                append(b,"\t",ex);
+            }
+        }
+        if (errcount > 0) {
+            b.insert(0,"scan partially performed with "+errcount+" error(s):");
+            throw new RuntimeException(b.toString());
+        }
+    }
+
+    // List of scheduled session task. Needed by stop() to cancel
+    // scheduled sessions. There's usually at most 1 session in
+    // this list (unless there's a bug somewhere ;-))
+    //
+    private final ConcurrentLinkedQueue<SessionTask> tasklist =
+            new ConcurrentLinkedQueue<SessionTask>();
+
+    // Used to give a unique id to session task - useful for
+    // debugging.
+    //
+    private volatile static long taskcount = 0;
+
+    /**
+     * A session task will be scheduled to run in background in a
+     * timer thread. There can be at most one session task running
+     * at a given time (this is ensured by using a timer - which is
+     * a single threaded object).
+     *
+     * If the session needs to be repeated, it will reschedule an
+     * identical session when it finishes to run. This ensure that
+     * two session runs are separated by the given interval time.
+     *
+     **/
+    private class SessionTask extends TimerTask {
+
+        /**
+         * Delay after which the next iteration of this task will
+         * start. This delay is measured  starting at the end of
+         * the previous iteration.
+         **/
+        final long delayBeforeNext;
+
+        /**
+         * A unique id for this task.
+         **/
+        final long taskid;
+
+        /**
+         * Whether it's been cancelled by stop()
+         **/
+        volatile boolean cancelled=false;
+
+        /**
+         * create a new SessionTask.
+         **/
+        SessionTask(long scheduleNext) {
+            delayBeforeNext = scheduleNext;
+            taskid = taskcount++;
+        }
+
+        /**
+         * When run() begins, the state is switched to RUNNING.
+         * When run() ends then:
+         *      If the task is repeated, the state will be switched
+         *      to SCHEDULED (because a new task was scheduled).
+         *      Otherwise the state will be switched to either
+         *      STOPPED (if it was stopped before it could complete)
+         *      or COMPLETED (if it completed gracefully)
+         * This method is used to switch to the desired state and
+         * send the appropriate notifications.
+         * When entering the method, we check whether the state is
+         * STOPPED. If so, we return false - and the SessionTask will
+         * stop. Otherwise, we switch the state to the desired value.
+         **/
+        private boolean notifyStateChange(ScanState newState,String condition) {
+            synchronized (ScanManager.this) {
+                if (state == STOPPED || state == CLOSED) return false;
+                switchState(newState,condition);
+            }
+            sendQueuedNotifications();
+            return true;
+        }
+
+        // Cancels this task.
+        public boolean cancel() {
+            cancelled=true;
+            return super.cancel();
+        }
+
+        /**
+         * Invoke all directories scanners in sequence. At each
+         * step, checks to see whether the task should stop.
+         **/
+        private boolean execute() {
+            final String tag = "Scheduled session["+taskid+"]";
+            try {
+                if (cancelled) {
+                    LOG.finer(tag+" cancelled: done");
+                    return false;
+                }
+                if (!notifyStateChange(RUNNING,"scan-running")) {
+                    LOG.finer(tag+" stopped: done");
+                    return false;
+                }
+                scanAllDirectories();
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST)) {
+                    LOG.log(Level.FINEST,
+                            tag+" failed to scan: "+x,x);
+                } else if (LOG.isLoggable(Level.FINE)) {
+                    LOG.fine(tag+" failed to scan: "+x);
+                }
+            }
+            return true;
+        }
+
+        /**
+         * Schedule an identical task for next iteration.
+         **/
+        private boolean scheduleNext() {
+            final String tag = "Scheduled session["+taskid+"]";
+
+            // We need now to reschedule a new task for after 'delayBeforeNext' ms.
+            try {
+                LOG.finer(tag+": scheduling next session for "+ delayBeforeNext + "ms");
+                if (cancelled || !notifyStateChange(SCHEDULED,"scan-scheduled")) {
+                    LOG.finer(tag+" stopped: do not reschedule");
+                    return false;
+                }
+                final SessionTask nextTask = new SessionTask(delayBeforeNext);
+                if (!scheduleSession(nextTask,delayBeforeNext)) return false;
+                LOG.finer(tag+": next session successfully scheduled");
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST)) {
+                    LOG.log(Level.FINEST,tag+
+                            " failed to schedule next session: "+x,x);
+                } else if (LOG.isLoggable(Level.FINE)) {
+                    LOG.fine(tag+" failed to schedule next session: "+x);
+                }
+            }
+            return true;
+        }
+
+
+        /**
+         * The run method:
+         * executes scanning logic, the schedule next iteration if needed.
+         **/
+        public void run() {
+            final String tag = "Scheduled session["+taskid+"]";
+            LOG.entering(SessionTask.class.getName(),"run");
+            LOG.finer(tag+" starting...");
+            try {
+                if (execute()==false) return;
+
+                LOG.finer(tag+" terminating - state is "+state+
+                    ((delayBeforeNext >0)?(" next session is due in "+delayBeforeNext+" ms."):
+                        " no additional session scheduled"));
+
+                // if delayBeforeNext <= 0 we are done, either because the session was
+                // stopped or because it successfully completed.
+                if (delayBeforeNext <= 0) {
+                    if (!notifyStateChange(COMPLETED,"scan-done"))
+                        LOG.finer(tag+" stopped: done");
+                    else
+                        LOG.finer(tag+" completed: done");
+                    return;
+                }
+
+                // we need to reschedule a new session for 'delayBeforeNext' ms.
+                scheduleNext();
+
+            } finally {
+                tasklist.remove(this);
+                LOG.finer(tag+" finished...");
+                LOG.exiting(SessionTask.class.getName(),"run");
+            }
+        }
+    }
+
+    // ---------------------------------------------------------------
+    // ---------------------------------------------------------------
+
+    // ---------------------------------------------------------------
+    // MBean Notification support
+    // The methods below are imported from {@link NotificationEmitter}
+    // ---------------------------------------------------------------
+
+    /**
+     * Delegates the implementation of this method to the wrapped
+     * {@code NotificationBroadcasterSupport} object.
+     **/
+    public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException {
+        broadcaster.addNotificationListener(listener, filter, handback);
+    }
+
+
+    /**
+     * We emit an {@code AttributeChangeNotification} when the {@code State}
+     * attribute changes.
+     **/
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[] {
+            new MBeanNotificationInfo(new String[] {
+                AttributeChangeNotification.ATTRIBUTE_CHANGE},
+                AttributeChangeNotification.class.getName(),
+                "Emitted when the State attribute changes")
+            };
+    }
+
+    /**
+     * Delegates the implementation of this method to the wrapped
+     * {@code NotificationBroadcasterSupport} object.
+     **/
+    public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener);
+    }
+
+    /**
+     * Delegates the implementation of this method to the wrapped
+     * {@code NotificationBroadcasterSupport} object.
+     **/
+    public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener, filter, handback);
+    }
+
+    /**
+     * Returns and increment the sequence number used for
+     * notifications. We use the same sequence number throughout the
+     * application - this is why this method is only package protected.
+     * @return A unique sequence number for the next notification.
+     */
+    static synchronized long getNextSeqNumber() {
+        return seqNumber++;
+    }
+
+    // ---------------------------------------------------------------
+    // End of MBean Notification support
+    // ---------------------------------------------------------------
+
+    // ---------------------------------------------------------------
+    // MBeanRegistration support
+    // The methods below are imported from {@link MBeanRegistration}
+    // ---------------------------------------------------------------
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * registered in the MBean server. If the name of the MBean is not
+     * specified, the MBean can provide a name for its registration. If
+     * any exception is raised, the MBean will not be registered in the
+     * MBean server.
+     * <p>In this implementation, we check that the provided name is
+     * either {@code null} or equals to {@link #SCAN_MANAGER_NAME}. If it
+     * isn't then we throw an IllegalArgumentException, otherwise we return
+     * {@link #SCAN_MANAGER_NAME}.</p>
+     * <p>This ensures that there will be a single instance of ScanManager
+     * registered in a given MBeanServer, and that it will always be
+     * registered with the singleton's {@link #SCAN_MANAGER_NAME}.</p>
+     * <p>We do not need to check whether an MBean by that name is
+     *    already registered because the MBeanServer will perform
+     *    this check just after having called preRegister().</p>
+     * @param server The MBean server in which the MBean will be registered.
+     * @param name The object name of the MBean. This name is null if the
+     * name parameter to one of the createMBean or registerMBean methods in
+     * the MBeanServer interface is null. In that case, this method must
+     * return a non-null ObjectName for the new MBean.
+     * @return The name under which the MBean is to be registered. This value
+     * must not be null. If the name parameter is not null, it will usually
+     * but not necessarily be the returned value.
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
+        if (name != null) {
+            if (!SCAN_MANAGER_NAME.equals(name))
+                throw new IllegalArgumentException(String.valueOf(name));
+        }
+        mbeanServer = server;
+        return SCAN_MANAGER_NAME;
+    }
+
+    // Returns the default configuration filename
+    static String getDefaultConfigurationFileName() {
+        // This is a file calles 'jmx-scandir.xml' located
+        // in the user directory.
+        final String user = System.getProperty("user.home");
+        final String defconf = user+File.separator+"jmx-scandir.xml";
+        return defconf;
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having
+     * been registered in the MBean server or after the registration has
+     * failed.
+     * <p>
+     * If registration was not successful, the method returns immediately.
+     * <p>
+     * If registration is successful, register the {@link ResultLogManager}
+     * and default {@link ScanDirConfigMXBean}. If registering these
+     * MBean fails, the {@code ScanManager} state will be switched to
+     * {@link #close CLOSED}, and postRegister ends there.
+     * </p>
+     * <p>Otherwise the {@code ScanManager} will ask the
+     * {@link ScanDirConfigMXBean} to load its configuration.
+     * If it succeeds, the configuration will be {@link
+     * #applyConfiguration applied}. Otherwise, the method simply returns,
+     * assuming that the user will later create/update a configuration and
+     * apply it.
+     * @param registrationDone Indicates whether or not the MBean has been
+     * successfully registered in the MBean server. The value false means
+     * that the registration has failed.
+     */
+    public void postRegister(Boolean registrationDone) {
+        if (!registrationDone) return;
+        Exception test=null;
+        try {
+            mbeanServer.registerMBean(log,
+                    ResultLogManager.RESULT_LOG_MANAGER_NAME);
+            final String defconf = getDefaultConfigurationFileName();
+            final String conf = System.getProperty("scandir.config.file",defconf);
+            final String confname = ScanDirConfig.guessConfigName(conf,defconf);
+            final ObjectName defaultProfileName =
+                    makeMBeanName(ScanDirConfigMXBean.class,confname);
+            if (!mbeanServer.isRegistered(defaultProfileName))
+                mbeanServer.registerMBean(new ScanDirConfig(conf),
+                        defaultProfileName);
+            config = JMX.newMXBeanProxy(mbeanServer,defaultProfileName,
+                    ScanDirConfigMXBean.class,true);
+            configmap.put(defaultProfileName,config);
+        } catch (Exception x) {
+            LOG.config("Failed to populate MBeanServer: "+x);
+            close();
+            return;
+        }
+        try {
+            config.load();
+        } catch (Exception x) {
+            LOG.finest("No config to load: "+x);
+            test = x;
+        }
+        if (test == null) {
+            try {
+                applyConfiguration(config.getConfiguration());
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST))
+                    LOG.log(Level.FINEST,"Failed to apply config: "+x,x);
+                LOG.config("Failed to apply config: "+x);
+            }
+        }
+    }
+
+    // Unregisters all created DirectoryScanners
+    private void unregisterScanners() throws JMException {
+        unregisterMBeans(scanmap);
+    }
+
+    // Unregisters all created ScanDirConfigs
+    private void unregisterConfigs() throws JMException {
+        unregisterMBeans(configmap);
+    }
+
+    // Unregisters all MBeans named by the given map
+    private void unregisterMBeans(Map<ObjectName,?> map) throws JMException {
+        for (ObjectName key : map.keySet()) {
+            if (mbeanServer.isRegistered(key))
+                mbeanServer.unregisterMBean(key);
+            map.remove(key);
+        }
+    }
+
+    // Unregisters the ResultLogManager.
+    private void unregisterResultLogManager() throws JMException {
+        final ObjectName name = ResultLogManager.RESULT_LOG_MANAGER_NAME;
+        if (mbeanServer.isRegistered(name)) {
+            mbeanServer.unregisterMBean(name);
+        }
+    }
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * unregistered by the MBean server.
+     * This implementation also unregisters all the MXBeans
+     * that were created by this object.
+     * @throws IllegalStateException if the lock can't be acquire, or if
+     *         the MBean's state doesn't allow the MBean to be unregistered
+     *         (e.g. because it's scheduled or running).
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        try {
+            close();
+            if (!sequencer.tryAcquire())
+                throw new IllegalStateException("can't acquire lock");
+            try {
+                unregisterScanners();
+                unregisterConfigs();
+                unregisterResultLogManager();
+            } finally {
+                sequencer.release();
+            }
+        } catch (Exception x) {
+            LOG.log(Level.FINEST,"Failed to unregister: "+x,x);
+            throw x;
+        }
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having been
+     * unregistered in the MBean server.
+     * Cancels the internal timer - if any.
+     */
+    public synchronized void postDeregister() {
+        if (timer != null) {
+            try {
+                timer.cancel();
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST))
+                    LOG.log(Level.FINEST,"Failed to cancel timer",x);
+                else if (LOG.isLoggable(Level.FINE))
+                    LOG.fine("Failed to cancel timer: "+x);
+            } finally {
+                timer = null;
+            }
+        }
+   }
+
+    // ---------------------------------------------------------------
+    // End of MBeanRegistration support
+    // ---------------------------------------------------------------
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManagerMXBean.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManagerMXBean.java
new file mode 100644
index 0000000..1f6d4ff
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManagerMXBean.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.io.IOException;
+import java.util.Map;
+import javax.management.InstanceNotFoundException;
+import javax.management.JMException;
+
+/**
+ * The <code>ScanManagerMXBean</code> is responsible for applying a
+ * configuration, starting and scheduling directory scans, and reporting
+ * application state.
+ * <p>
+ * The <code>ScanManagerMXBean</code> is a singleton MBean: there can be
+ * at most one instance of such an MBean registered in a given MBeanServer.
+ * The name of that MBean is a constant defined in
+ * {@link ScanManager#SCAN_MANAGER_NAME ScanManager.SCAN_MANAGER_NAME}.
+ * </p>
+ * <p>
+ * The <code>ScanManagerMXBean</code> is the entry point of the <i>scandir</i>
+ * application management interface. It is from this MBean that all other
+ * MBeans will be created and registered.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+public interface ScanManagerMXBean {
+    /**
+     * This state tells whether directory scans are running, scheduled,
+     * successfully completed, or stopped.
+     * <p>
+     * The {@link #CLOSED} state means
+     * that the {@link ScanManagerMXBean} was closed and is no longer usable.
+     * This state is used when the {@link ScanManagerMXBean} needs to be
+     * unregistered.
+     * </p>
+     **/
+    public enum ScanState {
+        /**
+         * Scanning of directories is in process.
+         **/
+        RUNNING,
+
+        /**
+         * Scanning of directories is not in process, but is scheduled
+         * for a later date.
+         **/
+        SCHEDULED,
+
+        /**
+         * Scanning is successfully completed.
+         **/
+        COMPLETED,
+
+        /**
+         * Scanning is stopped. No scanning is scheduled.
+         **/
+        STOPPED,
+
+        /**
+         * close() was called.
+         **/
+        CLOSED
+
+    }
+
+    /**
+     * Returns the current state of the application.
+     * @return the current state of the application.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanState getState()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Schedule a scan session for a later date.
+     * <p>
+     * A scan session is a background task that will sequentially call {@link
+     * DirectoryScannerMXBean#scan scan()} on every {@link
+     * DirectoryScannerMXBean} configured for this MBean.
+     * </p>
+     * @see #getDirectoryScanners
+     * @param delay The first scan session will be started after
+     *        the given delay. 0 means start now.
+     * @param interval Scan session will be rescheduled periodically
+     *        at the specified interval. The interval starts at the
+     *        the end of the scan session: if a scan session takes
+     *        on average x milliseconds to complete, then a scan session will
+     *        be started on average every x+interval milliseconds.
+     *        if (interval == 0) then scan session will not be
+     *        rescheduled, and will run only once.
+     * @throws IllegalStateException if a scan session is already
+     *         running or scheduled, or the MBean is closed.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void schedule(long delay, long interval)
+        throws IOException, InstanceNotFoundException;
+
+
+    /**
+     * Stops current running or scheduled scan sessions if any.
+     * <p>
+     * A scan session is a background task that will sequentially call {@link
+     * DirectoryScannerMXBean#scan scan()} on every {@link
+     * DirectoryScannerMXBean} configured for this MBean.
+     * </p>
+     * <p>
+     * Scan sessions are started/scheduled by calls to {@link #start start} or
+     * {@link #schedule schedule}.
+     * </p>
+     * After this method completes the state of the application will
+     * be {@link ScanState#STOPPED}.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void stop()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Switches the state to CLOSED.
+     * When closed, this MBean cannot be used any more.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void close()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Starts a scan session immediately.
+     * This is equivalent to {@link #schedule(long,long) schedule(0,0)}.
+     * @throws IllegalStateException if a scan session is already
+     *         running or scheduled, or the MBean is closed.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void start()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the list of directory scanners configured for this MBean.
+     * @return A {@code Map<String,DirectoryScannerMXBean>} where the
+     *         key in the map is the value of the <code>name=</code> key
+     *         of the {@link DirectoryScannerMXBean} ObjectName.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     **/
+    public Map<String,DirectoryScannerMXBean> getDirectoryScanners()
+        throws IOException, JMException;
+
+    /**
+     * Apply the configuration handled by the {@link
+     * #getConfigurationMBean configuration MBean}.
+     * <p>
+     * When the configuration is applied, all the {@link DirectoryScannerMXBean}
+     * created by this MBean will be unregistered, and new {@link
+     * DirectoryScannerMXBean} will be created and registered from the
+     * new {@link ScanDirConfigMXBean#getConfiguration configuration data}.
+     * </p>
+     * <p>
+     * The initial result log configuration held by the {@link
+     * #getConfigurationMBean configuration MBean} will also be pushed to the
+     * {@link ResultLogManagerMXBean}. If you don't want to lose your current
+     * {@link ResultLogManagerMXBean} configuration, you should therefore call
+     * {@link #applyCurrentResultLogConfig
+     * applyCurrentResultLogConfig} before calling
+     * {@link #applyConfiguration applyConfiguration}
+     * </p>
+     * @param fromMemory if {@code true}, the configuration will be applied
+     *        from memory. if {@code false}, the {@code ScanManagerMXBean} will
+     *        ask the {@link
+     * #getConfigurationMBean configuration MBean} to {@link
+     * ScanDirConfigMXBean#load reload its configuration} before applying
+     * it.
+     * @throws IllegalStateException if a scan session is
+     *         running or scheduled, or the MBean is closed.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     **/
+    public void applyConfiguration(boolean fromMemory)
+        throws IOException, JMException;
+    /**
+     * Replaces the {@link
+     * #getConfigurationMBean configuration MBean}'s {@link
+     * com.sun.jmx.examples.scandir.config.ScanManagerConfig#getInitialResultLogConfig
+     * initial result log configuration} with the current {@link
+     * ResultLogManagerMXBean}
+     * configuration. This prevents the <code>ResultLogManagerMXBean</code>
+     * current configuration from being reset when {@link #applyConfiguration
+     * applyConfiguration} is called.
+     * @param toMemory if {@code true} only replaces the initial result log
+     *                 configuration held in memory.
+     *                 if {@code false}, the {@link
+     * #getConfigurationMBean configuration MBean} will be asked to commit
+     * the whole configuration to the configuration file.
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     **/
+    public void applyCurrentResultLogConfig(boolean toMemory)
+        throws IOException, JMException;
+
+    /**
+     * Instruct the {@code ScanManagerMXBean} to use another {@link
+     * ScanDirConfigMXBean configuration MBean}.
+     * <p>This method doesn't {@link #applyConfiguration apply} the new
+     * configuration. If you want to apply the new configuration, you should
+     * additionally call {@link #applyConfiguration
+     * applyConfiguration(true|false)}. Note that you cannot apply a
+     * configuration as long as a scan session is scheduled or running.
+     * In that case you will need to wait for that session to complete
+     * or call {@link #stop} to stop it.
+     * </p>
+     * @param config A proxy to the {@link ScanDirConfigMXBean} that holds
+     * the new configuration for the application.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void setConfigurationMBean(ScanDirConfigMXBean config)
+        throws IOException, InstanceNotFoundException;
+    /**
+     * Gets the current configuration MBean.
+     * @return A proxy to the current configuration MBean.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanDirConfigMXBean getConfigurationMBean()
+        throws IOException, InstanceNotFoundException;
+    /**
+     * This method creates a new alternate {@link ScanDirConfigMXBean}.
+     *
+     * <p>You will need to call {@link #setConfigurationMBean
+     * setConfigurationMBean} if you
+     * want this new {@link ScanDirConfigMXBean} to become the
+     * current configuration MBean.
+     * </p>
+     * <p>
+     * This new {@link ScanDirConfigMXBean} will be unregistered automatically
+     * by the {@code ScanManagerMXBean} when the {@code ScanManagerMXBean}
+     * is unregistered.
+     * </p>
+     * @param name The short name for the new {@link ScanDirConfigMXBean}.
+     *        This name will be used in the ObjectName <code>name=</code> key
+     *        of the new {@link ScanDirConfigMXBean}.
+     * @param filename The path of the file from which the new {@link
+     *        ScanDirConfigMXBean} can {@link ScanDirConfigMXBean#load load} or
+     *        {@link ScanDirConfigMXBean#save save} its configuration data.
+     *        Note that even if the file exists and contain a valid
+     *        configuration, you will still need to call {@link
+     *        ScanDirConfigMXBean#load load} to make the {@link
+     *        ScanDirConfigMXBean} load its configuration data.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     * @return A proxy to the created {@link ScanDirConfigMXBean}.
+     */
+    public ScanDirConfigMXBean createOtherConfigurationMBean(String name,
+            String filename)
+        throws JMException, IOException;
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/DirectoryScannerConfig.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/DirectoryScannerConfig.java
new file mode 100644
index 0000000..b3f8e9f
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/DirectoryScannerConfig.java
@@ -0,0 +1,392 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Logger;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlList;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * The <code>DirectoryScannerConfig</code> Java Bean is used to model
+ * the configuration of a {@link
+ * com.sun.jmx.examples.scandir.DirectoryScannerMXBean}.
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="DirectoryScanner",
+        namespace=XmlConfigUtils.NAMESPACE)
+public class DirectoryScannerConfig {
+
+    //
+    // A logger for this class.
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(DirectoryScannerConfig.class.getName());
+
+    /**
+     * This enumeration is used to model the actions that a {@link
+     * com.sun.jmx.examples.scandir.DirectoryScannerMXBean
+     * DirectoryScannerMXBean} should take when a file matches its set
+     * of matching criteria.
+     **/
+    public enum Action {
+        /**
+         * Indicates that the {@code DirectoryScannerMXBean} should
+         * emit a {@code Notification} when a matching file is found.
+         */
+        NOTIFY,
+        /**
+         * Indicates that the {@code DirectoryScannerMXBean} should
+         * delete the matching files.
+         */
+        DELETE,
+        /**
+         * Indicates that the {@code DirectoryScannerMXBean} should
+         * log the actions that were taken on the matching files.
+         */
+        LOGRESULT };
+
+    // A short name for the Directory Scanner
+    // This name is used for the value of the {@code name=} key in the
+    // {@code DirectoryScannerMXBean} ObjectName.
+    private String name;
+
+    // The root directory of the Directory Scanner
+    private String rootDirectory;
+
+    // List of filters identifying files that should be selected.
+    // A file is selected if at least one filter matches.
+    //
+    private final List<FileMatch> includeFiles =
+            new ArrayList<FileMatch>();
+
+    // List of filters identifying files that should be excluded.
+    // A file is excluded if at least one filter matches.
+    //
+    private final List<FileMatch> excludeFiles =
+            new ArrayList<FileMatch>();
+
+
+    // The actions that this Directory Scanner should carry out when a
+    // file is selected. Default is NOTIFY and LOGRESULT.
+    //
+    private Action[] actions = { Action.NOTIFY, Action.LOGRESULT };
+
+    /**
+     * Creates a new instance of {@code DirectoryScannerConfig}.
+     * We keep this empty constructor to make XML binding easier.
+     * You shouldn't use this constructor directly:
+     * use {@link #DirectoryScannerConfig(String)
+     * DirectoryScannerConfig(String name)} instead.
+     * @deprecated <p>Tagged deprecated so that a compiler warning is issued.
+     *             Use {@link #DirectoryScannerConfig(String)
+     *                  DirectoryScannerConfig(String name)} instead.
+     *             </p>
+     **/
+    public DirectoryScannerConfig() {
+        this(null);
+    }
+
+    /**
+     * Creates a new instance of {@code DirectoryScannerConfig}.
+     * @param name A short name for the Directory Scanner. This name is used for
+     *        the value of the {@code name=} key in the
+     *        {@code DirectoryScannerMXBean} ObjectName.
+     **/
+    public DirectoryScannerConfig(String name) {
+        this.name = name;
+        rootDirectory = null;
+    }
+
+    /**
+     * Gets the root directory configured for that Directory Scanner.
+     * @return the root directory at which the directory scanner should start
+     *         scanning.
+     **/
+    @XmlElement(name="RootDirectory",namespace=XmlConfigUtils.NAMESPACE)
+    public String getRootDirectory() {
+        return rootDirectory;
+    }
+
+    /**
+     * Configures a root directory for that Directory Scanner.
+     * @param root The root directory at which the directory scanner should
+     *        start scanning.
+     **/
+    public void setRootDirectory(String root) {
+        rootDirectory=root;
+    }
+
+
+    /**
+     * Gets the short name of this directory scanner.
+     *
+     * <p>
+     * This name is used for the value of the {@code name=} key in the
+     * {@code DirectoryScannerMXBean} ObjectName.
+     * </p>
+     *
+     * @return the short name of this directory scanner.
+     **/
+    @XmlAttribute(name="name",required=true)
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Setter for property {@link #getName() name}.
+     * Once set its value cannot change.
+     * @param name New value of property name.
+     * @throws IllegalArgumentException if {@code name} is already set to a
+     *         different non null value.
+     */
+    public void setName(String name) {
+        if (this.name == null)
+            this.name = name;
+        else if (name == null)
+            throw new IllegalArgumentException("name=null");
+        else if (!name.equals(this.name))
+            throw new IllegalArgumentException("name="+name);
+    }
+
+    /**
+     * Getter for property includeFiles.
+     * This is an array of filters identifying files that should be selected.
+     * A file is selected if at least one filter matches.
+     * @return Value of property includeFiles.
+     */
+    @XmlElementWrapper(name="IncludeFiles",
+            namespace=XmlConfigUtils.NAMESPACE)
+    @XmlElementRef
+    public FileMatch[] getIncludeFiles() {
+        synchronized(includeFiles) {
+            return includeFiles.toArray(new FileMatch[0]);
+        }
+    }
+
+    /**
+     * Adds a filter to the includeFiles property.
+     * A file is selected if at least one filter matches.
+     * @param include A filter identifying files that should be selected.
+     */
+    public void addIncludeFiles(FileMatch include) {
+        if (include == null)
+            throw new IllegalArgumentException("null");
+        synchronized (includeFiles) {
+            includeFiles.add(include);
+        }
+    }
+
+    /**
+     * Setter for property includeFiles.
+     * @param includeFiles New value of property includeFiles.
+     *        This is an array of filters identifying files
+     *        that should be selected. A file is selected if at least
+     *        one filter matches.
+     */
+    public void setIncludeFiles(FileMatch[] includeFiles) {
+        synchronized (this.includeFiles) {
+            this.includeFiles.clear();
+            if (includeFiles == null) return;
+            this.includeFiles.addAll(Arrays.asList(includeFiles));
+        }
+    }
+
+    /**
+     * Getter for property excludeFiles.
+     * This is an array of filters identifying files that should be excluded.
+     * A file is excluded if at least one filter matches.
+     * @return Value of property excludeFiles.
+     */
+    @XmlElementWrapper(name="ExcludeFiles",
+            namespace=XmlConfigUtils.NAMESPACE)
+    @XmlElementRef
+    public FileMatch[] getExcludeFiles() {
+        synchronized(excludeFiles) {
+            return excludeFiles.toArray(new FileMatch[0]);
+        }
+    }
+
+    /**
+     * Setter for property excludeFiles.
+     * @param excludeFiles New value of property excludeFiles.
+     *        This is an array of filters identifying files
+     *        that should be excluded. A file is excluded if at least
+     *        one filter matches.
+     */
+    public void setExcludeFiles(FileMatch[] excludeFiles) {
+        synchronized (this.excludeFiles) {
+            this.excludeFiles.clear();
+            if (excludeFiles == null) return;
+            this.excludeFiles.addAll(Arrays.asList(excludeFiles));
+        }
+    }
+
+    /**
+     * Adds a filter to the excludeFiles property.
+     * A file is excluded if at least one filter matches.
+     * @param exclude A filter identifying files that should be excluded.
+     */
+    public void addExcludeFiles(FileMatch exclude) {
+        if (exclude == null)
+            throw new IllegalArgumentException("null");
+        synchronized (excludeFiles) {
+            this.excludeFiles.add(exclude);
+        }
+    }
+
+    /**
+     * Gets the list of actions that this Directory Scanner should carry
+     * out when a file is selected. Default is NOTIFY and LOGRESULT.
+
+     * @return The list of actions that this Directory Scanner should carry
+     * out when a file is selected.
+     */
+    @XmlElement(name="Actions",namespace=XmlConfigUtils.NAMESPACE)
+    @XmlList
+    public Action[] getActions() {
+       return  (actions == null)?null:actions.clone();
+    }
+
+    /**
+     * Sets the list of actions that this Directory Scanner should carry
+     * out when a file is selected. Default is NOTIFY and LOGRESULT.
+
+     * @param actions The list of actions that this Directory Scanner should
+     * carry out when a file is selected.
+     */
+    public void setActions(Action[] actions) {
+        this.actions = (actions == null)?null:actions.clone();
+    }
+
+    /**
+     * Builds a {@code FileFilter} from the {@link #getIncludeFiles
+     * includeFiles} and {@link #getExcludeFiles excludeFiles} lists.
+     * A file will be accepted if it is selected by at least one of
+     * the filters in {@link #getIncludeFiles includeFiles}, and is
+     * not excluded by any of the filters in {@link
+     * #getExcludeFiles excludeFiles}. If there's no filter in
+     * {@link #getIncludeFiles includeFiles}, then a file is accepted
+     * simply if it is not excluded by any of the filters in {@link
+     * #getExcludeFiles excludeFiles}.
+     *
+     * @return A new {@code FileFilter}  created from the current snapshot
+     *         of the {@link #getIncludeFiles
+     * includeFiles} and {@link #getExcludeFiles excludeFiles} lists.
+     *         Later modification of these lists will not affect the
+     *         returned {@code FileFilter}.
+     **/
+    public FileFilter buildFileFilter() {
+        final FileFilter[] ins = getIncludeFiles();
+        final FileFilter[] outs = getExcludeFiles();
+        final FileFilter filter = new FileFilter() {
+            public boolean accept(File f) {
+                boolean result = false;
+                // If no include filter, all files are included.
+                if (ins != null) {
+                    for (FileFilter in: ins) {
+                        // if one filter accepts it, file is included
+                        if (!in.accept(f)) continue;
+
+                        // file is accepted, include it
+                        result=true;
+                        break;
+                    }
+                } else result= true;
+                if (result == false) return false;
+
+                // The file is in the include list. Let's see if it's not
+                // in the exclude list...
+                //
+                if (outs != null) {
+                    for (FileFilter out: outs) {
+                        // if one filter accepts it, file is excluded
+                        if (!out.accept(f)) continue;
+
+                        // file is accepted, exclude it.
+                        result=false;
+                        break;
+                    }
+                }
+                return result;
+            }
+        };
+        return filter;
+    }
+
+    // Used for equality - see equals().
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            name,rootDirectory,actions,excludeFiles,includeFiles
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof DirectoryScannerConfig)) return false;
+        final DirectoryScannerConfig other = (DirectoryScannerConfig)o;
+        final Object[] thisconfig = toArray();
+        final Object[] otherconfig = other.toArray();
+        return Arrays.deepEquals(thisconfig,otherconfig);
+    }
+
+    @Override
+    public int hashCode() {
+        final String key = name;
+        if (key == null) return 0;
+        else return key.hashCode();
+    }
+
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/FileMatch.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/FileMatch.java
new file mode 100644
index 0000000..31f44ce
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/FileMatch.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.logging.Logger;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * The <code>FileMatch</code> Java Bean is used to model
+ * the configuration of a {@link FileFilter} which
+ * matches {@link File files} against a set of criteria.
+ * <p>
+ * The <code>FileMatch</code> class also implements
+ * {@link FileFilter} - applying an {@code AND} on all
+ * its conditions. {@code OR} conditions can be obtained
+ * by supplying several instances of <code>FileMatch</code>
+ * to the encapsulating {@link DirectoryScannerConfig}, which
+ * respectively applies an {@code OR} on all its
+ * {@code <FileFilter>} elements.
+ * </p>
+ *
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="FileFilter",
+        namespace=XmlConfigUtils.NAMESPACE)
+public class FileMatch implements FileFilter {
+
+    //
+    // A logger for this class.
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(FileMatch.class.getName());
+
+    /**
+     * A regular expression against which directory names should be matched.
+     */
+    private String directoryPattern;
+
+    /**
+     * A regular expression against which file names should be matched.
+     */
+    private String filePattern;
+
+    /**
+     * File whose size in bytes exceeds this limit will be selected.
+     */
+    private long sizeExceedsMaxBytes;
+
+    /**
+     * A file which will be selected only if it was last modified after
+     * this date
+     */
+    private Date lastModifiedAfter;
+
+    /**
+     * A file which will be selected only if it was last modified before
+     * this date
+     */
+    private Date lastModifiedBefore;
+
+    /**
+     * Creates a new instance of FileMatch
+     */
+    public FileMatch() {
+    }
+
+    /**
+     * Getter for property directoryPattern. This is a regular expression
+     * against which directory names should be matched.
+     * Applies only to directory, and tells whether a directory should be
+     * included or excluded from the search.
+     * <p>If File.isDirectory() && directoryPattern!=null &&
+     *    File.getName().matches(directoryPattern),
+     *    then File matches this filter.<br>
+     *    If File.isDirectory() && directoryPattern!=null &&
+     *    File.getName().matches(directoryPattern)==false,
+     *    then File doesn't match this filter.<br>
+     * </p>
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     * @return Value of property directoryPattern.
+     */
+    @XmlElement(name="DirectoryPattern",namespace=XmlConfigUtils.NAMESPACE)
+    public String getDirectoryPattern() {
+        return this.directoryPattern;
+    }
+
+    /**
+     * Setter for property directoryPattern.
+     * @param directoryPattern New value of property directoryPattern.
+     * This is a regular expression
+     * against which directory names should be {@link #getDirectoryPattern
+     * matched}.
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     */
+    public void setDirectoryPattern(String directoryPattern) {
+        this.directoryPattern = directoryPattern;
+    }
+
+    /**
+     * Getter for property filePattern. This is a regular expression
+     * against which file names should be matched.
+     * Applies only to files.
+     * <p>
+     *    If File.isDirectory()==false && filePattern!=null &&
+     *    File.getName().matches(filePattern)==false,
+     *    then File doesn't match this filter.
+     * </p>
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     * @return Value of property filePatern.
+     */
+    @XmlElement(name="FilePattern",namespace=XmlConfigUtils.NAMESPACE)
+    public String getFilePattern() {
+        return this.filePattern;
+    }
+
+    /**
+     * Setter for property filePattern.
+     * @param filePattern New value of property filePattern.
+     * This is a regular expression
+     * against which file names should be {@link #getFilePattern matched}.
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     */
+    public void setFilePattern(String filePattern) {
+        this.filePattern = filePattern;
+    }
+
+    /**
+     * Getter for property sizeExceedsMaxBytes.
+     * Ignored if 0 or negative. Otherwise, files whose size in bytes does
+     * not exceed this limit will be excluded by this filter.
+     *
+     * @return Value of property sizeExceedsMaxBytes.
+     */
+    @XmlElement(name="SizeExceedsMaxBytes",namespace=XmlConfigUtils.NAMESPACE)
+    public long getSizeExceedsMaxBytes() {
+        return this.sizeExceedsMaxBytes;
+    }
+
+    /**
+     * Setter for property sizeExceedsMaxBytes.
+     * @param sizeLimitInBytes New value of property sizeExceedsMaxBytes.
+     * Ignored if 0 or negative. Otherwise, files whose size in bytes does
+     * not exceed this limit will be excluded by this filter.
+     *
+     */
+    public void setSizeExceedsMaxBytes(long sizeLimitInBytes) {
+        this.sizeExceedsMaxBytes = sizeLimitInBytes;
+    }
+
+    /**
+     * Getter for property {@code lastModifiedAfter}.
+     * A file will be selected only if it was last modified after
+     * {@code lastModifiedAfter}.
+     * <br>This condition is ignored if {@code lastModifiedAfter} is
+     * {@code null}.
+     * @return Value of property {@code lastModifiedAfter}.
+     */
+    @XmlElement(name="LastModifiedAfter",namespace=XmlConfigUtils.NAMESPACE)
+    public Date getLastModifiedAfter() {
+        return (lastModifiedAfter==null)?null:(Date)lastModifiedAfter.clone();
+    }
+
+    /**
+     * Setter for property {@code lastModifiedAfter}.
+     * @param lastModifiedAfter  A file will be selected only if it was
+     * last modified after  {@code lastModifiedAfter}.
+     * <br>This condition is ignored if {@code lastModifiedAfter} is
+     * {@code null}.
+     */
+    public void setLastModifiedAfter(Date lastModifiedAfter) {
+        this.lastModifiedAfter =
+                (lastModifiedAfter==null)?null:(Date)lastModifiedAfter.clone();
+    }
+
+    /**
+     * Getter for property {@code lastModifiedBefore}.
+     * A file will be selected only if it was last modified before
+     * {@code lastModifiedBefore}.
+     * <br>This condition is ignored if {@code lastModifiedBefore} is
+     * {@code null}.
+     * @return Value of property {@code lastModifiedBefore}.
+     */
+    @XmlElement(name="LastModifiedBefore",namespace=XmlConfigUtils.NAMESPACE)
+    public Date getLastModifiedBefore() {
+        return (lastModifiedBefore==null)?null:(Date)lastModifiedBefore.clone();
+    }
+
+    /**
+     * Setter for property {@code lastModifiedBefore}.
+     * @param lastModifiedBefore  A file will be selected only if it was
+     * last modified before {@code lastModifiedBefore}.
+     * <br>This condition is ignored if {@code lastModifiedBefore} is
+     * {@code null}.
+     */
+    public void setLastModifiedBefore(Date lastModifiedBefore) {
+        this.lastModifiedBefore =
+             (lastModifiedBefore==null)?null:(Date)lastModifiedBefore.clone();
+    }
+
+    // Accepts or rejects a file with regards to the values of the fields
+    // configured in this bean. The accept() method is the implementation
+    // of FileFilter.accept(File);
+    //
+    /**
+     * A file is accepted when all the criteria that have been set
+     * are matched.
+     * @param f The file to match against the configured criteria.
+     * @return {@code true} if the file matches all criteria,
+     * {@code false} otherwise.
+     */
+    public boolean accept(File f) {
+
+        // Directories are accepted if they match against the directory pattern.
+        //
+        if (f.isDirectory()) {
+            if (directoryPattern != null
+                && !f.getName().matches(directoryPattern))
+                return false;
+            else return true;
+        }
+
+        // If we reach here, the f is not a directory.
+        //
+        // Files are accepted if they match all other conditions.
+
+        // Check whether f matches filePattern
+        if (filePattern != null
+                && !f.getName().matches(filePattern))
+            return false;
+
+        // Check whether f exceeeds size limit
+        if (sizeExceedsMaxBytes > 0 && f.length() <= sizeExceedsMaxBytes)
+            return false;
+
+        // Check whether f was last modified after lastModifiedAfter
+        if (lastModifiedAfter != null &&
+                lastModifiedAfter.after(new Date(f.lastModified())))
+            return false;
+
+        // Check whether f was last modified before lastModifiedBefore
+        if (lastModifiedBefore != null &&
+                lastModifiedBefore.before(new Date(f.lastModified())))
+            return false;
+
+        // All conditions were met: accept file.
+        return true;
+    }
+
+    // used by equals()
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            directoryPattern, filePattern, lastModifiedAfter,
+            lastModifiedBefore, sizeExceedsMaxBytes
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof FileMatch)) return false;
+        final FileMatch other = (FileMatch)o;
+        final Object[] thisconfig = toArray();
+        final Object[] otherconfig = other.toArray();
+        return Arrays.deepEquals(thisconfig,otherconfig);
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.deepHashCode(toArray());
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultLogConfig.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultLogConfig.java
new file mode 100644
index 0000000..5f3d668
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultLogConfig.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.util.Arrays;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * The <code>ResultLogConfig</code> Java Bean is used to model
+ * the initial configuration of the {@link
+ * com.sun.jmx.examples.scandir.ResultLogManagerMXBean}.
+ *
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="ResultLogConfig",
+        namespace=XmlConfigUtils.NAMESPACE)
+public class ResultLogConfig {
+
+    //
+    // A logger for this class.
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(ResultLogConfig.class.getName());
+
+    /**
+     * The path to the result log file. {@code null} means that logging to
+     * file is disabled.
+     */
+    private String logFileName;
+
+    /**
+     * Maximum number of record that will be logged in the log file before
+     * switching to a new log file.
+     */
+    private long logFileMaxRecords;
+
+    /**
+     * The maximum number of records that can be contained in the memory log.
+     * When this number is reached, the memory log drops its eldest record
+     * to make way for the new one.
+     */
+    private int memoryMaxRecords;
+
+    /**
+     * Creates a new instance of ResultLogConfig
+     */
+    public ResultLogConfig() {
+    }
+
+    /**
+     * Gets the path to the result log file. {@code null} means that logging to
+     * file is disabled.
+     * @return the path to the result log file.
+     */
+    @XmlElement(name="LogFileName",namespace=XmlConfigUtils.NAMESPACE)
+    public String getLogFileName() {
+        return this.logFileName;
+    }
+
+    /**
+     * Sets the path to the result log file. {@code null} means that
+     * logging to file is disabled.
+     * @param logFileName the path to the result log file.
+     */
+    public void setLogFileName(String logFileName) {
+        this.logFileName = logFileName;
+    }
+
+    /**
+     * Gets the maximum number of record that will be logged in the log file
+     * before switching to a new log file.
+     * A 0 or negative value means no limit.
+     * @return the maximum number of record that will be logged in the log file.
+     */
+    @XmlElement(name="LogFileMaxRecords",namespace=XmlConfigUtils.NAMESPACE)
+    public long getLogFileMaxRecords() {
+        return this.logFileMaxRecords;
+    }
+
+    /**
+     * Sets the maximum number of record that will be logged in the log file
+     * before switching to a new log file.
+     * A 0 or negative value means no limit.
+     * @param logFileMaxRecords the maximum number of record that will be
+     * logged in the log file.
+     */
+    public void setLogFileMaxRecords(long logFileMaxRecords) {
+        this.logFileMaxRecords = logFileMaxRecords;
+    }
+
+    /**
+     * Gets the maximum number of records that can be contained in the memory
+     * log.
+     * When this number is reached, the memory log drops its eldest record
+     * to make way for the new one.
+     * @return the maximum number of records that can be contained in the
+     * memory log.
+     */
+    @XmlElement(name="MemoryMaxRecords",namespace=XmlConfigUtils.NAMESPACE)
+    public int getMemoryMaxRecords() {
+        return this.memoryMaxRecords;
+    }
+
+    /**
+     * Sets the maximum number of records that can be contained in the memory
+     * log.
+     * When this number is reached, the memory log drops its eldest record
+     * to make way for the new one.
+     * @param memoryMaxRecords the maximum number of records that can be
+     * contained in the memory log.
+     */
+    public void setMemoryMaxRecords(int memoryMaxRecords) {
+        this.memoryMaxRecords = memoryMaxRecords;
+    }
+
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            memoryMaxRecords,logFileMaxRecords,logFileName
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof ResultLogConfig)) return false;
+        final ResultLogConfig other = (ResultLogConfig)o;
+        return Arrays.deepEquals(toArray(),other.toArray());
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.deepHashCode(toArray());
+    }
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultRecord.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultRecord.java
new file mode 100644
index 0000000..5e3188a
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultRecord.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.util.Date;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlList;
+import javax.xml.bind.annotation.XmlRootElement;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig.Action;
+import java.io.File;
+import java.util.Arrays;
+
+/**
+ * The <code>ResultRecord</code> Java Bean is used to write the
+ * results of a directory scan to a result log.
+ *
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="ResultRecord",namespace=XmlConfigUtils.NAMESPACE)
+public class ResultRecord {
+
+    /**
+     * The name of the file for which this result record is built.
+     */
+    private String filename;
+
+    /**
+     * The Date at which this result was obtained.
+     */
+    private Date date;
+
+    /**
+     * The short name of the directory scanner which performed the operation.
+     * @see DirectoryScannerConfig#getName()
+     */
+    private String directoryScanner;
+
+    /**
+     * The list of actions that were successfully carried out.
+     */
+    private Action[] actions;
+
+    /**
+     * Creates a new empty instance of ResultRecord.
+     */
+    public ResultRecord() {
+    }
+
+    /**
+     * Creates a new instance of ResultRecord.
+     * @param scan The DirectoryScannerConfig for which this result was
+     *        obtained.
+     * @param actions The list of actions that were successfully carried out.
+     * @param f The file for which these actions were successfully carried out.
+     */
+    public ResultRecord(DirectoryScannerConfig scan, Action[] actions,
+                     File f) {
+        directoryScanner = scan.getName();
+        this.actions = actions;
+        date = new Date();
+        filename = f.getAbsolutePath();
+    }
+
+    /**
+     * Gets the name of the file for which this result record is built.
+     * @return The name of the file for which this result record is built.
+     */
+    @XmlElement(name="Filename",namespace=XmlConfigUtils.NAMESPACE)
+    public String getFilename() {
+        return this.filename;
+    }
+
+    /**
+     * Sets the name of the file for which this result record is being built.
+     * @param filename the name of the file for which this result record is
+     *        being built.
+     */
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+
+    /**
+     * Gets the Date at which this result was obtained.
+     * @return the Date at which this result was obtained.
+     */
+    @XmlElement(name="Date",namespace=XmlConfigUtils.NAMESPACE)
+    public Date getDate() {
+        synchronized(this) {
+            return (date==null)?null:(new Date(date.getTime()));
+        }
+    }
+
+    /**
+     * Sets the Date at which this result was obtained.
+     * @param date the Date at which this result was obtained.
+     */
+    public void setDate(Date date) {
+        synchronized (this) {
+            this.date = (date==null)?null:(new Date(date.getTime()));
+        }
+    }
+
+    /**
+     * Gets the short name of the directory scanner which performed the
+     * operation.
+     * @see DirectoryScannerConfig#getName()
+     * @return the short name of the directory scanner which performed the
+     * operation.
+     */
+    @XmlElement(name="DirectoryScanner",namespace=XmlConfigUtils.NAMESPACE)
+    public String getDirectoryScanner() {
+        return this.directoryScanner;
+    }
+
+    /**
+     * Sets the short name of the directory scanner which performed the
+     * operation.
+     * @see DirectoryScannerConfig#getName()
+     * @param directoryScanner the short name of the directory scanner which
+     * performed the operation.
+     */
+    public void setDirectoryScanner(String directoryScanner) {
+        this.directoryScanner = directoryScanner;
+    }
+
+    /**
+     * Gets the list of actions that were successfully carried out.
+     * @return the list of actions that were successfully carried out.
+     */
+    @XmlElement(name="Actions",namespace=XmlConfigUtils.NAMESPACE)
+    @XmlList
+    public Action[] getActions() {
+        return (actions == null)?null:actions.clone();
+    }
+
+    /**
+     * Sets the list of actions that were successfully carried out.
+     * @param actions the list of actions that were successfully carried out.
+     */
+    public void setActions(Action[] actions) {
+        this.actions = (actions == null)?null:actions.clone();
+    }
+
+    // Used for equality
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            filename, date, directoryScanner, actions
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ResultRecord)) return false;
+        return Arrays.deepEquals(toArray(),((ResultRecord)o).toArray());
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.deepHashCode(toArray());
+    }
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ScanManagerConfig.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ScanManagerConfig.java
new file mode 100644
index 0000000..e1afcce
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ScanManagerConfig.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+/**
+ * The <code>ScanManagerConfig</code> Java Bean is used to model
+ * the configuration of the {@link
+ * com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean}.
+ *
+ * The {@link
+ * com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean} will
+ * use this configuration to initialize the {@link
+ * com.sun.jmx.examples.scandir.ResultLogManagerMXBean ResultLogManagerMXBean}
+ * and create the {@link
+ * com.sun.jmx.examples.scandir.DirectoryScannerMXBean DirectoryScannerMXBeans}
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+@XmlRootElement(name="ScanManager",
+        namespace="jmx:com.sun.jmx.examples.scandir.config")
+public class ScanManagerConfig {
+
+    // A logger for this class
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(ScanManagerConfig.class.getName());
+
+    /**
+     * A set of DirectoryScannerConfig objects indexed by their names.
+     **/
+    private final Map<String, DirectoryScannerConfig> directoryScanners;
+
+    /**
+     * The initial Result Log configuration.
+     */
+    private ResultLogConfig initialResultLogConfig;
+
+    /**
+     * Holds value of property name. The name of the configuration
+     *       usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     **/
+    private String name;
+
+    /**
+     * Creates a new instance of ScanManagerConfig.
+     * <p>You should not use this constructor directly, but use
+     *    {@link #ScanManagerConfig(String)} instead.
+     * </p>
+     * <p>This constructor is tagged deprecated so that the compiler
+     *    will generate a warning if it is used by mistake.
+     * </p>
+     * @deprecated Use {@link #ScanManagerConfig(String)} instead. This
+     *             constructor is used through reflection by the XML
+     *             binding framework.
+     */
+    public ScanManagerConfig() {
+        this(null,true);
+    }
+
+    /**
+     * Creates a new instance of ScanManagerConfig.
+     * @param name The name of the configuration which usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     **/
+    public ScanManagerConfig(String name) {
+        this(name,false);
+    }
+
+    // Our private constructor...
+    private ScanManagerConfig(String name, boolean allowsNull) {
+        if (name == null && allowsNull==false)
+            throw new IllegalArgumentException("name=null");
+        this.name = name;
+        directoryScanners = new LinkedHashMap<String,DirectoryScannerConfig>();
+        this.initialResultLogConfig = new ResultLogConfig();
+        this.initialResultLogConfig.setMemoryMaxRecords(1024);
+    }
+
+    // Creates an array for deep equality.
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            name,directoryScanners,initialResultLogConfig
+        };
+        return thisconfig;
+    }
+
+    // equals
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof ScanManagerConfig)) return false;
+        final ScanManagerConfig other = (ScanManagerConfig)o;
+        if (this.directoryScanners.size() != other.directoryScanners.size())
+            return false;
+        return Arrays.deepEquals(toArray(),other.toArray());
+    }
+
+    @Override
+    public int hashCode() {
+        final String key = name;
+        if (key == null) return 0;
+        else return key.hashCode();
+    }
+
+    /**
+     * Gets the name of this configuration. The name of the configuration
+     *       usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     * @return The name of this configuration.
+     */
+    @XmlAttribute(name="name",required=true)
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Sets the name of this configuration. The name of the configuration
+     *       usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     *       <p>Once set this value cannot change.</p>
+     * @param name The name of this configuration.
+     */
+    public void setName(String name) {
+        if (this.name == null)
+            this.name = name;
+        else if (name == null)
+            throw new IllegalArgumentException("name=null");
+        else if (!name.equals(this.name))
+            throw new IllegalArgumentException("name="+name);
+    }
+
+   /**
+    * Gets the list of Directory Scanner configured by this
+    * configuration. From each element in this list, the
+    * {@link com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean}
+    * will create, initialize, and register a {@link
+    * com.sun.jmx.examples.scandir.DirectoryScannerMXBean}.
+    * @return The list of Directory Scanner configured by this configuration.
+    */
+    @XmlElementWrapper(name="DirectoryScannerList",
+            namespace=XmlConfigUtils.NAMESPACE)
+    @XmlElementRef
+    public DirectoryScannerConfig[] getScanList() {
+        return directoryScanners.values().toArray(new DirectoryScannerConfig[0]);
+    }
+
+   /**
+    * Sets the list of Directory Scanner configured by this
+    * configuration. From each element in this list, the
+    * {@link com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean}
+    * will create, initialize, and register a {@link
+    * com.sun.jmx.examples.scandir.DirectoryScannerMXBean}.
+    * @param scans The list of Directory Scanner configured by this configuration.
+    */
+    public void setScanList(DirectoryScannerConfig[] scans) {
+        directoryScanners.clear();
+        for (DirectoryScannerConfig scan : scans)
+            directoryScanners.put(scan.getName(),scan);
+    }
+
+    /**
+     * Get a directory scanner by its name.
+     *
+     * @param name The name of the directory scanner. This is the
+     *             value returned by {@link
+     *             DirectoryScannerConfig#getName()}.
+     * @return The named {@code DirectoryScannerConfig}
+     */
+    public DirectoryScannerConfig getScan(String name) {
+        return directoryScanners.get(name);
+    }
+
+    /**
+     * Adds a directory scanner to the list.
+     * <p>If a directory scanner
+     * configuration by that name already exists in the list, it will
+     * be replaced by the given <var>scan</var>.
+     * </p>
+     * @param scan The {@code DirectoryScannerConfig} to add to the list.
+     * @return The replaced {@code DirectoryScannerConfig}, or {@code null}
+     *         if there was no {@code DirectoryScannerConfig} by that name
+     *         in the list.
+     */
+    public DirectoryScannerConfig putScan(DirectoryScannerConfig scan) {
+        return this.directoryScanners.put(scan.getName(),scan);
+    }
+
+    // XML value of  this object.
+    public String toString() {
+        return XmlConfigUtils.toString(this);
+    }
+
+    /**
+     * Removes the named directory scanner from the list.
+     *
+     * @param name The name of the directory scanner. This is the
+     *             value returned by {@link
+     *             DirectoryScannerConfig#getName()}.
+     * @return The removed {@code DirectoryScannerConfig}, or {@code null}
+     *         if there was no directory scanner by that name in the list.
+     */
+    public DirectoryScannerConfig removeScan(String name) {
+       return this.directoryScanners.remove(name);
+    }
+
+    /**
+     * Gets the initial Result Log Configuration.
+     * @return The initial Result Log Configuration.
+     */
+    @XmlElement(name="InitialResultLogConfig",namespace=XmlConfigUtils.NAMESPACE)
+    public ResultLogConfig getInitialResultLogConfig() {
+        return this.initialResultLogConfig;
+    }
+
+    /**
+     * Sets the initial Result Log Configuration.
+     * @param initialLogConfig The initial Result Log Configuration.
+     */
+    public void setInitialResultLogConfig(ResultLogConfig initialLogConfig) {
+        this.initialResultLogConfig = initialLogConfig;
+    }
+
+    /**
+     * Creates a copy of this object, with the specified name.
+     * @param newname the name of the copy.
+     * @return A copy of this object.
+     **/
+    public ScanManagerConfig copy(String newname) {
+        return copy(newname,this);
+    }
+
+    // Copy by XML cloning, then change the name.
+    //
+    private static ScanManagerConfig
+            copy(String newname, ScanManagerConfig other) {
+        ScanManagerConfig newbean = XmlConfigUtils.xmlClone(other);
+        newbean.name = newname;
+        return newbean;
+    }
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/XmlConfigUtils.java b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/XmlConfigUtils.java
new file mode 100644
index 0000000..a3e663d
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/XmlConfigUtils.java
@@ -0,0 +1,393 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.logging.Logger;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+/**
+ * The class XmlConfigUtils is used to deal with XML serialization
+ * and XML files.
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class XmlConfigUtils {
+
+    /**
+     * A URI for our XML configuration namespace. This doesn't start with
+     * http:// because we are not going to publish this private schema
+     * anywhere.
+     **/
+    public static final String NAMESPACE =
+            "jmx:com.sun.jmx.examples.scandir.config";
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(XmlConfigUtils.class.getName());
+
+    // Our JAXBContext.
+    private static JAXBContext context;
+
+    // The file name of the XML file in which an instance of this object
+    // will read and write XML data.
+    final String file;
+
+    /**
+     * Creates a new instance of XmlConfigUtils.
+     * @param file The file name of the XML file in which an instance of this
+     *        object will read and write XML data.
+     */
+    public XmlConfigUtils(String file) {
+        this.file = file;
+    }
+
+    /**
+     * Write the given bean to the XML file.
+     * <p>
+     * Performs an atomic write, first writing in {@code <file>.new}, then
+     * renaming {@code <file>} to {@code <file>~}, then renaming
+     * renaming {@code <file>.new} to {@code <file>}.
+     * </p>
+     * @param bean The configuration to write in the XML file.
+     * @throws IOException if write to file failed.
+     **/
+    public synchronized void writeToFile(ScanManagerConfig bean)
+        throws IOException {
+
+        // Creates a new file named <file>.new
+        final File f = newXmlTmpFile(file);
+        try {
+            final FileOutputStream out = new FileOutputStream(f);
+            boolean failed = true;
+            try {
+                // writes to <file>.new
+                write(bean,out,false);
+
+                // no exception: set failed=false for finaly {} block.
+                failed = false;
+            } finally {
+                out.close();
+                // An exception was raised: delete temporary file.
+                if (failed == true) f.delete();
+            }
+
+            // rename <file> to <file>~ and <file>.new to <file>
+            commit(file,f);
+        } catch (JAXBException x) {
+            final IOException io =
+                    new IOException("Failed to write SessionConfigBean to " +
+                    file+": "+x,x);
+            throw io;
+        }
+    }
+
+    /**
+     * Creates an XML string representation of the given bean.
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XMLbinding context.
+     * @return An XML string representation of the given bean.
+     **/
+    public static String toString(Object bean) {
+        try {
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            final Marshaller m = createMarshaller();
+            m.setProperty(m.JAXB_FRAGMENT,Boolean.TRUE);
+            m.marshal(bean, baos);
+            return baos.toString();
+        } catch (JAXBException x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException(
+                        "Failed to write SessionConfigBean: "+x,x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Creates an XML clone of the given bean.
+     * <p>
+     * In other words, this method XML-serializes the given bean, and
+     * XML-deserializes a copy of that bean.
+     * </p>
+     * @return A deep-clone of the given bean.
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XML binding context.
+     * @param bean The bean to clone.
+     */
+    public static ScanManagerConfig xmlClone(ScanManagerConfig bean) {
+        final Object clone = copy(bean);
+        return (ScanManagerConfig)clone;
+    }
+
+    /**
+     * Creates an XML clone of the given bean.
+     * <p>
+     * In other words, this method XML-serializes the given bean, and
+     * XML-deserializes a copy of that bean.
+     * </p>
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XML binding context.
+     * @return A deep-clone of the given bean.
+     **/
+    private static Object copy(Object bean) {
+        try {
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            final Marshaller m = createMarshaller();
+            m.marshal(bean, baos);
+            final ByteArrayInputStream bais =
+                    new ByteArrayInputStream(baos.toByteArray());
+            return createUnmarshaller().unmarshal(bais);
+        } catch (JAXBException x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException("Failed to write SessionConfigBean: "+x,x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Creates an XML clone of the given bean.
+     * <p>
+     * In other words, this method XML-serializes the given bean, and
+     * XML-deserializes a copy of that bean.
+     * </p>
+     * @return A deep-clone of the given bean.
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XML binding context.
+     * @param bean The bean to clone.
+     */
+    public static DirectoryScannerConfig xmlClone(DirectoryScannerConfig bean) {
+        final Object clone = copy(bean);
+        return (DirectoryScannerConfig)clone;
+    }
+
+    /**
+     * Reads the configuration from the XML configuration file.
+     * @throws IOException if it fails to read the configuration.
+     * @return A {@code ScanManagerConfig} bean read from the
+     *         XML configuration file.
+     **/
+    public synchronized ScanManagerConfig readFromFile() throws IOException {
+        final File f = new File(file);
+        if (!f.exists())
+            throw new IOException("No such file: "+file);
+        if (!f.canRead())
+            throw new IOException("Can't read file: "+file);
+        try {
+            return read(f);
+        } catch (JAXBException x) {
+            final IOException io =
+                    new IOException("Failed to read SessionConfigBean from " +
+                    file+": "+x,x);
+            throw io;
+        }
+    }
+
+    /**
+     * Reads the configuration from the given XML configuration file.
+     * @param f the file to read from.
+     * @return A {@code ScanManagerConfig} bean read from the
+     *         XML configuration file.
+     * @throws javax.xml.bind.JAXBException if it fails to read the configuration.
+     */
+    public static ScanManagerConfig read(File f)
+        throws JAXBException {
+        final Unmarshaller u = createUnmarshaller();
+        return (ScanManagerConfig) u.unmarshal(f);
+
+    }
+
+    /**
+     * Writes the given bean to the given output stream.
+     * @param bean the bean to write.
+     * @param os the output stream to write to.
+     * @param fragment whether the {@code <?xml ... ?>} header should be
+     *        included. The header is not included if the bean is just an
+     *        XML fragment encapsulated in a higher level XML element.
+     * @throws JAXBException An XML Binding exception occurred.
+     **/
+    public static void write(ScanManagerConfig bean, OutputStream os,
+            boolean fragment)
+        throws JAXBException {
+        writeXml((Object)bean,os,fragment);
+    }
+
+    /**
+     * Writes the given bean to the given output stream.
+     * @param bean the bean to write.
+     * @param os the output stream to write to.
+     * @param fragment whether the {@code <?xml ... ?>} header should be
+     *        included. The header is not included if the bean is just an
+     *        XML fragment encapsulated in a higher level XML element.
+     * @throws JAXBException An XML Binding exception occurred.
+     **/
+    public static void write(ResultRecord bean, OutputStream os, boolean fragment)
+        throws JAXBException {
+        writeXml((Object)bean,os,fragment);
+    }
+
+    /**
+     * Writes the given bean to the given output stream.
+     * @param bean the bean to write.
+     * @param os the output stream to write to.
+     * @param fragment whether the {@code <?xml ... ?>} header should be
+     *        included. The header is not included if the bean is just an
+     *        XML fragment encapsulated in a higher level XML element.
+     * @throws JAXBException An XML Binding exception occurred.
+     **/
+    private static void writeXml(Object bean, OutputStream os, boolean fragment)
+        throws JAXBException {
+        final Marshaller m = createMarshaller();
+        if (fragment) m.setProperty(m.JAXB_FRAGMENT,Boolean.TRUE);
+        m.marshal(bean,os);
+    }
+
+    // Creates a JAXB Unmarshaller.
+    private static Unmarshaller createUnmarshaller() throws JAXBException {
+        return getContext().createUnmarshaller();
+    }
+
+    // Creates a JAXB Marshaller - for nicely XML formatted output.
+    private static Marshaller createMarshaller() throws JAXBException {
+        final  Marshaller m = getContext().createMarshaller();
+        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
+        return m;
+    }
+
+    // Creates a JAXBContext if needed, and returns it.
+    // The JAXBContext instance we create will be able to handle the
+    // ScanManagerConfig and ResultRecord classes, plus all the property
+    // classes they reference (DirectoryScannerBean etc...).
+    //
+    private static synchronized JAXBContext getContext() throws JAXBException {
+        if (context == null)
+            context = JAXBContext.newInstance(ScanManagerConfig.class,
+                                              ResultRecord.class);
+        return context;
+    }
+
+
+    // Creates a new XML temporary file called <basename>.new
+    // This method is used to implement atomic writing to file.
+    // The usual sequence is:
+    //
+    // Final tmp = newXmlTmpFile(basename);
+    // boolean failed = true;
+    // try {
+    //      ... write to 'tmp' ...
+    //      // no exception: set failed=false for finaly {} block.
+    //      failed = false;
+    // } finally
+    //      // failed==true means there was an exception and
+    //      // commit won't be called...
+    //      if (failed==true) tmp.delete();
+    // }
+    // commit(tmp,basename)
+    //
+    private static File newXmlTmpFile(String basename) throws IOException {
+        final File f = new File(basename+".new");
+        if (!f.createNewFile())
+            throw new IOException("file "+f.getName()+" already exists");
+
+        try {
+            final OutputStream newStream = new FileOutputStream(f);
+            try {
+                final String decl =
+                    "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
+                newStream.write(decl.getBytes("UTF-8"));
+                newStream.flush();
+            } finally {
+                newStream.close();
+            }
+        } catch (IOException x) {
+            f.delete();
+            throw x;
+        }
+        return f;
+    }
+
+    // Commit the temporary file by renaming <basename> to <baesname>~
+    // and tmpFile to <basename>.
+    private static File commit(String basename, File tmpFile)
+        throws IOException {
+        try {
+            final String backupName = basename+"~";
+            final File desired = new File(basename);
+            final File backup = new File(backupName);
+            backup.delete();
+            if (desired.exists()) {
+                if (!desired.renameTo(new File(backupName)))
+                    throw new IOException("can't rename to "+backupName);
+            }
+            if (!tmpFile.renameTo(new File(basename)))
+                throw new IOException("can't rename to "+basename);
+        } catch (IOException x) {
+            tmpFile.delete();
+            throw x;
+        }
+        return new File(basename);
+    }
+
+    /**
+     * Creates a new committed XML file for {@code <basename>}, containing only
+     * the {@code <?xml ...?>} header.
+     * <p>This method will rename {@code <basename>} to {@code <basename>~},
+     * if it exists.
+     * </p>
+     * @return A newly created XML file containing the regular
+     *         {@code <?xml ...?>} header.
+     * @param basename The name of the new file.
+     * @throws IOException if the new XML file couldn't be created.
+     */
+    public static File createNewXmlFile(String basename) throws IOException {
+        return commit(basename,newXmlTmpFile(basename));
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/package.html b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/package.html
new file mode 100644
index 0000000..5390c29
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/package.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+    <title>com.sun.jmx.examples.scandir.config</title>
+  </head>
+  <body>
+  <p>
+     This package defines plain Java Beans, annotated for
+     XML bindings, and used to store and model the scandir 
+     application configuration.
+  </p>
+  <p>All the Java Beans defined in this package have been 
+     designed to be <i>naturally serialized</i> by JAXB.
+     Their bean properties were designed to minimize
+     the number of XML annotation required, as well as 
+     making them transparently convertible by the 
+     JMX MXBean framework.
+  </p>
+  <p>The {@link com.sun.jmx.examples.scandir.config.ScanManagerConfig} 
+     bean corresponds to the root element of the application's configuration.
+     From an instance of this element, the 
+     {@link com.sun.jmx.examples.scandir.ScanManagerMXBean} will be
+     able to initialize the 
+     {@link com.sun.jmx.examples.scandir.ResultLogManagerMXBean} and will
+     create, register and initialize 
+     {@link com.sun.jmx.examples.scandir.DirectoryScannerMXBean DirectoryScannerMXBeans}
+  </p>
+  <p>The {@link com.sun.jmx.examples.scandir.config.XmlConfigUtils} class is a simple utility
+     classes used to deal with XML and XML configuration files.
+  </p>
+  <p>The {@link com.sun.jmx.examples.scandir.config.ResultRecord ResultRecords} 
+     are used to store the results of directory scans in the result logs
+     managed by the {@link com.sun.jmx.examples.scandir.ResultLogManagerMXBean}
+  </p>
+  </body>
+</html>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/package.html b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/package.html
new file mode 100644
index 0000000..54d3172
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/package.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+    <title>com.sun.jmx.examples.scandir</title>
+  </head>
+  <body>
+  <p>
+  This package defines the set of MBeans which compose the
+  management interface of the scandir application.
+  </p>
+  
+  </body>
+</html>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/etc/access.properties b/darwin-x86/sample/jmx/jmx-scandir/src/etc/access.properties
new file mode 100644
index 0000000..c8286ed
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/etc/access.properties
@@ -0,0 +1,51 @@
+######################################################################
+#     Default Access Control File for Remote JMX(TM) Monitoring
+######################################################################
+#
+# Access control file for Remote JMX API access to monitoring.
+# This file defines the allowed access for different roles.  The
+# password file (jmxremote.password by default) defines the roles and their
+# passwords.  To be functional, a role must have an entry in
+# both the password and the access files.
+#
+# Default location of this file is $JRE/lib/management/jmxremote.access
+# You can specify an alternate location by specifying a property in 
+# the management config file $JRE/lib/management/management.properties
+# (See that file for details)
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format.  The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# Typical access file has multiple  lines, where each line is blank,
+# a comment (like this one), or an access control entry.
+#
+# An access control entry consists of a role name, and an
+# associated access level.  The role name is any string that does not
+# itself contain spaces or tabs.  It corresponds to an entry in the
+# password file (jmxremote.password).  The access level is one of the
+# following:
+#       "readonly" grants access to read attributes of MBeans.
+#                   For monitoring, this means that a remote client in this
+#                   role can read measurements but cannot perform any action
+#                   that changes the environment of the running program.
+#       "readwrite" grants access to read and write attributes of MBeans,
+#                   to invoke operations on them, and to create or remove them.
+#		    This access should be granted to only trusted clients, 
+#                   since they can potentially interfere with the smooth
+#		    operation of a running program 
+#
+# A given role should have at most one entry in this file.  If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last
+# access entry is used.
+#
+#
+# Default access control entries:
+# o The "monitorRole" role has readonly access.  
+# o The "controlRole" role has readwrite access.
+#
+# monitorRole   readonly
+# controlRole   readwrite
+
+guest   readonly
+admin   readwrite
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/etc/management.properties b/darwin-x86/sample/jmx/jmx-scandir/src/etc/management.properties
new file mode 100644
index 0000000..5035139
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/etc/management.properties
@@ -0,0 +1,273 @@
+#####################################################################
+#	Default Configuration File for Java Platform Management
+#####################################################################
+#
+# The Management Configuration file (in java.util.Properties format)
+# will be read if one of the following system properties is set:
+#    -Dcom.sun.management.jmxremote.port=<port-number>
+# or -Dcom.sun.management.snmp.port=<port-number> 
+# or -Dcom.sun.management.config.file=<this-file>
+#
+# The default Management Configuration file is:
+#
+#       $JRE/lib/management/management.properties
+#
+# Another location for the Management Configuration File can be specified
+# by the following property on the Java command line:
+#
+#    -Dcom.sun.management.config.file=<this-file>
+# 
+# If -Dcom.sun.management.config.file=<this-file> is set, the port
+# number for the management agent can be specified in the config file 
+# using the following lines:
+# 
+# ################ Management Agent Port #########################
+# 
+# For setting the JMX RMI agent port use the following line
+com.sun.management.jmxremote.port=4545
+#
+# For setting the SNMP agent port use the following line
+# com.sun.management.snmp.port=<port-number>
+
+#####################################################################
+#                   Optional Instrumentation
+#####################################################################
+#
+# By default only the basic instrumentation with low overhead is on.
+# The following properties allow to selectively turn on optional
+# instrumentation which are off by default and may have some
+# additional overhead.
+#
+# com.sun.management.enableThreadContentionMonitoring
+#
+#      This option enables thread contention monitoring if the
+#      Java virtual machine supports such instrumentation.
+#      Refer to the specification for the java.lang.management.ThreadMBean
+#      interface - see isThreadContentionMonitoringSupported() method.
+#
+ 
+# To enable thread contention monitoring, uncomment the following line
+# com.sun.management.enableThreadContentionMonitoring
+
+#####################################################################
+#			SNMP Management Properties
+#####################################################################
+#
+# If the system property -Dcom.sun.management.snmp.port=<port-number> 
+# is set then
+#	- The SNMP agent (with the Java virtual machine MIB) is started 
+#	  that listens on the specified port for incoming SNMP requests.
+#	- the following properties for read for SNMP management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to the above system property (e.g. via setProperty method), this
+# config file, or the ACL file has no effect to the running SNMP agent.
+#
+
+#
+# ##################### SNMP Trap Port #########################
+#
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+#      Specifies the remote port number at which managers are expected
+#      to listen for trap. For each host defined in the ACL file,
+#      the SNMP agent will send traps at <host>:<trap-destination-port-number>
+#      Default for this property is 162.
+#
+
+# To set port for sending traps to a different port use the following line
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+
+#
+# ################ SNMP listen interface #########################
+#
+# com.sun.management.snmp.interface=<InetAddress>
+#      Specifies the local interface on which the SNMP agent will bind.
+#      This is usefull when running on machines which have several
+#      interfaces defined. It makes it possible to listen to a specific
+#      subnet accessible through that interface.
+#      Default for this property is "localhost".
+#
+#      The format of the value for that property is any string accepted
+#      by java.net.InetAddress.getByName(String).
+# 
+
+# For restricting the port on which SNMP agent listens use the following line
+# com.sun.management.snmp.interface=<InetAddress>
+
+#
+# #################### SNMP ACL file #########################
+#
+# com.sun.management.snmp.acl=true|false
+#      Default for this property is true. (Case for true/false ignored)
+#      If this property is specified as false then the ACL file
+#      is not checked:  all manager hosts are allowed all access.
+#
+
+# For SNMP without checking ACL file uncomment the following line
+# com.sun.management.snmp.acl=false
+
+#
+# com.sun.management.snmp.acl.file=filepath
+#      Specifies location for ACL file
+#      This is optional - default location is
+#      $JRE/lib/management/snmp.acl
+# 
+#      If the property "com.sun.management.snmp.acl" is set to false,
+#      then this property and the ACL file are ignored.
+#      Otherwise the ACL file must exist and be in the valid format.
+#      If the ACL file is empty or non existent then no access is allowed.
+# 
+#      The SNMP agent will read the ACL file at startup time. 
+#      Modification to the ACL file has no effect to any running SNMP 
+#      agents which read that ACL file at startup.
+#
+
+# For a non-default acl file location use the following line
+# com.sun.management.snmp.acl.file=filepath
+
+#####################################################################
+#			RMI Management Properties
+#####################################################################
+#
+# If system property -Dcom.sun.management.jmxremote.port=<port-number>
+# is set then
+#     - A MBean server is started 
+#     - JRE Platform MBeans are registered in the MBean server
+#     - RMI connector is published  in a private readonly registry at
+#       specified port using a well known name, "jmxrmi"
+#     - the following properties are read for JMX remote management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to above system property (e.g. via setProperty method),
+# this config file, the password file, or the access file have no effect to the
+# running MBean server, the connector, or the registry. 
+#
+
+#
+# ###################### RMI SSL #############################
+#
+# com.sun.management.jmxremote.ssl=true|false
+#      Default for this property is true. (Case for true/false ignored)
+#      If this property is specified as false then SSL is not used.
+# 
+
+# For RMI monitoring without SSL use the following line
+# com.sun.management.jmxremote.ssl=false
+
+# com.sun.management.jmxremote.ssl.enabled.cipher.suites=<cipher-suites>
+#      The value of this property is a string that is a comma-separated list
+#      of SSL/TLS cipher suites to enable. This property can be specified in
+#      conjunction with the previous property "com.sun.management.jmxremote.ssl"
+#      in order to control which particular SSL/TLS cipher suites are enabled
+#      for use by accepted connections. If this property is not specified then
+#      the SSL/TLS RMI Server Socket Factory uses the SSL/TLS cipher suites that
+#      are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.enabled.protocols=<protocol-versions>
+#      The value of this property is a string that is a comma-separated list
+#      of SSL/TLS protocol versions to enable. This property can be specified in
+#      conjunction with the previous property "com.sun.management.jmxremote.ssl"
+#      in order to control which particular SSL/TLS protocol versions are
+#      enabled for use by accepted connections. If this property is not
+#      specified then the SSL/TLS RMI Server Socket Factory uses the SSL/TLS
+#      protocol versions that are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.need.client.auth=true|false
+#      Default for this property is false. (Case for true/false ignored)
+#      If this property is specified as true in conjunction with the previous
+#      property "com.sun.management.jmxremote.ssl" then the SSL/TLS RMI Server
+#      Socket Factory will require client authentication.
+#
+
+# For RMI monitoring with SSL client authentication use the following line
+com.sun.management.jmxremote.ssl.need.client.auth=true
+
+# com.sun.management.jmxremote.registry.ssl=true|false
+#      Default for this property is false. (Case for true/false ignored)
+#      If this property is specified as true then the RMI registry used
+#      to bind the RMIServer remote object is protected with SSL/TLS
+#      RMI Socket Factories that can be configured with the properties:
+#          com.sun.management.jmxremote.ssl.enabled.cipher.suites
+#          com.sun.management.jmxremote.ssl.enabled.protocols
+#          com.sun.management.jmxremote.ssl.need.client.auth
+#      If the two properties below are true at the same time, i.e.
+#          com.sun.management.jmxremote.ssl=true
+#          com.sun.management.jmxremote.registry.ssl=true
+#      then the RMIServer remote object and the RMI registry are
+#      both exported with the same SSL/TLS RMI Socket Factories.
+#
+
+# For using an SSL/TLS protected RMI registry use the following line
+com.sun.management.jmxremote.registry.ssl=true
+
+#
+# ################ RMI User authentication ################
+#
+# com.sun.management.jmxremote.authenticate=true|false
+#      Default for this property is true. (Case for true/false ignored)
+#      If this property is specified as false then no authentication is
+#      performed and all users are allowed all access.
+#
+
+# For RMI monitoring without any checking use the following line
+# com.sun.management.jmxremote.authenticate=false
+
+#
+# ################ RMI Login configuration ###################
+#
+# com.sun.management.jmxremote.login.config=<config-name>
+#      Specifies the name of a JAAS login configuration entry to use when 
+#      authenticating users of RMI monitoring. 
+#
+#      Setting this property is optional - the default login configuration
+#      specifies a file-based authentication that uses the password file.
+#
+#      When using this property to override the default login configuration 
+#      then the named configuration entry must be in a file that gets loaded 
+#      by JAAS. In addition, the login module(s) specified in the configuration
+#      should use the name and/or password callbacks to acquire the user's 
+#      credentials. See the NameCallback and PasswordCallback classes in the 
+#      javax.security.auth.callback package for more details.
+#
+#      If the property "com.sun.management.jmxremote.authenticate" is set to 
+#      false, then this property and the password & access files are ignored.
+#
+
+# For a non-default login configuration use the following line
+# com.sun.management.jmxremote.login.config=<config-name>
+
+#
+# ################ RMI Password file location ##################
+#
+# com.sun.management.jmxremote.password.file=filepath
+#      Specifies location for password file
+#      This is optional - default location is
+#      $JRE/lib/management/jmxremote.password
+# 
+#      If the property "com.sun.management.jmxremote.authenticate" is set to 
+#      false, then this property and the password & access files are ignored.
+#      Otherwise the password file must exist and be in the valid format.
+#      If the password file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+com.sun.management.jmxremote.password.file=src/etc/password.properties
+
+#
+# ################ RMI Access file location #####################
+#
+# com.sun.management.jmxremote.access.file=filepath
+#      Specifies location for access  file
+#      This is optional - default location is
+#      $JRE/lib/management/jmxremote.access
+# 
+#      If the property "com.sun.management.jmxremote.authenticate" is set to 
+#      false, then this property and the password & access files are ignored.
+#      Otherwise, the access file must exist and be in the valid format.
+#      If the access file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+com.sun.management.jmxremote.access.file=src/etc/access.properties
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/etc/password.properties b/darwin-x86/sample/jmx/jmx-scandir/src/etc/password.properties
new file mode 100644
index 0000000..d90c8c8
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/etc/password.properties
@@ -0,0 +1,55 @@
+##############################################################
+#        Password File for Remote JMX Monitoring
+##############################################################
+#
+# Password file for Remote JMX API access to monitoring.  This
+# file defines the different roles and their passwords.  The access
+# control file (jmxremote.access by default) defines the allowed
+# access for each role.  To be functional, a role must have an entry
+# in both the password and the access files.
+#
+# Default location of this file is $JRE/lib/management/jmxremote.password
+# You can specify an alternate location by specifying a property in 
+# the management config file $JRE/lib/management/management.properties
+# or by specifying a system property (See that file for details).
+
+
+##############################################################
+#    File permissions of the jmxremote.password file
+##############################################################
+#      Since there are cleartext passwords stored in this file,
+#      this file must be readable by ONLY the owner,
+#      otherwise the program will exit with an error. 
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format.  The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# Typical password file has multiple  lines, where each line is blank,
+# a comment (like this one), or a password entry.
+#
+#
+# A password entry consists of a role name and an associated
+# password.  The role name is any string that does not itself contain
+# spaces or tabs.  The password is again any string that does not
+# contain spaces or tabs.  Note that passwords appear in the clear in
+# this file, so it is a good idea not to use valuable passwords.
+#
+# A given role should have at most one entry in this file.  If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last one
+# is used.
+#
+# In a typical installation, this file can be read by anybody on the
+# local machine, and possibly by people on other machines.
+# For # security, you should either restrict the access to this file,
+# or specify another, less accessible file in the management config file
+# as described above.
+#
+# Following are two commented-out entries.  The "measureRole" role has
+# password "QED".  The "controlRole" role has password "R&D".
+#
+# monitorRole  QED
+# controlRole   R&D
+
+guest  guestpasswd
+admin  adminpasswd
diff --git a/darwin-x86/sample/jmx/jmx-scandir/src/etc/testconfig.xml b/darwin-x86/sample/jmx/jmx-scandir/src/etc/testconfig.xml
new file mode 100644
index 0000000..cf0fece
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/src/etc/testconfig.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<ScanManager xmlns="jmx:com.sun.jmx.examples.scandir.config" name="testconfig">
+    <InitialResultLogConfig>
+        <LogFileMaxRecords>2048</LogFileMaxRecords>
+        <LogFileName>build/scandir.log</LogFileName>
+        <MemoryMaxRecords>128</MemoryMaxRecords>
+    </InitialResultLogConfig>
+    <DirectoryScannerList>
+        <DirectoryScanner name="scan-build">
+            <Actions>NOTIFY LOGRESULT</Actions>
+            <ExcludeFiles/>
+            <IncludeFiles>
+                <FileFilter>
+                    <FilePattern>.*\.class</FilePattern>
+                    <SizeExceedsMaxBytes>4096</SizeExceedsMaxBytes>
+                </FileFilter>
+            </IncludeFiles>
+            <RootDirectory>build</RootDirectory>
+        </DirectoryScanner>
+    </DirectoryScannerList>
+</ScanManager>
diff --git a/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/DirectoryScannerTest.java b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/DirectoryScannerTest.java
new file mode 100644
index 0000000..06d1559
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/DirectoryScannerTest.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.util.LinkedList;
+import java.util.concurrent.BlockingQueue;
+import junit.framework.*;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import com.sun.jmx.examples.scandir.ScanManagerTest.Call;
+import java.util.EnumSet;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import javax.management.AttributeChangeNotification;
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+
+import static com.sun.jmx.examples.scandir.ScanManagerTest.*;
+import static com.sun.jmx.examples.scandir.TestUtils.*;
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+/**
+ * Unit tests for {@code DirectoryScanner}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class DirectoryScannerTest extends TestCase {
+
+    public DirectoryScannerTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(DirectoryScannerTest.class);
+
+        return suite;
+    }
+
+    private void doTestOperation(
+            DirectoryScannerMXBean proxy,
+            Call op,
+            EnumSet<ScanState> after,
+            String testName)
+        throws Exception {
+        System.out.println("doTestOperation: "+testName);
+
+        final LinkedBlockingQueue<Notification> queue =
+                new LinkedBlockingQueue<Notification>();
+
+        NotificationListener listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                        Object handback) {
+                try {
+                    queue.put(notification);
+                } catch (Exception x) {
+                    System.err.println("Failed to queue notif: "+x);
+                }
+            }
+        };
+        NotificationFilter filter = null;
+        Object handback = null;
+        final ScanState before;
+        final NotificationEmitter emitter = (NotificationEmitter)
+                makeNotificationEmitter(proxy,DirectoryScannerMXBean.class);
+        emitter.addNotificationListener(listener, filter, handback);
+        before = proxy.getState();
+        op.call();
+        try {
+            final Notification notification =
+                    queue.poll(3000,TimeUnit.MILLISECONDS);
+            assertEquals(AttributeChangeNotification.ATTRIBUTE_CHANGE,
+                    notification.getType());
+            assertEquals(AttributeChangeNotification.class,
+                    notification.getClass());
+            assertEquals(getObjectName(proxy),
+                    notification.getSource());
+            AttributeChangeNotification acn =
+                    (AttributeChangeNotification)notification;
+            assertEquals("State",acn.getAttributeName());
+            assertEquals(ScanState.class.getName(),acn.getAttributeType());
+            assertEquals(before,ScanState.valueOf((String)acn.getOldValue()));
+            assertContained(after,ScanState.valueOf((String)acn.getNewValue()));
+            emitter.removeNotificationListener(listener,filter,handback);
+        } finally {
+            try {
+                op.cancel();
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+
+    /**
+     * Test of getRootDirectory method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testGetRootDirectory() throws Exception {
+        System.out.println("getRootDirectory");
+
+       final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            final String tmpdir = System.getProperty("java.io.tmpdir");
+            final ScanDirConfigMXBean config = manager.getConfigurationMBean();
+            System.err.println("Configuration MXBean is: " + config);
+            final DirectoryScannerConfig bean =
+                    config.addDirectoryScanner("test",tmpdir,".*",0,0);
+            final String root = bean.getRootDirectory();
+            if (root == null)
+                throw new NullPointerException("bean.getRootDirectory()");
+            if (config.getConfiguration().getScan("test").getRootDirectory() == null)
+                throw new NullPointerException("config.getConfig().getScan(\"test\").getRootDirectory()");
+            manager.applyConfiguration(true);
+            final DirectoryScannerMXBean proxy =
+                    manager.getDirectoryScanners().get("test");
+            final File tmpFile =  new File(tmpdir);
+            final File rootFile = new File(proxy.getRootDirectory());
+            assertEquals(tmpFile,rootFile);
+        } catch (Exception x) {
+            x.printStackTrace();
+            throw x;
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+
+    /**
+     * Test of scan method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testScan() throws Exception {
+        System.out.println("scan");
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            final String tmpdir = System.getProperty("java.io.tmpdir");
+            final ScanDirConfigMXBean config = manager.getConfigurationMBean();
+            final DirectoryScannerConfig bean =
+                    config.addDirectoryScanner("test1",tmpdir,".*",0,0);
+            config.addDirectoryScanner("test2",tmpdir,".*",0,0);
+            config.addDirectoryScanner("test3",tmpdir,".*",0,0);
+            manager.applyConfiguration(true);
+            final DirectoryScannerMXBean proxy =
+                    manager.getDirectoryScanners().get("test1");
+            final Call op = new Call() {
+                public void call() throws Exception {
+                    final BlockingQueue<Notification> queue =
+                            new LinkedBlockingQueue<Notification>();
+                    final NotificationListener listener = new NotificationListener() {
+                        public void handleNotification(Notification notification,
+                                Object handback) {
+                            try {
+                               queue.put(notification);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    };
+                    manager.start();
+                    while(true) {
+                        final Notification n = queue.poll(10,TimeUnit.SECONDS);
+                        if (n == null) break;
+                        final AttributeChangeNotification at =
+                                (AttributeChangeNotification) n;
+                        if (RUNNING == ScanState.valueOf((String)at.getNewValue()))
+                            break;
+                        else {
+                            System.err.println("New state: "+(String)at.getNewValue()
+                            +" isn't "+RUNNING);
+                        }
+                    }
+                    assertContained(EnumSet.of(SCHEDULED,RUNNING,COMPLETED),
+                            proxy.getState());
+                }
+                public void cancel() throws Exception {
+                    manager.stop();
+                }
+            };
+            doTestOperation(proxy,op,
+                    EnumSet.of(RUNNING,SCHEDULED,COMPLETED),
+                    "scan");
+        } catch (Exception x) {
+            x.printStackTrace();
+            throw x;
+        } finally {
+            try {
+                manager.stop();
+            } catch (Exception x) {
+                System.err.println("Failed to stop: "+x);
+            }
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of getState method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testGetState() {
+        System.out.println("getState");
+
+        final DirectoryScannerConfig bean =
+                new DirectoryScannerConfig("test");
+        bean.setRootDirectory(System.getProperty("java.io.tmpdir"));
+        final ResultLogManager log = new ResultLogManager();
+        DirectoryScanner instance =
+                new DirectoryScanner(bean,log);
+
+        ScanState expResult = STOPPED;
+        ScanState result = instance.getState();
+        assertEquals(STOPPED, result);
+        instance.scan();
+        result = instance.getState();
+        assertEquals(COMPLETED, result);
+    }
+
+    /**
+     * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testAddNotificationListener() throws Exception {
+        System.out.println("addNotificationListener");
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        final Call op = new Call() {
+            public void call() throws Exception {
+                manager.start();
+            }
+            public void cancel() throws Exception {
+                manager.stop();
+            }
+        };
+        try {
+            final String tmpdir = System.getProperty("java.io.tmpdir");
+            final ScanDirConfigMXBean config = manager.getConfigurationMBean();
+            final DirectoryScannerConfig bean =
+                    config.addDirectoryScanner("test1",tmpdir,".*",0,0);
+            manager.applyConfiguration(true);
+            final DirectoryScannerMXBean proxy =
+                    manager.getDirectoryScanners().get("test1");
+           doTestOperation(proxy,op,
+                            EnumSet.of(RUNNING,SCHEDULED),
+                            "scan");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanDirConfigTest.java b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanDirConfigTest.java
new file mode 100644
index 0000000..c7e9599
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanDirConfigTest.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.FileMatch;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import junit.framework.*;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.File;
+import java.util.concurrent.BlockingQueue;
+import javax.management.*;
+
+/**
+ * Unit tests for {@code ScanDirConfig}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanDirConfigTest extends TestCase {
+
+    public ScanDirConfigTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(ScanDirConfigTest.class);
+
+        return suite;
+    }
+
+    /**
+     * Test of load method, of class com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testLoad() throws Exception {
+        System.out.println("load");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+        final ScanManagerConfig bean =
+                new  ScanManagerConfig("testLoad");
+        final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+        dir.setRootDirectory(file.getParent());
+        bean.putScan(dir);
+        XmlConfigUtils.write(bean,new FileOutputStream(file),false);
+        instance.load();
+
+        assertEquals(bean,instance.getConfiguration());
+        bean.removeScan(dir.getName());
+        XmlConfigUtils.write(bean,new FileOutputStream(file),false);
+
+        assertNotSame(bean,instance.getConfiguration());
+
+        instance.load();
+
+        assertEquals(bean,instance.getConfiguration());
+
+    }
+
+    /**
+     * Test of save method, of class com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testSave() throws Exception {
+        System.out.println("save");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ScanManagerMXBean manager = ScanManager.register(mbs);
+
+        try {
+            final ScanDirConfigMXBean instance =
+                    manager.createOtherConfigurationMBean("testSave",file.getAbsolutePath());
+            assertTrue(mbs.isRegistered(
+                    ScanManager.makeScanDirConfigName("testSave")));
+            final ScanManagerConfig bean =
+                new  ScanManagerConfig("testSave");
+            final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+            dir.setRootDirectory(file.getParent());
+            bean.putScan(dir);
+            instance.setConfiguration(bean);
+            instance.save();
+            final ScanManagerConfig loaded =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded);
+            assertEquals(bean,loaded);
+
+            instance.getConfiguration().removeScan("tmp");
+            instance.save();
+            assertNotSame(loaded,instance.getConfiguration());
+            final ScanManagerConfig loaded2 =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded2);
+        } finally {
+            manager.close();
+            mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+        }
+        final ObjectName all =
+                new ObjectName(ScanManager.SCAN_MANAGER_NAME.getDomain()+":*");
+        assertEquals(0,mbs.queryNames(all,null).size());
+    }
+
+    /**
+     * Test of saveTo method, of class com.sun.jmx.examples.scandir.ScanProfile.
+     */
+    /*
+    public void testSaveTo() throws Exception {
+        System.out.println("saveTo");
+
+        String filename = "";
+        ScanDirConfig instance = null;
+
+        instance.saveTo(filename);
+
+        // TODO review the generated test code and remove the default call to fail.
+        fail("The test case is a prototype.");
+    }
+    */
+
+    /**
+     * Test of getXmlConfigString method, of class com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testGetXmlConfigString() throws Exception {
+        System.out.println("getXmlConfigString");
+
+        try {
+            final File file = File.createTempFile("testconf",".xml");
+            final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+            final ScanManagerConfig bean =
+                new  ScanManagerConfig("testGetXmlConfigString");
+            final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+            dir.setRootDirectory(file.getParent());
+            bean.putScan(dir);
+            instance.setConfiguration(bean);
+            System.out.println("Expected: " + XmlConfigUtils.toString(bean));
+            System.out.println("Received: " +
+                    instance.getConfiguration().toString());
+            assertEquals(XmlConfigUtils.toString(bean),
+                instance.getConfiguration().toString());
+        } catch (Exception x) {
+            x.printStackTrace();
+            throw x;
+        }
+    }
+
+
+    /**
+     * Test of addNotificationListener method, of class
+     * com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testAddNotificationListener() throws Exception {
+        System.out.println("addNotificationListener");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ScanManagerMXBean manager = ScanManager.register(mbs);
+
+        try {
+            final ScanDirConfigMXBean instance =
+                TestUtils.makeNotificationEmitter(
+                    manager.createOtherConfigurationMBean("testSave",
+                        file.getAbsolutePath()),
+                    ScanDirConfigMXBean.class);
+            assertTrue(mbs.isRegistered(
+                    ScanManager.makeScanDirConfigName("testSave")));
+            DirectoryScannerConfig dir =
+                    instance.addDirectoryScanner("tmp",file.getParent(),".*",0,0);
+
+            final BlockingQueue<Notification> queue =
+                    new LinkedBlockingQueue<Notification>();
+            final NotificationListener listener = new NotificationListener() {
+                public void handleNotification(Notification notification,
+                            Object handback) {
+                    queue.add(notification);
+                }
+            };
+            NotificationFilter filter = null;
+            Object handback = null;
+
+            ((NotificationEmitter)instance).addNotificationListener(listener,
+                    filter, handback);
+
+            instance.save();
+            final ScanManagerConfig loaded =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded);
+
+            final ScanManagerConfig newConfig =
+                    instance.getConfiguration();
+            newConfig.removeScan("tmp");
+            instance.setConfiguration(newConfig);
+            instance.save();
+            assertNotSame(loaded,instance.getConfiguration());
+            final ScanManagerConfig loaded2 =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded2);
+            instance.load();
+            for (int i=0;i<4;i++) {
+                final Notification n = queue.poll(3,TimeUnit.SECONDS);
+                assertNotNull(n);
+                assertEquals(TestUtils.getObjectName(instance),n.getSource());
+                switch(i) {
+                    case 0: case 2:
+                        assertEquals(ScanDirConfig.NOTIFICATION_SAVED,n.getType());
+                        break;
+                    case 1:
+                        assertEquals(ScanDirConfig.NOTIFICATION_MODIFIED,n.getType());
+                        break;
+                    case 3:
+                        assertEquals(ScanDirConfig.NOTIFICATION_LOADED,n.getType());
+                        break;
+                    default: break;
+                }
+            }
+        } finally {
+            manager.close();
+            mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+        }
+        final ObjectName all =
+                new ObjectName(ScanManager.SCAN_MANAGER_NAME.getDomain()+":*");
+        assertEquals(0,mbs.queryNames(all,null).size());
+    }
+
+    /**
+     * Test of getConfigFilename method, of class
+     * com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testGetConfigFilename() throws Exception {
+        System.out.println("getConfigFilename");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+
+        String result = instance.getConfigFilename();
+        assertEquals(file.getAbsolutePath(), new File(result).getAbsolutePath());
+
+    }
+
+    /**
+     * Test of addDirectoryScanner method, of class
+     * com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testAddDirectoryScanner() throws IOException {
+        System.out.println("addDirectoryScanner");
+
+        System.out.println("save");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+        final ScanManagerConfig bean =
+                new  ScanManagerConfig("testSave");
+        final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+        dir.setRootDirectory(file.getParent());
+        FileMatch filter = new FileMatch();
+        filter.setFilePattern(".*");
+        dir.setIncludeFiles(new FileMatch[] {
+            filter
+        });
+        instance.setConfiguration(bean);
+        instance.addDirectoryScanner(dir.getName(),
+                                     dir.getRootDirectory(),
+                                     filter.getFilePattern(),
+                                     filter.getSizeExceedsMaxBytes(),
+                                     0);
+        instance.save();
+        final ScanManagerConfig loaded =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+        assertNotNull(loaded.getScan(dir.getName()));
+        assertEquals(dir,loaded.getScan(dir.getName()));
+        assertEquals(instance.getConfiguration(),loaded);
+        assertEquals(instance.getConfiguration().getScan(dir.getName()),dir);
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanManagerTest.java b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanManagerTest.java
new file mode 100644
index 0000000..94e3c98
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanManagerTest.java
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import junit.framework.*;
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.logging.Logger;
+import javax.management.AttributeChangeNotification;
+import javax.management.JMException;
+import javax.management.JMX;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+
+/**
+ * Unit tests for {@code ScanManager}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanManagerTest extends TestCase {
+
+    public ScanManagerTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(ScanManagerTest.class);
+
+        return suite;
+    }
+
+    /**
+     * Test of makeSingletonName method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testMakeSingletonName() {
+        System.out.println("makeSingletonName");
+
+        Class clazz = ScanManagerMXBean.class;
+
+        ObjectName expResult = ScanManager.SCAN_MANAGER_NAME;
+        ObjectName result = ScanManager.makeSingletonName(clazz);
+        assertEquals(expResult, result);
+
+    }
+
+    /**
+     * Test of register method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testRegister() throws Exception {
+        System.out.println("register");
+
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+
+
+        ScanManagerMXBean result = ScanManager.register(mbs);
+        try {
+            assertEquals(STOPPED,result.getState());
+        } finally {
+            try {
+                mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+
+    }
+
+    public interface Call {
+        public void call() throws Exception;
+        public void cancel() throws Exception;
+    }
+
+    /**
+     * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testAddNotificationListener() throws Exception {
+        System.out.println("addNotificationListener");
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        final Call op = new Call() {
+            public void call() throws Exception {
+                manager.schedule(100000,0);
+            }
+            public void cancel() throws Exception {
+                manager.stop();
+            }
+        };
+        try {
+            doTestOperation(manager,op,
+                            EnumSet.of(RUNNING,SCHEDULED),
+                            "schedule");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    private void doTestOperation(
+            ScanManagerMXBean proxy,
+            Call op,
+            EnumSet<ScanState> after,
+            String testName)
+        throws Exception {
+        System.out.println("doTestOperation: "+testName);
+
+        final LinkedBlockingQueue<Notification> queue =
+                new LinkedBlockingQueue<Notification>();
+
+        NotificationListener listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                        Object handback) {
+                try {
+                    queue.put(notification);
+                } catch (Exception x) {
+                    System.err.println("Failed to queue notif: "+x);
+                }
+            }
+        };
+        NotificationFilter filter = null;
+        Object handback = null;
+        final ScanState before;
+        final NotificationEmitter emitter = (NotificationEmitter)proxy;
+        emitter.addNotificationListener(listener, filter, handback);
+        before = proxy.getState();
+        op.call();
+        try {
+            final Notification notification =
+                    queue.poll(3000,TimeUnit.MILLISECONDS);
+            assertEquals(AttributeChangeNotification.ATTRIBUTE_CHANGE,
+                    notification.getType());
+            assertEquals(AttributeChangeNotification.class,
+                    notification.getClass());
+            assertEquals(ScanManager.SCAN_MANAGER_NAME,
+                    notification.getSource());
+            AttributeChangeNotification acn =
+                    (AttributeChangeNotification)notification;
+            assertEquals("State",acn.getAttributeName());
+            assertEquals(ScanState.class.getName(),acn.getAttributeType());
+            assertEquals(before,ScanState.valueOf((String)acn.getOldValue()));
+            assertContained(after,ScanState.valueOf((String)acn.getNewValue()));
+            emitter.removeNotificationListener(listener,filter,handback);
+        } finally {
+            try {
+                op.cancel();
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of preRegister method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testPreRegister() throws Exception {
+        System.out.println("preRegister");
+
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        ObjectName name = new ObjectName("DownUnder:type=Wombat");
+        ScanManager instance = new ScanManager();
+
+        ObjectName expResult = ScanManager.SCAN_MANAGER_NAME;
+        ObjectName result;
+        try {
+            result = instance.preRegister(server, name);
+            throw new RuntimeException("bad name accepted!");
+        } catch (IllegalArgumentException x) {
+            // OK!
+            result = instance.preRegister(server, null);
+        }
+        assertEquals(expResult, result);
+        result = instance.preRegister(server, ScanManager.SCAN_MANAGER_NAME);
+        assertEquals(expResult, result);
+    }
+
+
+    /**
+     * Test of getState method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testGetState() throws IOException, InstanceNotFoundException {
+        System.out.println("getState");
+
+        ScanManager instance = new ScanManager();
+
+        ScanState expResult = ScanState.STOPPED;
+        ScanState result = instance.getState();
+        assertEquals(expResult, result);
+        instance.start();
+        final ScanState afterStart = instance.getState();
+        assertContained(EnumSet.of(RUNNING,SCHEDULED,COMPLETED),afterStart);
+        instance.stop();
+        assertEquals(STOPPED,instance.getState());
+        instance.schedule(1000000L,1000000L);
+        assertEquals(SCHEDULED,instance.getState());
+        instance.stop();
+        assertEquals(STOPPED,instance.getState());
+    }
+
+    /**
+     * Test of schedule method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testSchedule() throws Exception {
+        System.out.println("schedule");
+
+        final long delay = 10000L;
+        final long interval = 10000L;
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        final Call op = new Call() {
+            public void call() throws Exception {
+                manager.schedule(delay,interval);
+                assertEquals(SCHEDULED,manager.getState());
+            }
+            public void cancel() throws Exception {
+                manager.stop();
+            }
+        };
+        try {
+            doTestOperation(manager,op,EnumSet.of(SCHEDULED),
+                    "schedule");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    public static void assertContained(EnumSet<ScanState> allowed,
+            ScanState state) {
+         final String msg = String.valueOf(state) + " is not one of " + allowed;
+         assertTrue(msg,allowed.contains(state));
+    }
+
+    /**
+     * Test of stop method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testStop() throws Exception {
+        System.out.println("stop");
+        final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            manager.schedule(1000000,0);
+            assertContained(EnumSet.of(SCHEDULED),manager.getState());
+            final Call op = new Call() {
+                public void call() throws Exception {
+                    manager.stop();
+                    assertEquals(STOPPED,manager.getState());
+                }
+                public void cancel() throws Exception {
+                    if (manager.getState() != STOPPED)
+                        manager.stop();
+                }
+            };
+            doTestOperation(manager,op,EnumSet.of(STOPPED),"stop");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of start method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testStart() throws Exception {
+        final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            final Call op = new Call() {
+                public void call() throws Exception {
+                    assertEquals(STOPPED,manager.getState());
+                    manager.start();
+                    assertContained(EnumSet.of(RUNNING,SCHEDULED,COMPLETED),
+                            manager.getState());
+                }
+                public void cancel() throws Exception {
+                    manager.stop();
+                }
+            };
+            doTestOperation(manager,op,EnumSet.of(RUNNING,SCHEDULED,COMPLETED),
+                    "start");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/TestUtils.java b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/TestUtils.java
new file mode 100644
index 0000000..4832949
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/TestUtils.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.util.logging.Logger;
+import javax.management.JMX;
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.NotificationEmitter;
+import javax.management.ObjectName;
+
+/**
+ * A utility class defining static methods used by our tests.
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class TestUtils {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(TestUtils.class.getName());
+
+    /** Creates a new instance of TestUtils */
+    private TestUtils() {
+    }
+
+    /**
+     * Returns the ObjectName of the MBean that a proxy object
+     * is proxying.
+     **/
+    public static ObjectName getObjectName(Object proxy) {
+        if (!(proxy instanceof Proxy))
+            throw new IllegalArgumentException("not a "+Proxy.class.getName());
+        final Proxy p = (Proxy) proxy;
+        final InvocationHandler handler =
+                Proxy.getInvocationHandler(proxy);
+        if (handler instanceof MBeanServerInvocationHandler)
+            return ((MBeanServerInvocationHandler)handler).getObjectName();
+        throw new IllegalArgumentException("not a JMX Proxy");
+    }
+
+    /**
+     * Transfroms a proxy implementing T in a proxy implementing T plus
+     * NotificationEmitter
+     *
+     **/
+    public static <T> T makeNotificationEmitter(T proxy,
+                        Class<T> mbeanInterface) {
+        if (proxy instanceof NotificationEmitter)
+            return proxy;
+        if (proxy == null) return null;
+        if (!(proxy instanceof Proxy))
+            throw new IllegalArgumentException("not a "+Proxy.class.getName());
+        final Proxy p = (Proxy) proxy;
+        final InvocationHandler handler =
+                Proxy.getInvocationHandler(proxy);
+        if (!(handler instanceof MBeanServerInvocationHandler))
+            throw new IllegalArgumentException("not a JMX Proxy");
+        final MBeanServerInvocationHandler h =
+                (MBeanServerInvocationHandler)handler;
+        final ObjectName name = h.getObjectName();
+        final MBeanServerConnection mbs = h.getMBeanServerConnection();
+        final boolean isMXBean = h.isMXBean();
+        final T newProxy;
+        if (isMXBean)
+            newProxy = JMX.newMXBeanProxy(mbs,name,mbeanInterface,true);
+        else
+            newProxy = JMX.newMBeanProxy(mbs,name,mbeanInterface,true);
+        return newProxy;
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/config/XmlConfigUtilsTest.java b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/config/XmlConfigUtilsTest.java
new file mode 100644
index 0000000..e4cea49
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/config/XmlConfigUtilsTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import junit.framework.*;
+import java.io.File;
+
+/**
+ * Unit tests for {@code XmlConfigUtils}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class XmlConfigUtilsTest extends TestCase {
+
+    public XmlConfigUtilsTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(XmlConfigUtilsTest.class);
+
+        return suite;
+    }
+
+
+    /**
+     * Test of writeToFile method, of class XmlConfigUtils.
+     */
+    public void testWriteToFile() throws Exception {
+        System.out.println("writeToFile");
+
+        final File file = File.createTempFile("test",".xml");
+        file.deleteOnExit();
+
+        final String tmp = System.getProperty("java.io.tmpdir");
+
+        DirectoryScannerConfig dir1 =
+                new DirectoryScannerConfig("scan2");
+        dir1.setRootDirectory(tmp);
+        ScanManagerConfig bean = new ScanManagerConfig("session2");
+        bean.putScan(dir1);
+        XmlConfigUtils instance = new XmlConfigUtils(file.getPath());
+
+        instance.writeToFile(bean);
+    }
+
+    /**
+     * Test of readFromFile method, of class com.sun.jmx.examples.scandir.config.XmlConfigUtils.
+     */
+    public void testReadFromFile() throws Exception {
+        System.out.println("readFromFile");
+
+        final String tmp = System.getProperty("java.io.tmpdir");
+        final File file = File.createTempFile("test",".xml");
+        file.deleteOnExit();
+
+        DirectoryScannerConfig dir1 =
+                new DirectoryScannerConfig("scan1");
+        dir1.setRootDirectory(tmp);
+        ScanManagerConfig bean = new ScanManagerConfig("session1");
+        bean.putScan(dir1);
+        XmlConfigUtils instance = new XmlConfigUtils(file.getPath());
+
+        instance.writeToFile(bean);
+
+        ScanManagerConfig expResult = bean;
+        ScanManagerConfig result = instance.readFromFile();
+        System.out.println(result);
+        assertEquals(expResult, result);
+
+
+    }
+
+}
diff --git a/darwin-x86/sample/jmx/jmx-scandir/truststore b/darwin-x86/sample/jmx/jmx-scandir/truststore
new file mode 100644
index 0000000..2f5ba34
--- /dev/null
+++ b/darwin-x86/sample/jmx/jmx-scandir/truststore
Binary files differ
diff --git a/darwin-x86/sample/lambda/BulkDataOperations/index.html b/darwin-x86/sample/lambda/BulkDataOperations/index.html
new file mode 100644
index 0000000..5a16695
--- /dev/null
+++ b/darwin-x86/sample/lambda/BulkDataOperations/index.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Bulk Data Operations Demo</title>
+</head>
+<body>
+<h2>Bulk Data Operations Demo</h2>
+
+<p>
+    This demo shows how to use bulk data operations with the new JDK8
+    Collections API.
+    The demo also demonstrates new features of JDK8 such as lambda expressions
+    and method/constructor references.
+</p>
+
+<ul>
+    <li><h3>CSV Processor</h3>
+
+        <p>
+            Analyzes a CSV file, finds and collects useful information, computes
+            different statistics. For more information, see the source file.
+        </p>
+        Source: <a href="src/CSVProcessor.java">src/CSVProcessor.java</a>
+    <li><h3>Grep</h3>
+
+        <p>
+            Behaves like the standard Linux tool Grep. For more information, see
+            the source file.
+        </p>
+        Source: <a href="src/Grep.java">src/Grep.java</a>
+    <li><h3>PasswordGenerator</h3>
+
+        <p>
+            Produces a password of desired length. For more information see
+            source file.
+        </p>
+        Source: <a
+                href="src/PasswordGenerator.java">src/PasswordGenerator.java</a>
+    <li><h3>WC</h3>
+
+        <p>
+            Counts newlines, words, characters, and the maximum line length of a
+            text file. For more information, see the source
+            file.
+        </p>
+        Source: <a href="src/WC.java">src/WC.java</a>
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/darwin-x86/sample/lambda/BulkDataOperations/src/CSVProcessor.java b/darwin-x86/sample/lambda/BulkDataOperations/src/CSVProcessor.java
new file mode 100644
index 0000000..ded9030
--- /dev/null
+++ b/darwin-x86/sample/lambda/BulkDataOperations/src/CSVProcessor.java
@@ -0,0 +1,368 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.function.*;
+import java.util.regex.Pattern;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+import static java.lang.Double.parseDouble;
+import static java.util.stream.Collectors.*;
+
+/**
+ * CSVProcessor is a tool for processing CSV files. There are several
+ * command-line options. Consult the {@link #printUsageAndExit} method for
+ * instructions and command line parameters. This sample shows examples of the
+ * following features:
+ * <ul>
+ * <li>Lambda and bulk operations. Working with streams: map(...), filter(...),
+ * sorted(...) methods. The collect(...) method with different collectors:
+ * Collectors.maxBy(...), Collectors.minBy(...), Collectors.toList(),
+ * Collectors.toCollection(...), Collectors.groupingBy(...),
+ * Collectors.toDoubleSummaryStatistics(...), and a custom Collector.</li>
+ * <li>Static method reference for printing values.</li>
+ * <li>Try-with-resources feature for closing files.</li>
+ * <li>Switch by String feature.</li>
+ * <li>Other new APIs: Pattern.asPredicate(), BinaryOperator
+ * BufferedReader.lines(), Collection.forEach(...), Comparator.comparing(...),
+ * Comparator.reversed(), Arrays.stream(...).</li>
+ * </ul>
+ *
+ */
+public class CSVProcessor {
+
+    //Number of characters that may be read
+    private static final int READ_AHEAD_LIMIT = 100_000_000;
+
+    /**
+     * The main method for the CSVProcessor program. Run the program with an
+     * empty argument list to see possible arguments.
+     *
+     * @param args the argument list for CSVProcessor.
+     */
+    public static void main(String[] args) {
+        if (args.length < 2) {
+            printUsageAndExit();
+        }
+        try (BufferedReader br = new BufferedReader(
+                Files.newBufferedReader(Paths.get(args[args.length - 1])))) {
+            //Assume that the first line contains column names.
+            List<String> header = Arrays.stream(br.readLine().split(","))
+                    .map(String::trim).collect(toList());
+            //Calculate an index of the column in question.
+            int column = getColumnNumber(header, args[1]);
+            switch (args[0]) {
+                case "sort":
+                    verifyArgumentNumber(args, 4);
+                    //Define the sort order.
+                    boolean isAsc;
+                    switch (args[2].toUpperCase()) {
+                        case "ASC":
+                            isAsc = true;
+                            break;
+                        case "DESC":
+                            isAsc = false;
+                            break;
+                        default:
+                            printUsageAndExit("Illegal argument" + args[2]);
+                            return;//Should not be reached.
+                    }
+                    /*
+                     * Create a comparator that compares lines by comparing
+                     * values in the specified column.
+                     */
+                    Comparator<String> cmp
+                            = Comparator.comparing(str -> getCell(str, column),
+                                    String.CASE_INSENSITIVE_ORDER);
+                    /*
+                     * sorted(...) is used to sort records.
+                     * forEach(...) is used to output sorted records.
+                     */
+                    br.lines().sorted(isAsc ? cmp : cmp.reversed())
+                            .forEach(System.out::println);
+                    break;
+                case "search":
+                    verifyArgumentNumber(args, 4);
+                    /*
+                     * Records are filtered by a regex.
+                     * forEach(...) is used to output filtered records.
+                     */
+                    Predicate<String> pattern
+                            = Pattern.compile(args[2]).asPredicate();
+                    br.lines().filter(str -> pattern.test(getCell(str, column)))
+                            .forEach(System.out::println);
+                    break;
+                case "groupby":
+                    verifyArgumentNumber(args, 3);
+                    /*
+                     * Group lines by values in the column with collect(...), and
+                     * print with forEach(...) for every distinct value within
+                     * the column.
+                     */
+                    br.lines().collect(
+                            Collectors.groupingBy(str -> getCell(str, column),
+                                    toCollection(TreeSet::new)))
+                            .forEach((str, set) -> {
+                                System.out.println(str + ":");
+                                set.forEach(System.out::println);
+                            });
+                    break;
+                case "stat":
+                    verifyArgumentNumber(args, 3);
+
+                    /*
+                     * BufferedReader will be read several times.
+                     * Mark this point to return here after each pass.
+                     * BufferedReader will be read right after the headers line
+                     * because it is already read.
+                     */
+                    br.mark(READ_AHEAD_LIMIT);
+
+                    /*
+                     * Statistics can be collected by a custom collector in one
+                     * pass. One pass is preferable.
+                     */
+                    System.out.println(
+                            br.lines().collect(new Statistics(column)));
+
+                    /*
+                     * Alternatively, statistics can be collected
+                     * by a built-in API in several passes.
+                     * This method demonstrates how separate operations can be
+                     * implemented using a built-in API.
+                     */
+                    br.reset();
+                    statInSeveralPasses(br, column);
+                    break;
+                default:
+                    printUsageAndExit("Illegal argument" + args[0]);
+            }
+        } catch (IOException e) {
+            printUsageAndExit(e.toString());
+        }
+    }
+
+    private static void statInSeveralPasses(BufferedReader br, int column)
+            throws IOException {
+        System.out.println("#-----Statistics in several passes-------#");
+        //Create a comparator to compare records by the column.
+        Comparator<String> comparator
+                = Comparator.comparing(
+                        (String str) -> parseDouble(getCell(str, column)));
+        //Find max record by using Collectors.maxBy(...)
+        System.out.println(
+                "Max: " + br.lines().collect(maxBy(comparator)).get());
+        br.reset();
+        //Find min record by using Collectors.minBy(...)
+        System.out.println(
+                "Min: " + br.lines().collect(minBy(comparator)).get());
+        br.reset();
+        //Compute the average value and sum with
+        //Collectors.toDoubleSummaryStatistics(...)
+        DoubleSummaryStatistics doubleSummaryStatistics
+                = br.lines().collect(summarizingDouble(
+                    str -> parseDouble(getCell(str, column))));
+        System.out.println("Average: " + doubleSummaryStatistics.getAverage());
+        System.out.println("Sum: " + doubleSummaryStatistics.getSum());
+    }
+
+    private static void verifyArgumentNumber(String[] args, int n) {
+        if (args.length != n) {
+            printUsageAndExit("Expected " + n + " arguments but was "
+                    + args.length);
+        }
+    }
+
+    private static int getColumnNumber(List<String> header, String name) {
+        int column = header.indexOf(name);
+        if (column == -1) {
+            printUsageAndExit("There is no column with name " + name);
+        }
+        return column;
+    }
+
+    private static String getCell(String record, int column) {
+        return record.split(",")[column].trim();
+    }
+
+    private static void printUsageAndExit(String... str) {
+        System.out.println("Usages:");
+
+        System.out.println("CSVProcessor sort COLUMN_NAME ASC|DESC FILE");
+        System.out.println("Sort lines by column COLUMN_NAME in CSV FILE\n");
+
+        System.out.println("CSVProcessor search COLUMN_NAME REGEX FILE");
+        System.out.println("Search for REGEX in column COLUMN_NAME in CSV FILE\n");
+
+        System.out.println("CSVProcessor groupby COLUMN_NAME FILE");
+        System.out.println("Split lines into different groups according to column "
+                + "COLUMN_NAME value\n");
+
+        System.out.println("CSVProcessor stat COLUMN_NAME FILE");
+        System.out.println("Compute max/min/average/sum  statistics by column "
+                + "COLUMN_NAME\n");
+
+        Arrays.asList(str).forEach(System.err::println);
+        System.exit(1);
+    }
+
+    /*
+     * This is a custom implementation of the Collector interface.
+     * Statistics are objects gather max,min,sum,average statistics.
+     */
+    private static class Statistics
+            implements Collector<String, Statistics, Statistics> {
+
+
+        /*
+         * This implementation does not need to be thread safe because
+         * the parallel implementation of
+         * {@link java.util.stream.Stream#collect Stream.collect()}
+         * provides the necessary partitioning and isolation for safe parallel
+         * execution.
+         */
+        private String maxRecord;
+        private String minRecord;
+
+        private double sum;
+        private int lineCount;
+        private final BinaryOperator<String> maxOperator;
+        private final BinaryOperator<String> minOperator;
+        private final int column;
+
+        public Statistics(int column) {
+            this.column = column;
+            Comparator<String> cmp = Comparator.comparing(
+                    (String str) -> parseDouble(getCell(str, column)));
+            maxOperator = BinaryOperator.maxBy(cmp);
+            minOperator = BinaryOperator.minBy(cmp);
+        }
+
+        /*
+         * Process line.
+         */
+        public Statistics accept(String line) {
+            maxRecord = maxRecord == null
+                    ? line : maxOperator.apply(maxRecord, line);
+            minRecord = minRecord == null
+                    ? line : minOperator.apply(minRecord, line);
+
+            sum += parseDouble(getCell(line, column));
+            lineCount++;
+            return this;
+        }
+
+
+        /*
+         * Merge two Statistics.
+         */
+        public Statistics combine(Statistics stat) {
+            maxRecord = maxOperator.apply(maxRecord, stat.getMaxRecord());
+            minRecord = minOperator.apply(minRecord, stat.getMinRecord());
+            sum += stat.getSum();
+            lineCount += stat.getLineCount();
+            return this;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("#------Statistics------#\n");
+            sb.append("Max: ").append(getMaxRecord()).append("\n");
+            sb.append("Min: ").append(getMinRecord()).append("\n");
+            sb.append("Sum = ").append(getSum()).append("\n");
+            sb.append("Average = ").append(average()).append("\n");
+            sb.append("#------Statistics------#\n");
+            return sb.toString();
+        }
+
+        @Override
+        public Supplier<Statistics> supplier() {
+            return () -> new Statistics(column);
+        }
+
+        @Override
+        public BiConsumer<Statistics, String> accumulator() {
+            return Statistics::accept;
+        }
+
+        @Override
+        public BinaryOperator<Statistics> combiner() {
+            return Statistics::combine;
+
+        }
+
+        @Override
+        public Function<Statistics, Statistics> finisher() {
+            return stat -> stat;
+        }
+
+        @Override
+        public Set<Characteristics> characteristics() {
+            return EnumSet.of(Characteristics.IDENTITY_FINISH);
+        }
+
+        private String getMaxRecord() {
+            return maxRecord;
+        }
+
+        private String getMinRecord() {
+            return minRecord;
+        }
+
+        private double getSum() {
+            return sum;
+        }
+
+        private double average() {
+            return sum / lineCount;
+        }
+
+        private int getLineCount() {
+            return lineCount;
+        }
+
+    }
+
+}
diff --git a/darwin-x86/sample/lambda/BulkDataOperations/src/Grep.java b/darwin-x86/sample/lambda/BulkDataOperations/src/Grep.java
new file mode 100644
index 0000000..cb4bdf7
--- /dev/null
+++ b/darwin-x86/sample/lambda/BulkDataOperations/src/Grep.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Grep prints lines matching a regex. See {@link #printUsageAndExit(String...)}
+ * method for instructions and command line parameters. This sample shows
+ * examples of using next features:
+ * <ul>
+ * <li>Lambda and bulk operations. Working with streams:
+ * map(...),filter(...),flatMap(...),limit(...) methods.</li>
+ * <li>Static method reference for printing values.</li>
+ * <li>New Collections API forEach(...) method.</li>
+ * <li>Try-with-resources feature.</li>
+ * <li>new Files.walk(...), Files.lines(...) API.</li>
+ * <li>Streams that need to be closed.</li>
+ * </ul>
+ *
+ */
+public class Grep {
+
+    private static void printUsageAndExit(String... str) {
+        System.out.println("Usage: " + Grep.class.getSimpleName()
+                + " [OPTION]... PATTERN FILE...");
+        System.out.println("Search for PATTERN in each FILE. "
+                + "If FILE is a directory then whole file tree of the directory"
+                + " will be processed.");
+        System.out.println("Example: grep -m 100 'hello world' menu.h main.c");
+        System.out.println("Options:");
+        System.out.println("    -m NUM: stop analysis after NUM matches");
+        Arrays.asList(str).forEach(System.err::println);
+        System.exit(1);
+    }
+
+    /**
+     * The main method for the Grep program. Run program with empty argument
+     * list to see possible arguments.
+     *
+     * @param args the argument list for Grep.
+     * @throws java.io.IOException If an I/O error occurs.
+     */
+    public static void main(String[] args) throws IOException {
+        long maxCount = Long.MAX_VALUE;
+        if (args.length < 2) {
+            printUsageAndExit();
+        }
+        int i = 0;
+        //parse OPTIONS
+        while (args[i].startsWith("-")) {
+            switch (args[i]) {
+                case "-m":
+                    try {
+                        maxCount = Long.parseLong(args[++i]);
+                    } catch (NumberFormatException ex) {
+                        printUsageAndExit(ex.toString());
+                    }
+                    break;
+                default:
+                    printUsageAndExit("Unexpected option " + args[i]);
+            }
+            i++;
+        }
+        //parse PATTERN
+        Pattern pattern = Pattern.compile(args[i++]);
+        if (i == args.length) {
+            printUsageAndExit("There are no files for input");
+        }
+
+        try {
+            /*
+            * First obtain the list of all paths.
+            * For a small number of arguments there is little to be gained
+            * by producing this list in parallel. For one argument
+            * there will be no parallelism.
+            *
+            * File names are converted to paths. If a path is a directory then
+            * Stream is populated with whole file tree of the directory by
+            * flatMap() method. Files are filtered from directories.
+            */
+            List<Path> files = Arrays.stream(args, i, args.length)
+                    .map(Paths::get)
+                    // flatMap will ensure each I/O-based stream will be closed
+                    .flatMap(Grep::getPathStream)
+                    .filter(Files::isRegularFile)
+                    .collect(toList());
+            /*
+            * Then operate on that list in parallel.
+            * This is likely to give a more even distribution of work for
+            * parallel execution.
+            *
+            * Lines are extracted from files. Lines are filtered by pattern.
+            * Stream is limited by number of matches. Each remaining string is
+            * displayed in std output by method reference System.out::println.
+            */
+            files.parallelStream()
+                    // flatMap will ensure each I/O-based stream will be closed
+                    .flatMap(Grep::path2Lines)
+                    .filter(pattern.asPredicate())
+                    .limit(maxCount)
+                    .forEachOrdered(System.out::println);
+        } catch (UncheckedIOException ioe) {
+            printUsageAndExit(ioe.toString());
+        }
+    }
+
+    /**
+     * Flattens file system hierarchy into a stream. This code is not inlined
+     * for the reason of Files.walk() throwing a checked IOException that must
+     * be caught.
+     *
+     * @param path - the file or directory
+     * @return Whole file tree starting from path, a stream with one element -
+     * the path itself - if it is a file.
+     */
+    private static Stream<Path> getPathStream(Path path) {
+        try {
+            return Files.walk(path);
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+    /**
+     * Produces a stream of lines from a file. The result is a stream in order
+     * to close it later. This code is not inlined for the reason of
+     * Files.lines() throwing a checked IOException that must be caught.
+     *
+     * @param path - the file to read
+     * @return stream of lines from the file
+     */
+    private static Stream<String> path2Lines(Path path) {
+        try {
+            return Files.lines(path);
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+}
diff --git a/darwin-x86/sample/lambda/BulkDataOperations/src/PasswordGenerator.java b/darwin-x86/sample/lambda/BulkDataOperations/src/PasswordGenerator.java
new file mode 100644
index 0000000..e467798
--- /dev/null
+++ b/darwin-x86/sample/lambda/BulkDataOperations/src/PasswordGenerator.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+
+/**
+ * Generates password of desired length. See {@link #usage} method
+ * for instructions and command line parameters. This sample shows usages of:
+ * <ul>
+ * <li>Method references.</li>
+ * <li>Lambda and bulk operations. A stream of random integers is mapped to
+ * chars, limited by desired length and printed in standard output as password
+ * string.</li>
+ * </ul>
+ *
+ */
+public class PasswordGenerator {
+
+    private static void usage() {
+        System.out.println("Usage: PasswordGenerator LENGTH");
+        System.out.println(
+                "Password Generator produces password of desired LENGTH.");
+    }
+
+    private static final List<Integer> PASSWORD_CHARS = new ArrayList<>();
+
+    //Valid symbols.
+    static {
+        IntStream.rangeClosed('0', '9').forEach(PASSWORD_CHARS::add);    // 0-9
+        IntStream.rangeClosed('A', 'Z').forEach(PASSWORD_CHARS::add);    // A-Z
+        IntStream.rangeClosed('a', 'z').forEach(PASSWORD_CHARS::add);    // a-z
+    }
+
+    /**
+     * The main method for the PasswordGenerator program. Run program with empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for PasswordGenerator.
+     */
+    public static void main(String[] args) {
+
+        if (args.length != 1) {
+            usage();
+            return;
+        }
+
+        long passwordLength;
+        try {
+            passwordLength = Long.parseLong(args[0]);
+            if (passwordLength < 1) {
+                printMessageAndUsage("Length has to be positive");
+                return;
+            }
+        } catch (NumberFormatException ex) {
+            printMessageAndUsage("Unexpected number format" + args[0]);
+            return;
+        }
+        /*
+         * Stream of random integers is created containing Integer values
+         * in range from 0 to PASSWORD_CHARS.size().
+         * The stream is limited by passwordLength.
+         * Valid chars are selected by generated index.
+         */
+        new SecureRandom().ints(passwordLength, 0, PASSWORD_CHARS.size())
+                .map(PASSWORD_CHARS::get)
+                .forEach(i -> System.out.print((char) i));
+    }
+
+    private static void printMessageAndUsage(String message) {
+        System.err.println(message);
+        usage();
+    }
+
+}
diff --git a/darwin-x86/sample/lambda/BulkDataOperations/src/WC.java b/darwin-x86/sample/lambda/BulkDataOperations/src/WC.java
new file mode 100644
index 0000000..c724f15
--- /dev/null
+++ b/darwin-x86/sample/lambda/BulkDataOperations/src/WC.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.function.Consumer;
+import java.util.regex.Pattern;
+
+/**
+ * WC - Prints newline, word, and character counts for each file. See
+ * the {@link #usage} method for instructions and command line parameters. This
+ * sample shows usages of:
+ * <ul>
+ * <li>Lambda and bulk operations. Shows how to create a custom collector to
+ * gather custom statistics. Implements the collection of statistics using a
+ * built-in API.</li>
+ * <li>Constructor reference.</li>
+ * <li>Try-with-resources feature.</li>
+ * </ul>
+ *
+ */
+public class WC {
+
+    //The number of characters that may be read.
+    private static final int READ_AHEAD_LIMIT = 100_000_000;
+
+    //The pattern for splitting strings by non word characters to get words.
+    private static final Pattern nonWordPattern = Pattern.compile("\\W");
+
+    /**
+     * The main method for the WC program. Run the program with an empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for WC
+     * @throws java.io.IOException If an input exception occurred.
+     */
+    public static void main(String[] args) throws IOException {
+
+        if (args.length != 1) {
+            usage();
+            return;
+        }
+
+        try (BufferedReader reader = new BufferedReader(
+                new FileReader(args[0]))) {
+            reader.mark(READ_AHEAD_LIMIT);
+            /*
+             * Statistics can be gathered in four passes using a built-in API.
+             * The method demonstrates how separate operations can be
+             * implemented using a built-in API.
+             */
+            collectInFourPasses(reader);
+            /*
+             * Usage of several passes to collect data is not the best way.
+             * Statistics can be gathered by a custom collector in one pass.
+             */
+            reader.reset();
+            collectInOnePass(reader);
+        } catch (FileNotFoundException e) {
+            usage();
+            System.err.println(e);
+        }
+    }
+
+    private static void collectInFourPasses(BufferedReader reader)
+            throws IOException {
+        /*
+         * Input is read as a stream of lines by lines().
+         * Every line is turned into a stream of chars by the flatMapToInt(...)
+         * method.
+         * Length of the stream is counted by count().
+         */
+        System.out.println("Character count = "
+                + reader.lines().flatMapToInt(String::chars).count());
+        /*
+         * Input is read as a stream of lines by lines().
+         * Every line is split by nonWordPattern into words by flatMap(...)
+         * method.
+         * Empty lines are removed by the filter(...) method.
+         * Length of the stream is counted by count().
+         */
+        reader.reset();
+        System.out.println("Word count = "
+                + reader.lines()
+                .flatMap(nonWordPattern::splitAsStream)
+                .filter(str -> !str.isEmpty()).count());
+
+        reader.reset();
+        System.out.println("Newline count = " + reader.lines().count());
+        /*
+         * Input is read as a stream of lines by lines().
+         * Every line is mapped to its length.
+         * Maximum of the lengths is calculated.
+         */
+        reader.reset();
+        System.out.println("Max line length = "
+                + reader.lines().mapToInt(String::length).max().getAsInt());
+    }
+
+    private static void collectInOnePass(BufferedReader reader) {
+        /*
+         * The collect() method has three parameters:
+         * The first parameter is the {@code WCStatistic} constructor reference.
+         * collect() will create {@code WCStatistics} instances, where
+         * statistics will be aggregated.
+         * The second parameter shows how {@code WCStatistics} will process
+         * String.
+         * The third parameter shows how to merge two {@code WCStatistic}
+         * instances.
+         *
+         * Also {@code Collector} can be used, which would be more reusable
+         * solution. See {@code CSVProcessor} example for how {@code Collector}
+         * can be implemented.
+         *
+         * Note that the any performance increase when going parallel will
+         * depend on the size of the input (lines) and the cost per-element.
+         */
+        WCStatistics wc = reader.lines().parallel()
+                .collect(WCStatistics::new,
+                        WCStatistics::accept,
+                        WCStatistics::combine);
+        System.out.println(wc);
+    }
+
+    private static void usage() {
+        System.out.println("Usage: " + WC.class.getSimpleName() + " FILE");
+        System.out.println("Print newline, word,"
+                + "  character counts and max line length for FILE.");
+    }
+
+    private static class WCStatistics implements Consumer<String> {
+        /*
+         * @implNote This implementation does not need to be thread safe because
+         * the parallel implementation of
+         * {@link java.util.stream.Stream#collect Stream.collect()}
+         * provides the necessary partitioning and isolation for safe parallel
+         * execution.
+         */
+
+        private long characterCount;
+        private long lineCount;
+        private long wordCount;
+        private long maxLineLength;
+
+
+        /*
+         * Processes line.
+         */
+        @Override
+        public void accept(String line) {
+            characterCount += line.length();
+            lineCount++;
+            wordCount += nonWordPattern.splitAsStream(line)
+                    .filter(str -> !str.isEmpty()).count();
+            maxLineLength = Math.max(maxLineLength, line.length());
+        }
+
+        /*
+         * Merges two WCStatistics.
+         */
+        public void combine(WCStatistics stat) {
+            wordCount += stat.wordCount;
+            lineCount += stat.lineCount;
+            characterCount += stat.characterCount;
+            maxLineLength = Math.max(maxLineLength, stat.maxLineLength);
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("#------WCStatistic------#\n");
+            sb.append("Character count = ").append(characterCount).append('\n');
+            sb.append("Word count = ").append(wordCount).append('\n');
+            sb.append("Newline count = ").append(lineCount).append('\n');
+            sb.append("Max line length = ").append(maxLineLength).append('\n');
+            return sb.toString();
+        }
+    }
+}
diff --git a/darwin-x86/sample/lambda/DefaultMethods/ArrayIterator.java b/darwin-x86/sample/lambda/DefaultMethods/ArrayIterator.java
new file mode 100644
index 0000000..2eca801
--- /dev/null
+++ b/darwin-x86/sample/lambda/DefaultMethods/ArrayIterator.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * The code sample illustrates the usage of default methods in the JDK 8. Most
+ * implementations of {@link Iterator} don't provide a useful
+ * {@link Iterator#remove()} method, however,
+ * they still have to implement this method to throw
+ * an UnsupportedOperationException. With the default method, the same
+ * default behavior in interface Iterator itself can be provided.
+ */
+public class ArrayIterator {
+
+    /** Close the constructor because ArrayIterator is part of the utility
+     * class.
+     */
+    protected ArrayIterator() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Returns an iterator that goes over the elements in the array.
+     *
+     * @param <E> type of an array element
+     * @param array source array to iterate over it
+     * @return an iterator that goes over the elements in the array
+     */
+    public static <E> Iterator<E> iterator(final E[] array) {
+        return new Iterator<E>() {
+            /**
+             * Index of the current position
+             *
+             */
+            private int index = 0;
+
+            /**
+             * Returns the next element in the iteration
+             *
+             * @return the next element in the iteration
+             * @throws NoSuchElementException if the iteration has no more
+             * elements
+             */
+            @Override
+            public boolean hasNext() {
+                return (index < array.length);
+            }
+
+            /**
+             * Returns {@code true} if the iteration has more elements. (In
+             * other words, returns {@code true} if {@link #next} returns
+             * an element, rather than throwing an exception.)
+             *
+             * @return {@code true} if the iteration has more elements
+             */
+            @Override
+            public E next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+                return array[index++];
+            }
+
+            /**
+             * This method does not need to be overwritten in JDK 8.
+             */
+            //@Override
+            //public void remove() {
+            //    throw UnsupportedOperationException(
+            //            "Arrays don't support remove.")
+            //}
+        };
+    }
+
+    /**
+     * Sample usage of the ArrayIterator
+     *
+     * @param args command-line arguments
+     */
+    public static void main(final String[] args) {
+        Iterator<String> it = ArrayIterator.iterator(
+                new String[]{"one", "two", "three"});
+
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+}
diff --git a/darwin-x86/sample/lambda/DefaultMethods/DiamondInheritance.java b/darwin-x86/sample/lambda/DefaultMethods/DiamondInheritance.java
new file mode 100644
index 0000000..9214d58
--- /dev/null
+++ b/darwin-x86/sample/lambda/DefaultMethods/DiamondInheritance.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This sample diamond interface inheritance with <b>default methods</b>.
+ * If there's not already a unique method implementation to inherit,
+ * you must provide it. The inheritance diagram is similar to the following:
+ * <pre>
+ *                   Animal
+ *                    /   \
+ *                 Horse   Bird
+ *                    \   /
+ *                   Pegasus
+ * </pre>
+ *
+ * Both {@link Horse} and {@link Bird} interfaces implements the <code>go</code>
+ * method. The {@link Pegasus} class have to overrides the
+ * <code>go</code> method.
+ *
+ * The new syntax of super-call is used here:
+ * <pre>
+ *     &lt;interface_name&gt;.super.&lt;method&gt;(...);
+ *     For example:  Horse.super.go();
+ * </pre> So, Pegasus moves like a horse.
+ */
+public class DiamondInheritance {
+
+    /**
+     * Base interface to illustrate the diamond inheritance.
+     *
+     * @see DiamondInheritance
+     */
+    public interface Animal {
+
+        /**
+         * Return string representation of the "go" action for concrete animal
+         *
+         * @return string representation of the "go" action for concrete animal
+         */
+        String go();
+    }
+
+    /**
+     * Interface to illustrate the diamond inheritance.
+     *
+     * @see DiamondInheritance
+     */
+    public interface Horse extends Animal {
+
+        /**
+         * Return string representation of the "go" action for horse
+         *
+         * @return string representation of the "go" action for horse
+         */
+        @Override
+        default String go() {
+            return this.getClass().getSimpleName() + " walks on four legs";
+        }
+    }
+
+    /**
+     * Interface to illustrate the diamond inheritance.
+     *
+     * @see DiamondInheritance
+     */
+    public interface Bird extends Animal {
+
+        /**
+         * Return string representation of the "go" action for bird
+         *
+         * @return string representation of the "go" action for bird
+         */
+        @Override
+        default String go() {
+            return this.getClass().getSimpleName() + " walks on two legs";
+        }
+
+        /**
+         * Return string representation of the "fly" action for bird
+         *
+         * @return string representation of the "fly" action for bird
+         */
+        default String fly() {
+            return "I can fly";
+        }
+    }
+
+    /**
+     * Class to illustrate the diamond inheritance. Pegasus must mix horse and
+     * bird behavior.
+     *
+     * @see DiamondInheritance
+     */
+    public static class Pegasus implements Horse, Bird {
+
+        /**
+         * Return string representation of the "go" action for the fictitious
+         * creature Pegasus
+         *
+         * @return string representation of the "go" action for the fictitious
+         * creature Pegasus
+         */
+        @Override
+        public String go() {
+            return Horse.super.go();
+        }
+    }
+
+    /**
+     * Illustrate the behavior of the {@link Pegasus} class
+     *
+     * @param args command line arguments
+     */
+    public static void main(final String[] args) {
+        System.out.println(new Pegasus().go());
+    }
+}
diff --git a/darwin-x86/sample/lambda/DefaultMethods/Inheritance.java b/darwin-x86/sample/lambda/DefaultMethods/Inheritance.java
new file mode 100644
index 0000000..961de2c
--- /dev/null
+++ b/darwin-x86/sample/lambda/DefaultMethods/Inheritance.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The sample illustrates rules to resolve conflicts between inheritance
+ * candidates with <b>default methods</b>. There are two simple rules:
+ * <ul>
+ * <li>Class wins. If the superclass has a concrete or abstract declaration of
+ * this method, then it is preferred over all defaults.</li>
+ * <li>Subtype wins. If an interface extends another interface, and both provide
+ * a default, then the more specific interface wins. </li>
+ * </ul>
+ */
+public class Inheritance {
+
+    /**
+     * The behavior of an creature that can swim
+     */
+    public interface Swimable {
+
+        /**
+         * Return string representation of the swim action for a creature that
+         * can swim
+         *
+         * @return string representation of the swim action for a creature
+         * that can swim
+         */
+        default String swim() {
+            return "I can swim.";
+        }
+    }
+
+    /**
+     * The abstract class that overrides {@link #swim} method
+     */
+    public abstract static class Fish implements Swimable {
+
+        /**
+         * Return string representation of the swim action for a fish
+         *
+         * @return string representation of the swim action for a fish
+         */
+        @Override
+        public String swim() {
+            return this.getClass().getSimpleName() + " swims under water";
+        }
+    }
+
+    /**
+     * This class is used for the illustration rule of 1. See the source code
+     * of the {@link #main} method.
+     * <pre>
+     *      System.out.println(new Tuna().swim()); //"Tuna swims under water" output is suspected here
+     * </pre>
+     */
+    public static class Tuna extends Fish implements Swimable {
+    }
+
+    /**
+     * The behavior of an creature that can dive: the interface that overrides
+     * {@link #swim} method (subtype of {@link Swimable})
+     */
+    public interface Diveable extends Swimable {
+
+        /**
+         * Return string representation of the swim action for a creature that
+         * can dive
+         *
+         * @return string representation of the swim action for a creature
+         * that can dive
+         */
+        @Override
+        default String swim() {
+            return "I can swim on the surface of the water.";
+        }
+
+        /**
+         * Return string representation of the dive action for a creature that
+         * can dive
+         *
+         * @return string representation of the dive action for a creature
+         * that can dive
+         */
+        default String dive() {
+            return "I can dive.";
+        }
+    }
+
+    /**
+     * This class is used for the illustration of rule 2. See the source code
+     * of the {@link #main} method
+     * <pre>
+     *      //"I can swim on the surface of the water." output is suspected here
+     *      System.out.println(new Duck().swim());
+     * </pre>
+     */
+    public static class Duck implements Swimable, Diveable {
+    }
+
+    /**
+     * Illustrate behavior of the classes: {@link Tuna} and {@link Duck}
+     *
+     * @param args command line arguments
+     */
+    public static void main(final String[] args) {
+        // Illustrates rule 1. The Fish.swim() implementation wins
+        //"Tuna swims under water" is output
+        System.out.println(new Tuna().swim());
+
+        // Illustrates rule 2. The Diveable.swim() implementation wins
+        //"I can swim on the surface of the water." is output
+        System.out.println(new Duck().swim());
+    }
+}
diff --git a/darwin-x86/sample/lambda/DefaultMethods/MixIn.java b/darwin-x86/sample/lambda/DefaultMethods/MixIn.java
new file mode 100644
index 0000000..d9ed81d
--- /dev/null
+++ b/darwin-x86/sample/lambda/DefaultMethods/MixIn.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+
+/**
+ * The example illustrates how to use the default method for mixin.
+ * @see BuildType
+ * @see Debuggable
+ */
+public class MixIn {
+
+    /**
+     * Implement this interface for a class that must be in debug print
+     */
+    public interface Debuggable {
+
+        /**
+         * Print the class name and all fields to a string. Uses reflection to
+         * obtain and access fields of this object.
+         *
+         * @return the string formatted like the following: <pre>
+         * State of the: &lt;Class Name&gt;
+         * &lt;member name&gt; : &lt;value&gt;
+         * ...
+         * </pre>
+         */
+        default String toDebugString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("State of the: ").append(
+                    this.getClass().getSimpleName()).append("\n");
+            for (Class cls = this.getClass();
+                    cls != null;
+                    cls = cls.getSuperclass()) {
+                for (Field f : cls.getDeclaredFields()) {
+                    try {
+                        f.setAccessible(true);
+                        sb.append(f.getName()).append(" : ").
+                                append(f.get(this)).append("\n");
+                    } catch (IllegalAccessException e) {
+                    }
+                }
+            }
+            return sb.toString();
+        }
+    }
+
+    /**
+     * Sample exception class to demonstrate mixin. This enum inherits the
+     * behavior of the {@link Debuggable}
+     */
+    public static enum BuildType implements Debuggable {
+
+        BUILD(0, "-build"),
+        PLAN(0, "-plan"),
+        EXCLUDE(1, "-exclude"),
+        TOTAL(2, "-total");
+
+        private final int compareOrder;
+        private final String pathSuffix;
+
+        private BuildType(int compareOrder, String pathSuffix) {
+            this.compareOrder = compareOrder;
+            this.pathSuffix = pathSuffix;
+        }
+
+        public int getCompareOrder() {
+            return compareOrder;
+        }
+
+        public String getPathSuffix() {
+            return pathSuffix;
+        }
+    }
+
+    /**
+     * Illustrate the behavior of the MixClass
+     *
+     * @param args command-line arguments
+     * @throws java.io.IOException internal demo error
+     */
+    public static void main(final String[] args) throws IOException {
+        System.out.println(BuildType.BUILD.toDebugString());
+    }
+}
diff --git a/darwin-x86/sample/lambda/DefaultMethods/Reflection.java b/darwin-x86/sample/lambda/DefaultMethods/Reflection.java
new file mode 100644
index 0000000..78424a2
--- /dev/null
+++ b/darwin-x86/sample/lambda/DefaultMethods/Reflection.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/**
+ * The code sample illustrates changes in the reflection API linked
+ * <b>default methods</b>. Since Java SE 8, a new method is added into the class
+ * <b><code>java.lang.reflect.Method</code></b>, with which you can reflectively
+ * determine whether or not a default method provided by an interface
+ * (<b><code>Method.isDefault()</code></b>).
+ */
+public class Reflection {
+
+    /**
+     * Base interface to illustrate the new reflection API.
+     *
+     * @see Dog
+     */
+    public interface Animal {
+
+        /**
+         * Return string representation of the eat action for Animal
+         *
+         * @return string representation of the eat action for Animal
+         */
+        default String eat() {
+            return this.getClass().getSimpleName()
+                    + " eats like an ordinary animal";
+        }
+
+        /**
+         * Return string representation of the sleep action for Animal
+         *
+         * @return string representation of the sleep action for Animal
+         */
+        default String sleep() {
+            return this.getClass().getSimpleName()
+                    + " sleeps like an ordinary animal";
+        }
+
+        /**
+         * Return string representation of the go action for Animal
+         *
+         * @return string representation of the go action for Animal
+         */
+        String go();
+    }
+
+    /**
+     * Dog class to illustrate the new reflection API. You can see that:
+     * <ul>
+     * <li> the {@link #go} and {@link #sleep} methods are not default.
+     * {@link #go} is not the default implementation and the {@link #sleep}
+     * method implementation wins as subtype (according with {@link Inheritance}
+     * rule. 2) </li>
+     * <li> the {@link #eat} is a simple default method that is not overridden
+     * in this class.
+     * </li>
+     * </ul>
+     */
+    public static class Dog implements Animal {
+
+        /**
+         * Return string representation of the go action for Dog
+         *
+         * @return string representation of the go action for Dog
+         */
+        @Override
+        public String go() {
+            return "Dog walks on four legs";
+        }
+
+        /**
+         * Return string representation of the sleep action for Dog
+         *
+         * @return string representation of the sleep action for Dog
+         */
+        @Override
+        public String sleep() {
+            return "Dog sleeps";
+        }
+    }
+
+    /**
+     * Illustrate the usage of the method java.lang.reflect.Method.isDefault()
+     *
+     * @param args command-line arguments
+     * @throws NoSuchMethodException internal demo error
+     */
+    public static void main(final String[] args) throws NoSuchMethodException {
+        Dog dog = new Dog();
+        Stream.of(Dog.class.getMethod("eat"), Dog.class.getMethod("go"), Dog.class.getMethod("sleep"))
+                .forEach((m) -> {
+                    System.out.println("Method name:   " + m.getName());
+                    System.out.println("    isDefault: " + m.isDefault());
+                    System.out.print("    invoke:    ");
+                    try {
+                        m.invoke(dog);
+                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
+                    }
+                    System.out.println();
+                });
+    }
+}
diff --git a/darwin-x86/sample/lambda/DefaultMethods/SimplestUsage.java b/darwin-x86/sample/lambda/DefaultMethods/SimplestUsage.java
new file mode 100644
index 0000000..a971858
--- /dev/null
+++ b/darwin-x86/sample/lambda/DefaultMethods/SimplestUsage.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The sample illustrates the simplest use case of the <b>default methods</b>.
+ */
+public class SimplestUsage {
+
+    /**
+     * The Animal interface provides the default implementation
+     * of the {@link #eat} method.
+     */
+    public interface Animal {
+
+        /**
+         * Return string representation of the eat action for Animal
+         *
+         * @return string representation of the eat action for Animal
+         */
+        default String eat() {
+            return this.getClass().getSimpleName()
+                    + " eats like an ordinary animal";
+        }
+    }
+
+    /**
+     * The Dog class doesn't have its own implementation of the {@link #eat}
+     * method and uses the default implementation.
+     */
+    public static class Dog implements Animal {
+    }
+
+    /**
+     * The Mosquito class implements {@link #eat} method, its own implementation
+     * overrides the default implementation.
+     *
+     */
+    public static class Mosquito implements Animal {
+
+        /**
+         * Return string representation of the eat action for Mosquito
+         *
+         * @return string representation of the eat action for Mosquito
+         */
+        @Override
+        public String eat() {
+            return "Mosquito consumes blood";
+        }
+    }
+
+    /**
+     * Illustrate behavior of the classes: {@link Dog} and {@link Mosquito}
+     *
+     * @param args command-line arguments
+     */
+    public static void main(String[] args) {
+        // "Dog eats like an ordinary animal" is output
+        System.out.println(new Dog().eat());
+
+        // "Mosquito consumes blood" is output
+        System.out.println(new Mosquito().eat());
+    }
+}
diff --git a/darwin-x86/sample/nbproject/project.xml b/darwin-x86/sample/nbproject/project.xml
new file mode 100644
index 0000000..8417326
--- /dev/null
+++ b/darwin-x86/sample/nbproject/project.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>JDK Samples</name>
+            <view>
+                <items/>
+            </view>
+            <subprojects>
+                <project>jmx/jmx-scandir</project>
+                <project>scripting/scriptpad</project>
+                <project>webservices/EbayClient</project>
+                <project>webservices/EbayServer</project>
+            </subprojects>
+        </general-data>
+    </configuration>
+</project>
diff --git a/darwin-x86/sample/nio/chatserver/ChatServer.java b/darwin-x86/sample/nio/chatserver/ChatServer.java
new file mode 100644
index 0000000..f807aa1
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/ChatServer.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.StandardSocketOptions;
+import java.nio.channels.*;
+import java.util.*;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Implements a chat server, this class holds the list of {@code clients} connected to the server.
+ * It sets up a server socket using AsynchronousServerSocketChannel listening to a specified port.
+ */
+public class ChatServer implements Runnable {
+    private final List<Client> connections = Collections.synchronizedList(new ArrayList<Client>());
+    private int port;
+    private final AsynchronousServerSocketChannel listener;
+    private final AsynchronousChannelGroup channelGroup;
+
+    /**
+     *
+     * @param port to listen to
+     * @throws java.io.IOException when failing to start the server
+     */
+    public ChatServer(int port) throws IOException {
+        channelGroup = AsynchronousChannelGroup.withFixedThreadPool(Runtime.getRuntime().availableProcessors(),
+                Executors.defaultThreadFactory());
+        this.port = port;
+        listener = createListener(channelGroup);
+    }
+
+    /**
+     *
+     * @return The socket address that the server is bound to
+     * @throws java.io.IOException if an I/O error occurs
+     */
+    public SocketAddress getSocketAddress() throws IOException {
+        return listener.getLocalAddress();
+    }
+
+    /**
+     * Start accepting connections
+     */
+    public void run() {
+
+        // call accept to wait for connections, tell it to call our CompletionHandler when there
+        // is a new incoming connection
+        listener.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
+            @Override
+            public void completed(AsynchronousSocketChannel result, Void attachment) {
+                // request a new accept and handle the incoming connection
+                listener.accept(null, this);
+                handleNewConnection(result);
+            }
+
+            @Override
+            public void failed(Throwable exc, Void attachment) {
+            }
+        });
+    }
+
+    /**
+     * Shuts down the server
+     * @throws InterruptedException if terminated while waiting for shutdown
+     * @throws IOException if failing to shutdown the channel group
+     */
+    public void shutdown() throws InterruptedException, IOException {
+        channelGroup.shutdownNow();
+        channelGroup.awaitTermination(1, TimeUnit.SECONDS);
+    }
+
+    /*
+    * Creates a listener and starts accepting connections
+    */
+    private AsynchronousServerSocketChannel createListener(AsynchronousChannelGroup channelGroup) throws IOException {
+        final AsynchronousServerSocketChannel listener = openChannel(channelGroup);
+        listener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
+        listener.bind(new InetSocketAddress(port));
+        return listener;
+    }
+
+    private AsynchronousServerSocketChannel openChannel(AsynchronousChannelGroup channelGroup) throws IOException {
+        return AsynchronousServerSocketChannel.open(channelGroup);
+    }
+
+    /**
+     * Creates a new client and adds it to the list of connections.
+     * Sets the clients handler to the initial state of NameReader
+     *
+     * @param channel the newly accepted channel
+     */
+    private void handleNewConnection(AsynchronousSocketChannel channel) {
+        Client client = new Client(channel, new ClientReader(this, new NameReader(this)));
+        try {
+            channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
+        } catch (IOException e) {
+            // ignore
+        }
+        connections.add(client);
+        client.run();
+    }
+
+    /**
+     * Sends a message to all clients except the source.
+     * The method is synchronized as it is desired that messages are sent to
+     * all clients in the same order as received.
+     *
+     * @param client the message source
+     * @param message the message to be sent
+     */
+    public void writeMessageToClients(Client client, String message) {
+        synchronized (connections) {
+            for (Client clientConnection : connections) {
+                if (clientConnection != client) {
+                    clientConnection.writeMessageFrom(client, message);
+                }
+            }
+        }
+    }
+
+    public void removeClient(Client client) {
+        connections.remove(client);
+    }
+
+    private static void usage() {
+        System.err.println("ChatServer [-port <port number>]");
+        System.exit(1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        int port = 5000;
+        if (args.length != 0 && args.length != 2) {
+            usage();
+        } else if (args.length == 2) {
+            try {
+                if (args[0].equals("-port")) {
+                    port = Integer.parseInt(args[1]);
+                } else {
+                    usage();
+                }
+            } catch (NumberFormatException e) {
+                usage();
+            }
+        }
+        System.out.println("Running on port " + port);
+        new ChatServer(port).run();
+    }
+}
diff --git a/darwin-x86/sample/nio/chatserver/Client.java b/darwin-x86/sample/nio/chatserver/Client.java
new file mode 100644
index 0000000..31ee034
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/Client.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.CompletionHandler;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Client represents a remote connection to the chat server.
+ * It contains methods for reading and writing messages from the
+ * channel.
+ * Messages are considered to be separated by newline, so incomplete
+ * messages are buffered in the {@code Client}.
+ *
+ * All reads and writes are asynchronous and uses the nio2 asynchronous
+ * elements.
+ */
+class Client {
+    private final AsynchronousSocketChannel channel;
+    private AtomicReference<ClientReader> reader;
+    private String userName;
+    private final StringBuilder messageBuffer = new StringBuilder();
+
+    private final Queue<ByteBuffer> queue = new LinkedList<ByteBuffer>();
+    private boolean writing = false;
+
+    public Client(AsynchronousSocketChannel channel, ClientReader reader) {
+        this.channel = channel;
+        this.reader = new AtomicReference<ClientReader>(reader);
+    }
+
+    /**
+     * Enqueues a write of the buffer to the channel.
+     * The call is asynchronous so the buffer is not safe to modify after
+     * passing the buffer here.
+     *
+     * @param buffer the buffer to send to the channel
+     */
+    private void writeMessage(final ByteBuffer buffer) {
+        boolean threadShouldWrite = false;
+
+        synchronized(queue) {
+            queue.add(buffer);
+            // Currently no thread writing, make this thread dispatch a write
+            if (!writing) {
+                writing = true;
+                threadShouldWrite = true;
+            }
+        }
+
+        if (threadShouldWrite) {
+            writeFromQueue();
+        }
+    }
+
+    private void writeFromQueue() {
+        ByteBuffer buffer;
+
+        synchronized (queue) {
+            buffer = queue.poll();
+            if (buffer == null) {
+                writing = false;
+            }
+        }
+
+        // No new data in buffer to write
+        if (writing) {
+            writeBuffer(buffer);
+        }
+    }
+
+    private void writeBuffer(ByteBuffer buffer) {
+        channel.write(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
+            @Override
+            public void completed(Integer result, ByteBuffer buffer) {
+                if (buffer.hasRemaining()) {
+                    channel.write(buffer, buffer, this);
+                } else {
+                    // Go back and check if there is new data to write
+                    writeFromQueue();
+                }
+            }
+
+            @Override
+            public void failed(Throwable exc, ByteBuffer attachment) {
+            }
+        });
+    }
+
+    /**
+     * Sends a message
+     * @param string the message
+     */
+    public void writeStringMessage(String string) {
+        writeMessage(ByteBuffer.wrap(string.getBytes()));
+    }
+
+    /**
+     * Send a message from a specific client
+     * @param client the message is sent from
+     * @param message to send
+     */
+    public void writeMessageFrom(Client client, String message) {
+        if (reader.get().acceptsMessages()) {
+            writeStringMessage(client.getUserName() + ": " + message);
+        }
+    }
+
+    /**
+     * Enqueue a read
+     * @param completionHandler callback on completed read
+     */
+    public void read(CompletionHandler<Integer, ? super ByteBuffer> completionHandler) {
+        ByteBuffer input = ByteBuffer.allocate(256);
+        if (!channel.isOpen()) {
+            return;
+        }
+        channel.read(input, input, completionHandler);
+    }
+
+    /**
+     * Closes the channel
+     */
+    public void close() {
+        try {
+            channel.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Run the current states actions.
+     */
+    public void run() {
+        reader.get().run(this);
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public void setReader(ClientReader reader) {
+        this.reader.set(reader);
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void appendMessage(String message) {
+        synchronized (messageBuffer) {
+            messageBuffer.append(message);
+        }
+    }
+
+    /**
+     * @return the next newline separated message in the buffer. null is returned if the buffer
+     * doesn't contain any newline.
+     */
+    public String nextMessage() {
+        synchronized(messageBuffer) {
+            int nextNewline = messageBuffer.indexOf("\n");
+            if (nextNewline == -1) {
+                return null;
+            }
+            String message = messageBuffer.substring(0, nextNewline + 1);
+            messageBuffer.delete(0, nextNewline + 1);
+            return message;
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/chatserver/ClientReader.java b/darwin-x86/sample/nio/chatserver/ClientReader.java
new file mode 100644
index 0000000..822125a
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/ClientReader.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+import java.nio.channels.CompletionHandler;
+
+/**
+ * Handles a cycle of reading / writing on the {@code Client}.
+ */
+class ClientReader {
+    private final DataReader callback;
+    private final ChatServer chatServer;
+
+    ClientReader(ChatServer chatServer, DataReader callback) {
+        this.chatServer = chatServer;
+        this.callback = callback;
+    }
+
+    public boolean acceptsMessages() {
+        return callback.acceptsMessages();
+    }
+
+    /**
+     * Runs a cycle of doing a beforeRead action and then enqueuing a new
+     * read on the client. Handles closed channels and errors while reading.
+     * If the client is still connected a new round of actions are called.
+     */
+    public void run(final Client client) {
+        callback.beforeRead(client);
+        client.read(new CompletionHandler<Integer, ByteBuffer>() {
+            @Override
+            public void completed(Integer result, ByteBuffer buffer) {
+                // if result is negative or zero the connection has been closed or something gone wrong
+                if (result < 1) {
+                    client.close();
+                    System.out.println("Closing connection to " + client);
+                    chatServer.removeClient(client);
+                } else {
+                    callback.onData(client, buffer, result);
+                    // enqueue next round of actions
+                    client.run();
+                }
+            }
+
+            @Override
+            public void failed(Throwable exc, ByteBuffer buffer) {
+                client.close();
+                chatServer.removeClient(client);
+            }
+        });
+    }
+}
diff --git a/darwin-x86/sample/nio/chatserver/DataReader.java b/darwin-x86/sample/nio/chatserver/DataReader.java
new file mode 100644
index 0000000..8858c9f
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/DataReader.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+
+public interface DataReader {
+    void beforeRead(Client client);
+    void onData(Client client, ByteBuffer buffer, int bytes);
+    boolean acceptsMessages();
+}
diff --git a/darwin-x86/sample/nio/chatserver/MessageReader.java b/darwin-x86/sample/nio/chatserver/MessageReader.java
new file mode 100644
index 0000000..81c370b
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/MessageReader.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+
+/**
+ * Writes all messages in our buffer to the other clients
+ * and appends new data read from the socket to our buffer
+ */
+class MessageReader implements DataReader {
+    private final ChatServer chatServer;
+
+    public MessageReader(ChatServer chatServer) {
+        this.chatServer = chatServer;
+    }
+
+    public boolean acceptsMessages() {
+        return true;
+    }
+
+    /**
+     * Write all full messages in our buffer to
+     * the other clients
+     *
+     * @param client the client to read messages from
+     */
+    @Override
+    public void beforeRead(Client client) {
+        // Check if we have any messages buffered and send them
+        String message = client.nextMessage();
+        while (message != null) {
+            chatServer.writeMessageToClients(client, message);
+            message = client.nextMessage();
+        }
+    }
+
+    /**
+     * Append the read buffer to the clients message buffer
+     * @param client the client to append messages to
+     * @param buffer the buffer we received from the socket
+     * @param bytes the number of bytes read into the buffer
+     */
+    @Override
+    public void onData(Client client, ByteBuffer buffer, int bytes) {
+        buffer.flip();
+        // Just append the message on the buffer
+        client.appendMessage(new String(buffer.array(), 0, bytes));
+    }
+}
diff --git a/darwin-x86/sample/nio/chatserver/NameReader.java b/darwin-x86/sample/nio/chatserver/NameReader.java
new file mode 100644
index 0000000..341d4da
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/NameReader.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+
+/**
+ * The first state a newly connected {@code Client} is in, this
+ * handles writing out the welcoming message and reads the response
+ * up to a newline. When a newline character have been received
+ * it changes the handler from NameReader to MessageReader on the
+ * client.
+ */
+class NameReader implements DataReader {
+    private final StringBuilder buffer = new StringBuilder();
+    private final ChatServer chatServer;
+    private boolean once = true;
+    private static final String NEWLINE = "\n";
+
+    public NameReader(ChatServer chatServer) {
+        this.chatServer = chatServer;
+    }
+
+    /**
+     * Writes the welcoming message to the client the first time this method
+     * is called.
+     *
+     * @param client the client to receive the message
+     */
+    @Override
+    public void beforeRead(Client client) {
+        // if it is a long name that takes more than one read we only want to display Name: once.
+        if (once) {
+            client.writeStringMessage("Name: ");
+            once = false;
+        }
+    }
+
+    public boolean acceptsMessages() {
+        return false;
+    }
+
+    /**
+     * Receives incoming data from the socket, searches for a newline
+     * and tries to set the username if one is found
+     */
+    @Override
+    public void onData(Client client, ByteBuffer buffer, int bytes) {
+        buffer.flip();
+        String name;
+        name = this.buffer.append(new String(buffer.array(), 0, bytes)).toString();
+        if (name.contains(NEWLINE)) {
+            onUserNameRead(client, name);
+        }
+    }
+
+    /**
+     * Splits the name on the newlines, takes the first as the username
+     * and appends everything else to the clients message buffer.
+     * Sets the clients handler to MessageReader.
+     *
+     * @param client the client to set the username for
+     * @param name the string containing the buffered input
+     */
+    private void onUserNameRead(Client client, String name) {
+        String[] strings = name.split(NEWLINE, 2);
+        client.setUserName(strings[0].trim());
+        sendRemainingParts(client, strings);
+        client.setReader(new ClientReader(chatServer, new MessageReader(chatServer)));
+        client.writeStringMessage("Welcome " + client.getUserName() + "\n");
+    }
+
+    /**
+     * Appends the remaining parts to the clients message buffer
+     *
+     * @param client the client
+     * @param strings the messages to append to the buffer
+     */
+    private void sendRemainingParts(Client client, String[] strings) {
+        for (int i = 1; i < strings.length; ++i) {
+            client.appendMessage(strings[i]);
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/chatserver/README.txt b/darwin-x86/sample/nio/chatserver/README.txt
new file mode 100644
index 0000000..ec9b476
--- /dev/null
+++ b/darwin-x86/sample/nio/chatserver/README.txt
@@ -0,0 +1,62 @@
+A Simple Chat Server Example
+
+INTRODUCTION
+============
+This directory contains a very simple chat server, the server takes input from a
+socket ("user") and sends it to all other connected sockets ("users") along with
+the provided name the user was asked for when first connecting.
+
+The server was written to demonstrate the asynchronous I/O API in JDK 7. 
+The sample assumes the reader has some familiarity with the subject matter.
+
+SETUP
+=====
+
+The server must be built with version 7 (or later) of the JDK.
+The server is built with:
+
+    % mkdir build
+    % javac -source 7 -target 7 -d build *.java
+
+EXECUTION
+=========
+
+    % java -classpath build ChatServer [-port <port number>]
+
+    Usage:  ChatServer [options]
+        options:
+            -port port      port number
+                default: 5000
+
+CLIENT EXECUTION
+================
+
+No client binary is included in the sample.
+Connections can be made using for example the telnet command or any program
+that supports a raw TCP connection to a port.
+
+SOURCE CODE OVERVIEW
+====================
+ChatServer is the main class, it handles the startup and handles incoming
+connections on the listening sockets. It keeps a list of connected client
+and provides methods for sending a message to them.
+
+Client represents a connected user, it provides methods for reading/writing
+from/to the underlying socket. It also contains a buffer of input read from
+the user.
+
+DataReader provides the interface of the two states a user can
+be in. Waiting for a name (and not receiving any messages while doing so, implemented
+by NameReader) and waiting for messages from the user (implemented by MessageReader).
+
+ClientReader contains the "main loop" for a connected client. 
+
+NameReader is the initial state for a new client, it sends the user a string and
+waits for a response before changing the state to MessageReader.
+
+MessageReader is the main state for a client, it checks for new messages to send to
+other clients and reads messages from the client.
+
+FINALLY
+=======
+This is a sample: it is not production quality and isn't optimized for performance.
diff --git a/darwin-x86/sample/nio/file/AclEdit.java b/darwin-x86/sample/nio/file/AclEdit.java
new file mode 100644
index 0000000..90af865
--- /dev/null
+++ b/darwin-x86/sample/nio/file/AclEdit.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * Sample utility for editing a file's ACL.
+ */
+
+public class AclEdit {
+
+    // parse string as list of ACE permissions separated by /
+    static Set<AclEntryPermission> parsePermissions(String permsString) {
+        Set<AclEntryPermission> perms = new HashSet<AclEntryPermission>();
+        String[] result = permsString.split("/");
+        for (String s : result) {
+            if (s.equals(""))
+                continue;
+            try {
+                perms.add(AclEntryPermission.valueOf(s.toUpperCase()));
+            } catch (IllegalArgumentException x) {
+                System.err.format("Invalid permission '%s'\n", s);
+                System.exit(-1);
+            }
+        }
+        return perms;
+    }
+
+    // parse string as list of ACE flags separated by /
+    static Set<AclEntryFlag> parseFlags(String flagsString) {
+        Set<AclEntryFlag> flags = new HashSet<AclEntryFlag>();
+        String[] result = flagsString.split("/");
+        for (String s : result) {
+            if (s.equals(""))
+                continue;
+            try {
+                flags.add(AclEntryFlag.valueOf(s.toUpperCase()));
+            } catch (IllegalArgumentException x) {
+                System.err.format("Invalid flag '%s'\n", s);
+                System.exit(-1);
+            }
+        }
+        return flags;
+    }
+
+    // parse ACE type
+    static AclEntryType parseType(String typeString) {
+        // FIXME: support audit and alarm types in the future
+        if (typeString.equalsIgnoreCase("allow"))
+            return AclEntryType.ALLOW;
+        if (typeString.equalsIgnoreCase("deny"))
+            return AclEntryType.DENY;
+        System.err.format("Invalid type '%s'\n", typeString);
+        System.exit(-1);
+        return null;    // keep compiler happy
+    }
+
+    /**
+     * Parse string of the form:
+     *   [user|group:]<username|groupname>:<perms>[:flags]:<allow|deny>
+     */
+    static AclEntry parseAceString(String s,
+                                   UserPrincipalLookupService lookupService)
+    {
+        String[] result = s.split(":");
+
+        // must have at least 3 components (username:perms:type)
+        if (result.length < 3)
+            usage();
+
+        int index = 0;
+        int remaining = result.length;
+
+        // optional first component can indicate user or group type
+        boolean isGroup = false;
+        if (result[index].equalsIgnoreCase("user") ||
+            result[index].equalsIgnoreCase("group"))
+        {
+            if (--remaining < 3)
+                usage();
+            isGroup = result[index++].equalsIgnoreCase("group");
+        }
+
+        // user and permissions required
+        String userString = result[index++]; remaining--;
+        String permsString = result[index++]; remaining--;
+
+        // flags are optional
+        String flagsString = "";
+        String typeString = null;
+        if (remaining == 1) {
+            typeString = result[index++];
+        } else {
+            if (remaining == 2) {
+                flagsString = result[index++];
+                typeString = result[index++];
+            } else {
+                usage();
+            }
+        }
+
+        // lookup UserPrincipal
+        UserPrincipal user = null;
+        try {
+            user = (isGroup) ?
+                lookupService.lookupPrincipalByGroupName(userString) :
+                lookupService.lookupPrincipalByName(userString);
+        } catch (UserPrincipalNotFoundException x) {
+            System.err.format("Invalid %s '%s'\n",
+                ((isGroup) ? "group" : "user"),
+                userString);
+            System.exit(-1);
+        } catch (IOException x) {
+            System.err.format("Lookup of '%s' failed: %s\n", userString, x);
+            System.exit(-1);
+        }
+
+        // map string representation of permissions, flags, and type
+        Set<AclEntryPermission> perms = parsePermissions(permsString);
+        Set<AclEntryFlag> flags = parseFlags(flagsString);
+        AclEntryType type = parseType(typeString);
+
+        // build the ACL entry
+        return AclEntry.newBuilder()
+            .setType(type)
+            .setPrincipal(user)
+            .setPermissions(perms).setFlags(flags).build();
+    }
+
+    static void usage() {
+        System.err.println("usage: java AclEdit [ACL-operation] file");
+        System.err.println("");
+        System.err.println("Example 1: Prepends access control entry to the begining of the myfile's ACL");
+        System.err.println("       java AclEdit A+alice:read_data/read_attributes:allow myfile");
+        System.err.println("");
+        System.err.println("Example 2: Remove the entry at index 6 of myfile's ACL");
+        System.err.println("       java AclEdit A6- myfile");
+        System.err.println("");
+        System.err.println("Example 3: Replace the entry at index 2 of myfile's ACL");
+        System.err.println("       java AclEdit A2=bob:write_data/append_data:deny myfile");
+        System.exit(-1);
+    }
+
+    static enum Action {
+        PRINT,
+        ADD,
+        REMOVE,
+        REPLACE;
+    }
+
+    /**
+     * Main class: parses arguments and prints or edits ACL
+     */
+    public static void main(String[] args) throws IOException {
+        Action action = null;
+        int index = -1;
+        String entryString = null;
+
+        // parse arguments
+        if (args.length < 1 || args[0].equals("-help") || args[0].equals("-?"))
+            usage();
+
+        if (args.length == 1) {
+            action = Action.PRINT;
+        } else {
+            String s = args[0];
+
+            // A[index]+entry
+            if (Pattern.matches("^A[0-9]*\\+.*", s)) {
+                String[] result = s.split("\\+", 2);
+                if (result.length == 2) {
+                    if (result[0].length() < 2) {
+                        index = 0;
+                    } else {
+                        index = Integer.parseInt(result[0].substring(1));
+                    }
+                    entryString = result[1];
+                    action = Action.ADD;
+                }
+            }
+
+            // Aindex-
+            if (Pattern.matches("^A[0-9]+\\-", s)) {
+                String[] result = s.split("\\-", 2);
+                if (result.length == 2) {
+                    index = Integer.parseInt(result[0].substring(1));
+                    entryString = result[1];
+                    action = Action.REMOVE;
+                }
+            }
+
+            // Aindex=entry
+            if (Pattern.matches("^A[0-9]+=.*", s)) {
+                String[] result = s.split("=", 2);
+                if (result.length == 2) {
+                    index = Integer.parseInt(result[0].substring(1));
+                    entryString = result[1];
+                    action = Action.REPLACE;
+                }
+            }
+        }
+        if (action == null)
+            usage();
+
+        int fileArg = (action == Action.PRINT) ? 0 : 1;
+        Path file = Paths.get(args[fileArg]);
+
+        // read file's ACL
+        AclFileAttributeView view =
+            Files.getFileAttributeView(file, AclFileAttributeView.class);
+        if (view == null) {
+            System.err.println("ACLs not supported on this platform");
+            System.exit(-1);
+        }
+        List<AclEntry> acl = view.getAcl();
+
+        switch (action) {
+            // print ACL
+            case PRINT : {
+                for (int i=0; i<acl.size(); i++) {
+                    System.out.format("%5d: %s\n", i, acl.get(i));
+                }
+                break;
+            }
+
+            // add ACE to existing ACL
+            case ADD: {
+                AclEntry entry = parseAceString(entryString, file
+                    .getFileSystem().getUserPrincipalLookupService());
+                if (index >= acl.size()) {
+                    acl.add(entry);
+                } else {
+                    acl.add(index, entry);
+                }
+                view.setAcl(acl);
+                break;
+            }
+
+            // remove ACE
+            case REMOVE: {
+                if (index >= acl.size()) {
+                    System.err.format("Index '%d' is invalid", index);
+                    System.exit(-1);
+                }
+                acl.remove(index);
+                view.setAcl(acl);
+                break;
+            }
+
+            // replace ACE
+            case REPLACE: {
+                if (index >= acl.size()) {
+                    System.err.format("Index '%d' is invalid", index);
+                    System.exit(-1);
+                }
+                AclEntry entry = parseAceString(entryString, file
+                    .getFileSystem().getUserPrincipalLookupService());
+                acl.set(index, entry);
+                view.setAcl(acl);
+                break;
+            }
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/file/Chmod.java b/darwin-x86/sample/nio/file/Chmod.java
new file mode 100644
index 0000000..05c16b9
--- /dev/null
+++ b/darwin-x86/sample/nio/file/Chmod.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import static java.nio.file.attribute.PosixFilePermission.*;
+import static java.nio.file.FileVisitResult.*;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Sample code that changes the permissions of files in a similar manner to the
+ * chmod(1) program.
+ */
+
+public class Chmod {
+
+    /**
+     * Compiles a list of one or more <em>symbolic mode expressions</em> that
+     * may be used to change a set of file permissions. This method is
+     * intended for use where file permissions are required to be changed in
+     * a manner similar to the UNIX <i>chmod</i> program.
+     *
+     * <p> The {@code exprs} parameter is a comma separated list of expressions
+     * where each takes the form:
+     * <blockquote>
+     * <i>who operator</i> [<i>permissions</i>]
+     * </blockquote>
+     * where <i>who</i> is one or more of the characters {@code 'u'}, {@code 'g'},
+     * {@code 'o'}, or {@code 'a'} meaning the owner (user), group, others, or
+     * all (owner, group, and others) respectively.
+     *
+     * <p> <i>operator</i> is the character {@code '+'}, {@code '-'}, or {@code
+     * '='} signifying how permissions are to be changed. {@code '+'} means the
+     * permissions are added, {@code '-'} means the permissions are removed, and
+     * {@code '='} means the permissions are assigned absolutely.
+     *
+     * <p> <i>permissions</i> is a sequence of zero or more of the following:
+     * {@code 'r'} for read permission, {@code 'w'} for write permission, and
+     * {@code 'x'} for execute permission. If <i>permissions</i> is omitted
+     * when assigned absolutely, then the permissions are cleared for
+     * the owner, group, or others as identified by <i>who</i>. When omitted
+     * when adding or removing then the expression is ignored.
+     *
+     * <p> The following examples demonstrate possible values for the {@code
+     * exprs} parameter:
+     *
+     * <table border="0">
+     * <tr>
+     *   <td> {@code u=rw} </td>
+     *   <td> Sets the owner permissions to be read and write. </td>
+     * </tr>
+     * <tr>
+     *   <td> {@code ug+w} </td>
+     *   <td> Sets the owner write and group write permissions. </td>
+     * </tr>
+     * <tr>
+     *   <td> {@code u+w,o-rwx} </td>
+     *   <td> Sets the owner write, and removes the others read, others write
+     *     and others execute permissions. </td>
+     * </tr>
+     * <tr>
+     *   <td> {@code o=} </td>
+     *   <td> Sets the others permission to none (others read, others write and
+     *     others execute permissions are removed if set) </td>
+     * </tr>
+     * </table>
+     *
+     * @param   exprs
+     *          List of one or more <em>symbolic mode expressions</em>
+     *
+     * @return  A {@code Changer} that may be used to changer a set of
+     *          file permissions
+     *
+     * @throws  IllegalArgumentException
+     *          If the value of the {@code exprs} parameter is invalid
+     */
+    public static Changer compile(String exprs) {
+        // minimum is who and operator (u= for example)
+        if (exprs.length() < 2)
+            throw new IllegalArgumentException("Invalid mode");
+
+        // permissions that the changer will add or remove
+        final Set<PosixFilePermission> toAdd = new HashSet<PosixFilePermission>();
+        final Set<PosixFilePermission> toRemove = new HashSet<PosixFilePermission>();
+
+        // iterate over each of expression modes
+        for (String expr: exprs.split(",")) {
+            // minimum of who and operator
+            if (expr.length() < 2)
+                throw new IllegalArgumentException("Invalid mode");
+
+            int pos = 0;
+
+            // who
+            boolean u = false;
+            boolean g = false;
+            boolean o = false;
+            boolean done = false;
+            for (;;) {
+                switch (expr.charAt(pos)) {
+                    case 'u' : u = true; break;
+                    case 'g' : g = true; break;
+                    case 'o' : o = true; break;
+                    case 'a' : u = true; g = true; o = true; break;
+                    default : done = true;
+                }
+                if (done)
+                    break;
+                pos++;
+            }
+            if (!u && !g && !o)
+                throw new IllegalArgumentException("Invalid mode");
+
+            // get operator and permissions
+            char op = expr.charAt(pos++);
+            String mask = (expr.length() == pos) ? "" : expr.substring(pos);
+
+            // operator
+            boolean add = (op == '+');
+            boolean remove = (op == '-');
+            boolean assign = (op == '=');
+            if (!add && !remove && !assign)
+                throw new IllegalArgumentException("Invalid mode");
+
+            // who= means remove all
+            if (assign && mask.length() == 0) {
+                assign = false;
+                remove = true;
+                mask = "rwx";
+            }
+
+            // permissions
+            boolean r = false;
+            boolean w = false;
+            boolean x = false;
+            for (int i=0; i<mask.length(); i++) {
+                switch (mask.charAt(i)) {
+                    case 'r' : r = true; break;
+                    case 'w' : w = true; break;
+                    case 'x' : x = true; break;
+                    default:
+                        throw new IllegalArgumentException("Invalid mode");
+                }
+            }
+
+            // update permissions set
+            if (add) {
+                if (u) {
+                    if (r) toAdd.add(OWNER_READ);
+                    if (w) toAdd.add(OWNER_WRITE);
+                    if (x) toAdd.add(OWNER_EXECUTE);
+                }
+                if (g) {
+                    if (r) toAdd.add(GROUP_READ);
+                    if (w) toAdd.add(GROUP_WRITE);
+                    if (x) toAdd.add(GROUP_EXECUTE);
+                }
+                if (o) {
+                    if (r) toAdd.add(OTHERS_READ);
+                    if (w) toAdd.add(OTHERS_WRITE);
+                    if (x) toAdd.add(OTHERS_EXECUTE);
+                }
+            }
+            if (remove) {
+                if (u) {
+                    if (r) toRemove.add(OWNER_READ);
+                    if (w) toRemove.add(OWNER_WRITE);
+                    if (x) toRemove.add(OWNER_EXECUTE);
+                }
+                if (g) {
+                    if (r) toRemove.add(GROUP_READ);
+                    if (w) toRemove.add(GROUP_WRITE);
+                    if (x) toRemove.add(GROUP_EXECUTE);
+                }
+                if (o) {
+                    if (r) toRemove.add(OTHERS_READ);
+                    if (w) toRemove.add(OTHERS_WRITE);
+                    if (x) toRemove.add(OTHERS_EXECUTE);
+                }
+            }
+            if (assign) {
+                if (u) {
+                    if (r) toAdd.add(OWNER_READ);
+                      else toRemove.add(OWNER_READ);
+                    if (w) toAdd.add(OWNER_WRITE);
+                      else toRemove.add(OWNER_WRITE);
+                    if (x) toAdd.add(OWNER_EXECUTE);
+                      else toRemove.add(OWNER_EXECUTE);
+                }
+                if (g) {
+                    if (r) toAdd.add(GROUP_READ);
+                      else toRemove.add(GROUP_READ);
+                    if (w) toAdd.add(GROUP_WRITE);
+                      else toRemove.add(GROUP_WRITE);
+                    if (x) toAdd.add(GROUP_EXECUTE);
+                      else toRemove.add(GROUP_EXECUTE);
+                }
+                if (o) {
+                    if (r) toAdd.add(OTHERS_READ);
+                      else toRemove.add(OTHERS_READ);
+                    if (w) toAdd.add(OTHERS_WRITE);
+                      else toRemove.add(OTHERS_WRITE);
+                    if (x) toAdd.add(OTHERS_EXECUTE);
+                      else toRemove.add(OTHERS_EXECUTE);
+                }
+            }
+        }
+
+        // return changer
+        return new Changer() {
+            @Override
+            public Set<PosixFilePermission> change(Set<PosixFilePermission> perms) {
+                perms.addAll(toAdd);
+                perms.removeAll(toRemove);
+                return perms;
+            }
+        };
+    }
+
+    /**
+     * A task that <i>changes</i> a set of {@link PosixFilePermission} elements.
+     */
+    public interface Changer {
+        /**
+         * Applies the changes to the given set of permissions.
+         *
+         * @param   perms
+         *          The set of permissions to change
+         *
+         * @return  The {@code perms} parameter
+         */
+        Set<PosixFilePermission> change(Set<PosixFilePermission> perms);
+    }
+
+    /**
+     * Changes the permissions of the file using the given Changer.
+     */
+    static void chmod(Path file, Changer changer) {
+        try {
+            Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file);
+            Files.setPosixFilePermissions(file, changer.change(perms));
+        } catch (IOException x) {
+            System.err.println(x);
+        }
+    }
+
+    /**
+     * Changes the permission of each file and directory visited
+     */
+    static class TreeVisitor implements FileVisitor<Path> {
+        private final Changer changer;
+
+        TreeVisitor(Changer changer) {
+            this.changer = changer;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+            chmod(dir, changer);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+            chmod(file, changer);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+            if (exc != null)
+                System.err.println("WARNING: " + exc);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFileFailed(Path file, IOException exc) {
+            System.err.println("WARNING: " + exc);
+            return CONTINUE;
+        }
+    }
+
+    static void usage() {
+        System.err.println("java Chmod [-R] symbolic-mode-list file...");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length < 2)
+            usage();
+        int argi = 0;
+        int maxDepth = 0;
+        if (args[argi].equals("-R")) {
+            if (args.length < 3)
+                usage();
+            argi++;
+            maxDepth = Integer.MAX_VALUE;
+        }
+
+        // compile the symbolic mode expressions
+        Changer changer = compile(args[argi++]);
+        TreeVisitor visitor = new TreeVisitor(changer);
+
+        Set<FileVisitOption> opts = Collections.emptySet();
+        while (argi < args.length) {
+            Path file = Paths.get(args[argi]);
+            Files.walkFileTree(file, opts, maxDepth, visitor);
+            argi++;
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/file/Copy.java b/darwin-x86/sample/nio/file/Copy.java
new file mode 100644
index 0000000..0d61ef3
--- /dev/null
+++ b/darwin-x86/sample/nio/file/Copy.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import static java.nio.file.StandardCopyOption.*;
+import java.nio.file.attribute.*;
+import static java.nio.file.FileVisitResult.*;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Sample code that copies files in a similar manner to the cp(1) program.
+ */
+
+public class Copy {
+
+    /**
+     * Returns {@code true} if okay to overwrite a  file ("cp -i")
+     */
+    static boolean okayToOverwrite(Path file) {
+        String answer = System.console().readLine("overwrite %s (yes/no)? ", file);
+        return (answer.equalsIgnoreCase("y") || answer.equalsIgnoreCase("yes"));
+    }
+
+    /**
+     * Copy source file to target location. If {@code prompt} is true then
+     * prompt user to overwrite target if it exists. The {@code preserve}
+     * parameter determines if file attributes should be copied/preserved.
+     */
+    static void copyFile(Path source, Path target, boolean prompt, boolean preserve) {
+        CopyOption[] options = (preserve) ?
+            new CopyOption[] { COPY_ATTRIBUTES, REPLACE_EXISTING } :
+            new CopyOption[] { REPLACE_EXISTING };
+        if (!prompt || Files.notExists(target) || okayToOverwrite(target)) {
+            try {
+                Files.copy(source, target, options);
+            } catch (IOException x) {
+                System.err.format("Unable to copy: %s: %s%n", source, x);
+            }
+        }
+    }
+
+    /**
+     * A {@code FileVisitor} that copies a file-tree ("cp -r")
+     */
+    static class TreeCopier implements FileVisitor<Path> {
+        private final Path source;
+        private final Path target;
+        private final boolean prompt;
+        private final boolean preserve;
+
+        TreeCopier(Path source, Path target, boolean prompt, boolean preserve) {
+            this.source = source;
+            this.target = target;
+            this.prompt = prompt;
+            this.preserve = preserve;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+            // before visiting entries in a directory we copy the directory
+            // (okay if directory already exists).
+            CopyOption[] options = (preserve) ?
+                new CopyOption[] { COPY_ATTRIBUTES } : new CopyOption[0];
+
+            Path newdir = target.resolve(source.relativize(dir));
+            try {
+                Files.copy(dir, newdir, options);
+            } catch (FileAlreadyExistsException x) {
+                // ignore
+            } catch (IOException x) {
+                System.err.format("Unable to create: %s: %s%n", newdir, x);
+                return SKIP_SUBTREE;
+            }
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+            copyFile(file, target.resolve(source.relativize(file)),
+                     prompt, preserve);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+            // fix up modification time of directory when done
+            if (exc == null && preserve) {
+                Path newdir = target.resolve(source.relativize(dir));
+                try {
+                    FileTime time = Files.getLastModifiedTime(dir);
+                    Files.setLastModifiedTime(newdir, time);
+                } catch (IOException x) {
+                    System.err.format("Unable to copy all attributes to: %s: %s%n", newdir, x);
+                }
+            }
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFileFailed(Path file, IOException exc) {
+            if (exc instanceof FileSystemLoopException) {
+                System.err.println("cycle detected: " + file);
+            } else {
+                System.err.format("Unable to copy: %s: %s%n", file, exc);
+            }
+            return CONTINUE;
+        }
+    }
+
+    static void usage() {
+        System.err.println("java Copy [-ip] source... target");
+        System.err.println("java Copy -r [-ip] source-dir... target");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        boolean recursive = false;
+        boolean prompt = false;
+        boolean preserve = false;
+
+        // process options
+        int argi = 0;
+        while (argi < args.length) {
+            String arg = args[argi];
+            if (!arg.startsWith("-"))
+                break;
+            if (arg.length() < 2)
+                usage();
+            for (int i=1; i<arg.length(); i++) {
+                char c = arg.charAt(i);
+                switch (c) {
+                    case 'r' : recursive = true; break;
+                    case 'i' : prompt = true; break;
+                    case 'p' : preserve = true; break;
+                    default : usage();
+                }
+            }
+            argi++;
+        }
+
+        // remaining arguments are the source files(s) and the target location
+        int remaining = args.length - argi;
+        if (remaining < 2)
+            usage();
+        Path[] source = new Path[remaining-1];
+        int i=0;
+        while (remaining > 1) {
+            source[i++] = Paths.get(args[argi++]);
+            remaining--;
+        }
+        Path target = Paths.get(args[argi]);
+
+        // check if target is a directory
+        boolean isDir = Files.isDirectory(target);
+
+        // copy each source file/directory to target
+        for (i=0; i<source.length; i++) {
+            Path dest = (isDir) ? target.resolve(source[i].getFileName()) : target;
+
+            if (recursive) {
+                // follow links when copying files
+                EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
+                TreeCopier tc = new TreeCopier(source[i], dest, prompt, preserve);
+                Files.walkFileTree(source[i], opts, Integer.MAX_VALUE, tc);
+            } else {
+                // not recursive so source must not be a directory
+                if (Files.isDirectory(source[i])) {
+                    System.err.format("%s: is a directory%n", source[i]);
+                    continue;
+                }
+                copyFile(source[i], dest, prompt, preserve);
+            }
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/file/DiskUsage.java b/darwin-x86/sample/nio/file/DiskUsage.java
new file mode 100644
index 0000000..7d30bdf
--- /dev/null
+++ b/darwin-x86/sample/nio/file/DiskUsage.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+
+/**
+ * Example utility that works like the df(1M) program to print out disk space
+ * information
+ */
+
+public class DiskUsage {
+
+    static final long K = 1024;
+
+    static void printFileStore(FileStore store) throws IOException {
+        long total = store.getTotalSpace() / K;
+        long used = (store.getTotalSpace() - store.getUnallocatedSpace()) / K;
+        long avail = store.getUsableSpace() / K;
+
+        String s = store.toString();
+        if (s.length() > 20) {
+            System.out.println(s);
+            s = "";
+        }
+        System.out.format("%-20s %12d %12d %12d\n", s, total, used, avail);
+    }
+
+    public static void main(String[] args) throws IOException {
+        System.out.format("%-20s %12s %12s %12s\n", "Filesystem", "kbytes", "used", "avail");
+        if (args.length == 0) {
+            FileSystem fs = FileSystems.getDefault();
+            for (FileStore store: fs.getFileStores()) {
+                printFileStore(store);
+            }
+        } else {
+            for (String file: args) {
+                FileStore store = Files.getFileStore(Paths.get(file));
+                printFileStore(store);
+            }
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/file/FileType.java b/darwin-x86/sample/nio/file/FileType.java
new file mode 100644
index 0000000..d001d60
--- /dev/null
+++ b/darwin-x86/sample/nio/file/FileType.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.io.IOException;
+
+public class FileType {
+    public static void main(String[] args) throws IOException {
+        if (args.length == 0) {
+            System.err.println("usage: java FileType file...");
+            System.exit(-1);
+        }
+        for (String arg: args) {
+            Path file = Paths.get(arg);
+            String type;
+            if (Files.isDirectory(file)) {
+                type = "directory";
+            } else {
+                type = Files.probeContentType(file);
+                if (type == null)
+                    type = "<not recognized>";
+            }
+            System.out.format("%s\t%s%n", file, type);
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/file/WatchDir.java b/darwin-x86/sample/nio/file/WatchDir.java
new file mode 100644
index 0000000..4c73820
--- /dev/null
+++ b/darwin-x86/sample/nio/file/WatchDir.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import static java.nio.file.StandardWatchEventKinds.*;
+import static java.nio.file.LinkOption.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+
+/**
+ * Example to watch a directory (or tree) for changes to files.
+ */
+
+public class WatchDir {
+
+    private final WatchService watcher;
+    private final boolean recursive;
+    private boolean trace = false;
+    private int count;
+
+    @SuppressWarnings("unchecked")
+    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
+        return (WatchEvent<T>)event;
+    }
+
+    /**
+     * Register the given directory with the WatchService
+     */
+    private void register(Path dir) throws IOException {
+        WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
+        count++;
+        if (trace)
+            System.out.format("register: %s\n", dir);
+    }
+
+    /**
+     * Register the given directory, and all its sub-directories, with the
+     * WatchService.
+     */
+    private void registerAll(final Path start) throws IOException {
+        // register directory and sub-directories
+        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
+                throws IOException
+            {
+                register(dir);
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    /**
+     * Creates a WatchService and registers the given directory
+     */
+    WatchDir(Path dir, boolean recursive) throws IOException {
+        this.watcher = FileSystems.getDefault().newWatchService();
+        this.recursive = recursive;
+
+        if (recursive) {
+            System.out.format("Scanning %s ...\n", dir);
+            registerAll(dir);
+            System.out.println("Done.");
+        } else {
+            register(dir);
+        }
+
+        // enable trace after initial registration
+        this.trace = true;
+    }
+
+    /**
+     * Process all events for keys queued to the watcher
+     */
+    void processEvents() {
+        for (;;) {
+
+            // wait for key to be signalled
+            WatchKey key;
+            try {
+                key = watcher.take();
+            } catch (InterruptedException x) {
+                return;
+            }
+
+            for (WatchEvent<?> event: key.pollEvents()) {
+                WatchEvent.Kind kind = event.kind();
+
+                // TBD - provide example of how OVERFLOW event is handled
+                if (kind == OVERFLOW) {
+                    continue;
+                }
+
+                // Context for directory entry event is the file name of entry
+                WatchEvent<Path> ev = cast(event);
+                Path name = ev.context();
+                Path child = ((Path)key.watchable()).resolve(name);
+
+                // print out event
+                System.out.format("%s: %s\n", event.kind().name(), child);
+
+                // if directory is created, and watching recursively, then
+                // register it and its sub-directories
+                if (recursive && (kind == ENTRY_CREATE)) {
+                    try {
+                        if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
+                            registerAll(child);
+                        }
+                    } catch (IOException x) {
+                        // ignore to keep sample readbale
+                    }
+                }
+            }
+
+            // reset key
+            boolean valid = key.reset();
+            if (!valid) {
+                // directory no longer accessible
+                count--;
+                if (count == 0)
+                    break;
+            }
+        }
+    }
+
+    static void usage() {
+        System.err.println("usage: java WatchDir [-r] dir");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        // parse arguments
+        if (args.length == 0 || args.length > 2)
+            usage();
+        boolean recursive = false;
+        int dirArg = 0;
+        if (args[0].equals("-r")) {
+            if (args.length < 2)
+                usage();
+            recursive = true;
+            dirArg++;
+        }
+
+        // register directory and process its events
+        Path dir = Paths.get(args[dirArg]);
+        new WatchDir(dir, recursive).processEvents();
+    }
+}
diff --git a/darwin-x86/sample/nio/file/Xdd.java b/darwin-x86/sample/nio/file/Xdd.java
new file mode 100644
index 0000000..c0c7f87
--- /dev/null
+++ b/darwin-x86/sample/nio/file/Xdd.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+
+/**
+ * Example code to list/set/get/delete the user-defined attributes of a file.
+ */
+
+public class Xdd {
+
+    static void usage() {
+        System.out.println("Usage: java Xdd <file>");
+        System.out.println("       java Xdd -set <name>=<value> <file>");
+        System.out.println("       java Xdd -get <name> <file>");
+        System.out.println("       java Xdd -del <name> <file>");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        // one or three parameters
+        if (args.length != 1 && args.length != 3)
+            usage();
+
+        Path file = (args.length == 1) ?
+            Paths.get(args[0]) : Paths.get(args[2]);
+
+        // check that user defined attributes are supported by the file store
+        FileStore store = Files.getFileStore(file);
+        if (!store.supportsFileAttributeView(UserDefinedFileAttributeView.class)) {
+            System.err.format("UserDefinedFileAttributeView not supported on %s\n", store);
+            System.exit(-1);
+
+        }
+        UserDefinedFileAttributeView view =
+            Files.getFileAttributeView(file, UserDefinedFileAttributeView.class);
+
+        // list user defined attributes
+        if (args.length == 1) {
+            System.out.println("    Size  Name");
+            System.out.println("--------  --------------------------------------");
+            for (String name: view.list()) {
+                System.out.format("%8d  %s\n", view.size(name), name);
+            }
+            return;
+        }
+
+        // Add/replace a file's user defined attribute
+        if (args[0].equals("-set")) {
+            // name=value
+            String[] s = args[1].split("=");
+            if (s.length != 2)
+                usage();
+            String name = s[0];
+            String value = s[1];
+            view.write(name, Charset.defaultCharset().encode(value));
+            return;
+        }
+
+        // Print out the value of a file's user defined attribute
+        if (args[0].equals("-get")) {
+            String name = args[1];
+            int size = view.size(name);
+            ByteBuffer buf = ByteBuffer.allocateDirect(size);
+            view.read(name, buf);
+            buf.flip();
+            System.out.println(Charset.defaultCharset().decode(buf).toString());
+            return;
+        }
+
+        // Delete a file's user defined attribute
+        if (args[0].equals("-del")) {
+            view.delete(args[1]);
+            return;
+        }
+
+        // option not recognized
+        usage();
+    }
+ }
diff --git a/darwin-x86/sample/nio/multicast/MulticastAddress.java b/darwin-x86/sample/nio/multicast/MulticastAddress.java
new file mode 100644
index 0000000..05f5ca5
--- /dev/null
+++ b/darwin-x86/sample/nio/multicast/MulticastAddress.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.UnknownHostException;
+import java.net.SocketException;
+
+/**
+ * Parses and represents a multicast address.
+ */
+
+class MulticastAddress {
+    private final InetAddress group;
+    private final int port;
+    private final NetworkInterface interf;
+
+    private MulticastAddress(InetAddress group, int port, NetworkInterface interf) {
+        this.group = group;
+        this.port = port;
+        this.interf = interf;
+    }
+
+    InetAddress group() {
+        return group;
+    }
+
+    int port() {
+        return port;
+    }
+
+    /**
+     * @return  The network interface, may be {@code null}
+     */
+    NetworkInterface interf() {
+        return interf;
+    }
+
+    /**
+     * Parses a string of the form "group:port[@interface]", returning
+     * a MulticastAddress representing the address
+     */
+    static MulticastAddress parse(String s) {
+        String[] components = s.split("@");
+        if (components.length > 2)
+            throw new IllegalArgumentException("At most one '@' expected");
+
+        // get group and port
+        String target = components[0];
+        int len = components[0].length();
+        int colon = components[0].lastIndexOf(':');
+        if ((colon < 1) || (colon > (len-2)))
+            throw new IllegalArgumentException("group:port expected");
+        String groupString = target.substring(0, colon);
+        int port = -1;
+        try {
+            port = Integer.parseInt(target.substring(colon+1, len));
+        } catch (NumberFormatException x) {
+             throw new IllegalArgumentException(x);
+        }
+
+        // handle IPv6 literal address
+        if (groupString.charAt(0) == '[') {
+            len = groupString.length();
+            if (groupString.charAt(len-1) != ']')
+                throw new IllegalArgumentException("missing ']'");
+            groupString = groupString.substring(1,len-1);
+            if (groupString.length() == 0)
+                throw new IllegalArgumentException("missing IPv6 address");
+        }
+
+        // get group address
+        InetAddress group = null;
+        try {
+            group = InetAddress.getByName(groupString);
+        } catch (UnknownHostException x) {
+            throw new IllegalArgumentException(x);
+        }
+        if (!group.isMulticastAddress()) {
+            throw new IllegalArgumentException("'" + group.getHostAddress() +
+                "' is not multicast address");
+        }
+
+        // optional interface
+        NetworkInterface interf = null;
+        if (components.length == 2) {
+            try {
+                interf = NetworkInterface.getByName(components[1]);
+            } catch (SocketException x) {
+                throw new IllegalArgumentException(x);
+            }
+            if (interf == null) {
+                throw new IllegalArgumentException("'" + components[1] +
+                   "' is not valid interface");
+            }
+        }
+        return new MulticastAddress(group, port, interf);
+    }
+}
diff --git a/darwin-x86/sample/nio/multicast/Reader.java b/darwin-x86/sample/nio/multicast/Reader.java
new file mode 100644
index 0000000..303c356
--- /dev/null
+++ b/darwin-x86/sample/nio/multicast/Reader.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+import java.nio.charset.*;
+import java.nio.ByteBuffer;
+import java.net.*;
+import java.io.IOException;
+import java.util.*;
+
+public class Reader {
+
+    static void usage() {
+        System.err.println("usage: java Reader group:port@interf [-only source...] [-block source...]");
+        System.exit(-1);
+    }
+
+    static void printDatagram(SocketAddress sa, ByteBuffer buf) {
+        System.out.format("-- datagram from %s --\n",
+            ((InetSocketAddress)sa).getAddress().getHostAddress());
+        System.out.println(Charset.defaultCharset().decode(buf));
+    }
+
+    static void parseAddessList(String s, List<InetAddress> list)
+        throws UnknownHostException
+    {
+        String[] sources = s.split(",");
+        for (int i=0; i<sources.length; i++) {
+            list.add(InetAddress.getByName(sources[i]));
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length == 0)
+            usage();
+
+        // first parameter is the multicast address (interface required)
+        MulticastAddress target = MulticastAddress.parse(args[0]);
+        if (target.interf() == null)
+            usage();
+
+        // addition arguments are source addresses to include or exclude
+        List<InetAddress> includeList = new ArrayList<InetAddress>();
+        List<InetAddress> excludeList = new ArrayList<InetAddress>();
+        int argc = 1;
+        while (argc < args.length) {
+            String option = args[argc++];
+            if (argc >= args.length)
+                usage();
+            String value = args[argc++];
+            if (option.equals("-only")) {
+                 parseAddessList(value, includeList);
+                continue;
+            }
+            if (option.equals("-block")) {
+                parseAddessList(value, excludeList);
+                continue;
+            }
+            usage();
+        }
+        if (!includeList.isEmpty() && !excludeList.isEmpty()) {
+            usage();
+        }
+
+        // create and bind socket
+        ProtocolFamily family = StandardProtocolFamily.INET;
+        if (target.group() instanceof Inet6Address) {
+            family = StandardProtocolFamily.INET6;
+        }
+        DatagramChannel dc = DatagramChannel.open(family)
+            .setOption(StandardSocketOptions.SO_REUSEADDR, true)
+            .bind(new InetSocketAddress(target.port()));
+
+        if (includeList.isEmpty()) {
+            // join group and block addresses on the exclude list
+            MembershipKey key = dc.join(target.group(), target.interf());
+            for (InetAddress source: excludeList) {
+                key.block(source);
+            }
+        } else {
+            // join with source-specific membership for each source
+            for (InetAddress source: includeList) {
+                dc.join(target.group(), target.interf(), source);
+            }
+        }
+
+        // register socket with Selector
+        Selector sel = Selector.open();
+        dc.configureBlocking(false);
+        dc.register(sel, SelectionKey.OP_READ);
+
+        // print out each datagram that we receive
+        ByteBuffer buf = ByteBuffer.allocateDirect(4096);
+        for (;;) {
+            int updated = sel.select();
+            if (updated > 0) {
+                Iterator<SelectionKey> iter = sel.selectedKeys().iterator();
+                while (iter.hasNext()) {
+                    SelectionKey sk = iter.next();
+                    iter.remove();
+
+                    DatagramChannel ch = (DatagramChannel)sk.channel();
+                    SocketAddress sa = ch.receive(buf);
+                    if (sa != null) {
+                        buf.flip();
+                        printDatagram(sa, buf);
+                        buf.rewind();
+                        buf.limit(buf.capacity());
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/multicast/Sender.java b/darwin-x86/sample/nio/multicast/Sender.java
new file mode 100644
index 0000000..f8685f6
--- /dev/null
+++ b/darwin-x86/sample/nio/multicast/Sender.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+import java.nio.charset.Charset;
+import java.net.*;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Sample multicast sender to send a message in a multicast datagram
+ * to a given group.
+ */
+
+public class Sender {
+
+    private static void usage() {
+        System.err.println("usage: java Sender group:port[@interface] message");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length < 2)
+            usage();
+
+        MulticastAddress target = MulticastAddress.parse(args[0]);
+
+        // create socket
+        ProtocolFamily family = StandardProtocolFamily.INET;
+        if (target.group() instanceof Inet6Address)
+            family = StandardProtocolFamily.INET6;
+        DatagramChannel dc = DatagramChannel.open(family).bind(new InetSocketAddress(0));
+        if (target.interf() != null) {
+            dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, target.interf());
+        }
+
+        // send multicast packet
+        dc.send(Charset.defaultCharset().encode(args[1]),
+                new InetSocketAddress(target.group(), target.port()));
+        dc.close();
+    }
+
+}
diff --git a/darwin-x86/sample/nio/server/AcceptHandler.java b/darwin-x86/sample/nio/server/AcceptHandler.java
new file mode 100644
index 0000000..41c2570
--- /dev/null
+++ b/darwin-x86/sample/nio/server/AcceptHandler.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import javax.net.ssl.*;
+
+/**
+ * A single threaded Handler that performs accepts SocketChannels and
+ * registers the Channels with the read/write Selector.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class AcceptHandler implements Handler {
+
+    private ServerSocketChannel channel;
+    private Dispatcher dsp;
+
+    private SSLContext sslContext;
+
+    AcceptHandler(ServerSocketChannel ssc, Dispatcher dsp,
+            SSLContext sslContext) {
+        channel = ssc;
+        this.dsp = dsp;
+        this.sslContext = sslContext;
+    }
+
+    public void handle(SelectionKey sk) throws IOException {
+
+        if (!sk.isAcceptable())
+            return;
+
+        SocketChannel sc = channel.accept();
+        if (sc == null) {
+            return;
+        }
+
+        ChannelIO cio = (sslContext != null ?
+            ChannelIOSecure.getInstance(
+                sc, false /* non-blocking */, sslContext) :
+            ChannelIO.getInstance(
+                sc, false /* non-blocking */));
+
+        RequestHandler rh = new RequestHandler(cio);
+        dsp.register(cio.getSocketChannel(), SelectionKey.OP_READ, rh);
+    }
+}
diff --git a/darwin-x86/sample/nio/server/Acceptor.java b/darwin-x86/sample/nio/server/Acceptor.java
new file mode 100644
index 0000000..cfdaf0e
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Acceptor.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import javax.net.ssl.*;
+
+/**
+ * A Runnable class which sits in a loop accepting SocketChannels,
+ * then registers the Channels with the read/write Selector.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Acceptor implements Runnable {
+
+    private ServerSocketChannel ssc;
+    private Dispatcher d;
+
+    private SSLContext sslContext;
+
+    Acceptor(ServerSocketChannel ssc, Dispatcher d, SSLContext sslContext) {
+        this.ssc = ssc;
+        this.d = d;
+        this.sslContext = sslContext;
+    }
+
+    public void run() {
+        for (;;) {
+            try {
+                SocketChannel sc = ssc.accept();
+
+                ChannelIO cio = (sslContext != null ?
+                    ChannelIOSecure.getInstance(
+                        sc, false /* non-blocking */, sslContext) :
+                    ChannelIO.getInstance(
+                        sc, false /* non-blocking */));
+
+                RequestHandler rh = new RequestHandler(cio);
+
+                d.register(cio.getSocketChannel(), SelectionKey.OP_READ, rh);
+
+            } catch (IOException x) {
+                x.printStackTrace();
+                break;
+            }
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/server/B1.java b/darwin-x86/sample/nio/server/B1.java
new file mode 100644
index 0000000..c6d7e90
--- /dev/null
+++ b/darwin-x86/sample/nio/server/B1.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+
+/**
+ * A blocking/single-threaded server which completely services
+ * each connection before moving to the next.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class B1 extends Server {
+
+    B1(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws Exception {
+        for (;;) {
+
+            SocketChannel sc = ssc.accept();
+
+            ChannelIO cio = (sslContext != null ?
+                ChannelIOSecure.getInstance(
+                    sc, true /* blocking */, sslContext) :
+                ChannelIO.getInstance(
+                    sc, true /* blocking */));
+
+            RequestServicer svc = new RequestServicer(cio);
+            svc.run();
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/server/BN.java b/darwin-x86/sample/nio/server/BN.java
new file mode 100644
index 0000000..c765a8b
--- /dev/null
+++ b/darwin-x86/sample/nio/server/BN.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+
+/**
+ * A Blocking/Multi-threaded Server which creates a new thread for each
+ * connection.  This is not efficient for large numbers of connections.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class BN extends Server {
+
+    BN(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws IOException {
+        for (;;) {
+
+            SocketChannel sc = ssc.accept();
+
+            ChannelIO cio = (sslContext != null ?
+                ChannelIOSecure.getInstance(
+                    sc, true /* blocking */, sslContext) :
+                ChannelIO.getInstance(
+                    sc, true /* blocking */));
+
+            RequestServicer svc = new RequestServicer(cio);
+            Thread th = new Thread(svc);
+            th.start();
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/server/BP.java b/darwin-x86/sample/nio/server/BP.java
new file mode 100644
index 0000000..9540f1c
--- /dev/null
+++ b/darwin-x86/sample/nio/server/BP.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+import java.util.concurrent.*;
+
+/**
+ * A multi-threaded server which creates a pool of threads for use
+ * by the server.  The Thread pool decides how to schedule those threads.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class BP extends Server {
+
+    private static final int POOL_MULTIPLE = 4;
+
+    BP(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws Exception {
+
+        ExecutorService xec = Executors.newFixedThreadPool(
+            Runtime.getRuntime().availableProcessors() * POOL_MULTIPLE);
+
+        for (;;) {
+
+            SocketChannel sc = ssc.accept();
+
+            ChannelIO cio = (sslContext != null ?
+                ChannelIOSecure.getInstance(
+                    sc, true /* blocking */, sslContext) :
+                ChannelIO.getInstance(
+                    sc, true /* blocking */));
+
+            RequestServicer svc = new RequestServicer(cio);
+            xec.execute(svc);
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/server/ChannelIO.java b/darwin-x86/sample/nio/server/ChannelIO.java
new file mode 100644
index 0000000..7d1ca18
--- /dev/null
+++ b/darwin-x86/sample/nio/server/ChannelIO.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+
+/**
+ * A helper class for properly sizing inbound byte buffers and
+ * redirecting I/O calls to the proper SocketChannel call.
+ * <P>
+ * Many of these calls may seem unnecessary until you consider
+ * that they are placeholders for the secure variant, which is much
+ * more involved.  See ChannelIOSecure for more information.
+ *
+ * @author Brad R. Wetmore
+ * @author Mark Reinhold
+ */
+class ChannelIO {
+
+    protected SocketChannel sc;
+
+    /*
+     * All of the inbound request data lives here until we determine
+     * that we've read everything, then we pass that data back to the
+     * caller.
+     */
+    protected ByteBuffer requestBB;
+    static private int requestBBSize = 4096;
+
+    protected ChannelIO(SocketChannel sc, boolean blocking)
+            throws IOException {
+        this.sc = sc;
+        sc.configureBlocking(blocking);
+    }
+
+    static ChannelIO getInstance(SocketChannel sc, boolean blocking)
+            throws IOException {
+        ChannelIO cio = new ChannelIO(sc, blocking);
+        cio.requestBB = ByteBuffer.allocate(requestBBSize);
+
+        return cio;
+    }
+
+    SocketChannel getSocketChannel() {
+        return sc;
+    }
+
+    /*
+     * Return a ByteBuffer with "remaining" space to work.  If you have to
+     * reallocate the ByteBuffer, copy the existing info into the new buffer.
+     */
+    protected void resizeRequestBB(int remaining) {
+        if (requestBB.remaining() < remaining) {
+            // Expand buffer for large request
+            ByteBuffer bb = ByteBuffer.allocate(requestBB.capacity() * 2);
+            requestBB.flip();
+            bb.put(requestBB);
+            requestBB = bb;
+        }
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * This variant is for Servers without SelectionKeys (e.g.
+     * blocking).
+     * <P>
+     * return true when we're done with handshaking.
+     */
+    boolean doHandshake() throws IOException {
+        return true;
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * This variant is for Servers with SelectionKeys, so that
+     * we can register for selectable operations (e.g. selectable
+     * non-blocking).
+     * <P>
+     * return true when we're done with handshaking.
+     */
+    boolean doHandshake(SelectionKey sk) throws IOException {
+        return true;
+    }
+
+    /*
+     * Resize (if necessary) the inbound data buffer, and then read more
+     * data into the read buffer.
+     */
+    int read() throws IOException {
+        /*
+         * Allocate more space if less than 5% remains
+         */
+        resizeRequestBB(requestBBSize/20);
+        return sc.read(requestBB);
+    }
+
+    /*
+     * All data has been read, pass back the request in one buffer.
+     */
+    ByteBuffer getReadBuf() {
+        return requestBB;
+    }
+
+    /*
+     * Write the src buffer into the socket channel.
+     */
+    int write(ByteBuffer src) throws IOException {
+        return sc.write(src);
+    }
+
+    /*
+     * Perform a FileChannel.TransferTo on the socket channel.
+     */
+    long transferTo(FileChannel fc, long pos, long len) throws IOException {
+        return fc.transferTo(pos, len, sc);
+    }
+
+    /*
+     * Flush any outstanding data to the network if possible.
+     * <P>
+     * This isn't really necessary for the insecure variant, but needed
+     * for the secure one where intermediate buffering must take place.
+     * <P>
+     * Return true if successful.
+     */
+    boolean dataFlush() throws IOException {
+        return true;
+    }
+
+    /*
+     * Start any connection shutdown processing.
+     * <P>
+     * This isn't really necessary for the insecure variant, but needed
+     * for the secure one where intermediate buffering must take place.
+     * <P>
+     * Return true if successful, and the data has been flushed.
+     */
+    boolean shutdown() throws IOException {
+        return true;
+    }
+
+    /*
+     * Close the underlying connection.
+     */
+    void close() throws IOException {
+        sc.close();
+    }
+
+}
diff --git a/darwin-x86/sample/nio/server/ChannelIOSecure.java b/darwin-x86/sample/nio/server/ChannelIOSecure.java
new file mode 100644
index 0000000..7508966
--- /dev/null
+++ b/darwin-x86/sample/nio/server/ChannelIOSecure.java
@@ -0,0 +1,650 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.*;
+
+/**
+ * A helper class which performs I/O using the SSLEngine API.
+ * <P>
+ * Each connection has a SocketChannel and a SSLEngine that is
+ * used through the lifetime of the Channel.  We allocate byte buffers
+ * for use as the outbound and inbound network buffers.
+ *
+ * <PRE>
+ *               Application Data
+ *               src      requestBB
+ *                |           ^
+ *                |     |     |
+ *                v     |     |
+ *           +----+-----|-----+----+
+ *           |          |          |
+ *           |       SSL|Engine    |
+ *   wrap()  |          |          |  unwrap()
+ *           | OUTBOUND | INBOUND  |
+ *           |          |          |
+ *           +----+-----|-----+----+
+ *                |     |     ^
+ *                |     |     |
+ *                v           |
+ *            outNetBB     inNetBB
+ *                   Net data
+ * </PRE>
+ *
+ * These buffers handle all of the intermediary data for the SSL
+ * connection.  To make things easy, we'll require outNetBB be
+ * completely flushed before trying to wrap any more data, but we
+ * could certainly remove that restriction by using larger buffers.
+ * <P>
+ * There are many, many ways to handle compute and I/O strategies.
+ * What follows is a relatively simple one.  The reader is encouraged
+ * to develop the strategy that best fits the application.
+ * <P>
+ * In most of the non-blocking operations in this class, we let the
+ * Selector tell us when we're ready to attempt an I/O operation (by the
+ * application repeatedly calling our methods).  Another option would be
+ * to attempt the operation and return from the method when no forward
+ * progress can be made.
+ * <P>
+ * There's lots of room for enhancements and improvement in this example.
+ * <P>
+ * We're checking for SSL/TLS end-of-stream truncation attacks via
+ * sslEngine.closeInbound().  When you reach the end of a input stream
+ * via a read() returning -1 or an IOException, we call
+ * sslEngine.closeInbound() to signal to the sslEngine that no more
+ * input will be available.  If the peer's close_notify message has not
+ * yet been received, this could indicate a trucation attack, in which
+ * an attacker is trying to prematurely close the connection.   The
+ * closeInbound() will throw an exception if this condition were
+ * present.
+ *
+ * @author Brad R. Wetmore
+ * @author Mark Reinhold
+ */
+class ChannelIOSecure extends ChannelIO {
+
+    private SSLEngine sslEngine = null;
+
+    private int appBBSize;
+    private int netBBSize;
+
+    /*
+     * All I/O goes through these buffers.
+     * <P>
+     * It might be nice to use a cache of ByteBuffers so we're
+     * not alloc/dealloc'ing ByteBuffer's for each new SSLEngine.
+     * <P>
+     * We use our superclass' requestBB for our application input buffer.
+     * Outbound application data is supplied to us by our callers.
+     */
+    private ByteBuffer inNetBB;
+    private ByteBuffer outNetBB;
+
+    /*
+     * An empty ByteBuffer for use when one isn't available, say
+     * as a source buffer during initial handshake wraps or for close
+     * operations.
+     */
+    private static ByteBuffer hsBB = ByteBuffer.allocate(0);
+
+    /*
+     * The FileChannel we're currently transferTo'ing (reading).
+     */
+    private ByteBuffer fileChannelBB = null;
+
+    /*
+     * During our initial handshake, keep track of the next
+     * SSLEngine operation that needs to occur:
+     *
+     *     NEED_WRAP/NEED_UNWRAP
+     *
+     * Once the initial handshake has completed, we can short circuit
+     * handshake checks with initialHSComplete.
+     */
+    private HandshakeStatus initialHSStatus;
+    private boolean initialHSComplete;
+
+    /*
+     * We have received the shutdown request by our caller, and have
+     * closed our outbound side.
+     */
+    private boolean shutdown = false;
+
+    /*
+     * Constructor for a secure ChannelIO variant.
+     */
+    protected ChannelIOSecure(SocketChannel sc, boolean blocking,
+            SSLContext sslc) throws IOException {
+        super(sc, blocking);
+
+        /*
+         * We're a server, so no need to use host/port variant.
+         *
+         * The first call for a server is a NEED_UNWRAP.
+         */
+        sslEngine = sslc.createSSLEngine();
+        sslEngine.setUseClientMode(false);
+        initialHSStatus = HandshakeStatus.NEED_UNWRAP;
+        initialHSComplete = false;
+
+        // Create a buffer using the normal expected packet size we'll
+        // be getting.  This may change, depending on the peer's
+        // SSL implementation.
+        netBBSize = sslEngine.getSession().getPacketBufferSize();
+        inNetBB = ByteBuffer.allocate(netBBSize);
+        outNetBB = ByteBuffer.allocate(netBBSize);
+        outNetBB.position(0);
+        outNetBB.limit(0);
+    }
+
+    /*
+     * Static factory method for creating a secure ChannelIO object.
+     * <P>
+     * We need to allocate different sized application data buffers
+     * based on whether we're secure or not.  We can't determine
+     * this until our sslEngine is created.
+     */
+    static ChannelIOSecure getInstance(SocketChannel sc, boolean blocking,
+            SSLContext sslc) throws IOException {
+
+        ChannelIOSecure cio = new ChannelIOSecure(sc, blocking, sslc);
+
+        // Create a buffer using the normal expected application size we'll
+        // be getting.  This may change, depending on the peer's
+        // SSL implementation.
+        cio.appBBSize = cio.sslEngine.getSession().getApplicationBufferSize();
+        cio.requestBB = ByteBuffer.allocate(cio.appBBSize);
+
+        return cio;
+    }
+
+    /*
+     * Calls up to the superclass to adjust the buffer size
+     * by an appropriate increment.
+     */
+    protected void resizeRequestBB() {
+        resizeRequestBB(appBBSize);
+    }
+
+    /*
+     * Adjust the inbount network buffer to an appropriate size.
+     */
+    private void resizeResponseBB() {
+        ByteBuffer bb = ByteBuffer.allocate(netBBSize);
+        inNetBB.flip();
+        bb.put(inNetBB);
+        inNetBB = bb;
+    }
+
+    /*
+     * Writes bb to the SocketChannel.
+     * <P>
+     * Returns true when the ByteBuffer has no remaining data.
+     */
+    private boolean tryFlush(ByteBuffer bb) throws IOException {
+        super.write(bb);
+        return !bb.hasRemaining();
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * This variant is for Servers without SelectionKeys (e.g.
+     * blocking).
+     */
+    boolean doHandshake() throws IOException {
+        return doHandshake(null);
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * If a SelectionKey is passed, register for selectable
+     * operations.
+     * <P>
+     * In the blocking case, our caller will keep calling us until
+     * we finish the handshake.  Our reads/writes will block as expected.
+     * <P>
+     * In the non-blocking case, we just received the selection notification
+     * that this channel is ready for whatever the operation is, so give
+     * it a try.
+     * <P>
+     * return:
+     *          true when handshake is done.
+     *          false while handshake is in progress
+     */
+    boolean doHandshake(SelectionKey sk) throws IOException {
+
+        SSLEngineResult result;
+
+        if (initialHSComplete) {
+            return initialHSComplete;
+        }
+
+        /*
+         * Flush out the outgoing buffer, if there's anything left in
+         * it.
+         */
+        if (outNetBB.hasRemaining()) {
+
+            if (!tryFlush(outNetBB)) {
+                return false;
+            }
+
+            // See if we need to switch from write to read mode.
+
+            switch (initialHSStatus) {
+
+            /*
+             * Is this the last buffer?
+             */
+            case FINISHED:
+                initialHSComplete = true;
+                // Fall-through to reregister need for a Read.
+
+            case NEED_UNWRAP:
+                if (sk != null) {
+                    sk.interestOps(SelectionKey.OP_READ);
+                }
+                break;
+            }
+
+            return initialHSComplete;
+        }
+
+
+        switch (initialHSStatus) {
+
+        case NEED_UNWRAP:
+            if (sc.read(inNetBB) == -1) {
+                sslEngine.closeInbound();
+                return initialHSComplete;
+            }
+
+needIO:
+            while (initialHSStatus == HandshakeStatus.NEED_UNWRAP) {
+                resizeRequestBB();    // expected room for unwrap
+                inNetBB.flip();
+                result = sslEngine.unwrap(inNetBB, requestBB);
+                inNetBB.compact();
+
+                initialHSStatus = result.getHandshakeStatus();
+
+                switch (result.getStatus()) {
+
+                case OK:
+                    switch (initialHSStatus) {
+                    case NOT_HANDSHAKING:
+                        throw new IOException(
+                            "Not handshaking during initial handshake");
+
+                    case NEED_TASK:
+                        initialHSStatus = doTasks();
+                        break;
+
+                    case FINISHED:
+                        initialHSComplete = true;
+                        break needIO;
+                    }
+
+                    break;
+
+                case BUFFER_UNDERFLOW:
+                    // Resize buffer if needed.
+                    netBBSize = sslEngine.getSession().getPacketBufferSize();
+                    if (netBBSize > inNetBB.capacity()) {
+                        resizeResponseBB();
+                    }
+
+                    /*
+                     * Need to go reread the Channel for more data.
+                     */
+                    if (sk != null) {
+                        sk.interestOps(SelectionKey.OP_READ);
+                    }
+                    break needIO;
+
+                case BUFFER_OVERFLOW:
+                    // Reset the application buffer size.
+                    appBBSize =
+                        sslEngine.getSession().getApplicationBufferSize();
+                    break;
+
+                default: //CLOSED:
+                    throw new IOException("Received" + result.getStatus() +
+                        "during initial handshaking");
+                }
+            }  // "needIO" block.
+
+            /*
+             * Just transitioned from read to write.
+             */
+            if (initialHSStatus != HandshakeStatus.NEED_WRAP) {
+                break;
+            }
+
+            // Fall through and fill the write buffers.
+
+        case NEED_WRAP:
+            /*
+             * The flush above guarantees the out buffer to be empty
+             */
+            outNetBB.clear();
+            result = sslEngine.wrap(hsBB, outNetBB);
+            outNetBB.flip();
+
+            initialHSStatus = result.getHandshakeStatus();
+
+            switch (result.getStatus()) {
+            case OK:
+
+                if (initialHSStatus == HandshakeStatus.NEED_TASK) {
+                    initialHSStatus = doTasks();
+                }
+
+                if (sk != null) {
+                    sk.interestOps(SelectionKey.OP_WRITE);
+                }
+
+                break;
+
+            default: // BUFFER_OVERFLOW/BUFFER_UNDERFLOW/CLOSED:
+                throw new IOException("Received" + result.getStatus() +
+                        "during initial handshaking");
+            }
+            break;
+
+        default: // NOT_HANDSHAKING/NEED_TASK/FINISHED
+            throw new RuntimeException("Invalid Handshaking State" +
+                    initialHSStatus);
+        } // switch
+
+        return initialHSComplete;
+    }
+
+    /*
+     * Do all the outstanding handshake tasks in the current Thread.
+     */
+    private SSLEngineResult.HandshakeStatus doTasks() {
+
+        Runnable runnable;
+
+        /*
+         * We could run this in a separate thread, but
+         * do in the current for now.
+         */
+        while ((runnable = sslEngine.getDelegatedTask()) != null) {
+            runnable.run();
+        }
+        return sslEngine.getHandshakeStatus();
+    }
+
+    /*
+     * Read the channel for more information, then unwrap the
+     * (hopefully application) data we get.
+     * <P>
+     * If we run out of data, we'll return to our caller (possibly using
+     * a Selector) to get notification that more is available.
+     * <P>
+     * Each call to this method will perform at most one underlying read().
+     */
+    int read() throws IOException {
+        SSLEngineResult result;
+
+        if (!initialHSComplete) {
+            throw new IllegalStateException();
+        }
+
+        int pos = requestBB.position();
+
+        if (sc.read(inNetBB) == -1) {
+            sslEngine.closeInbound();  // probably throws exception
+            return -1;
+        }
+
+        do {
+            resizeRequestBB();    // expected room for unwrap
+            inNetBB.flip();
+            result = sslEngine.unwrap(inNetBB, requestBB);
+            inNetBB.compact();
+
+            /*
+             * Could check here for a renegotation, but we're only
+             * doing a simple read/write, and won't have enough state
+             * transitions to do a complete handshake, so ignore that
+             * possibility.
+             */
+            switch (result.getStatus()) {
+
+            case BUFFER_OVERFLOW:
+                // Reset the application buffer size.
+                appBBSize = sslEngine.getSession().getApplicationBufferSize();
+                break;
+
+            case BUFFER_UNDERFLOW:
+                // Resize buffer if needed.
+                netBBSize = sslEngine.getSession().getPacketBufferSize();
+                if (netBBSize > inNetBB.capacity()) {
+                    resizeResponseBB();
+
+                    break; // break, next read will support larger buffer.
+                }
+            case OK:
+                if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+                    doTasks();
+                }
+                break;
+
+            default:
+                throw new IOException("sslEngine error during data read: " +
+                    result.getStatus());
+            }
+        } while ((inNetBB.position() != 0) &&
+            result.getStatus() != Status.BUFFER_UNDERFLOW);
+
+        return (requestBB.position() - pos);
+    }
+
+    /*
+     * Try to write out as much as possible from the src buffer.
+     */
+    int write(ByteBuffer src) throws IOException {
+
+        if (!initialHSComplete) {
+            throw new IllegalStateException();
+        }
+
+        return doWrite(src);
+    }
+
+    /*
+     * Try to flush out any existing outbound data, then try to wrap
+     * anything new contained in the src buffer.
+     * <P>
+     * Return the number of bytes actually consumed from the buffer,
+     * but the data may actually be still sitting in the output buffer,
+     * waiting to be flushed.
+     */
+    private int doWrite(ByteBuffer src) throws IOException {
+        int retValue = 0;
+
+        if (outNetBB.hasRemaining() && !tryFlush(outNetBB)) {
+            return retValue;
+        }
+
+        /*
+         * The data buffer is empty, we can reuse the entire buffer.
+         */
+        outNetBB.clear();
+
+        SSLEngineResult result = sslEngine.wrap(src, outNetBB);
+        retValue = result.bytesConsumed();
+
+        outNetBB.flip();
+
+        switch (result.getStatus()) {
+
+        case OK:
+            if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+                doTasks();
+            }
+            break;
+
+        default:
+            throw new IOException("sslEngine error during data write: " +
+                result.getStatus());
+        }
+
+        /*
+         * Try to flush the data, regardless of whether or not
+         * it's been selected.  Odds of a write buffer being full
+         * is less than a read buffer being empty.
+         */
+        if (outNetBB.hasRemaining()) {
+            tryFlush(outNetBB);
+        }
+
+        return retValue;
+    }
+
+    /*
+     * Perform a FileChannel.TransferTo on the socket channel.
+     * <P>
+     * We have to copy the data into an intermediary app ByteBuffer
+     * first, then send it through the SSLEngine.
+     * <P>
+     * We return the number of bytes actually read out of the
+     * filechannel.  However, the data may actually be stuck
+     * in the fileChannelBB or the outNetBB.  The caller
+     * is responsible for making sure to call dataFlush()
+     * before shutting down.
+     */
+    long transferTo(FileChannel fc, long pos, long len) throws IOException {
+
+        if (!initialHSComplete) {
+            throw new IllegalStateException();
+        }
+
+        if (fileChannelBB == null) {
+            fileChannelBB = ByteBuffer.allocate(appBBSize);
+            fileChannelBB.limit(0);
+        }
+
+        fileChannelBB.compact();
+        int fileRead = fc.read(fileChannelBB);
+        fileChannelBB.flip();
+
+        /*
+         * We ignore the return value here, we return the
+         * number of bytes actually consumed from the the file.
+         * We'll flush the output buffer before we start shutting down.
+         */
+        doWrite(fileChannelBB);
+
+        return fileRead;
+    }
+
+    /*
+     * Flush any remaining data.
+     * <P>
+     * Return true when the fileChannelBB and outNetBB are empty.
+     */
+    boolean dataFlush() throws IOException {
+        boolean fileFlushed = true;
+
+        if ((fileChannelBB != null) && fileChannelBB.hasRemaining()) {
+            doWrite(fileChannelBB);
+            fileFlushed = !fileChannelBB.hasRemaining();
+        } else if (outNetBB.hasRemaining()) {
+            tryFlush(outNetBB);
+        }
+
+        return (fileFlushed && !outNetBB.hasRemaining());
+    }
+
+    /*
+     * Begin the shutdown process.
+     * <P>
+     * Close out the SSLEngine if not already done so, then
+     * wrap our outgoing close_notify message and try to send it on.
+     * <P>
+     * Return true when we're done passing the shutdown messsages.
+     */
+    boolean shutdown() throws IOException {
+
+        if (!shutdown) {
+            sslEngine.closeOutbound();
+            shutdown = true;
+        }
+
+        if (outNetBB.hasRemaining() && tryFlush(outNetBB)) {
+            return false;
+        }
+
+        /*
+         * By RFC 2616, we can "fire and forget" our close_notify
+         * message, so that's what we'll do here.
+         */
+        outNetBB.clear();
+        SSLEngineResult result = sslEngine.wrap(hsBB, outNetBB);
+        if (result.getStatus() != Status.CLOSED) {
+            throw new SSLException("Improper close state");
+        }
+        outNetBB.flip();
+
+        /*
+         * We won't wait for a select here, but if this doesn't work,
+         * we'll cycle back through on the next select.
+         */
+        if (outNetBB.hasRemaining()) {
+            tryFlush(outNetBB);
+        }
+
+        return (!outNetBB.hasRemaining() &&
+                (result.getHandshakeStatus() != HandshakeStatus.NEED_WRAP));
+    }
+
+    /*
+     * close() is not overridden
+     */
+}
diff --git a/darwin-x86/sample/nio/server/Content.java b/darwin-x86/sample/nio/server/Content.java
new file mode 100644
index 0000000..52e06fa
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Content.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * An Sendable interface extension that adds additional
+ * methods for additional information, such as Files
+ * or Strings.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Content extends Sendable {
+
+    String type();
+
+    // Returns -1 until prepare() invoked
+    long length();
+
+}
diff --git a/darwin-x86/sample/nio/server/Dispatcher.java b/darwin-x86/sample/nio/server/Dispatcher.java
new file mode 100644
index 0000000..9474c12
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Dispatcher.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+
+/**
+ * Base class for the Dispatchers.
+ * <P>
+ * Servers use these to obtain ready status, and then to dispatch jobs.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Dispatcher extends Runnable {
+
+    void register(SelectableChannel ch, int ops, Handler h)
+        throws IOException;
+
+}
diff --git a/darwin-x86/sample/nio/server/Dispatcher1.java b/darwin-x86/sample/nio/server/Dispatcher1.java
new file mode 100644
index 0000000..533e4b8
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Dispatcher1.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import java.util.*;
+
+/**
+ * A single-threaded dispatcher.
+ * <P>
+ * When a SelectionKey is ready, it dispatches the job in this
+ * thread.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Dispatcher1 implements Dispatcher {
+
+    private Selector sel;
+
+    Dispatcher1() throws IOException {
+        sel = Selector.open();
+    }
+
+    // Doesn't really need to be runnable
+    public void run() {
+        for (;;) {
+            try {
+                dispatch();
+            } catch (IOException x) {
+                x.printStackTrace();
+            }
+        }
+    }
+
+    private void dispatch() throws IOException {
+        sel.select();
+        for (Iterator i = sel.selectedKeys().iterator(); i.hasNext(); ) {
+            SelectionKey sk = (SelectionKey)i.next();
+            i.remove();
+            Handler h = (Handler)sk.attachment();
+            h.handle(sk);
+        }
+    }
+
+    public void register(SelectableChannel ch, int ops, Handler h)
+            throws IOException {
+        ch.register(sel, ops, h);
+    }
+}
diff --git a/darwin-x86/sample/nio/server/DispatcherN.java b/darwin-x86/sample/nio/server/DispatcherN.java
new file mode 100644
index 0000000..7b601b0
--- /dev/null
+++ b/darwin-x86/sample/nio/server/DispatcherN.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import java.util.*;
+
+/**
+ * A Multi-threaded dispatcher.
+ * <P>
+ * In this example, one thread does accepts, and the second
+ * does read/writes.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class DispatcherN implements Dispatcher {
+
+    private Selector sel;
+
+    DispatcherN() throws IOException {
+        sel = Selector.open();
+    }
+
+    public void run() {
+        for (;;) {
+            try {
+                dispatch();
+            } catch (IOException x) {
+                x.printStackTrace();
+            }
+        }
+    }
+
+    private Object gate = new Object();
+
+    private void dispatch() throws IOException {
+        sel.select();
+        for (Iterator i = sel.selectedKeys().iterator(); i.hasNext(); ) {
+            SelectionKey sk = (SelectionKey)i.next();
+            i.remove();
+            Handler h = (Handler)sk.attachment();
+            h.handle(sk);
+        }
+        synchronized (gate) { }
+    }
+
+    public void register(SelectableChannel ch, int ops, Handler h)
+            throws IOException {
+        synchronized (gate) {
+            sel.wakeup();
+            ch.register(sel, ops, h);
+        }
+    }
+
+}
diff --git a/darwin-x86/sample/nio/server/FileContent.java b/darwin-x86/sample/nio/server/FileContent.java
new file mode 100644
index 0000000..82c44a9
--- /dev/null
+++ b/darwin-x86/sample/nio/server/FileContent.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.net.*;
+import java.nio.channels.*;
+import java.nio.charset.*;
+
+/**
+ * A Content type that provides for transferring files.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class FileContent implements Content {
+
+    private static File ROOT = new File("root");
+
+    private File fn;
+
+    FileContent(URI uri) {
+        fn = new File(ROOT,
+                      uri.getPath()
+                      .replace('/',
+                               File.separatorChar));
+    }
+
+    private String type = null;
+
+    public String type() {
+        if (type != null)
+            return type;
+        String nm = fn.getName();
+        if (nm.endsWith(".html"))
+            type = "text/html; charset=iso-8859-1";
+        else if ((nm.indexOf('.') < 0) || nm.endsWith(".txt"))
+            type = "text/plain; charset=iso-8859-1";
+        else
+            type = "application/octet-stream";
+        return type;
+    }
+
+    private FileChannel fc = null;
+    private long length = -1;
+    private long position = -1;         // NB only; >= 0 if transferring
+
+    public long length() {
+        return length;
+    }
+
+    public void prepare() throws IOException {
+        if (fc == null)
+            fc = new RandomAccessFile(fn, "r").getChannel();
+        length = fc.size();
+        position = 0;                   // NB only
+    }
+
+    public boolean send(ChannelIO cio) throws IOException {
+        if (fc == null)
+            throw new IllegalStateException();
+        if (position < 0)               // NB only
+            throw new IllegalStateException();
+
+        /*
+         * Short-circuit if we're already done.
+         */
+        if (position >= length) {
+            return false;
+        }
+
+        position += cio.transferTo(fc, position, length - position);
+        return (position < length);
+    }
+
+    public void release() throws IOException {
+        if (fc != null) {
+            fc.close();
+            fc = null;
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/server/Handler.java b/darwin-x86/sample/nio/server/Handler.java
new file mode 100644
index 0000000..110feb7
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Handler.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+
+/**
+ * Base class for the Handlers.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Handler {
+
+    void handle(SelectionKey sk) throws IOException;
+
+}
diff --git a/darwin-x86/sample/nio/server/MalformedRequestException.java b/darwin-x86/sample/nio/server/MalformedRequestException.java
new file mode 100644
index 0000000..89b0db6
--- /dev/null
+++ b/darwin-x86/sample/nio/server/MalformedRequestException.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * Exception class used when a request can't be properly parsed.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class MalformedRequestException extends Exception {
+
+    MalformedRequestException() { }
+
+    MalformedRequestException(String msg) {
+        super(msg);
+    }
+
+    MalformedRequestException(Exception x) {
+        super(x);
+    }
+}
diff --git a/darwin-x86/sample/nio/server/N1.java b/darwin-x86/sample/nio/server/N1.java
new file mode 100644
index 0000000..d02bc93
--- /dev/null
+++ b/darwin-x86/sample/nio/server/N1.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+
+/**
+ * A non-blocking/single-threaded server.  All accept() and
+ * read()/write() operations are performed by a single thread, but only
+ * after being selected for those operations by a Selector.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class N1 extends Server {
+
+    N1(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+        ssc.configureBlocking(false);
+    }
+
+    void runServer() throws Exception {
+        Dispatcher d = new Dispatcher1();
+        d.register(ssc, SelectionKey.OP_ACCEPT,
+                   new AcceptHandler(ssc, d, sslContext));
+        d.run();
+    }
+}
diff --git a/darwin-x86/sample/nio/server/N2.java b/darwin-x86/sample/nio/server/N2.java
new file mode 100644
index 0000000..2a21612
--- /dev/null
+++ b/darwin-x86/sample/nio/server/N2.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * A non-blocking/dual-threaded which performs accept()s in one thread,
+ * and services requests in a second.  Both threads use select().
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class N2 extends Server {
+
+    N2(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws Exception {
+        Dispatcher d = new DispatcherN();
+        Acceptor a = new Acceptor(ssc, d, sslContext);
+        new Thread(a).start();
+        d.run();
+    }
+}
diff --git a/darwin-x86/sample/nio/server/README.txt b/darwin-x86/sample/nio/server/README.txt
new file mode 100644
index 0000000..aa803e8
--- /dev/null
+++ b/darwin-x86/sample/nio/server/README.txt
@@ -0,0 +1,279 @@
+        A Simple NIO-based HTTP/HTTPS Server Example
+
+
+INTRODUCTION
+============
+This directory contains a simple HTTP/HTTPS server.  HTTP/HTTPS are two
+common network protocols that provide for data transfer, and are more
+fully described in RFC 2616 and RFC 2818 (Available at
+http://www.ietf.org ). HTTPS is essentially HTTP after the connection
+has been secured with SSL/TLS.  TLS is the successor to SSL, and is
+described in RFC 2246.
+
+This server was written to demonstrate some of the functionality new to
+the Java 2 platform.  The demo is not meant to be a full tutorial, and
+assumes the reader has some familiarity with the subject matter.
+
+In particular, it shows:
+
+    New I/O (java.nio, java.nio.channels, java.util.regex, java.nio.charset)
+
+        Introduced in version 1.4 of the platform, NIO was designed to
+        overcome some of the scalability limitations found in the
+        existing blocking java.net.* API's, and to address other
+        concepts such as Regular Expression parsing and Character
+        Sets.
+
+        This server demonstrates:
+
+            ByteBuffer
+            Blocking and Non-Blocking I/O
+            SocketChannel
+            ServerSocketChannel
+            Selector
+            CharacterSet
+            Pattern matching using Regular Expressions
+
+    JSSE (javax.net.ssl)
+
+	Introduced in version 1.4 of the platform, JSSE provides
+	network security using SSL/TLS for java.net.Socket-based
+	traffic.  In version 1.5, the SSLEngine API was introduced
+	which separates the SSL/TLS functionality from the underlying
+	I/O model.  By making this separation, applications can adapt
+	I/O and compute strategies to best fit their circumstances.
+
+        This server demonstrates:
+
+            Using SSLEngine to create a HTTPS server
+	    Creating simple key material for use with HTTPS
+
+    Concurrency Library (java.util.concurrent)
+
+        Introduced in version 1.5 of the platform, the concurrency
+        library provides a mechanism which decouples task submission
+        from the mechanics of how each task will be run.
+
+        This server demonstrates:
+
+            A ThreadPool with a fixed number of threads, which is
+            based on the number of available processors.
+
+
+SETUP
+=====
+
+The server must be built on version 1.5 (or later) of the platform.
+Invoking the following should be sufficient:
+
+    % mkdir build
+    % javac -source 1.5 -target 1.5 -d build *.java
+
+The following creates the document root:
+
+    % mkdir root
+
+All documents should be placed in this directory.
+
+For HTTPS, the server authenticates itself to clients by using simple
+Public Key Infrastructure (PKI) credentials in the form of
+X509Certificates.  You must create the server's credentials before
+attempting to run the server in "-secure" mode.  The server is
+currently hardcoded to look for its credentials in a file called
+"testkeys".
+
+In this example, we'll create credentials for a fictional widget web
+site owned by the ubiquitous "Xyzzy, Inc.".  When you run this in your
+own environment, replace "widgets.xyzzy.com" with the hostname of your
+server.
+
+The easiest way to create the SSL/TLS credentials is to use the
+java keytool, by doing the following:
+
+        (<CR> represents your end-of-line key)
+
+    % keytool -genkey -keyalg rsa -keystore testkeys -alias widgets
+    Enter keystore password:  passphrase
+    What is your first and last name?
+    [Unknown]:  widgets.xyzzy.com<CR>
+    What is the name of your organizational unit?
+    [Unknown]:  Consumer Widgets Group<CR>
+    What is the name of your organization?
+    [Unknown]:  Xyzzy, Inc.<CR>
+    What is the name of your City or Locality?
+    [Unknown]:  Arcata<CR>
+    What is the name of your State or Province?
+    [Unknown]:  CA<CR>
+    What is the two-letter country code for this unit?
+    [Unknown]:  US<CR>
+    Is CN=widgets.xyzzy.com, OU=Consumer Widgets Group, O="Xyzzy, Inc.",
+    L=Arcata, ST=CA, C=US correct?
+    [no]:  yes<CR>
+
+    Enter key password for <mykey>
+    (RETURN if same as keystore password):  <CR>
+
+This directory also contain a very simple URL reader (URLDumper), which
+connects to a specified URL and places all output into a specified file.
+
+
+SERVER EXECUTION
+================
+
+    % java -classpath build Server N1
+
+    Usage:  Server <type> [options]
+        type:
+                B1      Blocking/Single-threaded Server
+                BN      Blocking/Multi-threaded Server
+                BP      Blocking/Pooled-thread Server
+                N1      Nonblocking/Single-threaded Server
+                N2      Nonblocking/Dual-threaded Server
+
+        options:
+                -port port                port number
+                    default:  8000
+                -backlog backlog          backlog
+                    default:  1024
+                -secure                   encrypt with SSL/TLS
+		    default is insecure
+
+"http://" URLs should be used with insecure mode, and
+"https://" for secure mode.
+
+The "B*" servers use classic blocking I/O:  in other words, calls to
+read()/write() will not return until the I/O operation has completed.  The
+"N*" servers use non-blocking mode and Selectors to determine which
+Channels are ready to perform I/O.
+
+B1:	A single-threaded server which completely services each
+	connection before moving to the next.
+
+B2:	A multi-threaded server which creates a new thread for each
+	connection.  This is not efficient for large numbers of
+	connections.
+
+BP:	A multi-threaded server which creates a pool of threads for use
+	by the server.  The Thread pool decides how to schedule those
+	threads.
+
+N1:	A single-threaded server.  All accept() and read()/write()
+	operations are performed by a single thread, but only after
+	being selected for those operations by a Selector.
+
+N2:	A dual-threaded server which performs accept()s in one thread, and
+	services requests in a second.  Both threads use select().
+
+
+CLIENT EXECUTION
+================
+You can test the server using any standard browser such as Internet
+Explorer or Mozilla, but since the browser will not trust the
+credentials you just created, you may need to accept the credentials
+via the browser's pop-up dialog box.
+
+Alternatively, to use the certificates using the simple included JSSE
+client URLDumper, export the server certificate into a new truststore,
+and then run the application using the new truststore.
+
+    % keytool -export -keystore testkeys -alias widgets -file widgets.cer
+    Enter keystore password:  passphrase<CR>
+    Certificate stored in file <widgets.cer>
+
+    % keytool -import -keystore trustCerts -alias widgetServer \
+            -file widgets.cer
+    Enter keystore password:  passphrase<CR>
+    Owner: CN=widgets.xyzzy.com, OU=Consumer, O="xyzzy, inc.", L=Arcata,
+    ST=CA, C=US
+    Issuer: CN=widgets.xyzzy.com, OU=Consumer, O="xyzzy, inc.",
+    L=Arcata, ST=CA, C=US
+    Serial number: 4086cc7a
+    Valid from: Wed Apr 21 12:33:14 PDT 2004 until: Tue Jul 20 12:33:14
+    PDT 2004
+    Certificate fingerprints:
+        MD5:  39:71:42:CD:BF:0D:A9:8C:FB:8B:4A:CD:F8:6D:19:1F
+        SHA1: 69:5D:38:E9:F4:6C:E5:A7:4C:EA:45:8E:FB:3E:F3:9A:84:01:6F:22
+    Trust this certificate? [no]:  yes<CR>
+    Certificate was added to keystore
+
+    % java -classpath build -Djavax.net.ssl.trustStore=trustCerts \
+        -Djavax.net.ssl.TrustStorePassword=passphrase \
+        URLDumper https://widgets.xyzzy.com:8000/ outputFile
+
+NOTE:  The server must be run with "-secure" in order to receive
+"https://" URLs.
+
+WARNING:  This is just a simple example for code exposition, you should
+spend more time understanding PKI security concerns.
+
+
+SOURCE CODE OVERVIEW
+====================
+
+The main class is Server, which handles program startup, and is
+subclassed by the "B*" and "N*" server classes.
+
+Following a successful accept(), the "B*" variants each create a
+RequestServicer object to perform the actual request/reply operations.  The
+primary differences between the different "B*" servers is how the
+RequestServicer is actually run:
+
+    B1:	RequestServicer.run() is directly called.
+    BN:	A new thread is started, and the thread calls RequestServicer.run().
+    BP:	A ThreadPool is created, and the pool framework is given Runnable
+	tasks to complete.
+
+In the "N*" variations, a Dispatcher object is created, which is
+responsible for performing the select, and then issuing the
+corresponding handler:
+
+    N1:	A single thread is used for all accept()/read()/write() operations
+    N2:	Similar to N1, but a separate thread is used for the accept()
+	operations.
+
+In all cases, once the connection has been accepted, a ChannelIO object
+is created to handle all I/O.  In the insecure case, the corresponding
+SocketChannel methods are directly called.  However in the secure case,
+more manipulations are needed to first secure the channel, then
+encrypt/decrypt the data, and finally properly send any shutdown
+messages.  ChannelIOSecure extends ChannelIO, and provides the secure
+variants of the corresponding ChannelIO calls.
+
+RequestServicer and RequestHandler are the main drivers for the
+blocking and non-blocking variants, respectively.  They are responsible
+for:
+
+    Performing any initial handshaking
+
+    Reading the request data
+        All data is stored in a local buffer in the ChannelIO
+        structure.
+
+    Parsing the request
+        The request data is obtained from the ChannelIO object, and
+        is processed by Request class, which represents the
+        parsed URI address.
+
+    Locating/preparing/sending the data or reporting error conditions.
+        A Reply object is created which represents the entire object to send,
+        including the HTTP/HTTPS headers.
+
+    Shutdown/closing the channel.
+
+
+CLOSING THOUGHTS
+================
+This example represents a simple server: it is not production quality.
+It was primarily meant to demonstrate the new APIs in versions 1.4 and
+1.5 of the platform.
+
+This example could certainly be expanded to address other areas of
+concern: for example, assigning multiple threads to handle the selected
+Channels, or delegating SSLEngine tasks to multiple threads.  There are
+so many ways to implement compute and I/O strategies, we encourage you
+to experiment and find what works best for your situation.
+
+To steal a phrase from many textbooks:
+
+    "It is left as an exercise for the reader..."
+
diff --git a/darwin-x86/sample/nio/server/Reply.java b/darwin-x86/sample/nio/server/Reply.java
new file mode 100644
index 0000000..c128ee8
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Reply.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+/**
+ * An object used for sending Content to the requestor.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Reply implements Sendable {
+
+    /**
+     * A helper class which define the HTTP response codes
+     */
+    static class Code {
+
+        private int number;
+        private String reason;
+        private Code(int i, String r) { number = i; reason = r; }
+        public String toString() { return number + " " + reason; }
+
+        static Code OK = new Code(200, "OK");
+        static Code BAD_REQUEST = new Code(400, "Bad Request");
+        static Code NOT_FOUND = new Code(404, "Not Found");
+        static Code METHOD_NOT_ALLOWED = new Code(405, "Method Not Allowed");
+
+    }
+
+    private Code code;
+    private Content content;
+    private boolean headersOnly;
+
+    Reply(Code rc, Content c) {
+        this(rc, c, null);
+    }
+
+    Reply(Code rc, Content c, Request.Action head) {
+        code = rc;
+        content = c;
+        headersOnly = (head == Request.Action.HEAD);
+    }
+
+    private static String CRLF = "\r\n";
+    private static Charset ascii = Charset.forName("US-ASCII");
+
+    private ByteBuffer hbb = null;
+
+    private ByteBuffer headers() {
+        CharBuffer cb = CharBuffer.allocate(1024);
+        for (;;) {
+            try {
+                cb.put("HTTP/1.0 ").put(code.toString()).put(CRLF);
+                cb.put("Server: niossl/0.1").put(CRLF);
+                cb.put("Content-type: ").put(content.type()).put(CRLF);
+                cb.put("Content-length: ")
+                    .put(Long.toString(content.length())).put(CRLF);
+                cb.put(CRLF);
+                break;
+            } catch (BufferOverflowException x) {
+                assert(cb.capacity() < (1 << 16));
+                cb = CharBuffer.allocate(cb.capacity() * 2);
+                continue;
+            }
+        }
+        cb.flip();
+        return ascii.encode(cb);
+    }
+
+    public void prepare() throws IOException {
+        content.prepare();
+        hbb = headers();
+    }
+
+    public boolean send(ChannelIO cio) throws IOException {
+
+        if (hbb == null)
+            throw new IllegalStateException();
+
+        if (hbb.hasRemaining()) {
+            if (cio.write(hbb) <= 0)
+                return true;
+        }
+
+        if (!headersOnly) {
+            if (content.send(cio))
+                return true;
+        }
+
+        if (!cio.dataFlush())
+            return true;
+
+        return false;
+    }
+
+    public void release() throws IOException {
+        content.release();
+    }
+}
diff --git a/darwin-x86/sample/nio/server/Request.java b/darwin-x86/sample/nio/server/Request.java
new file mode 100644
index 0000000..fa36d1e
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Request.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.net.*;
+import java.nio.*;
+import java.nio.charset.*;
+import java.util.regex.*;
+
+/**
+ * An encapsulation of the request received.
+ * <P>
+ * The static method parse() is responsible for creating this
+ * object.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Request {
+
+    /**
+     * A helper class for parsing HTTP command actions.
+     */
+    static class Action {
+
+        private String name;
+        private Action(String name) { this.name = name; }
+        public String toString() { return name; }
+
+        static Action GET = new Action("GET");
+        static Action PUT = new Action("PUT");
+        static Action POST = new Action("POST");
+        static Action HEAD = new Action("HEAD");
+
+        static Action parse(String s) {
+            if (s.equals("GET"))
+                return GET;
+            if (s.equals("PUT"))
+                return PUT;
+            if (s.equals("POST"))
+                return POST;
+            if (s.equals("HEAD"))
+                return HEAD;
+            throw new IllegalArgumentException(s);
+        }
+    }
+
+    private Action action;
+    private String version;
+    private URI uri;
+
+    Action action() { return action; }
+    String version() { return version; }
+    URI uri() { return uri; }
+
+    private Request(Action a, String v, URI u) {
+        action = a;
+        version = v;
+        uri = u;
+    }
+
+    public String toString() {
+        return (action + " " + version + " " + uri);
+    }
+
+    static boolean isComplete(ByteBuffer bb) {
+        int p = bb.position() - 4;
+        if (p < 0)
+            return false;
+        return (((bb.get(p + 0) == '\r') &&
+                 (bb.get(p + 1) == '\n') &&
+                 (bb.get(p + 2) == '\r') &&
+                 (bb.get(p + 3) == '\n')));
+    }
+
+    private static Charset ascii = Charset.forName("US-ASCII");
+
+    /*
+     * The expected message format is first compiled into a pattern,
+     * and is then compared against the inbound character buffer to
+     * determine if there is a match.  This convienently tokenizes
+     * our request into usable pieces.
+     *
+     * This uses Matcher "expression capture groups" to tokenize
+     * requests like:
+     *
+     *     GET /dir/file HTTP/1.1
+     *     Host: hostname
+     *
+     * into:
+     *
+     *     group[1] = "GET"
+     *     group[2] = "/dir/file"
+     *     group[3] = "1.1"
+     *     group[4] = "hostname"
+     *
+     * The text in between the parens are used to captured the regexp text.
+     */
+    private static Pattern requestPattern
+        = Pattern.compile("\\A([A-Z]+) +([^ ]+) +HTTP/([0-9\\.]+)$"
+                          + ".*^Host: ([^ ]+)$.*\r\n\r\n\\z",
+                          Pattern.MULTILINE | Pattern.DOTALL);
+
+    static Request parse(ByteBuffer bb) throws MalformedRequestException {
+
+        CharBuffer cb = ascii.decode(bb);
+        Matcher m = requestPattern.matcher(cb);
+        if (!m.matches())
+            throw new MalformedRequestException();
+        Action a;
+        try {
+            a = Action.parse(m.group(1));
+        } catch (IllegalArgumentException x) {
+            throw new MalformedRequestException();
+        }
+        URI u;
+        try {
+            u = new URI("http://"
+                        + m.group(4)
+                        + m.group(2));
+        } catch (URISyntaxException x) {
+            throw new MalformedRequestException();
+        }
+        return new Request(a, m.group(3), u);
+    }
+}
diff --git a/darwin-x86/sample/nio/server/RequestHandler.java b/darwin-x86/sample/nio/server/RequestHandler.java
new file mode 100644
index 0000000..91d2bda
--- /dev/null
+++ b/darwin-x86/sample/nio/server/RequestHandler.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+
+/**
+ * Primary driver class used by non-blocking Servers to receive,
+ * prepare, send, and shutdown requests.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class RequestHandler implements Handler {
+
+    private ChannelIO cio;
+    private ByteBuffer rbb = null;
+
+    private boolean requestReceived = false;
+    private Request request = null;
+    private Reply reply = null;
+
+    private static int created = 0;
+
+    RequestHandler(ChannelIO cio) {
+        this.cio = cio;
+
+        // Simple heartbeat to let user know we're alive.
+        synchronized (RequestHandler.class) {
+            created++;
+            if ((created % 50) == 0) {
+                System.out.println(".");
+                created = 0;
+            } else {
+                System.out.print(".");
+            }
+        }
+    }
+
+    // Returns true when request is complete
+    // May expand rbb if more room required
+    //
+    private boolean receive(SelectionKey sk) throws IOException {
+        ByteBuffer tmp = null;
+
+        if (requestReceived) {
+            return true;
+        }
+
+        if (!cio.doHandshake(sk)) {
+            return false;
+        }
+
+        if ((cio.read() < 0) || Request.isComplete(cio.getReadBuf())) {
+            rbb = cio.getReadBuf();
+            return (requestReceived = true);
+        }
+        return false;
+    }
+
+    // When parse is successfull, saves request and returns true
+    //
+    private boolean parse() throws IOException {
+        try {
+            request = Request.parse(rbb);
+            return true;
+        } catch (MalformedRequestException x) {
+            reply = new Reply(Reply.Code.BAD_REQUEST,
+                              new StringContent(x));
+        }
+        return false;
+    }
+
+    // Ensures that reply field is non-null
+    //
+    private void build() throws IOException {
+        Request.Action action = request.action();
+        if ((action != Request.Action.GET) &&
+                (action != Request.Action.HEAD)) {
+            reply = new Reply(Reply.Code.METHOD_NOT_ALLOWED,
+                              new StringContent(request.toString()));
+        }
+        reply = new Reply(Reply.Code.OK,
+                          new FileContent(request.uri()), action);
+    }
+
+    public void handle(SelectionKey sk) throws IOException {
+        try {
+
+            if (request == null) {
+                if (!receive(sk))
+                    return;
+                rbb.flip();
+                if (parse())
+                    build();
+                try {
+                    reply.prepare();
+                } catch (IOException x) {
+                    reply.release();
+                    reply = new Reply(Reply.Code.NOT_FOUND,
+                                      new StringContent(x));
+                    reply.prepare();
+                }
+                if (send()) {
+                    // More bytes remain to be written
+                    sk.interestOps(SelectionKey.OP_WRITE);
+                } else {
+                    // Reply completely written; we're done
+                    if (cio.shutdown()) {
+                        cio.close();
+                        reply.release();
+                    }
+                }
+            } else {
+                if (!send()) {  // Should be rp.send()
+                    if (cio.shutdown()) {
+                        cio.close();
+                        reply.release();
+                    }
+                }
+            }
+        } catch (IOException x) {
+            String m = x.getMessage();
+            if (!m.equals("Broken pipe") &&
+                    !m.equals("Connection reset by peer")) {
+                System.err.println("RequestHandler: " + x.toString());
+            }
+
+            try {
+                /*
+                 * We had a failure here, so we'll try to be nice
+                 * before closing down and send off a close_notify,
+                 * but if we can't get the message off with one try,
+                 * we'll just shutdown.
+                 */
+                cio.shutdown();
+            } catch (IOException e) {
+                // ignore
+            }
+
+            cio.close();
+            if (reply !=  null) {
+                reply.release();
+            }
+        }
+
+    }
+
+    private boolean send() throws IOException {
+        try {
+            return reply.send(cio);
+        } catch (IOException x) {
+            if (x.getMessage().startsWith("Resource temporarily")) {
+                System.err.println("## RTA");
+                return true;
+            }
+            throw x;
+        }
+    }
+}
diff --git a/darwin-x86/sample/nio/server/RequestServicer.java b/darwin-x86/sample/nio/server/RequestServicer.java
new file mode 100644
index 0000000..88d40b5
--- /dev/null
+++ b/darwin-x86/sample/nio/server/RequestServicer.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+
+/**
+ * Primary driver class used by blocking Servers to receive,
+ * prepare, send, and shutdown requests.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class RequestServicer implements Runnable {
+
+    private ChannelIO cio;
+
+    private static int created = 0;
+
+    RequestServicer(ChannelIO cio) {
+        this.cio = cio;
+
+        // Simple heartbeat to let user know we're alive.
+        synchronized (RequestServicer.class) {
+            created++;
+            if ((created % 50) == 0) {
+                System.out.println(".");
+                created = 0;
+            } else {
+                System.out.print(".");
+            }
+        }
+    }
+
+    private void service() throws IOException {
+        Reply rp = null;
+        try {
+            ByteBuffer rbb = receive();         // Receive
+            Request rq = null;
+            try {                               // Parse
+                rq = Request.parse(rbb);
+            } catch (MalformedRequestException x) {
+                rp = new Reply(Reply.Code.BAD_REQUEST,
+                               new StringContent(x));
+            }
+            if (rp == null) rp = build(rq);     // Build
+            do {} while (rp.send(cio));         // Send
+            do {} while (!cio.shutdown());
+            cio.close();
+            rp.release();
+        } catch (IOException x) {
+            String m = x.getMessage();
+            if (!m.equals("Broken pipe") &&
+                    !m.equals("Connection reset by peer")) {
+                System.err.println("RequestHandler: " + x.toString());
+            }
+
+            try {
+                /*
+                 * We had a failure here, so we'll try to be nice
+                 * before closing down and send off a close_notify,
+                 * but if we can't get the message off with one try,
+                 * we'll just shutdown.
+                 */
+                cio.shutdown();
+            } catch (IOException e) {
+                // ignore
+            }
+
+            cio.close();
+            if (rp != null) {
+                rp.release();
+            }
+        }
+    }
+
+    public void run() {
+        try {
+            service();
+        } catch (IOException x) {
+            x.printStackTrace();
+        }
+    }
+
+    ByteBuffer receive() throws IOException {
+
+        do {} while (!cio.doHandshake());
+
+        for (;;) {
+            int read = cio.read();
+            ByteBuffer bb = cio.getReadBuf();
+            if ((read < 0) || (Request.isComplete(bb))) {
+                bb.flip();
+                return bb;
+            }
+        }
+    }
+
+    Reply build(Request rq) throws IOException {
+
+        Reply rp = null;
+        Request.Action action = rq.action();
+        if ((action != Request.Action.GET) &&
+                (action != Request.Action.HEAD))
+            rp = new Reply(Reply.Code.METHOD_NOT_ALLOWED,
+                           new StringContent(rq.toString()));
+        else
+            rp = new Reply(Reply.Code.OK,
+                           new FileContent(rq.uri()), action);
+        try {
+            rp.prepare();
+        } catch (IOException x) {
+            rp.release();
+            rp = new Reply(Reply.Code.NOT_FOUND,
+                           new StringContent(x));
+            rp.prepare();
+        }
+        return rp;
+    }
+}
diff --git a/darwin-x86/sample/nio/server/Sendable.java b/darwin-x86/sample/nio/server/Sendable.java
new file mode 100644
index 0000000..44ac848
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Sendable.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+
+/**
+ * Method definitions used for preparing, sending, and release
+ * content.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Sendable {
+
+    void prepare() throws IOException;
+
+    // Sends (some) content to the given channel.
+    // Returns true if more bytes remain to be written.
+    // Throws IllegalStateException if not prepared.
+    //
+    boolean send(ChannelIO cio) throws IOException;
+
+    void release() throws IOException;
+}
diff --git a/darwin-x86/sample/nio/server/Server.java b/darwin-x86/sample/nio/server/Server.java
new file mode 100644
index 0000000..1ac6421
--- /dev/null
+++ b/darwin-x86/sample/nio/server/Server.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.net.*;
+import java.nio.channels.*;
+import java.security.*;
+import javax.net.ssl.*;
+
+/**
+ * The main server base class.
+ * <P>
+ * This class is responsible for setting up most of the server state
+ * before the actual server subclasses take over.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public abstract class Server {
+
+    ServerSocketChannel ssc;
+    SSLContext sslContext = null;
+
+    static private int PORT = 8000;
+    static private int BACKLOG = 1024;
+    static private boolean SECURE = false;
+
+    Server(int port, int backlog,
+            boolean secure) throws Exception {
+
+        if (secure) {
+            createSSLContext();
+        }
+
+        ssc = ServerSocketChannel.open();
+        ssc.socket().setReuseAddress(true);
+        ssc.socket().bind(new InetSocketAddress(port), backlog);
+    }
+
+    /*
+     * If this is a secure server, we now setup the SSLContext we'll
+     * use for creating the SSLEngines throughout the lifetime of
+     * this process.
+     */
+    private void createSSLContext() throws Exception {
+
+        char[] passphrase = "passphrase".toCharArray();
+
+        KeyStore ks = KeyStore.getInstance("JKS");
+        ks.load(new FileInputStream("testkeys"), passphrase);
+
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+        kmf.init(ks, passphrase);
+
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+        tmf.init(ks);
+
+        sslContext = SSLContext.getInstance("TLS");
+        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+    }
+
+    abstract void runServer() throws Exception;
+
+    static private void usage() {
+        System.out.println(
+            "Usage:  Server <type> [options]\n"
+                + "     type:\n"
+                + "             B1      Blocking/Single-threaded Server\n"
+                + "             BN      Blocking/Multi-threaded Server\n"
+                + "             BP      Blocking/Pooled-Thread Server\n"
+                + "             N1      Nonblocking/Single-threaded Server\n"
+                + "             N2      Nonblocking/Dual-threaded Server\n"
+                + "\n"
+                + "     options:\n"
+                + "             -port port              port number\n"
+                + "                 default:  " + PORT + "\n"
+                + "             -backlog backlog        backlog\n"
+                + "                 default:  " + BACKLOG + "\n"
+                + "             -secure                 encrypt with SSL/TLS");
+        System.exit(1);
+    }
+
+    /*
+     * Parse the arguments, decide what type of server to run,
+     * see if there are any defaults to change.
+     */
+    static private Server createServer(String args[]) throws Exception {
+        if (args.length < 1) {
+            usage();
+        }
+
+        int port = PORT;
+        int backlog = BACKLOG;
+        boolean secure = SECURE;
+
+        for (int i = 1; i < args.length; i++) {
+            if (args[i].equals("-port")) {
+                checkArgs(i, args.length);
+                port = Integer.valueOf(args[++i]);
+            } else if (args[i].equals("-backlog")) {
+                checkArgs(i, args.length);
+                backlog = Integer.valueOf(args[++i]);
+            } else if (args[i].equals("-secure")) {
+                secure = true;
+            } else {
+                usage();
+            }
+        }
+
+        Server server = null;
+
+        if (args[0].equals("B1")) {
+            server = new B1(port, backlog, secure);
+        } else if (args[0].equals("BN")) {
+            server = new BN(port, backlog, secure);
+        } else if (args[0].equals("BP")) {
+            server = new BP(port, backlog, secure);
+        } else if (args[0].equals("N1")) {
+            server = new N1(port, backlog, secure);
+        } else if (args[0].equals("N2")) {
+            server = new N2(port, backlog, secure);
+        }
+
+        return server;
+    }
+
+    static private void checkArgs(int i, int len) {
+        if ((i + 1) >= len) {
+           usage();
+        }
+    }
+
+    static public void main(String args[]) throws Exception {
+        Server server = createServer(args);
+
+        if (server == null) {
+            usage();
+        }
+
+        System.out.println("Server started.");
+        server.runServer();
+    }
+}
diff --git a/darwin-x86/sample/nio/server/StringContent.java b/darwin-x86/sample/nio/server/StringContent.java
new file mode 100644
index 0000000..267b338
--- /dev/null
+++ b/darwin-x86/sample/nio/server/StringContent.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+/**
+ * A Content type that provides for transferring Strings.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class StringContent implements Content {
+
+    private static Charset ascii = Charset.forName("US-ASCII");
+
+    private String type;                // MIME type
+    private String content;
+
+    StringContent(CharSequence c, String t) {
+        content = c.toString();
+        if (!content.endsWith("\n"))
+            content += "\n";
+        type = t + "; charset=iso-8859-1";
+    }
+
+    StringContent(CharSequence c) {
+        this(c, "text/plain");
+    }
+
+    StringContent(Exception x) {
+        StringWriter sw = new StringWriter();
+        x.printStackTrace(new PrintWriter(sw));
+        type = "text/plain; charset=iso-8859-1";
+        content = sw.toString();
+    }
+
+    public String type() {
+        return type;
+    }
+
+    private ByteBuffer bb = null;
+
+    private void encode() {
+        if (bb == null)
+            bb = ascii.encode(CharBuffer.wrap(content));
+    }
+
+    public long length() {
+        encode();
+        return bb.remaining();
+    }
+
+    public void prepare() {
+        encode();
+        bb.rewind();
+    }
+
+    public boolean send(ChannelIO cio) throws IOException {
+        if (bb == null)
+            throw new IllegalStateException();
+        cio.write(bb);
+
+        return bb.hasRemaining();
+    }
+
+    public void release() throws IOException {
+    }
+}
diff --git a/darwin-x86/sample/nio/server/URLDumper.java b/darwin-x86/sample/nio/server/URLDumper.java
new file mode 100644
index 0000000..30166e7
--- /dev/null
+++ b/darwin-x86/sample/nio/server/URLDumper.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.net.*;
+
+/**
+ * A simple example to illustrate using a URL to access a resource
+ * and then store the result to a File.
+ * <P>
+ * Any type of URL can be used:  http, https, ftp, etc.
+ *
+ * @author Brad R. Wetmore
+ * @author Mark Reinhold
+ */
+public class URLDumper {
+    public static void main(String[] args) throws Exception {
+
+        if (args.length != 2) {
+            System.out.println("Usage:  URLDumper <URL> <file>");
+            System.exit(1);
+        }
+
+        String location = args[0];
+        String file = args[1];
+
+        URL url = new URL(location);
+        FileOutputStream fos = new FileOutputStream(file);
+
+        byte [] bytes = new byte [4096];
+
+        InputStream is = url.openStream();
+
+        int read;
+
+        while ((read = is.read(bytes)) != -1) {
+            fos.write(bytes, 0, read);
+        }
+
+        is.close();
+        fos.close();
+    }
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/README.txt b/darwin-x86/sample/scripting/scriptpad/README.txt
new file mode 100644
index 0000000..ab4bd5f
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/README.txt
@@ -0,0 +1,122 @@
+Scriptpad Sample
+
+* Introduction
+
+Scriptpad is a notepad like editor to open/edit/save and run 
+script (JavaScript) files. This sample demonstrates the use of 
+javax.script (JSR-223) API and JavaScript engine that is bundled 
+with JDK 6.
+
+Scriptpad sample demonstrates how to use Javascript to use Java 
+classes and objects to perform various tasks such as to modify,
+customize Swing GUI or to connect to a running application and 
+monitor it using JMX (Java Management Extensions) API.
+
+* How to run Scriptpad?
+
+Scriptpad can be run with the following command:
+    
+    java -jar ./build/scriptpad.jar
+
+(be sure to use the correct version of java).  You can
+open/edit/save scripts using menu items under "File" menu.
+To run currently edited script, you can use "Tools->Run" menu.
+
+For example, you may enter
+
+    alert("hello, world");
+
+in the editor and run the same with "Tools->Run" menu. 
+You will see an alert box with the message "hello, world".
+
+In addition to being a simple script editor/runner, scriptpad 
+can be used to connect to a JMX MBean server ("Tools->JMX Connect" 
+menu). User can specify JMX hostname and port. After connecting, 
+user can use "monitoring and management" script functions defined 
+in "mm.js" (see below).
+
+* Scriptpad Sources
+
+com.sun.demo.scriptpad.Main class is the entry point of this
+sample. This class creates ScriptEngine and evaluates few
+JavaScript "files" -- which are stored as resources (please
+refer to src/resources/*.js). Actual code for the scriptpad's
+main functionality lives in these JavaScript files.
+
+1. conc.js
+ -- simple concurrency utilities for JavaScript
+
+2. gui.js
+ -- simple GUI utilities for JavaScript
+
+3. mm.js
+ -- Monitoring and Management utilities for JavaScript
+
+4. scriptpad.js
+ -- This creates main "notepad"-like GUI for open/edit/save
+    and run script files
+
+5. Main.js
+ -- This script file can be used under "jrunscript" tool.
+    jrunscript is an experimental tool shipped with JDK (under
+    $JDK_HOME/bin directory). The scriptpad application can be
+    run by the following commands:
+
+    cd ./src/resources
+    $JDK_HOME/bin/jrunscript -f Main.js -f -
+
+
+* Extending Scriptpad:
+
+It is possible to extend scriptpad using scripts. There is a global
+object called "application". This object has 2 fields and a method.
+
+    Fields of the application object:
+
+        frame  -> JFrame of the scriptpad
+        editor -> editor pane of the scriptpad
+ 
+    Method of the application object:
+
+        addTool -> adds a menu item under "Tools" menu
+
+    Example script to add "Tools->Hello" menu item:
+
+        application.addTool("Hello", 
+            function() { alert("hello, world"); });
+
+After running the above script, you can click Tools->Hello menu item
+and you'll see an alert box.
+
+Scriptpad customization may also be done by defining a file named 
+"scriptpad.js" under your home directory,. If this file is found, 
+scriptpad loads this file just after initializating everything. 
+In your initialization file, you can additional script functions 
+by "load" function.
+
+* Script Samples:
+
+On clicking the menu items under "Examples" menu, scriptpad shows 
+built-in examples in the editor. Also, there are few script samples
+under the ./src/scripts directory.
+
+* Monitoring and Management with Scriptpad:
+
+(1) Start the application with the JMX agent - here's an example of 
+    how the Java2D demo is started
+   
+      java -Dcom.sun.management.jmxremote.port=1090          \
+           -Dcom.sun.management.jmxremote.ssl=false          \
+           -Dcom.sun.management.jmxremote.authenticate=false \
+           -jar $JDK_HOME/demo/jfc/Font2DTest/Font2DTest.jar
+
+(2) Start scriptpad and click on "Tools->JMX Connect" menu.
+    In the prompt, enter "localhost:1090" to connect to the above
+    program.
+
+After connecting to a MBeanServer (using "Tools->JMX Connect"),
+you can run any script that uses functions defined in "mm.js". 
+For example, it is possible to load and run management scripts that
+are part of JConsole script shell plugin under the directory:
+
+    $JDK_HOME/demo/scripting/jconsole-plugin/src/scripts
diff --git a/darwin-x86/sample/scripting/scriptpad/build.properties b/darwin-x86/sample/scripting/scriptpad/build.properties
new file mode 100644
index 0000000..efcd591
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/build.properties
@@ -0,0 +1,22 @@
+main.dir=.
+
+src.dir=${main.dir}/src
+
+build.dir=build
+classes.dir=${build.dir}/classes
+jar=${build.dir}/scriptpad.jar
+javadoc.dir=${build.dir}/javadoc
+
+build.sysclasspath=ignore
+# E.g.: cp=lib/x.jar:lib/y.jar
+cp=
+extra.run.cp=
+
+main.class=com.sun.sample.scriptpad.Main
+
+run.cp=${cp}:${classes.dir}:${extra.run.cp}
+
+debug=true
+deprecation=false
+
+nbjdk.home=${basedir}/../../..
diff --git a/darwin-x86/sample/scripting/scriptpad/build.xml b/darwin-x86/sample/scripting/scriptpad/build.xml
new file mode 100644
index 0000000..5f203d5
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/build.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+
+<!-- 
+  This is ant (http://ant.apache.org) build script to build the
+  "Scriptpad" sample. Either this build.xml can be used standalone 
+  with "ant" tool or can be opened as a project with NetBeans IDE
+  (http://www.netbeans.org).
+-->
+
+<project name="Scriptpad" default="jar" basedir=".">
+
+    <import file="nbproject/jdk.xml"/>
+
+    <target name="-prop-init">
+        <property file="user.build.properties"/>
+        <property file="build.properties"/>
+    </target>
+
+    <target name="-init" depends="-prop-init,-jdk-init"/>
+
+    <target name="compile" depends="-init" description="Compile main sources.">
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+        </javac>
+        <copy todir="${classes.dir}">
+            <fileset dir="${src.dir}"/>
+        </copy>
+    </target>
+
+    <target name="jar" depends="compile" description="Build JAR file for main sources.">
+        <jar jarfile="${jar}" compress="true">
+            <manifest>
+                <attribute name="Main-Class" value="${main.class}"/>
+            </manifest>
+            <fileset dir="${classes.dir}"/>
+        </jar>
+    </target>
+
+    <target name="run" depends="compile" description="Run application.">
+        <fail unless="main.class">Must set property 'main.class' (e.g. in build.properties)</fail>
+        <java classname="${main.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+        </java>
+    </target>
+
+    <target name="javadoc" depends="-init" description="Build Javadoc.">
+        <mkdir dir="${javadoc.dir}"/>
+        <javadoc destdir="${javadoc.dir}">
+            <classpath path="${cp}"/>
+            <sourcepath>
+                <pathelement location="${src.dir}"/>
+            </sourcepath>
+            <fileset dir="${src.dir}"/>
+        </javadoc>
+    </target>
+
+    <target name="clean" depends="-init" description="Clean build products.">
+        <delete dir="${build.dir}"/>
+        <delete file="${jar}"/>
+    </target>
+
+    <target name="profile">
+        <ant antfile="nbproject/netbeans-targets.xml" target="profile"/>
+    </target>
+</project>
diff --git a/darwin-x86/sample/scripting/scriptpad/nbproject/file-targets.xml b/darwin-x86/sample/scripting/scriptpad/nbproject/file-targets.xml
new file mode 100644
index 0000000..0904977
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/nbproject/file-targets.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="scriptpad/file">
+    
+    <import file="../build.xml"/>
+    
+    <target name="compile-selected" depends="-init">
+        <fail unless="includes">Must set property 'includes'</fail>
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}" includes="${includes}">
+            <classpath path="${cp}"/>
+        </javac>
+    </target>
+    
+</project>
diff --git a/darwin-x86/sample/scripting/scriptpad/nbproject/jdk.xml b/darwin-x86/sample/scripting/scriptpad/nbproject/jdk.xml
new file mode 100644
index 0000000..2b85b77
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/nbproject/jdk.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project name="jdk" basedir=".">
+
+    <target name="-jdk-preinit">
+        <condition property=".exe" value=".exe">
+            <os family="windows"/>
+        </condition>
+        <property name=".exe" value=""/>
+        <property name="nbjdk.javac" value="${nbjdk.home}/bin/javac${.exe}"/>
+        <property name="nbjdk.java" value="${nbjdk.home}/bin/java${.exe}"/>
+        <property name="nbjdk.javadoc" value="${nbjdk.home}/bin/javadoc${.exe}"/>
+        <property name="nbjdk.appletviewer" value="${nbjdk.home}/bin/appletviewer${.exe}"/>
+        <property name="nbjdk.bootclasspath" value="${nbjdk.home}/jre/lib/rt.jar"/>
+    </target>
+
+    <target name="-jdk-presetdef-basic" depends="-jdk-preinit" unless="nbjdk.presetdef.basic.done">
+        <macrodef name="javac-presetdef">
+            <attribute name="javacval"/>
+            <sequential>
+                <presetdef name="javac">
+                    <javac fork="yes" executable="@{javacval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javac-presetdef javacval="${nbjdk.javac}"/>
+        <macrodef name="java-presetdef">
+            <attribute name="javaval"/>
+            <sequential>
+                <presetdef name="java">
+                    <java fork="yes" jvm="@{javaval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <java-presetdef javaval="${nbjdk.java}"/>
+        <macrodef name="javadoc-presetdef">
+            <attribute name="javadocval"/>
+            <sequential>
+                <presetdef name="javadoc">
+                    <javadoc executable="@{javadocval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javadoc-presetdef javadocval="${nbjdk.javadoc}"/>
+        <property name="nbjdk.presetdef.basic.done" value="true"/>
+    </target>
+
+    <target name="-jdk-presetdef-nbjpdastart" depends="-jdk-preinit" unless="nbjdk.presetdef.nbjpdastart.done">
+        <macrodef name="nbjpdastart-presetdef">
+            <attribute name="bootcpval"/>
+            <sequential>
+                <presetdef name="nbjpdastart">
+                    <nbjpdastart>
+                        <bootclasspath>
+                            <path path="@{bootcpval}"/>
+                        </bootclasspath>
+                    </nbjpdastart>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <nbjpdastart-presetdef bootcpval="${nbjdk.bootclasspath}"/>
+        <property name="nbjdk.presetdef.nbjpdastart.done" value="true"/>
+    </target>
+
+    <target name="-jdk-init" depends="-jdk-preinit,-jdk-presetdef-basic"/>
+
+</project>
diff --git a/darwin-x86/sample/scripting/scriptpad/nbproject/netbeans-targets.xml b/darwin-x86/sample/scripting/scriptpad/nbproject/netbeans-targets.xml
new file mode 100644
index 0000000..b53c34d
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/nbproject/netbeans-targets.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="scriptpad/NB">
+
+    <import file="../build.xml"/>
+    
+    <target name="debug" depends="compile,-jdk-presetdef-nbjpdastart">
+        <nbjpdastart addressproperty="jpda.address" name="scriptpad" transport="dt_socket">
+            <classpath path="${run.cp}"/>
+        </nbjpdastart>
+        <java classname="${main.class}" failonerror="true" fork="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="-Xdebug"/>
+            <jvmarg value="-Xnoagent"/>
+            <jvmarg value="-Djava.compiler=none"/>
+            <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
+        </java>
+    </target>
+    
+    <target name="debug-fix" depends="-init">
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+            <include name="${class}.java"/>
+        </javac>
+        <nbjpdareload>
+            <fileset dir="${classes.dir}">
+                <include name="${class}.class"/>
+            </fileset>
+        </nbjpdareload>
+    </target>
+    
+    <target name="show-javadoc" depends="javadoc">
+        <nbbrowse file="${javadoc.dir}/index.html"/>
+    </target>
+    
+    <target name="profile" depends="compile">
+        <nbprofiledirect>
+            <classpath path="${run.cp}"/>
+        </nbprofiledirect>
+        <property environment="env"/>
+        <java classname="${main.class}" fork="true" failonerror="true" dir="${profiler.session.working.dir}" jvm="${profiler.info.jvm}">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <env key="LD_LIBRARY_PATH" path="${profiler.info.agentpath}:${env.LD_LIBRARY_PATH}"/>
+            <env key="Path" path="${profiler.info.agentpath}:${env.Path}"/>
+        </java>
+    </target>
+    
+</project>
diff --git a/darwin-x86/sample/scripting/scriptpad/nbproject/project.xml b/darwin-x86/sample/scripting/scriptpad/nbproject/project.xml
new file mode 100644
index 0000000..32135c7
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/nbproject/project.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>Scriptpad</name>
+            <properties>
+                <property-file>user.build.properties</property-file>
+                <property-file>build.properties</property-file>
+                <property name="nbjdk.bootclasspath">${nbjdk.home}/jre/lib/rt.jar</property>
+            </properties>
+            <folders>
+                <source-folder>
+                    <label>JDK Demo</label>
+                    <location>${main.dir}</location>
+                </source-folder>
+                <source-folder>
+                    <label>Sources</label>
+                    <type>java</type>
+                    <location>${src.dir}</location>
+                </source-folder>
+                <build-folder>
+                    <location>${build.dir}</location>
+                </build-folder>
+            </folders>
+            <ide-actions>
+                <action name="build">
+                    <target>jar</target>
+                </action>
+                <action name="clean">
+                    <target>clean</target>
+                </action>
+                <action name="rebuild">
+                    <target>clean</target>
+                    <target>jar</target>
+                </action>
+                <action name="run">
+                    <target>run</target>
+                </action>
+                <action name="javadoc">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>show-javadoc</target>
+                </action>
+                <action name="debug">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                </action>
+                <action name="compile.single">
+                    <script>nbproject/file-targets.xml</script>
+                    <target>compile-selected</target>
+                    <context>
+                        <property>includes</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug-fix</target>
+                    <context>
+                        <property>class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+            </ide-actions>
+            <export>
+                <type>jar</type>
+                <location>${jar}</location>
+                <build-target>jar</build-target>
+                <clean-target>clean</clean-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="packages">
+                        <label>Sources</label>
+                        <location>${src.dir}</location>
+                    </source-folder>
+                    <source-file>
+                        <location>${main.dir}/README.txt</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <ide-action name="build"/>
+                    <ide-action name="rebuild"/>
+                    <ide-action name="clean"/>
+                    <ide-action name="javadoc"/>
+                    <separator/>
+                    <ide-action name="run"/>
+                    <ide-action name="debug"/>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/2">
+            <compilation-unit>
+                <package-root>${src.dir}</package-root>
+                <classpath mode="compile">${cp}</classpath>
+                <classpath mode="execute">${run.cp}</classpath>
+                <classpath mode="boot">${nbjdk.bootclasspath}</classpath>
+                <built-to>${classes.dir}</built-to>
+                <built-to>${jar}</built-to>
+                <javadoc-built-to>${javadoc.dir}</javadoc-built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+        </java-data>
+    </configuration>
+</project>
diff --git a/darwin-x86/sample/scripting/scriptpad/src/META-INF/manifest.mf b/darwin-x86/sample/scripting/scriptpad/src/META-INF/manifest.mf
new file mode 100644
index 0000000..76eda30
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/META-INF/manifest.mf
@@ -0,0 +1,2 @@
+Main-Class: com.sun.sample.scriptpad.Main
+
diff --git a/darwin-x86/sample/scripting/scriptpad/src/com/sun/sample/scriptpad/Main.java b/darwin-x86/sample/scripting/scriptpad/src/com/sun/sample/scriptpad/Main.java
new file mode 100644
index 0000000..aaeb58d
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/com/sun/sample/scriptpad/Main.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.sample.scriptpad;
+
+import javax.script.*;
+import java.io.*;
+
+/**
+ * This is the entry point of "Scriptpad" sample. This class creates
+ * ScriptEngine and evaluates few JavaScript "files" -- which are stored
+ * as resources (please refer to src/resources/*.js). Actual code for the
+ * scriptpad's main functionality lives in these JavaScript files.
+ */
+public class Main {
+    public static void main(String[] args) throws Exception {
+
+        // create a ScriptEngineManager
+        ScriptEngineManager m = new ScriptEngineManager();
+        // get an instance of JavaScript script engine
+        ScriptEngine engine = m.getEngineByName("js");
+
+        // expose the current script engine as a global variable
+        engine.put("engine", engine);
+
+        // evaluate few scripts that are bundled in "resources"
+        eval(engine, "conc.js");
+        eval(engine, "gui.js");
+        eval(engine, "scriptpad.js");
+        eval(engine, "mm.js");
+    }
+
+    private static void eval(ScriptEngine engine, String name)
+                            throws Exception {
+        /*
+         * This class is compiled into a jar file. The jar file
+         * contains few scripts under /resources URL.
+         */
+        InputStream is = Main.class.getResourceAsStream("/resources/" + name);
+        // current script file name for better error messages
+        engine.put(ScriptEngine.FILENAME, name);
+        // evaluate the script in the InputStream
+        engine.eval(new InputStreamReader(is));
+    }
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/src/resources/Main.js b/darwin-x86/sample/scripting/scriptpad/src/resources/Main.js
new file mode 100644
index 0000000..a1c332d
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/resources/Main.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script can be loaded in jrunscript to start scriptpad.
+ *
+ *    jrunscript -f Main.js -f -
+ */
+
+load("conc.js");
+load("gui.js");
+load("scriptpad.js");
+load("mm.js");
diff --git a/darwin-x86/sample/scripting/scriptpad/src/resources/conc.js b/darwin-x86/sample/scripting/scriptpad/src/resources/conc.js
new file mode 100644
index 0000000..aaca49a
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/resources/conc.js
@@ -0,0 +1,329 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * Concurrency utilities for JavaScript. These are based on
+ * java.lang and java.util.concurrent API. The following functions
+ * provide a simpler API for scripts. Instead of directly using java.lang
+ * and java.util.concurrent classes, scripts can use functions and
+ * objects exported from here.
+ */
+
+// shortcut for j.u.c lock classes
+var Lock = java.util.concurrent.locks.ReentrantLock;
+var RWLock = java.util.concurrent.locks.ReentrantReadWriteLock;
+
+// check if there is a build in sync function, define one if missing
+if (typeof sync === "undefined") {
+    var sync = function(func, obj) {
+        if (arguments.length < 1 || arguments.length > 2 ) {
+            throw "sync(function [,object]) parameter count mismatch";
+        }
+
+        var syncobj = (arguments.length == 2 ? obj : this);
+
+        if (!syncobj._syncLock) {
+            syncobj._syncLock = new Lock();
+        }
+
+        return function() {
+            syncobj._syncLock.lock();
+            try {
+                func.apply(null, arguments);
+            } finally {
+                syncobj._syncLock.unlock();
+            }
+        };
+    };
+    sync.docString = "synchronize a function, optionally on an object";
+}
+
+/**
+ * Wrapper for java.lang.Object.wait
+ *
+ * can be called only within a sync method
+ */
+function wait(object) {
+    var objClazz = java.lang.Class.forName('java.lang.Object');
+    var waitMethod = objClazz.getMethod('wait', null);
+    waitMethod.invoke(object, null);
+}
+wait.docString = "convenient wrapper for java.lang.Object.wait method";
+
+/**
+ * Wrapper for java.lang.Object.notify
+ *
+ * can be called only within a sync method
+ */
+function notify(object) {
+    var objClazz = java.lang.Class.forName('java.lang.Object');
+    var notifyMethod = objClazz.getMethod('notify', null);
+    notifyMethod.invoke(object, null);
+}
+notify.docString = "convenient wrapper for java.lang.Object.notify method";
+
+/**
+ * Wrapper for java.lang.Object.notifyAll
+ *
+ * can be called only within a sync method
+ */
+function notifyAll(object)  {
+    var objClazz = java.lang.Class.forName('java.lang.Object');
+    var notifyAllMethod = objClazz.getMethod('notifyAll', null);
+    notifyAllMethod.invoke(object, null);
+}
+notifyAll.docString = "convenient wrapper for java.lang.Object.notifyAll method";
+
+/**
+ * Creates a java.lang.Runnable from a given script
+ * function.
+ */
+Function.prototype.runnable = function() {
+    var args = arguments;
+    var func = this;
+    return new java.lang.Runnable() {
+        run: function() {
+            func.apply(null, args);
+        }
+    }
+};
+
+/**
+ * Executes the function on a new Java Thread.
+ */
+Function.prototype.thread = function() {
+    var t = new java.lang.Thread(this.runnable.apply(this, arguments));
+    t.start();
+    return t;
+};
+
+/**
+ * Executes the function on a new Java daemon Thread.
+ */
+Function.prototype.daemon = function() {
+    var t = new java.lang.Thread(this.runnable.apply(this, arguments));
+    t.setDaemon(true);
+    t.start();
+    return t;
+};
+
+/**
+ * Creates a java.util.concurrent.Callable from a given script
+ * function.
+ */
+Function.prototype.callable = function() {
+    var args = arguments;
+    var func = this;
+    return new java.util.concurrent.Callable() {
+          call: function() { return func.apply(null, args); }
+    }
+};
+
+/**
+ * Registers the script function so that it will be called exit.
+ */
+Function.prototype.atexit = function () {
+    var args = arguments;
+    java.lang.Runtime.getRuntime().addShutdownHook(
+         new java.lang.Thread(this.runnable.apply(this, args)));
+};
+
+/**
+ * Executes the function asynchronously.
+ *
+ * @return a java.util.concurrent.FutureTask
+ */
+Function.prototype.future = (function() {
+    // default executor for future
+    var juc = java.util.concurrent;
+    var theExecutor = juc.Executors.newSingleThreadExecutor();
+    // clean-up the default executor at exit
+    (function() { theExecutor.shutdown(); }).atexit();
+    return function() {
+        return theExecutor.submit(this.callable.apply(this, arguments));
+    };
+})();
+
+/**
+ * Executes a function after acquiring given lock. On return,
+ * (normal or exceptional), lock is released.
+ *
+ * @param lock lock that is locked and unlocked
+ */
+Function.prototype.sync = function (lock) {
+    if (arguments.length == 0) {
+        throw "lock is missing";
+    }
+    var res = new Array(arguments.length - 1);
+    for (var i = 0; i < res.length; i++) {
+        res[i] = arguments[i + 1];
+    }
+    lock.lock();
+    try {
+        this.apply(null, res);
+    } finally {
+        lock.unlock();
+    }
+};
+
+/**
+ * Causes current thread to sleep for specified
+ * number of milliseconds
+ *
+ * @param interval in milliseconds
+ */
+function sleep(interval) {
+    java.lang.Thread.sleep(interval);
+}
+sleep.docString = "wrapper for java.lang.Thread.sleep method";
+
+/**
+ * Schedules a task to be executed once in N milliseconds specified.
+ *
+ * @param callback function or expression to evaluate
+ * @param interval in milliseconds to sleep
+ * @return timeout ID (which is nothing but Thread instance)
+ */
+function setTimeout(callback, interval) {
+    if (! (callback instanceof Function)) {
+        callback = new Function(callback);
+    }
+
+    // start a new thread that sleeps given time
+    // and calls callback in an infinite loop
+    return (function() {
+         try {
+             sleep(interval);
+         } catch (x) { }
+         callback();
+    }).daemon();
+}
+setTimeout.docString = "calls given callback once after specified interval";
+
+/**
+ * Cancels a timeout set earlier.
+ * @param tid timeout ID returned from setTimeout
+ */
+function clearTimeout(tid) {
+    // we just interrupt the timer thread
+    tid.interrupt();
+}
+clearTimeout.docString = "interrupt a setTimeout timer";
+
+/**
+ * Schedules a task to be executed once in
+ * every N milliseconds specified.
+ *
+ * @param callback function or expression to evaluate
+ * @param interval in milliseconds to sleep
+ * @return timeout ID (which is nothing but Thread instance)
+ */
+function setInterval(callback, interval) {
+    if (! (callback instanceof Function)) {
+        callback = new Function(callback);
+    }
+
+    // start a new thread that sleeps given time
+    // and calls callback in an infinite loop
+    return (function() {
+         while (true) {
+             try {
+                 sleep(interval);
+             } catch (x) {
+                 break;
+             }
+             callback();
+         }
+    }).daemon();
+}
+setInterval.docString = "calls given callback every specified interval";
+
+/**
+ * Cancels a timeout set earlier.
+ * @param tid timeout ID returned from setTimeout
+ */
+function clearInterval(tid) {
+    // we just interrupt the timer thread
+    tid.interrupt();
+}
+clearInterval.docString = "interrupt a setInterval timer";
+
+/**
+ * Simple access to thread local storage.
+ *
+ * Script sample:
+ *
+ *  __thread.x = 44;
+ *  function f() {
+ *      __thread.x = 'hello';
+ *      print(__thread.x);
+ *  }
+ *  f.thread();       // prints 'hello'
+ * print(__thread.x); // prints 44 in main thread
+ */
+var __thread = (function () {
+    var map = new Object();
+    return new JSAdapter({
+        __has__: function(name) {
+            return map[name] != undefined;
+        },
+        __get__: function(name) {
+            if (map[name] != undefined) {
+                return map[name].get();
+            } else {
+                return undefined;
+            }
+        },
+        __put__: sync(function(name, value) {
+            if (map[name] == undefined) {
+                var tmp = new java.lang.ThreadLocal();
+                tmp.set(value);
+                map[name] = tmp;
+            } else {
+                map[name].set(value);
+            }
+        }),
+        __delete__: function(name) {
+            if (map[name] != undefined) {
+                map[name].set(null);
+            }
+        }
+    });
+})();
+
diff --git a/darwin-x86/sample/scripting/scriptpad/src/resources/gui.js b/darwin-x86/sample/scripting/scriptpad/src/resources/gui.js
new file mode 100644
index 0000000..d62b92f
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/resources/gui.js
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * Few user interface utilities.
+ */
+
+if (this.window === undefined) {
+    this.window = null;
+}
+
+/**
+ * Swing invokeLater - invokes given function in AWT event thread
+ */
+Function.prototype.invokeLater = function() {
+    var SwingUtilities = javax.swing.SwingUtilities;
+    var func = this;
+    var args = arguments;
+    SwingUtilities.invokeLater(new java.lang.Runnable() {
+                       run: function() {
+                           func.apply(func, args);
+                       }
+                  });
+};
+
+/**
+ * Swing invokeAndWait - invokes given function in AWT event thread
+ * and waits for it's completion
+ */
+Function.prototype.invokeAndWait = function() {
+    var SwingUtilities = javax.swing.SwingUtilities;
+    var func = this;
+    var args = arguments;
+    SwingUtilities.invokeAndWait(new java.lang.Runnable() {
+                       run: function() {
+                           func.apply(func, args);
+                       }
+                  });
+};
+
+/**
+ * Am I running in AWT event dispatcher thread?
+ */
+function isEventThread() {
+    var SwingUtilities = javax.swing.SwingUtilities;
+    return SwingUtilities.isEventDispatchThread();
+}
+isEventThread.docString = "returns whether the current thread is GUI thread";
+
+/**
+ * Opens a file dialog box
+ *
+ * @param curDir current directory [optional]
+ * @param save flag tells whether this is a save dialog or not
+ * @return selected file or else null
+ */
+function fileDialog(curDir, save) {
+    var result;
+    function _fileDialog() {
+        if (curDir == undefined) {
+            curDir = new java.io.File(".");
+        }
+
+        var JFileChooser = javax.swing.JFileChooser;
+        var dialog = new JFileChooser(curDir);
+        var res = save ? dialog.showSaveDialog(window):
+            dialog.showOpenDialog(window);
+
+        if (res == JFileChooser.APPROVE_OPTION) {
+           result = dialog.getSelectedFile();
+        } else {
+           result = null;
+        }
+    }
+
+    if (isEventThread()) {
+        _fileDialog();
+    } else {
+        _fileDialog.invokeAndWait();
+    }
+
+    return result;
+}
+fileDialog.docString = "show a file dialog box";
+
+/**
+ * Opens a color chooser dialog box
+ *
+ * @param title of the dialog box [optional]
+ * @param color default color [optional]
+ * @return chosen color or default color
+ */
+function colorDialog(title, color) {
+    var result;
+
+    function _colorDialog() {
+        if (title == undefined) {
+            title = "Choose Color";
+        }
+
+        if (color == undefined) {
+            color = java.awt.Color.BLACK;
+        }
+
+        var chooser = new javax.swing.JColorChooser();
+        var res = chooser.showDialog(window, title, color);
+        result = res ? res : color;
+    }
+
+    if (isEventThread()) {
+        _colorDialog();
+    } else {
+        _colorDialog.invokeAndWait();
+    }
+
+    return result;
+}
+colorDialog.docString = "shows a color chooser dialog box";
+
+/**
+ * Shows a message box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ * @param msgType type of message box [constants in JOptionPane]
+ */
+function msgBox(msg, title, msgType) {
+    function _msgBox() {
+        var JOptionPane = javax.swing.JOptionPane;
+        if (msg === undefined) msg = "undefined";
+        if (msg === null) msg = "null";
+        if (title == undefined) title = msg;
+        if (msgType == undefined) msgType = JOptionPane.INFORMATION_MESSAGE;
+        JOptionPane.showMessageDialog(window, msg, title, msgType);
+    }
+
+    if (isEventThread()) {
+        _msgBox();
+    } else {
+        _msgBox.invokeAndWait();
+    }
+}
+msgBox.docString = "shows MessageBox to the user";
+
+/**
+ * Shows an information alert box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ */
+function alert(msg, title) {
+    var JOptionPane = javax.swing.JOptionPane;
+    msgBox(msg, title, JOptionPane.INFORMATION_MESSAGE);
+}
+alert.docString = "shows an alert message box to the user";
+
+/**
+ * Shows an error alert box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ */
+function error(msg, title) {
+    var JOptionPane = javax.swing.JOptionPane;
+    msgBox(msg, title, JOptionPane.ERROR_MESSAGE);
+}
+error.docString = "shows an error message box to the user";
+
+/**
+ * Shows a warning alert box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ */
+function warn(msg, title) {
+    var JOptionPane = javax.swing.JOptionPane;
+    msgBox(msg, title, JOptionPane.WARNING_MESSAGE);
+}
+warn.docString = "shows a warning message box to the user";
+
+/**
+ * Shows a prompt dialog box
+ *
+ * @param question question to be asked
+ * @param answer default answer suggested [optional]
+ * @return answer given by user
+ */
+function prompt(question, answer) {
+    var result;
+    function _prompt() {
+        var JOptionPane = javax.swing.JOptionPane;
+        if (answer == undefined) answer = "";
+        result = JOptionPane.showInputDialog(window, question, answer);
+    }
+
+    if (isEventThread()) {
+        _prompt();
+    } else {
+        _prompt.invokeAndWait();
+    }
+
+    return result;
+}
+prompt.docString = "shows a prompt box to the user and returns the answer";
+
+/**
+ * Shows a confirmation dialog box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ * @return boolean (yes->true, no->false)
+ */
+function confirm(msg, title) {
+    var result;
+    var JOptionPane = javax.swing.JOptionPane;
+
+    function _confirm() {
+        if (title == undefined) title = msg;
+        var optionType = JOptionPane.YES_NO_OPTION;
+        result = JOptionPane.showConfirmDialog(window, msg, title, optionType);
+    }
+
+    if (isEventThread()) {
+        _confirm();
+    } else {
+        _confirm.invokeAndWait();
+    }
+
+    return result == JOptionPane.YES_OPTION;
+}
+confirm.docString = "shows a confirmation message box to the user";
+
+/**
+ * Exit the process after confirmation from user
+ *
+ * @param exitCode return code to OS [optional]
+ */
+function exit(exitCode) {
+    if (exitCode == undefined) exitCode = 0;
+    if (confirm("Do you really want to exit?")) {
+        java.lang.System.exit(exitCode);
+    }
+}
+exit.docString = "exits jconsole";
+
+// synonym to exit
+var quit = exit;
+
+// if echo function is not defined, define it as synonym
+// for println function
+if (this.echo == undefined) {
+    function echo(str) {
+        println(str);
+    }
+}
+
diff --git a/darwin-x86/sample/scripting/scriptpad/src/resources/mm.js b/darwin-x86/sample/scripting/scriptpad/src/resources/mm.js
new file mode 100644
index 0000000..07efad2
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/resources/mm.js
@@ -0,0 +1,339 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This is a collection of utilities for Monitoring
+ * and management API.
+ *
+ * File dependency:
+ *    conc.js -> for concurrency utilities
+ */
+
+// At any time, we maintain atmost one MBeanServer
+// connection. And so, we store the same as a global
+// variable.
+var mmConnection = null;
+
+function jmxConnect(hostport) {
+    if (mmConnection != null) {
+        // close the existing connection
+        try {
+            mmConnection.close();
+        } catch (e) {
+        }
+    }
+
+    var JMXServiceURL = javax.management.remote.JMXServiceURL;
+    var JMXConnectorFactory = javax.management.remote.JMXConnectorFactory;
+
+    var urlPath = "/jndi/rmi://" + hostport + "/jmxrmi";
+    var url = new JMXServiceURL("rmi", "", 0, urlPath);
+    var jmxc = JMXConnectorFactory.connect(url);
+    // note that the "mmConnection" is a global variable!
+    mmConnection = jmxc.getMBeanServerConnection();
+}
+jmxConnect.docString = "connects to the given host, port (specified as name:port)";
+
+function mbeanConnection() {
+    if (mmConnection == null) {
+        throw "Not connected to MBeanServer yet!";
+    }
+
+    return mmConnection;
+}
+mbeanConnection.docString = "returns the current MBeanServer connection";
+
+/**
+ * Returns a platform MXBean proxy for given MXBean name and interface class
+ */
+function newPlatformMXBeanProxy(name, intf) {
+    var factory = java.lang.management.ManagementFactory;
+    return factory.newPlatformMXBeanProxy(mbeanConnection(), name, intf);
+}
+newPlatformMXBeanProxy.docString = "returns a proxy for a platform MXBean";
+
+/**
+ * Wraps a string to ObjectName if needed.
+ */
+function objectName(objName) {
+    var ObjectName = Packages.javax.management.ObjectName;
+    if (objName instanceof ObjectName) {
+        return objName;
+    } else {
+        return new ObjectName(objName);
+    }
+}
+objectName.docString = "creates JMX ObjectName for a given String";
+
+/**
+ * Creates a new (M&M) Attribute object
+ *
+ * @param name name of the attribute
+ * @param value value of the attribute
+ */
+function attribute(name, value) {
+    var Attribute = Packages.javax.management.Attribute;
+    return new Attribute(name, value);
+}
+attribute.docString = "returns a new JMX Attribute using name and value given";
+
+/**
+ * Returns MBeanInfo for given ObjectName. Strings are accepted.
+ */
+function mbeanInfo(objName) {
+    objName = objectName(objName);
+    return mbeanConnection().getMBeanInfo(objName);
+}
+mbeanInfo.docString = "returns MBeanInfo of a given ObjectName";
+
+/**
+ * Returns ObjectInstance for a given ObjectName.
+ */
+function objectInstance(objName) {
+    objName = objectName(objName);
+    return mbeanConnection().objectInstance(objectName);
+}
+objectInstance.docString = "returns ObjectInstance for a given ObjectName";
+
+/**
+ * Queries with given ObjectName and QueryExp.
+ * QueryExp may be null.
+ *
+ * @return set of ObjectNames.
+ */
+function queryNames(objName, query) {
+    objName = objectName(objName);
+    if (query == undefined) query = null;
+    return mbeanConnection().queryNames(objName, query);
+}
+queryNames.docString = "returns QueryNames using given ObjectName and optional query";
+
+/**
+ * Queries with given ObjectName and QueryExp.
+ * QueryExp may be null.
+ *
+ * @return set of ObjectInstances.
+ */
+function queryMBeans(objName, query) {
+    objName = objectName(objName);
+    if (query == undefined) query = null;
+    return mbeanConnection().queryMBeans(objName, query);
+}
+queryMBeans.docString = "return MBeans using given ObjectName and optional query";
+
+// wraps a script array as java.lang.Object[]
+function objectArray(array) {
+    return Java.to(array, "java.lang.Object[]");
+}
+
+// wraps a script (string) array as java.lang.String[]
+function stringArray(array) {
+    return Java.to(array, "java.lang.String[]");
+}
+
+// script array to Java List
+function toAttrList(array) {
+    var AttributeList = Packages.javax.management.AttributeList;
+    if (array instanceof AttributeList) {
+        return array;
+    }
+    var list = new AttributeList(array.length);
+    for (var index = 0; index < array.length; index++) {
+        list.add(array[index]);
+    }
+    return list;
+}
+
+// Java Collection (Iterable) to script array
+function toArray(collection) {
+    if (collection instanceof Array) {
+        return collection;
+    }
+    var itr = collection.iterator();
+    var array = new Array();
+    while (itr.hasNext()) {
+        array[array.length] = itr.next();
+    }
+    return array;
+}
+
+// gets MBean attributes
+function getMBeanAttributes(objName, attributeNames) {
+    objName = objectName(objName);
+    return mbeanConnection().getAttributes(objName,stringArray(attributeNames));
+}
+getMBeanAttributes.docString = "returns specified Attributes of given ObjectName";
+
+// gets MBean attribute
+function getMBeanAttribute(objName, attrName) {
+    objName = objectName(objName);
+    return mbeanConnection().getAttribute(objName, attrName);
+}
+getMBeanAttribute.docString = "returns a single Attribute of given ObjectName";
+
+// sets MBean attributes
+function setMBeanAttributes(objName, attrList) {
+    objName = objectName(objName);
+    attrList = toAttrList(attrList);
+    return mbeanConnection().setAttributes(objName, attrList);
+}
+setMBeanAttributes.docString = "sets specified Attributes of given ObjectName";
+
+// sets MBean attribute
+function setMBeanAttribute(objName, attrName, attrValue) {
+    var Attribute = Packages.javax.management.Attribute;
+    objName = objectName(objName);
+    mbeanConnection().setAttribute(objName, new Attribute(attrName, attrValue));
+}
+setMBeanAttribute.docString = "sets a single Attribute of given ObjectName";
+
+// invokes an operation on given MBean
+function invokeMBean(objName, operation, params, signature) {
+    objName = objectName(objName);
+    params = objectArray(params);
+    signature = stringArray(signature);
+    return mbeanConnection().invoke(objName, operation, params, signature);
+}
+invokeMBean.docString = "invokes MBean operation on given ObjectName";
+
+/**
+ * Wraps a MBean specified by ObjectName as a convenient
+ * script object -- so that setting/getting MBean attributes
+ * and invoking MBean method can be done with natural syntax.
+ *
+ * @param objName ObjectName of the MBean
+ * @param async asynchornous mode [optional, default is false]
+ * @return script wrapper for MBean
+ *
+ * With async mode, all field, operation access is async. Results
+ * will be of type FutureTask. When you need value, call 'get' on it.
+ */
+function mbean(objName, async) {
+    var index;
+    objName = objectName(objName);
+    var info = mbeanInfo(objName);
+    var attrs = info.attributes;
+    var attrMap = new Object;
+    for (index in attrs) {
+        attrMap[attrs[index].name] = attrs[index];
+    }
+    var opers = info.operations;
+    var operMap = new Object;
+    for (index in opers) {
+        operMap[opers[index].name] = opers[index];
+    }
+
+    function isAttribute(name) {
+        return name in attrMap;
+    }
+
+    function isOperation(name) {
+        return name in operMap;
+    }
+
+    return new JSAdapter() {
+        __has__: function (name) {
+            return isAttribute(name) || isOperation(name);
+        },
+        __get__: function (name) {
+            if (isAttribute(name)) {
+                if (async) {
+                    return getMBeanAttribute.future(objName, name); 
+                } else {
+                    return getMBeanAttribute(objName, name); 
+                }
+            } else {
+                return undefined;
+            }
+        },
+        __call__: function(name) {
+            if (isOperation(name)) {
+                var oper = operMap[name];
+
+                var params = [];
+                for (var j = 1; j < arguments.length; j++) {
+                    params[j-1]= arguments[j];
+                }
+
+                var sigs = oper.signature;
+
+                var sigNames = new Array(sigs.length);
+                for (var index in sigs) {
+                    sigNames[index] = sigs[index].getType();
+                }
+
+                if (async) {
+                    return invokeMBean.future(objName, name, params, sigNames);
+                } else {
+                    return invokeMBean(objName, name, params, sigNames);
+                }
+            } else {
+                return undefined;
+            }
+        },
+        __put__: function (name, value) {
+            if (isAttribute(name)) {
+                if (async) {
+                    setMBeanAttribute.future(objName, name, value);
+                } else {
+                    setMBeanAttribute(objName, name, value);
+                }
+            } else {
+                return undefined;
+            }
+        }
+    };
+}
+mbean.docString = "returns a conveninent script wrapper for a MBean of given ObjectName";
+
+if (this.application != undefined) {
+    this.application.addTool("JMX Connect",
+        // connect to a JMX MBean Server
+        function () {
+            var url = prompt("Connect to JMX server (host:port)");
+            if (url != null) {
+                try {
+                    jmxConnect(url);
+                    alert("connected!");
+                } catch (e) {
+                    error(e, "Can not connect to " + url);
+                }
+            }
+        });
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/src/resources/scriptpad.js b/darwin-x86/sample/scripting/scriptpad/src/resources/scriptpad.js
new file mode 100644
index 0000000..807d05e
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/resources/scriptpad.js
@@ -0,0 +1,662 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script creates a simple Notepad-like interface, which
+ * serves as a simple script editor, runner.
+ *
+ * File dependency:
+ *
+ *    gui.js -> for basic GUI functions
+ */
+
+/*
+ * globalThis is used for actionHelpGlobals() and showFrame().
+ */
+var globalThis = this;
+
+/*
+ * JavaImporter helps in avoiding pollution of JavaScript
+ * global namespace. We can import multiple Java packages
+ * with this and use the JavaImporter object with "with"
+ * statement.
+ */
+var guiPkgs = new JavaImporter(java.awt, java.awt.event,
+                               javax.swing, javax.swing.undo,
+                               javax.swing.event, javax.swing.text);
+
+// main entry point of the scriptpad application
+var main = function() {
+    function createEditor() {
+        var c = new guiPkgs.JTextArea();
+        c.setDragEnabled(true);
+        c.setFont(new guiPkgs.Font("monospaced", guiPkgs.Font.PLAIN, 12));
+        return c;
+    }
+
+    /*const*/ var titleSuffix = "- Scriptpad";
+    /*const*/ var defaultTitle = "Untitled" + titleSuffix;
+
+    // Scriptpad's main frame
+    var frame;
+    // Scriptpad's main editor
+    var editor;
+
+    // To track the current file name
+    var curFileName = null;
+
+    // To track whether the current document
+    // has been modified or not
+    var docChanged = false;
+
+    // check and alert user for unsaved
+    // but modified document
+    function checkDocChanged() {
+        if (docChanged) {
+            // ignore zero-content untitled document
+            if (curFileName == null &&
+                editor.document.length == 0) {
+                return;
+            }
+
+            if (confirm("Do you want to save the changes?",
+                        "The document has changed")) {
+                actionSave();
+            }
+        }
+    }
+
+    // set a document listener to track
+    // whether that is modified or not
+    function setDocListener() {
+        var doc = editor.getDocument();
+        docChanged = false;
+        doc.addDocumentListener( new guiPkgs.DocumentListener() {
+                                     equals: function(o) {
+                                         return this === o; },
+                                     toString: function() {
+                                         return "doc listener"; },
+                                     changeUpdate: function() {
+                                         docChanged = true; },
+                                     insertUpdate: function() {
+                                         docChanged = true; },
+                                     removeUpdate: function() {
+                                         docChanged = true; }
+                                 });
+    }
+
+    // menu action functions
+
+    // "File" menu
+
+    // create a "new" document
+    function actionNew() {
+        checkDocChanged();
+        curFileName = null;
+        editor.setDocument(new guiPkgs.PlainDocument());
+        setDocListener();
+        frame.setTitle(defaultTitle);
+        editor.revalidate();
+    }
+
+    // open an existing file
+    function actionOpen() {
+        checkDocChanged();
+        var f = fileDialog();
+        if (f == null) {
+            return;
+        }
+
+        if (f.isFile() && f.canRead()) {
+            frame.setTitle(f.getName() + titleSuffix);
+            editor.setDocument(new guiPkgs.PlainDocument());
+            var progress = new guiPkgs.JProgressBar();
+            progress.setMinimum(0);
+            progress.setMaximum(f.length());
+            var doc = editor.getDocument();
+            var inp = new java.io.FileReader(f);
+            var buff = java.lang.reflect.Array.newInstance(
+                java.lang.Character.TYPE, 4096);
+            var nch;
+            while ((nch = inp.read(buff, 0, buff.length)) != -1) {
+                doc.insertString(doc.getLength(),
+                                 new java.lang.String(buff, 0, nch), null);
+                progress.setValue(progress.getValue() + nch);
+            }
+            inp.close();
+            curFileName = f.getAbsolutePath();
+            setDocListener();
+        } else {
+            error("Can not open file: " + f,
+                  "Error opening file: " + f);
+        }
+    }
+
+    // open script from a URL
+    function actionOpenURL() {
+        checkDocChanged();
+        var url = prompt("Address:");
+        if (url == null) {
+            return;
+        }
+
+        try {
+            var u = new java.net.URL(url);
+            editor.setDocument(new guiPkgs.PlainDocument());
+            frame.setTitle(url + titleSuffix);
+            var progress = new guiPkgs.JProgressBar();
+            progress.setMinimum(0);
+            progress.setIndeterminate(true);
+            var doc = editor.getDocument();
+            var inp = new java.io.InputStreamReader(u.openStream());
+            var buff = java.lang.reflect.Array.newInstance(
+                java.lang.Character.TYPE, 4096);
+            var nch;
+            while ((nch = inp.read(buff, 0, buff.length)) != -1) {
+                doc.insertString(doc.getLength(),
+                                 new java.lang.String(buff, 0, nch), null);
+                progress.setValue(progress.getValue() + nch);
+            }
+            curFileName = null;
+            setDocListener();
+        } catch (e) {
+            error("Error opening URL: " + e,
+                  "Can not open URL: " + url);
+        }
+    }
+
+    // factored out "save" function used by
+    // save, save as menu actions
+    function save(file) {
+        var doc = editor.getDocument();
+        frame.setTitle(file.getName() + titleSuffix);
+        curFileName = file;
+        var progress = new guiPkgs.JProgressBar();
+        progress.setMinimum(0);
+        progress.setMaximum(file.length());
+        var out = new java.io.FileWriter(file);
+        var text = new guiPkgs.Segment();
+        text.setPartialReturn(true);
+        var charsLeft = doc.getLength();
+        var offset = 0;
+        var min;
+
+        while (charsLeft > 0) {
+            doc.getText(offset, Math.min(4096, charsLeft), text);
+            out.write(text.array, text.offset, text.count);
+            charsLeft -= text.count;
+            offset += text.count;
+            progress.setValue(offset);
+            java.lang.Thread.sleep(10);
+        }
+
+        out.flush();
+        out.close();
+        docChanged = false;
+    }
+
+    // file-save as menu
+    function actionSaveAs() {
+        var ret = fileDialog(null, true);
+        if (ret == null) {
+            return;
+        }
+        save(ret);
+    }
+
+    // file-save menu
+    function actionSave() {
+        if (curFileName) {
+            save(new java.io.File(curFileName));
+        } else {
+            actionSaveAs();
+        }
+    }
+
+    // exit from scriptpad
+    function actionExit() {
+        checkDocChanged();
+        java.lang.System.exit(0);
+    }
+
+    // "Edit" menu
+
+    // cut the currently selected text
+    function actionCut() {
+        editor.cut();
+    }
+
+    // copy the currently selected text to clipboard
+    function actionCopy() {
+        editor.copy();
+    }
+
+    // paste clipboard content to document
+    function actionPaste() {
+        editor.paste();
+    }
+
+    // select all the text in editor
+    function actionSelectAll() {
+        editor.selectAll();
+    }
+
+    // "Tools" menu
+
+    // run the current document as JavaScript
+    function actionRun() {
+        var doc = editor.getDocument();
+        var script = doc.getText(0, doc.getLength());
+        var oldFile = engine.get(javax.script.ScriptEngine.FILENAME);
+        try {
+            if (engine == undefined) {
+                var m = new javax.script.ScriptEngineManager();
+                engine = m.getEngineByName("nashorn");
+            }
+            engine.put(javax.script.ScriptEngine.FILENAME, frame.title);
+            engine.eval(script, context);
+        } catch (e) {
+            error(e, "Script Error");
+            e.printStackTrace();
+        } finally {
+            engine.put(javax.script.ScriptEngine.FILENAME, oldFile);
+        }
+    }
+
+    // "Examples" menu
+
+    // show given script as new document
+    function showScript(title, str) {
+        actionNew();
+        frame.setTitle("Example - " + title + titleSuffix);
+        var doc = editor.document;
+        doc.insertString(0, str, null);
+    }
+
+    // "hello world"
+    function actionHello() {
+        showScript(actionEval.title,
+                   "alert('Hello, world');");
+    }
+    actionHello.title = "Hello, World";
+
+    // eval the "hello world"!
+    function actionEval() {
+        showScript(actionEval.title,
+                   "eval(\"alert('Hello, world')\");");
+    }
+    actionEval.title = "Eval";
+
+    // show how to access Java static methods
+    function actionJavaStatic() {
+        showScript(arguments.callee.title,
+                   "// Just use Java syntax\n" +
+                   "var props = java.lang.System.getProperties();\n" +
+                   "alert(props.get('os.name'));");
+    }
+    actionJavaStatic.title = "Java Static Calls";
+
+    // show how to access Java classes, methods
+    function actionJavaAccess() {
+        showScript(arguments.callee.title,
+                   "// just use new JavaClass();\n" +
+                   "var fr = new javax.swing.JFrame();\n" +
+                   "// call all public methods as in Java\n" +
+                   "fr.setTitle('hello');\n" +
+                   "fr.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);\n" +
+                   "fr.setSize(200, 200);\n" +
+                   "fr.setVisible(true);");
+    }
+    actionJavaAccess.title = "Java Object Access";
+
+    // show how to use Java bean conventions
+    function actionJavaBean() {
+        showScript(arguments.callee.title,
+                   "var fr = new javax.swing.JFrame();\n" +
+                   "fr.setSize(200, 200);\n" +
+                   "// access public get/set methods as fields\n" +
+                   "fr.defaultCloseOperation = javax.swing.WindowConstants.DISPOSE_ON_CLOSE;\n" +
+                   "fr.title = 'hello';\n" +
+                   "fr.visible = true;");
+    }
+    actionJavaBean.title = "Java Beans";
+
+    // show how to implement Java interface
+    function actionJavaInterface() {
+        showScript(arguments.callee.title,
+                   "// use Java anonymizer class-like syntax!\n" +
+                   "var r = new java.lang.Runnable() {\n" +
+                   "            run: function() {\n" +
+                   "                    alert('hello');\n" +
+                   "            }\n" +
+                   "    };\n" +
+                   "// use the above Runnable to create a Thread\n" +
+                   "new java.lang.Thread(r).start();\n" +
+                   "// For simple one method interfaces, just pass script function\n" +
+                   "new java.lang.Thread(function() { alert('world'); }).start();");
+    }
+    actionJavaInterface.title = "Java Interfaces";
+
+    // show how to import Java classes, packages
+    function actionJavaImport() {
+        showScript(arguments.callee.title,
+                   "// use Java-like import *...\n" +
+                   "//    importPackage(java.io);\n" +
+                   "// or import a specific class\n" +
+                   "//    importClass(java.io.File);\n" +
+                   "// or better - import just within a scope!\n" +
+                   "var ioPkgs = JavaImporter(java.io);\n" +
+                   "with (ioPkgs) { alert(new File('.').absolutePath); }");
+    }
+    actionJavaImport.title = "Java Import";
+
+    // "Help" menu
+
+    /*
+     * Shows a one liner help message for each
+     * global function. Note that this function
+     * depends on docString meta-data for each
+     * function.
+     */
+    function actionHelpGlobals() {
+        var names = new java.util.ArrayList();
+        for (var i in globalThis) {
+            var func = globalThis[i];
+            if (typeof(func) == "function" &&
+                ("docString" in func)) {
+                names.add(i);
+            }
+        }
+        java.util.Collections.sort(names);
+        var helpDoc = new java.lang.StringBuffer();
+        helpDoc.append("<table border='1'>");
+        var itr = names.iterator();
+        while (itr.hasNext()) {
+            var name = itr.next();
+            helpDoc.append("<tr><td>");
+            helpDoc.append(name);
+            helpDoc.append("</td><td>");
+            helpDoc.append(globalThis[name].docString);
+            helpDoc.append("</td></tr>");
+        }
+        helpDoc.append("</table>");
+
+        var helpEditor = new guiPkgs.JEditorPane();
+        helpEditor.setContentType("text/html");
+        helpEditor.setEditable(false);
+        helpEditor.setText(helpDoc.toString());
+
+        var scroller = new guiPkgs.JScrollPane();
+        var port = scroller.getViewport();
+        port.add(helpEditor);
+
+        var helpFrame = new guiPkgs.JFrame("Help - Global Functions");
+        helpFrame.getContentPane().add("Center", scroller);
+        helpFrame.setDefaultCloseOperation(guiPkgs.WindowConstants.DISPOSE_ON_CLOSE);
+        helpFrame.pack();
+        helpFrame.setSize(500, 600);
+        helpFrame.setVisible(true);
+    }
+
+    // show a simple about message for scriptpad
+    function actionAbout() {
+        alert("Scriptpad\nVersion 1.1", "Scriptpad");
+    }
+
+    /*
+     * This data is used to construct menu bar.
+     * This way adding a menu is easier. Just add
+     * top level menu or add an item to an existing
+     * menu. "action" should be a function that is
+     * called back on clicking the correponding menu.
+     */
+    var menuData = [
+        {
+            menu: "File",
+            items: [
+                { name: "New",  action: actionNew , accel: guiPkgs.KeyEvent.VK_N },
+                { name: "Open...", action: actionOpen, accel: guiPkgs.KeyEvent.VK_O },
+                { name: "Open URL...", action: actionOpenURL, accel: guiPkgs.KeyEvent.VK_U },
+                { name: "Save", action: actionSave, accel: guiPkgs.KeyEvent.VK_S },
+                { name: "Save As...", action: actionSaveAs },
+                { name: "-" },
+                { name: "Exit", action: actionExit, accel: guiPkgs.KeyEvent.VK_Q }
+            ]
+        },
+
+        {
+            menu: "Edit",
+            items: [
+                { name: "Cut", action: actionCut, accel: guiPkgs.KeyEvent.VK_X },
+                { name: "Copy", action: actionCopy, accel: guiPkgs.KeyEvent.VK_C },
+                { name: "Paste", action: actionPaste, accel: guiPkgs.KeyEvent.VK_V },
+                { name: "-" },
+                { name: "Select All", action: actionSelectAll, accel: guiPkgs.KeyEvent.VK_A }
+            ]
+        },
+
+        {
+            menu: "Tools",
+            items: [
+                { name: "Run", action: actionRun, accel: guiPkgs.KeyEvent.VK_R }
+            ]
+        },
+
+        {
+            menu: "Examples",
+            items: [
+                { name: actionHello.title, action: actionHello },
+                { name: actionEval.title, action: actionEval },
+                { name: actionJavaStatic.title, action: actionJavaStatic },
+                { name: actionJavaAccess.title, action: actionJavaAccess },
+                { name: actionJavaBean.title, action: actionJavaBean },
+                { name: actionJavaInterface.title, action: actionJavaInterface },
+                { name: actionJavaImport.title, action: actionJavaImport }
+            ]
+        },
+
+        {
+            menu: "Help",
+            items: [
+                { name: "Global Functions", action: actionHelpGlobals },
+                { name: "-" },
+                { name: "About Scriptpad", action: actionAbout }
+            ]
+        }
+    ];
+
+    function setMenuAccelerator(mi, accel) {
+        var keyStroke = guiPkgs.KeyStroke.getKeyStroke(accel,
+                                                       guiPkgs.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+        mi.setAccelerator(keyStroke);
+    }
+
+    // create a menubar using the above menu data
+    function createMenubar() {
+        var mb = new guiPkgs.JMenuBar();
+        for (var m in menuData) {
+            var items = menuData[m].items;
+            var menu = new guiPkgs.JMenu(menuData[m].menu);
+
+            for (var i in items) {
+                if (items[i].name.equals("-")) {
+                    menu.addSeparator();
+                } else {
+                    var mi = new guiPkgs.JMenuItem(items[i].name);
+                    var action = items[i].action;
+                    mi.addActionListener(action);
+                    var accel = items[i].accel;
+                    if (accel) {
+                        setMenuAccelerator(mi, accel);
+                    }
+                    menu.add(mi);
+                }
+	        }
+
+	        mb.add(menu);
+        }
+
+        return mb;
+    }
+
+    // function to add a new menu item under "Tools" menu
+    function addTool(menuItem, action, accel) {
+        if (typeof(action) != "function") {
+            return;
+        }
+
+        var toolsIndex = -1;
+        // find the index of the "Tools" menu
+        for (var i in menuData) {
+            if (menuData[i].menu.equals("Tools")) {
+                toolsIndex = i;
+                break;
+            }
+        }
+        if (toolsIndex == -1) {
+            return;
+        }
+        var toolsMenu = frame.getJMenuBar().getMenu(toolsIndex);
+        var mi = new guiPkgs.JMenuItem(menuItem);
+        mi.addActionListener(action);
+        if (accel) {
+            setMenuAccelerator(mi, accel);
+        }
+        toolsMenu.add(mi);
+    }
+
+    // create Scriptpad frame
+    function createFrame() {
+        frame = new guiPkgs.JFrame();
+        frame.setTitle(defaultTitle);
+        frame.setBackground(guiPkgs.Color.lightGray);
+        frame.getContentPane().setLayout(new guiPkgs.BorderLayout());
+
+        // create notepad panel
+        var notepad = new guiPkgs.JPanel();
+        notepad.setBorder(guiPkgs.BorderFactory.createEtchedBorder());
+        notepad.setLayout(new guiPkgs.BorderLayout());
+
+        // create editor
+        editor = createEditor();
+        var scroller = new guiPkgs.JScrollPane();
+        var port = scroller.getViewport();
+        port.add(editor);
+
+        // add editor to notepad panel
+        var panel = new guiPkgs.JPanel();
+        panel.setLayout(new guiPkgs.BorderLayout());
+        panel.add("Center", scroller);
+        notepad.add("Center", panel);
+
+        // add notepad panel to frame
+        frame.getContentPane().add("Center", notepad);
+
+        // set menu bar to frame and show the frame
+        frame.setJMenuBar(createMenubar());
+        frame.setDefaultCloseOperation(guiPkgs.JFrame.EXIT_ON_CLOSE);
+        frame.pack();
+        frame.setSize(500, 600);
+    }
+
+    // show Scriptpad frame
+    function showFrame() {
+        // set global variable by the name "window"
+        globalThis.window = frame;
+
+        // open new document
+        actionNew();
+
+        frame.setVisible(true);
+    }
+
+    // create and show Scriptpad frame
+    createFrame();
+    showFrame();
+
+    /*
+     * Application object has two fields "frame", "editor"
+     * which are current JFrame and editor and a method
+     * called "addTool" to add new menu item to "Tools" menu.
+     */
+    return {
+        frame: frame,
+        editor: editor,
+        addTool: addTool
+    };
+};
+
+/*
+ * Call the main and store Application object
+ * in a global variable named "application".
+ */
+var application = main();
+
+if (this.load == undefined) {
+    function load(file) {
+        var ioPkgs = new JavaImporter(java.io);
+        with (ioPkgs) {
+            var stream = new FileInputStream(file);
+            var bstream = new BufferedInputStream(stream);
+            var reader = new BufferedReader(new InputStreamReader(bstream));
+            var oldFilename = engine.get(engine.FILENAME);
+            engine.put(engine.FILENAME, file);
+            try {
+                engine.eval(reader, context);
+            } finally {
+                engine.put(engine.FILENAME, oldFilename);
+            }
+            stream.close();
+        }
+    }
+    load.docString = "loads the given script file";
+}
+
+/*
+ * Load user specific init file under home dir, if found.
+ */
+function loadUserInit() {
+    var home = java.lang.System.getProperty("user.home");
+    var f = new java.io.File(home, "scriptpad.js");
+    if (f.exists()) {
+        engine.eval(new java.io.FileReader(f));
+    }
+}
+
+loadUserInit();
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/README.txt b/darwin-x86/sample/scripting/scriptpad/src/scripts/README.txt
new file mode 100644
index 0000000..72e162d
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/README.txt
@@ -0,0 +1,52 @@
+Sample scripts:
+
+(1) browse.js 
+
+ -- Open and run this script in scriptpad. You will see 
+    Tools->Browse menu. Using this you can start your
+    desktop default browser with the given URL.
+
+(2) insertfile.js
+
+ -- Open and run this script in scriptpad. You will see 
+    "Tools->Insert File..." menu. Using this you can start 
+    insert content of a selected file into currently
+    edited document
+
+(3) linewrap.js
+
+ -- Open and run this script in scriptpad. You will see 
+    "Tools->Line Wrap" menu. Using this you can toggle
+    the line wrapping mode of the editor
+
+(4) mail.js
+
+ -- Open and run this script in scriptpad. You will see 
+    Tools->Mail menu. Using this you can start your
+    desktop default mail client with the given "To" mail id.
+
+(5) memmonitor.js
+
+ -- This is a simple Monitoring & Management script. To use this,
+    you need an application to monitor. You can use memory.bat
+    or memory.sh in the current directory to start an application
+    that will be monitored. After that please follow these steps:
+
+   1. Start the target application using memory.sh or memory.bat
+   2. Start scriptpad 
+   3. Use "Tools->JMX Connect" menu and specify "localhost:1090"
+      to connect
+   4. Open "memmonitor.js" and run it (using "Tools->Run")       
+      in scriptpad
+   5. A new "Tools-Memory Monitor" menu appears. Use this menu
+      and specify 4 and 500 as threshold and interval values.
+   6. In the target application shell (where memory.bat/.sh was
+      started), enter an integer value and press "enter".
+   7. You'll see an alert box from scriptpad -- alerting you for
+      memory threshold exceeded!
+
+(6) textcolor.js
+
+ -- Open and run this script in scriptpad. You will see 
+    "Tools->Selected Text Color..." menu. Using this you
+    change the color of "selected text" in the editor.
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/browse.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/browse.js
new file mode 100644
index 0000000..fbe50e1
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/browse.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This function uses new Swing Desktop API in JDK 6.
+ * To use this with scriptpad, open this in scriptpad
+ * and use "Tools->Run Script" menu.
+ */
+function browse() {
+    var desktop = null;
+    // Before more Desktop API is used, first check
+    // whether the API is supported by this particular
+    // virtual machine (VM) on this particular host.
+    if (java.awt.Desktop.isDesktopSupported()) {
+        desktop = java.awt.Desktop.getDesktop();
+    } else {
+        alert("no desktop support");
+        return;
+    }
+
+    if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {
+        var url = prompt("Address:");
+        if (url != null) {
+            desktop.browse(new java.net.URI(url));
+        }
+    } else {
+        alert("no browser support");
+    }
+}
+
+if (this.application != undefined) {
+    // add "Browse" menu item under "Tools" menu
+    this.application.addTool("Browse", browse);
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/insertfile.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/insertfile.js
new file mode 100644
index 0000000..07a7ac2
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/insertfile.js
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script adds "Insert File" mode menu item to "Tools" menu.
+ * When selected, this menu shows a file dialog box and inserts
+ * contents of the selected file into current document (at the
+ * current caret position).
+ */
+if (this.application) {
+    application.addTool("Insert File...",
+        function() {
+            var file = fileDialog();
+
+            if (file) {
+                var reader = new java.io.FileReader(file);
+                var arr = java.lang.reflect.Array.newInstance(
+                      java.lang.Character.TYPE, 8*1024); // 8K at a time
+                var buf = new java.lang.StringBuffer();
+                var numChars;
+
+                while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
+                    buf.append(arr, 0, numChars);
+                }
+
+                var pos = application.editor.caretPosition;
+                var doc = application.editor.document;
+
+                doc.insertString(pos, buf.toString(), null);
+           }
+        });
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/linewrap.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/linewrap.js
new file mode 100644
index 0000000..989473a
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/linewrap.js
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script adds "Line Wrap" mode menu item to "Tools" menu.
+ * When selected, this menu toggles the current word wrap mode
+ * of the editor.
+ */
+
+function toggleLineWrap() {
+    var wrap = application.editor.lineWrap;
+    application.editor.lineWrap = !wrap;
+}
+
+application.addTool("Line Wrap",  toggleLineWrap);
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/mail.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/mail.js
new file mode 100644
index 0000000..cabe5c4
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/mail.js
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This function uses new Swing Desktop API in JDK 6.
+ * To use this with scriptpad, open this in scriptpad
+ * and use "Tools->Run Script" menu.
+ */
+function mail() {
+    var desktop = null;
+    // Before more Desktop API is used, first check
+    // whether the API is supported by this particular
+    // virtual machine (VM) on this particular host.
+    if (java.awt.Desktop.isDesktopSupported()) {
+        desktop = java.awt.Desktop.getDesktop();
+    } else {
+        alert("no desktop support");
+        return;
+    }
+
+    if (desktop.isSupported(java.awt.Desktop.Action.MAIL)) {
+        var mailTo = prompt("Mail To:");
+        if (mailTo != null) {
+            desktop.mail(new java.net.URI("mailto", mailTo, null));
+        }
+    }
+}
+
+if (this.application != undefined) {
+    // add "Mail" menu item under "Tools" menu
+    this.application.addTool("Mail", mail);
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/memmonitor.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/memmonitor.js
new file mode 100644
index 0000000..0744e30
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/memmonitor.js
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+// this checker function runs asynchronously
+function memoryChecker(memoryBean, threshold, interval) {
+    while (true) {
+        var memUsage = memoryBean.HeapMemoryUsage;
+        var usage = memUsage.get("used") / (1024 * 1024);
+
+        println("usage: " + usage);
+
+        if (usage > threshold) {
+            alert("Hey! heap usage threshold exceeded!");
+            // after first alert just return.
+            return;
+        }
+
+        java.lang.Thread.sleep(interval);
+    }
+}
+
+// add "Tools->Memory Monitor" menu item
+if (this.application != undefined) {
+    this.application.addTool("Memory Monitor",
+        function () {
+            // show threshold box with default of 50 MB
+            var threshold = prompt("Threshold (mb)", 50);
+
+            // show interval box with default of 1000 millisec.
+            var interval = prompt("Sample Interval (ms):", 1000);
+            var memoryBean = mbean("java.lang:type=Memory");
+
+            // ".future" makes the function to be called
+            // asynchronously in a separate thread.
+            memoryChecker.future(memoryBean, threshold, interval);
+        });
+}
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.bat b/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.bat
new file mode 100644
index 0000000..9478c09
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.bat
@@ -0,0 +1,35 @@
+@echo off
+REM
+REM Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+REM
+REM Redistribution and use in source and binary forms, with or without
+REM modification, are permitted provided that the following conditions
+REM are met:
+REM
+REM   - Redistributions of source code must retain the above copyright
+REM     notice, this list of conditions and the following disclaimer.
+REM
+REM   - Redistributions in binary form must reproduce the above copyright
+REM     notice, this list of conditions and the following disclaimer in the
+REM     documentation and/or other materials provided with the distribution.
+REM
+REM   - Neither the name of Oracle nor the names of its
+REM     contributors may be used to endorse or promote products derived
+REM     from this software without specific prior written permission.
+REM
+REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+REM IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+REM THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+REM PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+REM CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+REM EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+REM PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+REM PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+REM LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+REM NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+REM SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+REM
+
+
+jrunscript -J-Dcom.sun.management.jmxremote.port=1090 -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false memory.js
+
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.js
new file mode 100644
index 0000000..b8252fb
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.js
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script serves as a simple "monitored application".
+ * Start this script using memory.bat or memory.sh in the
+ * current directory.
+ */
+
+java.lang.System.out.print("Enter a number and press enter:");
+var input = java.lang.System["in"].read();
+
+// allocate an integer array of "big enough" size!
+var a = java.lang.reflect.Array.newInstance(
+    java.lang.Integer.TYPE, input * 1024 * 1024);
+
+// sleep some time...
+java.lang.Thread.sleep(10*60*1000);
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.sh b/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.sh
new file mode 100644
index 0000000..8da155b
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/memory.sh
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   - Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   - Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+#   - Neither the name of Oracle nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+jrunscript -J-Dcom.sun.management.jmxremote.port=1090 -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false memory.js
diff --git a/darwin-x86/sample/scripting/scriptpad/src/scripts/textcolor.js b/darwin-x86/sample/scripting/scriptpad/src/scripts/textcolor.js
new file mode 100644
index 0000000..b9d86cc
--- /dev/null
+++ b/darwin-x86/sample/scripting/scriptpad/src/scripts/textcolor.js
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script adds "Selected Text Color" menu item to "Tools" menu.
+ * When selected, this menu changes the "selected text" color.
+ */
+if (this.application) {
+    application.addTool("Selected Text Color...",
+        function() {
+            var color = application.editor.selectedTextColor;
+            color = colorDialog("Selected Text Color", color);
+            application.editor.selectedTextColor = color;
+        });
+}
diff --git a/darwin-x86/sample/try-with-resources/index.html b/darwin-x86/sample/try-with-resources/index.html
new file mode 100644
index 0000000..ff237d8
--- /dev/null
+++ b/darwin-x86/sample/try-with-resources/index.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+    <title>Try-with-Resources Feature Demo</title>
+</head>
+<body>
+<h2>Try-with-Resources Feature Demo</h2>
+
+<p>
+    This demo shows how to use the try-with-resources feature introduced in JDK7.
+</p>
+
+<ul>
+    <li><h3>Custom AutoCloseable.</h3>
+
+        <p>
+            Shows how to use a custom resource with the try-with-resources construct.
+            For more information, see the source file.
+        </p>
+        Source: <a href="src/CustomAutoCloseableSample.java">src/CustomAutoCloseableSample.java</a>
+
+    <li><h3>Unzip</h3>
+
+        <p>
+            Extracts archived files. For more information, see the source file.
+        </p>
+        Source: <a href="src/Unzip.java">src/Unzip.java</a>
+    <li><h3>ZipCat</h3>
+
+        <p>Prints data about a specified file from an archive. For more information, see the source file.</p>
+        Source: <a href="src/ZipCat.java">src/ZipCat.java</a>
+
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/darwin-x86/sample/try-with-resources/src/CustomAutoCloseableSample.java b/darwin-x86/sample/try-with-resources/src/CustomAutoCloseableSample.java
new file mode 100644
index 0000000..9bbe09a
--- /dev/null
+++ b/darwin-x86/sample/try-with-resources/src/CustomAutoCloseableSample.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/**
+ * This sample demonstrates the ability to create custom resource that
+ * implements the {@code AutoCloseable} interface. This resource can be used in
+ * the try-with-resources construct.
+ */
+public class CustomAutoCloseableSample {
+
+    /**
+     * The main method for the CustomAutoCloseableSample program.
+     *
+     * @param args is not used.
+     */
+    public static void main(String[] args) {
+        /*
+         * TeeStream will be closed automatically after the try block.
+         */
+        try (TeeStream teeStream = new TeeStream(System.out, Paths.get("out.txt"));
+             PrintStream out = new PrintStream(teeStream)) {
+            out.print("Hello, world");
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    /**
+     * Passes the output through to the specified output stream while copying it into a file.
+     * The TeeStream functionality is similar to the Unix tee utility.
+     * TeeStream implements AutoCloseable interface. See OutputStream for details.
+     */
+    public static class TeeStream extends OutputStream {
+
+        private final OutputStream fileStream;
+        private final OutputStream outputStream;
+
+        /**
+         * Creates a TeeStream.
+         *
+         * @param outputStream an output stream.
+         * @param outputFile   an path to file.
+         * @throws IOException If an I/O error occurs.
+         */
+        public TeeStream(OutputStream outputStream, Path outputFile) throws IOException {
+            this.fileStream = new BufferedOutputStream(Files.newOutputStream(outputFile));
+            this.outputStream = outputStream;
+        }
+
+        /**
+         * Writes the specified byte to the specified output stream
+         * and copies it to the file.
+         *
+         * @param b the byte to be written.
+         * @throws IOException If an I/O error occurs.
+         */
+        @Override
+        public void write(int b) throws IOException {
+            fileStream.write(b);
+            outputStream.write(b);
+        }
+
+        /**
+         * Flushes this output stream and forces any buffered output bytes
+         * to be written out.
+         * The <code>flush</code> method of <code>TeeStream</code> flushes
+         * the specified output stream and the file output stream.
+         *
+         * @throws IOException if an I/O error occurs.
+         */
+        @Override
+        public void flush() throws IOException {
+            outputStream.flush();
+            fileStream.flush();
+        }
+
+        /**
+         * Closes underlying streams and resources.
+         * The external output stream won't be closed.
+         * This method is the member of AutoCloseable interface and
+         * it will be invoked automatically after the try-with-resources block.
+         *
+         * @throws IOException If an I/O error occurs.
+         */
+        @Override
+        public void close() throws IOException {
+            try (OutputStream file = fileStream) {
+                flush();
+            }
+        }
+    }
+}
diff --git a/darwin-x86/sample/try-with-resources/src/Unzip.java b/darwin-x86/sample/try-with-resources/src/Unzip.java
new file mode 100644
index 0000000..d75eba5
--- /dev/null
+++ b/darwin-x86/sample/try-with-resources/src/Unzip.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.*;
+
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+
+/**
+ * Extract (unzip) a file to the current directory.
+ */
+public class Unzip {
+
+    /**
+     * The main method for the Unzip program. Run the program with an empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for {@code Unzip}.
+     */
+    public static void main(String[] args) {
+        if (args.length != 1) {
+            System.out.println("Usage: Unzip zipfile");
+        }
+        final Path destDir = Paths.get(".");
+        /*
+         * Create AutoCloseable FileSystem. It will be closed automatically
+         * after the try block.
+         */
+        try (FileSystem zipFileSystem = FileSystems.newFileSystem(Paths.get(args[0]), null)) {
+
+            Path top = zipFileSystem.getPath("/");
+            Files.walk(top).skip(1).forEach(file -> {
+                Path target = destDir.resolve(top.relativize(file).toString());
+                System.out.println("Extracting " + target);
+                try {
+                    Files.copy(file, target, REPLACE_EXISTING);
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
+            });
+        } catch (UncheckedIOException | IOException e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+}
diff --git a/darwin-x86/sample/try-with-resources/src/ZipCat.java b/darwin-x86/sample/try-with-resources/src/ZipCat.java
new file mode 100644
index 0000000..4bbf513
--- /dev/null
+++ b/darwin-x86/sample/try-with-resources/src/ZipCat.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * Prints data of the specified file to standard output from a zip archive.
+ */
+public class ZipCat {
+
+    /**
+     * The main method for the ZipCat program. Run the program with an empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for ZipCat
+     */
+    public static void main(String[] args) {
+        if (args.length != 2) {
+            System.out.println("Usage: ZipCat zipfile fileToPrint");
+        }
+        /*
+         * Creates AutoCloseable FileSystem and BufferedReader.
+         * They will be closed automatically after the try block.
+         * If reader initialization fails, then zipFileSystem will be closed
+         * automatically.
+         */
+        try (FileSystem zipFileSystem
+                = FileSystems.newFileSystem(Paths.get(args[0]),null);
+                InputStream input
+                = Files.newInputStream(zipFileSystem.getPath(args[1]))) {
+                    byte[] buffer = new byte[1024];
+                    int len;
+                    while ((len = input.read(buffer)) != -1) {
+                        System.out.write(buffer, 0, len);
+                    }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+}
diff --git a/darwin-x86/src.zip b/darwin-x86/src.zip
index 27b4758..7a42e91 100644
--- a/darwin-x86/src.zip
+++ b/darwin-x86/src.zip
Binary files differ
diff --git a/linux-x86/bin/appletviewer b/linux-x86/bin/appletviewer
index 3037b58..c679764 100755
--- a/linux-x86/bin/appletviewer
+++ b/linux-x86/bin/appletviewer
Binary files differ
diff --git a/linux-x86/bin/extcheck b/linux-x86/bin/extcheck
index 570c740..a718d20 100755
--- a/linux-x86/bin/extcheck
+++ b/linux-x86/bin/extcheck
Binary files differ
diff --git a/linux-x86/bin/idlj b/linux-x86/bin/idlj
index 101af1e..425d2f3 100755
--- a/linux-x86/bin/idlj
+++ b/linux-x86/bin/idlj
Binary files differ
diff --git a/linux-x86/bin/jar b/linux-x86/bin/jar
index 92629d0..bf81422 100755
--- a/linux-x86/bin/jar
+++ b/linux-x86/bin/jar
Binary files differ
diff --git a/linux-x86/bin/jarsigner b/linux-x86/bin/jarsigner
index 959c2f2..1243662 100755
--- a/linux-x86/bin/jarsigner
+++ b/linux-x86/bin/jarsigner
Binary files differ
diff --git a/linux-x86/bin/java b/linux-x86/bin/java
index 0be5831..7c05167 100755
--- a/linux-x86/bin/java
+++ b/linux-x86/bin/java
Binary files differ
diff --git a/linux-x86/bin/javac b/linux-x86/bin/javac
index d2b4f80..d8b0846 100755
--- a/linux-x86/bin/javac
+++ b/linux-x86/bin/javac
Binary files differ
diff --git a/linux-x86/bin/javadoc b/linux-x86/bin/javadoc
index c688946..72d0fc4 100755
--- a/linux-x86/bin/javadoc
+++ b/linux-x86/bin/javadoc
Binary files differ
diff --git a/linux-x86/bin/javah b/linux-x86/bin/javah
index c90b17e..15db415 100755
--- a/linux-x86/bin/javah
+++ b/linux-x86/bin/javah
Binary files differ
diff --git a/linux-x86/bin/javap b/linux-x86/bin/javap
index 3a01f00..9fd39b5 100755
--- a/linux-x86/bin/javap
+++ b/linux-x86/bin/javap
Binary files differ
diff --git a/linux-x86/bin/jcmd b/linux-x86/bin/jcmd
index b0df76e..9fc7297 100755
--- a/linux-x86/bin/jcmd
+++ b/linux-x86/bin/jcmd
Binary files differ
diff --git a/linux-x86/bin/jconsole b/linux-x86/bin/jconsole
index 0fd68c3..5e69ace 100755
--- a/linux-x86/bin/jconsole
+++ b/linux-x86/bin/jconsole
Binary files differ
diff --git a/linux-x86/bin/jdb b/linux-x86/bin/jdb
index 74c4b32..e9088e7 100755
--- a/linux-x86/bin/jdb
+++ b/linux-x86/bin/jdb
Binary files differ
diff --git a/linux-x86/bin/jdeps b/linux-x86/bin/jdeps
index 64ccdc3..d636b32 100755
--- a/linux-x86/bin/jdeps
+++ b/linux-x86/bin/jdeps
Binary files differ
diff --git a/linux-x86/bin/jhat b/linux-x86/bin/jhat
index eab5161..fd9510c 100755
--- a/linux-x86/bin/jhat
+++ b/linux-x86/bin/jhat
Binary files differ
diff --git a/linux-x86/bin/jinfo b/linux-x86/bin/jinfo
index d380413..e53b8e8 100755
--- a/linux-x86/bin/jinfo
+++ b/linux-x86/bin/jinfo
Binary files differ
diff --git a/linux-x86/bin/jjs b/linux-x86/bin/jjs
index e9fd590..10fdc0c 100755
--- a/linux-x86/bin/jjs
+++ b/linux-x86/bin/jjs
Binary files differ
diff --git a/linux-x86/bin/jmap b/linux-x86/bin/jmap
index bcbbaf5..a74346f 100755
--- a/linux-x86/bin/jmap
+++ b/linux-x86/bin/jmap
Binary files differ
diff --git a/linux-x86/bin/jps b/linux-x86/bin/jps
index e9ec783..9fe4c43 100755
--- a/linux-x86/bin/jps
+++ b/linux-x86/bin/jps
Binary files differ
diff --git a/linux-x86/bin/jrunscript b/linux-x86/bin/jrunscript
index ef9ef8a..ad35d39 100755
--- a/linux-x86/bin/jrunscript
+++ b/linux-x86/bin/jrunscript
Binary files differ
diff --git a/linux-x86/bin/jsadebugd b/linux-x86/bin/jsadebugd
index 1d0f0b2..62e5731 100755
--- a/linux-x86/bin/jsadebugd
+++ b/linux-x86/bin/jsadebugd
Binary files differ
diff --git a/linux-x86/bin/jstack b/linux-x86/bin/jstack
index 52c841e..1169e57 100755
--- a/linux-x86/bin/jstack
+++ b/linux-x86/bin/jstack
Binary files differ
diff --git a/linux-x86/bin/jstat b/linux-x86/bin/jstat
index f9bef8b..42eaf56 100755
--- a/linux-x86/bin/jstat
+++ b/linux-x86/bin/jstat
Binary files differ
diff --git a/linux-x86/bin/jstatd b/linux-x86/bin/jstatd
index c263b72..d3df3f2 100755
--- a/linux-x86/bin/jstatd
+++ b/linux-x86/bin/jstatd
Binary files differ
diff --git a/linux-x86/bin/keytool b/linux-x86/bin/keytool
index 4f87ae8..fedd8e2 100755
--- a/linux-x86/bin/keytool
+++ b/linux-x86/bin/keytool
Binary files differ
diff --git a/linux-x86/bin/native2ascii b/linux-x86/bin/native2ascii
index 6350762..9e0a26f 100755
--- a/linux-x86/bin/native2ascii
+++ b/linux-x86/bin/native2ascii
Binary files differ
diff --git a/linux-x86/bin/orbd b/linux-x86/bin/orbd
index 869ff6c..c545599 100755
--- a/linux-x86/bin/orbd
+++ b/linux-x86/bin/orbd
Binary files differ
diff --git a/linux-x86/bin/pack200 b/linux-x86/bin/pack200
index 7d284e5..386005a 100755
--- a/linux-x86/bin/pack200
+++ b/linux-x86/bin/pack200
Binary files differ
diff --git a/linux-x86/bin/policytool b/linux-x86/bin/policytool
index 043394c..c556ed6 100755
--- a/linux-x86/bin/policytool
+++ b/linux-x86/bin/policytool
Binary files differ
diff --git a/linux-x86/bin/rmic b/linux-x86/bin/rmic
index 09cc26d..a2d6fa2 100755
--- a/linux-x86/bin/rmic
+++ b/linux-x86/bin/rmic
Binary files differ
diff --git a/linux-x86/bin/rmid b/linux-x86/bin/rmid
index a0d0470..d3329a2 100755
--- a/linux-x86/bin/rmid
+++ b/linux-x86/bin/rmid
Binary files differ
diff --git a/linux-x86/bin/rmiregistry b/linux-x86/bin/rmiregistry
index b64474d..8a7d840 100755
--- a/linux-x86/bin/rmiregistry
+++ b/linux-x86/bin/rmiregistry
Binary files differ
diff --git a/linux-x86/bin/schemagen b/linux-x86/bin/schemagen
index f9506f4..974aa87 100755
--- a/linux-x86/bin/schemagen
+++ b/linux-x86/bin/schemagen
Binary files differ
diff --git a/linux-x86/bin/serialver b/linux-x86/bin/serialver
index 978db86..c87fb13 100755
--- a/linux-x86/bin/serialver
+++ b/linux-x86/bin/serialver
Binary files differ
diff --git a/linux-x86/bin/servertool b/linux-x86/bin/servertool
index a9af370..10c3ef9 100755
--- a/linux-x86/bin/servertool
+++ b/linux-x86/bin/servertool
Binary files differ
diff --git a/linux-x86/bin/tnameserv b/linux-x86/bin/tnameserv
index 4dd5eac..6e784a1 100755
--- a/linux-x86/bin/tnameserv
+++ b/linux-x86/bin/tnameserv
Binary files differ
diff --git a/linux-x86/bin/unpack200 b/linux-x86/bin/unpack200
index e9d32c5..0bb3097 100755
--- a/linux-x86/bin/unpack200
+++ b/linux-x86/bin/unpack200
Binary files differ
diff --git a/linux-x86/bin/wsgen b/linux-x86/bin/wsgen
index dbb31ff..f1a7410 100755
--- a/linux-x86/bin/wsgen
+++ b/linux-x86/bin/wsgen
Binary files differ
diff --git a/linux-x86/bin/wsimport b/linux-x86/bin/wsimport
index 5ab8370..b204ca0 100755
--- a/linux-x86/bin/wsimport
+++ b/linux-x86/bin/wsimport
Binary files differ
diff --git a/linux-x86/bin/xjc b/linux-x86/bin/xjc
index 43b41d4..257a180 100755
--- a/linux-x86/bin/xjc
+++ b/linux-x86/bin/xjc
Binary files differ
diff --git a/linux-x86/jre/bin/java b/linux-x86/jre/bin/java
index 0be5831..7c05167 100755
--- a/linux-x86/jre/bin/java
+++ b/linux-x86/jre/bin/java
Binary files differ
diff --git a/linux-x86/jre/bin/jjs b/linux-x86/jre/bin/jjs
index e9fd590..10fdc0c 100755
--- a/linux-x86/jre/bin/jjs
+++ b/linux-x86/jre/bin/jjs
Binary files differ
diff --git a/linux-x86/jre/bin/keytool b/linux-x86/jre/bin/keytool
index 4f87ae8..fedd8e2 100755
--- a/linux-x86/jre/bin/keytool
+++ b/linux-x86/jre/bin/keytool
Binary files differ
diff --git a/linux-x86/jre/bin/orbd b/linux-x86/jre/bin/orbd
index 869ff6c..c545599 100755
--- a/linux-x86/jre/bin/orbd
+++ b/linux-x86/jre/bin/orbd
Binary files differ
diff --git a/linux-x86/jre/bin/pack200 b/linux-x86/jre/bin/pack200
index 7d284e5..386005a 100755
--- a/linux-x86/jre/bin/pack200
+++ b/linux-x86/jre/bin/pack200
Binary files differ
diff --git a/linux-x86/jre/bin/policytool b/linux-x86/jre/bin/policytool
index 043394c..c556ed6 100755
--- a/linux-x86/jre/bin/policytool
+++ b/linux-x86/jre/bin/policytool
Binary files differ
diff --git a/linux-x86/jre/bin/rmid b/linux-x86/jre/bin/rmid
index a0d0470..d3329a2 100755
--- a/linux-x86/jre/bin/rmid
+++ b/linux-x86/jre/bin/rmid
Binary files differ
diff --git a/linux-x86/jre/bin/rmiregistry b/linux-x86/jre/bin/rmiregistry
index b64474d..8a7d840 100755
--- a/linux-x86/jre/bin/rmiregistry
+++ b/linux-x86/jre/bin/rmiregistry
Binary files differ
diff --git a/linux-x86/jre/bin/servertool b/linux-x86/jre/bin/servertool
index a9af370..10c3ef9 100755
--- a/linux-x86/jre/bin/servertool
+++ b/linux-x86/jre/bin/servertool
Binary files differ
diff --git a/linux-x86/jre/bin/tnameserv b/linux-x86/jre/bin/tnameserv
index 4dd5eac..6e784a1 100755
--- a/linux-x86/jre/bin/tnameserv
+++ b/linux-x86/jre/bin/tnameserv
Binary files differ
diff --git a/linux-x86/jre/bin/unpack200 b/linux-x86/jre/bin/unpack200
index e9d32c5..0bb3097 100755
--- a/linux-x86/jre/bin/unpack200
+++ b/linux-x86/jre/bin/unpack200
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/jli/libjli.so b/linux-x86/jre/lib/amd64/jli/libjli.so
index 26a1ad3..1634bc5 100755
--- a/linux-x86/jre/lib/amd64/jli/libjli.so
+++ b/linux-x86/jre/lib/amd64/jli/libjli.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libattach.so b/linux-x86/jre/lib/amd64/libattach.so
index 29d061d..4ce0e8f 100755
--- a/linux-x86/jre/lib/amd64/libattach.so
+++ b/linux-x86/jre/lib/amd64/libattach.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libawt.so b/linux-x86/jre/lib/amd64/libawt.so
index 9c8d5ae..c554455 100755
--- a/linux-x86/jre/lib/amd64/libawt.so
+++ b/linux-x86/jre/lib/amd64/libawt.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libawt_headless.so b/linux-x86/jre/lib/amd64/libawt_headless.so
index 923f26e..445818d 100755
--- a/linux-x86/jre/lib/amd64/libawt_headless.so
+++ b/linux-x86/jre/lib/amd64/libawt_headless.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libawt_xawt.so b/linux-x86/jre/lib/amd64/libawt_xawt.so
index 1235ccb..5e2ac27 100755
--- a/linux-x86/jre/lib/amd64/libawt_xawt.so
+++ b/linux-x86/jre/lib/amd64/libawt_xawt.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libdt_socket.so b/linux-x86/jre/lib/amd64/libdt_socket.so
index de1bf08..d377925 100755
--- a/linux-x86/jre/lib/amd64/libdt_socket.so
+++ b/linux-x86/jre/lib/amd64/libdt_socket.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libfontmanager.so b/linux-x86/jre/lib/amd64/libfontmanager.so
index ae95243..10f11d7 100755
--- a/linux-x86/jre/lib/amd64/libfontmanager.so
+++ b/linux-x86/jre/lib/amd64/libfontmanager.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libhprof.so b/linux-x86/jre/lib/amd64/libhprof.so
index 744a638..48f5b5e 100755
--- a/linux-x86/jre/lib/amd64/libhprof.so
+++ b/linux-x86/jre/lib/amd64/libhprof.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libinstrument.so b/linux-x86/jre/lib/amd64/libinstrument.so
index 9355735..994f49f 100755
--- a/linux-x86/jre/lib/amd64/libinstrument.so
+++ b/linux-x86/jre/lib/amd64/libinstrument.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libj2gss.so b/linux-x86/jre/lib/amd64/libj2gss.so
index cf249bb..2284214 100755
--- a/linux-x86/jre/lib/amd64/libj2gss.so
+++ b/linux-x86/jre/lib/amd64/libj2gss.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libj2pcsc.so b/linux-x86/jre/lib/amd64/libj2pcsc.so
index ff1a15d..4633ab3 100755
--- a/linux-x86/jre/lib/amd64/libj2pcsc.so
+++ b/linux-x86/jre/lib/amd64/libj2pcsc.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libj2pkcs11.so b/linux-x86/jre/lib/amd64/libj2pkcs11.so
index 5b9c6d2..cf2f40d 100755
--- a/linux-x86/jre/lib/amd64/libj2pkcs11.so
+++ b/linux-x86/jre/lib/amd64/libj2pkcs11.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjaas_unix.so b/linux-x86/jre/lib/amd64/libjaas_unix.so
index 3a3961b..95713d7 100755
--- a/linux-x86/jre/lib/amd64/libjaas_unix.so
+++ b/linux-x86/jre/lib/amd64/libjaas_unix.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjava.so b/linux-x86/jre/lib/amd64/libjava.so
index f6901b0..0945616 100755
--- a/linux-x86/jre/lib/amd64/libjava.so
+++ b/linux-x86/jre/lib/amd64/libjava.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjava_crw_demo.so b/linux-x86/jre/lib/amd64/libjava_crw_demo.so
index fe082ce..c8a3c6b 100755
--- a/linux-x86/jre/lib/amd64/libjava_crw_demo.so
+++ b/linux-x86/jre/lib/amd64/libjava_crw_demo.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjawt.so b/linux-x86/jre/lib/amd64/libjawt.so
index ef318eb..4c16160 100755
--- a/linux-x86/jre/lib/amd64/libjawt.so
+++ b/linux-x86/jre/lib/amd64/libjawt.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjdwp.so b/linux-x86/jre/lib/amd64/libjdwp.so
index f5f8113..d3e750c 100755
--- a/linux-x86/jre/lib/amd64/libjdwp.so
+++ b/linux-x86/jre/lib/amd64/libjdwp.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjpeg.so b/linux-x86/jre/lib/amd64/libjpeg.so
index 7eeb903..ecc12c4 100755
--- a/linux-x86/jre/lib/amd64/libjpeg.so
+++ b/linux-x86/jre/lib/amd64/libjpeg.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjsdt.so b/linux-x86/jre/lib/amd64/libjsdt.so
index abee133..8bfc3f4 100755
--- a/linux-x86/jre/lib/amd64/libjsdt.so
+++ b/linux-x86/jre/lib/amd64/libjsdt.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjsig.so b/linux-x86/jre/lib/amd64/libjsig.so
index bb0bc38..46d66c6 100755
--- a/linux-x86/jre/lib/amd64/libjsig.so
+++ b/linux-x86/jre/lib/amd64/libjsig.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjsound.so b/linux-x86/jre/lib/amd64/libjsound.so
index a9cc045..3329d12 100755
--- a/linux-x86/jre/lib/amd64/libjsound.so
+++ b/linux-x86/jre/lib/amd64/libjsound.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libjsoundalsa.so b/linux-x86/jre/lib/amd64/libjsoundalsa.so
index 15f6ae0..e92dfee 100755
--- a/linux-x86/jre/lib/amd64/libjsoundalsa.so
+++ b/linux-x86/jre/lib/amd64/libjsoundalsa.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/liblcms.so b/linux-x86/jre/lib/amd64/liblcms.so
index 0b0a7af..78cfcab 100755
--- a/linux-x86/jre/lib/amd64/liblcms.so
+++ b/linux-x86/jre/lib/amd64/liblcms.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libmanagement.so b/linux-x86/jre/lib/amd64/libmanagement.so
index 0e0cab7..15641ec 100755
--- a/linux-x86/jre/lib/amd64/libmanagement.so
+++ b/linux-x86/jre/lib/amd64/libmanagement.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libmlib_image.so b/linux-x86/jre/lib/amd64/libmlib_image.so
index 97a9ad7..81ab2c2 100755
--- a/linux-x86/jre/lib/amd64/libmlib_image.so
+++ b/linux-x86/jre/lib/amd64/libmlib_image.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libnet.so b/linux-x86/jre/lib/amd64/libnet.so
index ad01bac..4bd793e 100755
--- a/linux-x86/jre/lib/amd64/libnet.so
+++ b/linux-x86/jre/lib/amd64/libnet.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libnio.so b/linux-x86/jre/lib/amd64/libnio.so
index fc7f363..13320c1 100755
--- a/linux-x86/jre/lib/amd64/libnio.so
+++ b/linux-x86/jre/lib/amd64/libnio.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libnpt.so b/linux-x86/jre/lib/amd64/libnpt.so
index 6fbbe10..64405e9 100755
--- a/linux-x86/jre/lib/amd64/libnpt.so
+++ b/linux-x86/jre/lib/amd64/libnpt.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libsaproc.so b/linux-x86/jre/lib/amd64/libsaproc.so
index dd32c13..aeaf3f4 100755
--- a/linux-x86/jre/lib/amd64/libsaproc.so
+++ b/linux-x86/jre/lib/amd64/libsaproc.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libsctp.so b/linux-x86/jre/lib/amd64/libsctp.so
index ef2def0..eebd9dd 100755
--- a/linux-x86/jre/lib/amd64/libsctp.so
+++ b/linux-x86/jre/lib/amd64/libsctp.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libsplashscreen.so b/linux-x86/jre/lib/amd64/libsplashscreen.so
index 014dfce..b9b4db1 100755
--- a/linux-x86/jre/lib/amd64/libsplashscreen.so
+++ b/linux-x86/jre/lib/amd64/libsplashscreen.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libsunec.so b/linux-x86/jre/lib/amd64/libsunec.so
index ca9ce47..c7d1aa7 100755
--- a/linux-x86/jre/lib/amd64/libsunec.so
+++ b/linux-x86/jre/lib/amd64/libsunec.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libunpack.so b/linux-x86/jre/lib/amd64/libunpack.so
index cf00f2c..d10e4c8 100755
--- a/linux-x86/jre/lib/amd64/libunpack.so
+++ b/linux-x86/jre/lib/amd64/libunpack.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libverify.so b/linux-x86/jre/lib/amd64/libverify.so
index 0666e25..f636edf 100755
--- a/linux-x86/jre/lib/amd64/libverify.so
+++ b/linux-x86/jre/lib/amd64/libverify.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/libzip.so b/linux-x86/jre/lib/amd64/libzip.so
index 25f8928..12ea89a 100755
--- a/linux-x86/jre/lib/amd64/libzip.so
+++ b/linux-x86/jre/lib/amd64/libzip.so
Binary files differ
diff --git a/linux-x86/jre/lib/amd64/server/libjsig.so b/linux-x86/jre/lib/amd64/server/libjsig.so
deleted file mode 120000
index d3e0c65..0000000
--- a/linux-x86/jre/lib/amd64/server/libjsig.so
+++ /dev/null
@@ -1 +0,0 @@
-../libjsig.so
\ No newline at end of file
diff --git a/linux-x86/jre/lib/amd64/server/libjsig.so b/linux-x86/jre/lib/amd64/server/libjsig.so
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/linux-x86/jre/lib/amd64/server/libjsig.so
diff --git a/linux-x86/jre/lib/amd64/server/libjvm.so b/linux-x86/jre/lib/amd64/server/libjvm.so
index c245a8f..3f85e7d 100755
--- a/linux-x86/jre/lib/amd64/server/libjvm.so
+++ b/linux-x86/jre/lib/amd64/server/libjvm.so
Binary files differ
diff --git a/linux-x86/jre/lib/charsets.jar b/linux-x86/jre/lib/charsets.jar
index 14c7889..26c548c 100644
--- a/linux-x86/jre/lib/charsets.jar
+++ b/linux-x86/jre/lib/charsets.jar
Binary files differ
diff --git a/linux-x86/jre/lib/ext/nashorn.jar b/linux-x86/jre/lib/ext/nashorn.jar
index e735c69..ed912c4 100644
--- a/linux-x86/jre/lib/ext/nashorn.jar
+++ b/linux-x86/jre/lib/ext/nashorn.jar
Binary files differ
diff --git a/linux-x86/jre/lib/jce.jar b/linux-x86/jre/lib/jce.jar
index 7556a27..16eb259 100644
--- a/linux-x86/jre/lib/jce.jar
+++ b/linux-x86/jre/lib/jce.jar
Binary files differ
diff --git a/linux-x86/jre/lib/jexec b/linux-x86/jre/lib/jexec
index 337e34f..481e6fa 100755
--- a/linux-x86/jre/lib/jexec
+++ b/linux-x86/jre/lib/jexec
Binary files differ
diff --git a/linux-x86/jre/lib/jsse.jar b/linux-x86/jre/lib/jsse.jar
index fd3bfcc..eb0a1b8 100644
--- a/linux-x86/jre/lib/jsse.jar
+++ b/linux-x86/jre/lib/jsse.jar
Binary files differ
diff --git a/linux-x86/jre/lib/resources.jar b/linux-x86/jre/lib/resources.jar
index 3f0c08b..e79e0ca 100644
--- a/linux-x86/jre/lib/resources.jar
+++ b/linux-x86/jre/lib/resources.jar
Binary files differ
diff --git a/linux-x86/jre/lib/rt.jar b/linux-x86/jre/lib/rt.jar
index ae636ba..cf81d99 100644
--- a/linux-x86/jre/lib/rt.jar
+++ b/linux-x86/jre/lib/rt.jar
Binary files differ
diff --git a/linux-x86/jre/lib/security/java.security b/linux-x86/jre/lib/security/java.security
index 51eea18..27cb94e 100644
--- a/linux-x86/jre/lib/security/java.security
+++ b/linux-x86/jre/lib/security/java.security
@@ -733,67 +733,70 @@
 
 # Cryptographic Jurisdiction Policy defaults
 #
-# Due to the import control restrictions of some countries, the default
-# JCE policy files allow for strong but "limited" cryptographic key
-# lengths to be used.  If your country's cryptographic regulations allow,
-# the "unlimited" strength policy files can be used instead, which contain
-# no restrictions on cryptographic strengths.
+# Import and export control rules on cryptographic software vary from
+# country to country.  By default, the JDK provides two different sets of
+# cryptographic policy files:
 #
-# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY
-# TO DETERMINE THE EXACT REQUIREMENTS.
+#     unlimited:  These policy files contain no restrictions on cryptographic
+#                 strengths or algorithms.
 #
-# <java-home> (below) refers to the directory where the JRE was
-# installed. It is determined based on whether you are running JCE
-# on a JRE or a JRE contained within the Java Development Kit, or
-# JDK(TM). The JDK contains the JRE, but at a different level in the
-# file hierarchy. For example, if the JDK is installed in
-# /home/user1/jdk1.8.0 on Unix or in C:\jdk1.8.0 on Windows, then
-# <java-home> is:
+#     limited:    These policy files contain more restricted cryptographic
+#                 strengths, and are still available if your country or
+#                 usage requires the traditional restrictive policy.
 #
-#  /home/user1/jdk1.8.0/jre           [Unix]
-#  C:\jdk1.8.0\jre                    [Windows]
+# The JDK JCE framework uses the unlimited policy files by default.
+# However the user may explicitly choose a set either by defining the
+# "crypto.policy" Security property or by installing valid JCE policy
+# jar files into the traditional JDK installation location.  To better
+# support older JDK Update releases, the "crypto.policy" property is not
+# defined by default.  See below for more information.
 #
-# If on the other hand the JRE is installed in /home/user1/jre1.8.0
-# on Unix or in C:\jre1.8.0 on Windows, and the JDK is not
-# installed, then <java-home> is:
+# The following logic determines which policy files are used:
 #
-#  /home/user1/jre1.8.0               [Unix]
-#  C:\jre1.8.0                        [Windows]
+#         <java-home> refers to the directory where the JRE was
+#         installed and may be determined using the "java.home"
+#         System property.
 #
-# On Windows, for each JDK installation, there may be additional
-# JREs installed under the "Program Files" directory. Please make
-# sure that you install the unlimited strength policy JAR files
-# for all JREs that you plan to use.
+# 1.  If the Security property "crypto.policy" has been defined,
+#     then the following mechanism is used:
 #
-# The policy files are jar files organized into subdirectories of
+#     The policy files are stored as jar files in subdirectories of
 # <java-home>/lib/security/policy.  Each directory contains a complete
 # set of policy files.
 #
-# The "crypto.policy" Security property controls the directory selection,
-# and thus the effective cryptographic policy.
+#     The "crypto.policy" Security property controls the directory
+#     selection, and thus the effective cryptographic policy.
 #
 # The default set of directories is:
 #
 #     limited | unlimited
 #
-# however other directories can be created and configured.
-#
-# To support older JDK Update releases, the crypto.policy property
-# is not defined by default. When the property is not defined, an
-# update release binary aware of the new property will use the following
-# logic to decide what crypto policy files get used :
-#
-# * If the US_export_policy.jar and local_policy.jar files are located
-# in the (legacy) <java-home>/lib/security directory, then the rules
-# embedded in those jar files will be used. This helps preserve compatibility
+# 2.  If the "crypto.policy" property is not set and the traditional
+#     US_export_policy.jar and local_policy.jar files
+#     (e.g. limited/unlimited) are found in the legacy
+#     <java-home>/lib/security directory, then the rules embedded within
+#     those jar files will be used. This helps preserve compatibility
 # for users upgrading from an older installation.
 #
-# * If crypto.policy is not defined and no such jar files are present in
-# the legacy locations, then the JDK will use the limited settings
-# (equivalent to crypto.policy=limited)
+# 3.  If the jar files are not present in the legacy location
+#     and the "crypto.policy" Security property is not defined,
+#     then the JDK will use the unlimited settings (equivalent to
+#     crypto.policy=unlimited)
 #
 # Please see the JCA documentation for additional information on these
 # files and formats.
+#
+# YOU ARE ADVISED TO CONSULT YOUR EXPORT/IMPORT CONTROL COUNSEL OR ATTORNEY
+# TO DETERMINE THE EXACT REQUIREMENTS.
+#
+# Please note that the JCE for Java SE, including the JCE framework,
+# cryptographic policy files, and standard JCE providers provided with
+# the Java SE, have been reviewed and approved for export as mass market
+# encryption item by the US Bureau of Industry and Security.
+#
+# Note: This property is currently used by the JDK Reference implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
 #crypto.policy=unlimited
 
 #
diff --git a/linux-x86/lib/amd64/jli/libjli.so b/linux-x86/lib/amd64/jli/libjli.so
index 94eefac..e95f4e8 100755
--- a/linux-x86/lib/amd64/jli/libjli.so
+++ b/linux-x86/lib/amd64/jli/libjli.so
Binary files differ
diff --git a/linux-x86/lib/amd64/libjawt.so b/linux-x86/lib/amd64/libjawt.so
index 91cb1e5..b36d25f 100755
--- a/linux-x86/lib/amd64/libjawt.so
+++ b/linux-x86/lib/amd64/libjawt.so
Binary files differ
diff --git a/linux-x86/lib/ct.sym b/linux-x86/lib/ct.sym
index 87d9e44..d160ad1 100644
--- a/linux-x86/lib/ct.sym
+++ b/linux-x86/lib/ct.sym
Binary files differ
diff --git a/linux-x86/lib/jconsole.jar b/linux-x86/lib/jconsole.jar
index a25d502..c301a7e 100644
--- a/linux-x86/lib/jconsole.jar
+++ b/linux-x86/lib/jconsole.jar
Binary files differ
diff --git a/linux-x86/lib/jexec b/linux-x86/lib/jexec
index 337e34f..481e6fa 100755
--- a/linux-x86/lib/jexec
+++ b/linux-x86/lib/jexec
Binary files differ
diff --git a/linux-x86/lib/sa-jdi.jar b/linux-x86/lib/sa-jdi.jar
index 97ebf83..e91c217 100644
--- a/linux-x86/lib/sa-jdi.jar
+++ b/linux-x86/lib/sa-jdi.jar
Binary files differ
diff --git a/linux-x86/lib/tools.jar b/linux-x86/lib/tools.jar
index 95ad238..4c994cb 100644
--- a/linux-x86/lib/tools.jar
+++ b/linux-x86/lib/tools.jar
Binary files differ
diff --git a/linux-x86/sample/README b/linux-x86/sample/README
new file mode 100644
index 0000000..ae56b64
--- /dev/null
+++ b/linux-x86/sample/README
@@ -0,0 +1,6 @@
+The source code provided with samples and demos for the JDK is meant
+to illustrate the usage of a given feature or technique and has been
+deliberately simplified. Additional steps required for a
+production-quality application, such as security checks, input
+validation, and proper error handling, might not be present in the
+sample code.
diff --git a/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Device.java b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Device.java
new file mode 100644
index 0000000..f4fd2c5
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Device.java
@@ -0,0 +1,66 @@
+package checker;
+
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+
+/**
+ * Represents the device configuration. The values are loaded from an XML file by JAXB.
+ */
+@XmlRootElement
+public class Device {
+
+    @XmlElement()
+    private Map<Module, Integer> supportedModules = new EnumMap<>(Module.class);
+
+    /**
+     * Returns map of supported modules. The map key is module. The map value is version.
+     *
+     * @return map of supported modules.
+     */
+    public Map<Module, Integer> getSupportedModules() {
+        return Collections.unmodifiableMap(supportedModules);
+    }
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Kettle.xml b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Kettle.xml
new file mode 100644
index 0000000..2e0357d
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Kettle.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+    - Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    - Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+    - Neither the name of Oracle nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+  This source code is provided to illustrate the usage of a given feature
+  or technique and has been deliberately simplified. Additional steps
+  required for a production-quality application, such as security checks,
+  input validation and proper error handling, might not be present in
+  this sample code.
+
+  -->
+
+<device>
+    <supportedModules>
+        <entry>
+            <key>DISPLAY</key>
+            <value>2</value>
+        </entry>
+        <entry>
+            <key>THERMOMETER</key>
+            <value>1</value>
+        </entry>
+        <entry>
+            <key>CLOCK</key>
+            <value>4</value>
+        </entry>
+    </supportedModules>
+</device>
\ No newline at end of file
diff --git a/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Module.java b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Module.java
new file mode 100644
index 0000000..2b97b4e
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Module.java
@@ -0,0 +1,49 @@
+package checker;
+
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * Represents available modules.
+ */
+public enum Module {
+
+    DISPLAY, CLOCK, THERMOMETER, HEATER, SPEAKER, GSM, LED;
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/PluginChecker.java b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/PluginChecker.java
new file mode 100644
index 0000000..6db5bae
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/PluginChecker.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package checker;
+
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.TypeElement;
+import javax.tools.Diagnostic;
+import javax.xml.bind.JAXBContext;
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.bind.JAXBException;
+
+/**
+ * Reads the device configuration from the XML file specified by -Adevice=device.xml.
+ * For each class in a project, checks required modules. If the device doesn't have
+ * the required module, then a compilation error will be shown.
+ */
+@SupportedAnnotationTypes("checker.RequireContainer")
+@SupportedSourceVersion(SourceVersion.RELEASE_8)
+public class PluginChecker extends javax.annotation.processing.AbstractProcessor {
+
+    /**
+     * Name of the option to get the path to the xml with device configuration.
+     */
+    public static final String DEVICE_OPTION = "device";
+    private Device device;
+
+    /**
+     * Only the device option is supported.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<String> getSupportedOptions() {
+        return new HashSet<>(Arrays.asList(DEVICE_OPTION));
+    }
+
+    /**
+     * Initializes the processor by loading the device configuration.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public synchronized void init(ProcessingEnvironment processingEnv) {
+        super.init(processingEnv);
+        try {
+            String deviceOption = processingEnv.getOptions().get(DEVICE_OPTION);
+            device = (Device) JAXBContext.newInstance(Device.class)
+                    .createUnmarshaller().unmarshal(new File(deviceOption));
+        } catch (JAXBException e) {
+            throw new RuntimeException(
+                    "Please specify device by -Adevice=device.xml\n"
+                    + e.toString(), e);
+        }
+    }
+
+    /**
+     * Processes @Require annotations and checks that Device meets requirements.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean process(Set<? extends TypeElement> annotations,
+            RoundEnvironment roundEnv) {
+        for (Element el : roundEnv.getElementsAnnotatedWith(RequireContainer.class)) {
+            for (Require req : el.getAnnotationsByType(Require.class)) {
+                //for every Require annotation checks if device has module of required version.
+                Integer version = device.getSupportedModules().get(req.value());
+
+                if (version == null
+                        || version < req.minVersion()
+                        || version > req.maxVersion()) {
+                    //if module is optional then show only warning not error
+                    if (req.optional()) {
+                        processingEnv.getMessager()
+                                .printMessage(Diagnostic.Kind.WARNING,
+                                        "Plugin [" + el + "] requires " + req
+                                        + "\n but device " + (version == null
+                                        ? "doesn't have such module."
+                                        + " This module is optional."
+                                        + " So plugin will work but miss"
+                                        + " some functionality"
+                                        : "has " + version
+                                        + " version of that module"));
+                    } else {
+                        processingEnv.getMessager()
+                                .printMessage(Diagnostic.Kind.ERROR,
+                                        "Plugin [" + el + "] requires " + req
+                                        + "\n but device "
+                                        + (version == null
+                                        ? "doesn't have such module"
+                                        : "has " + version
+                                        + " version of that module"));
+                    }
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Require.java b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Require.java
new file mode 100644
index 0000000..6681c28
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/Require.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package checker;
+
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates that a plug-in depends on a module.
+ */
+@Retention(RetentionPolicy.CLASS)
+@Repeatable(RequireContainer.class)
+public @interface Require {
+
+    /**
+     * Returns the required module.
+     *
+     * @return required module.
+     */
+    Module value();
+
+    /**
+     * Returns the minimum supported version of a module.
+     *
+     * @return minimum supported version of a module.
+     */
+    int minVersion() default 1;
+
+    /**
+     * Returns the maximum supported version of a module.
+     *
+     * @return maximum supported version of a module.
+     */
+    int maxVersion() default Integer.MAX_VALUE;
+
+    /**
+     * Returns true if a module is optional. A module is optional if a system
+     * works without that module but is missing some functionality. Returns false if a system
+     * won't work without the specified module.
+     *
+     * @return true if module is optional. False otherwise.
+     */
+    boolean optional() default false;
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/RequireContainer.java b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/RequireContainer.java
new file mode 100644
index 0000000..d18e0d5
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/PluginChecker/src/checker/RequireContainer.java
@@ -0,0 +1,51 @@
+package checker;
+
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * A container for the repeatable @Require annotation.
+ */
+@Retention(RetentionPolicy.CLASS)
+public @interface RequireContainer {
+
+    Require[] value();
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/BoilerPlugin.java b/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/BoilerPlugin.java
new file mode 100644
index 0000000..3a9d842
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/BoilerPlugin.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package plugins;
+
+import checker.Module;
+import checker.Require;
+
+/**
+ * BoilerPlugin provides support for boiling water and keeping water warm.
+ */
+@Require(value = Module.CLOCK, maxVersion = 3)
+@Require(value = Module.THERMOMETER)
+@Require(value = Module.HEATER)
+@Require(value = Module.LED, optional = true) //will use if present
+public class BoilerPlugin {
+
+    /**
+     * Heats water up to 100 degrees Celsius.
+     */
+    public void boil() {
+        boil(100);
+    }
+
+    /**
+     * Heats water up to temperature.
+     *
+     * @param temperature - desired temperature of the water in the boiler
+     */
+    public void boil(int temperature) {
+        /*
+         * Turn on heater and wait while temperature reaches desired temperature
+         * in Celsius. Finally, turn off heater.
+         * If present, the LED light changes color according to the temperature.
+         */
+    }
+
+    /**
+     * Keeps desired temperature.
+     *
+     * @param temperature - desired temperature of the water in the boiler
+     * @param seconds - period of time for checking temperature in seconds
+     */
+    public void keepWarm(int temperature, int seconds) {
+        //Every n seconds check temperature and warm up, if necessary.
+    }
+
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/ExtendedBoilerPlugin.java b/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/ExtendedBoilerPlugin.java
new file mode 100644
index 0000000..b7be610
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/ExtendedBoilerPlugin.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package plugins;
+
+import checker.Module;
+import checker.Require;
+import java.util.Calendar;
+
+/**
+ * Introduces new features for BoilerPlugin. Features are boiling water by an
+ * SMS and boiling water by date with notification by a phone call.
+ */
+@Require(value = Module.SPEAKER)
+@Require(value = Module.GSM, minVersion = 3)
+@Require(value = Module.DISPLAY)
+public class ExtendedBoilerPlugin extends BoilerPlugin {
+
+    /**
+     * Boils water at the appointed time and wakes you up by a ring and phone
+     * call. Shows "Good morning" and a quote of the day from the Internet on the
+     * display.
+     *
+     * @param calendar - date and time when water should be boiled
+     * @param phoneNumber - phone number to call
+     */
+    public void boilAndWakeUp(Calendar calendar, int phoneNumber) {
+        //implementation
+    }
+
+    /**
+     * Boils water at the appointed time by getting an SMS of fixed format.
+     * Sends an SMS on finish.
+     *
+     * @param sms - text of SMS
+     */
+    public void boilBySMS(String sms) {
+        //implementation
+    }
+}
diff --git a/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/TimerPlugin.java b/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/TimerPlugin.java
new file mode 100644
index 0000000..678785c
--- /dev/null
+++ b/linux-x86/sample/annotations/DependencyChecker/Plugins/src/plugins/TimerPlugin.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package plugins;
+
+import checker.Module;
+import checker.Require;
+
+/**
+ * Timer plug-in is used to support an alarm and a timer. It depends on Display and
+ * Clock modules.
+ */
+@Require(Module.DISPLAY)
+@Require(value = Module.CLOCK, maxVersion = 3)
+public class TimerPlugin {
+
+    /**
+     * Sets timer.
+     *
+     * @param time - the remaining time.
+     */
+    public void timer(long time) {
+        //start timer
+        //show the remaining time on display
+    }
+
+    /**
+     * Sets alarm.
+     *
+     * @param time - the alarm time.
+     */
+    public void alarm(long time) {
+        //start alarm
+        //show current time and alarm time on display
+    }
+}
diff --git a/linux-x86/sample/annotations/Validator/src/PositiveIntegerSupplier.java b/linux-x86/sample/annotations/Validator/src/PositiveIntegerSupplier.java
new file mode 100644
index 0000000..0a14913
--- /dev/null
+++ b/linux-x86/sample/annotations/Validator/src/PositiveIntegerSupplier.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import java.util.function.Supplier;
+
+/**
+ * Supplies a positive number.
+ */
+@Validate(value = Validator.INTEGER_NUMBER,
+        description = "It's not an Integer ")
+@Validate(value = Validator.POSITIVE_NUMBER,
+        description = "It's not a positive Number")
+public class PositiveIntegerSupplier implements Supplier<String> {
+
+    /**
+     * Returns a string representation of a positive integer.
+     *
+     * @return string representation of a positive integer.
+     */
+    @Override
+    public String get() {
+        return "20005"; //random number
+    }
+}
diff --git a/linux-x86/sample/annotations/Validator/src/SupplierValidator.java b/linux-x86/sample/annotations/Validator/src/SupplierValidator.java
new file mode 100644
index 0000000..479ac86
--- /dev/null
+++ b/linux-x86/sample/annotations/Validator/src/SupplierValidator.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import javax.xml.bind.ValidationException;
+import java.util.function.Supplier;
+
+/**
+ * Validates the supplier.
+ */
+public class SupplierValidator {
+
+    /**
+     * Validates the supplier.
+     *
+     * @param supplier - Supplier that needs to be validated.
+     * @return true if supplier has passed validation check. False otherwise.
+     */
+    public static boolean validate(Supplier<?> supplier) {
+        for (Validate annotation
+                : supplier.getClass().getAnnotationsByType(Validate.class)) {
+            try {
+                annotation.value().validate(supplier);
+            } catch (ValidationException e) {
+                System.out.println(annotation.description());
+                e.printStackTrace();
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/linux-x86/sample/annotations/Validator/src/Validate.java b/linux-x86/sample/annotations/Validator/src/Validate.java
new file mode 100644
index 0000000..e0404ea
--- /dev/null
+++ b/linux-x86/sample/annotations/Validator/src/Validate.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates that the class should be validated by the specified validator.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(ValidateContainer.class)
+public @interface Validate {
+
+    /**
+     * Returns the validator that should validate the annotated class.
+     *
+     * @return Validator that should validate annotated class.
+     */
+    Validator value();
+
+    /**
+     * Returns text to describe the failure of the validation check.
+     *
+     * @return text to describe the failure of the validation check.
+     */
+    String description() default "";
+}
+
+/**
+ * A container for the repeatable @Validate annotation.
+ *
+ * @author Andrey Nazarov
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@interface ValidateContainer {
+
+    Validate[] value();
+}
diff --git a/linux-x86/sample/annotations/Validator/src/Validator.java b/linux-x86/sample/annotations/Validator/src/Validator.java
new file mode 100644
index 0000000..9e074f5
--- /dev/null
+++ b/linux-x86/sample/annotations/Validator/src/Validator.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+import javax.xml.bind.ValidationException;
+import java.util.function.Supplier;
+
+/**
+ * Enum of Validator implementations.
+ */
+public enum Validator {
+
+    /**
+     * This validator checks that the string represents an integer.
+     */
+    INTEGER_NUMBER {
+                /**
+                 * Checks that the string represents an integer.
+                 *
+                 * @param string - a string supplier
+                 * @throws ValidationException if the validation check fails
+                 */
+                @Override
+                void validate(Supplier<?> string) throws ValidationException {
+                    try {
+                        Integer.parseInt((String) string.get());
+                    } catch (NumberFormatException ex) {
+                        throw new ValidationException("Error while validating "
+                                + string.get());
+                    }
+                }
+            },
+    /**
+     * This validator checks that the string represents a positive number.
+     */
+    POSITIVE_NUMBER {
+                /**
+                 * Checks that the string represents a positive number.
+                 *
+                 * @param string - an string supplier
+                 * @throws ValidationException if the validation check fails
+                 */
+                @Override
+                void validate(Supplier<?> string) throws ValidationException {
+                    try {
+                        if (Double.compare(0.0, Double.parseDouble(
+                                        (String) string.get())) > 0) {
+                            throw new Exception();
+                        }
+                    } catch (Exception ex) {
+                        throw new ValidationException("Error while validating "
+                                + string.get());
+                    }
+                }
+            };
+
+    /**
+     * Checks that the supplier is valid.
+     *
+     * @param string - a string supplier
+     * @throws ValidationException if validation check fails
+     */
+    abstract void validate(Supplier<?> string) throws ValidationException;
+
+}
diff --git a/linux-x86/sample/annotations/index.html b/linux-x86/sample/annotations/index.html
new file mode 100644
index 0000000..804c83d
--- /dev/null
+++ b/linux-x86/sample/annotations/index.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Repeating Annotations Demo</title>
+</head>
+<body>
+<h2>Repeating Annotations Demo</h2>
+
+<p>
+    This demo shows how to use repeating annotations at runtime and at compile time.
+</p>
+
+<ul>
+    <li><h3>Dependency checker.</h3>
+
+        <p>
+            Shows how to define repeating annotations and process them at compile time.
+            The problem domain is some code that performs useful operations on hardware devices.
+            The code relies on "modules" to be present on the devices. Applicability of the code to a particular
+            device is checked while compiling the code for a particular device.
+            A set of modules provided by a device is listed in an xml file that turns red during the compilation
+            phase and is compared with the required module set specified by annotations.
+            For instance, there is kettle with hardware modules: thermometer, display, and clock.
+            There is also a boiler plug-in that requires clock, thermometer, heater, and optionally an LED light.
+
+            Build the PluginChecker annotation processor first.
+            Then, run javac with the annotation processor against plug-in sources using the following command: </p>
+
+        <code>javac -cp "PluginChecker.jar" -processor checker.PluginChecker -Adevice=Kettle.xml -proc:only &lt;source
+            files&gt;</code>
+
+        <p>
+            where <code>PluginChecker.jar</code> - path to jar file that contains PluginChecker annotation processor
+            class. </br>
+            <code>Kettle.xml</code> - path to device descriptor Kettle.xml                                         </br>
+            <code>&lt;source files&gt;</code> - source files in Plugins/src
+        </p>
+        For more information, see the source files.
+        </p>
+        <ul>
+            <li>Annotation processor sources: <a href="DependencyChecker/PluginChecker/src/">DependencyChecker/PluginChecker/src</a>
+            <li>Processing of repeating annotations can be found in <a href="DependencyChecker/PluginChecker/src/checker/PluginChecker.java">PluginChecker.java</a>
+            <li>Usage of repeating annotation is shown in modules sources.<a href="DependencyChecker/Plugins/src">DependencyChecker/Plugins/src</a>
+        </ul>
+
+    <li><h3>Validator.</h3>
+
+        <p>
+            Shows how to define repeating annotations and process them at runtime.
+            A problem domain is code that needs to validate provided Suppliers for conformance to some criteria.
+            The criteria are implemented by the Validator class which is applied by using annotations that are placed in
+            the code whenever validation is needed. For more information, see the
+            source files.
+        </p>
+
+        <p>
+        <ul>
+            <li>Usage of repeating annotation is described in <a href="Validator/src/PositiveIntegerSupplier.java">PositiveIntegerSupplier.java</a>
+            <li> Example of how to define a repeating annotation type can be found in
+                <a href="Validator/src/Validate.java">Validate.java</a>
+            <li> Usages of the new reflective methods can be found in <a href="Validator/src/SupplierValidator.java">SupplierValidator.java</a>
+        </ul>
+        </p>
+        Sources: <a href="Validator/src/">Validator/src/</a>
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/linux-x86/sample/forkjoin/mergesort/MergeDemo.java b/linux-x86/sample/forkjoin/mergesort/MergeDemo.java
new file mode 100644
index 0000000..528f383
--- /dev/null
+++ b/linux-x86/sample/forkjoin/mergesort/MergeDemo.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.util.Arrays;
+import java.util.Random;
+
+import static java.lang.Integer.parseInt;
+
+/**
+ * MergeExample is a class that runs a demo benchmark of the {@code ForkJoin} framework
+ * by benchmarking a {@link MergeSort} algorithm that is implemented using
+ * {@link java.util.concurrent.RecursiveAction}.
+ * The {@code ForkJoin} framework is setup with different parallelism levels
+ * and the sort is executed with arrays of different sizes to see the
+ * trade offs by using multiple threads for different sizes of the array.
+ */
+public class MergeDemo {
+    // Use a fixed seed to always get the same random values back
+    private final Random random = new Random(759123751834L);
+    private static final int ITERATIONS = 10;
+
+    /**
+     * Represents the formula {@code f(n) = start + (step * n)} for n = 0 & n < iterations
+     */
+    private static class Range {
+        private final int start;
+        private final int step;
+        private final int iterations;
+
+        private Range(int start, int step, int iterations) {
+            this.start = start;
+            this.step = step;
+            this.iterations = iterations;
+        }
+
+        /**
+         * Parses start, step and iterations from args
+         * @param args the string array containing the arguments
+         * @param start which element to start the start argument from
+         * @return the constructed range
+         */
+        public static Range parse(String[] args, int start) {
+            if (args.length < start + 3) {
+                throw new IllegalArgumentException("Too few elements in array");
+            }
+            return new Range(parseInt(args[start]), parseInt(args[start + 1]), parseInt(args[start + 2]));
+        }
+
+        public int get(int iteration) {
+            return start + (step * iteration);
+        }
+
+        public int getIterations() {
+            return iterations;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            builder.append(start).append(" ").append(step).append(" ").append(iterations);
+            return builder.toString();
+        }
+    }
+
+    /**
+     * Wraps the different parameters that is used when running the MergeExample.
+     * {@code sizes} represents the different array sizes
+     * {@code parallelism} represents the different parallelism levels
+     */
+    private static class Configuration {
+        private final Range sizes;
+        private final Range parallelism;
+
+        private final static Configuration defaultConfig = new Configuration(new Range(20000, 20000, 10),
+                new Range(2, 2, 10));
+
+        private Configuration(Range sizes, Range parallelism) {
+            this.sizes = sizes;
+            this.parallelism = parallelism;
+        }
+
+        /**
+         * Parses the arguments and attempts to create a configuration containing the
+         * parameters for creating the array sizes and parallelism sizes
+         * @param args the input arguments
+         * @return the configuration
+         */
+        public static Configuration parse(String[] args) {
+            if (args.length == 0) {
+                return defaultConfig;
+            } else {
+                try {
+                    if (args.length == 6) {
+                        return new Configuration(Range.parse(args, 0), Range.parse(args, 3));
+                    }
+                } catch (NumberFormatException e) {
+                    System.err.println("MergeExample: error: Argument was not a number.");
+                }
+                System.err.println("MergeExample <size start> <size step> <size steps> <parallel start> <parallel step>" +
+                        " <parallel steps>");
+                System.err.println("example: MergeExample 20000 10000 3 1 1 4");
+                System.err.println("example: will run with arrays of sizes 20000, 30000, 40000" +
+                        " and parallelism: 1, 2, 3, 4");
+                return null;
+            }
+        }
+
+        /**
+         * Creates an array for reporting the test result time in
+         * @return an array containing {@code sizes.iterations * parallelism.iterations} elements
+         */
+        private long[][] createTimesArray() {
+            return new long[sizes.getIterations()][parallelism.getIterations()];
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder("");
+            if (this == defaultConfig) {
+                builder.append("Default configuration. ");
+            }
+            builder.append("Running with parameters: ");
+            builder.append(sizes);
+            builder.append(" ");
+            builder.append(parallelism);
+            return builder.toString();
+        }
+    }
+
+    /**
+     * Generates an array of {@code elements} random elements
+     * @param elements the number of elements requested in the array
+     * @return an array of {@code elements} random elements
+     */
+    private int[] generateArray(int elements) {
+        int[] array = new int[elements];
+        for (int i = 0; i < elements; ++i) {
+            array[i] = random.nextInt();
+        }
+        return array;
+    }
+
+    /**
+     * Runs the test
+     * @param config contains the settings for the test
+     */
+    private void run(Configuration config) {
+        Range sizes = config.sizes;
+        Range parallelism = config.parallelism;
+
+        // Run a couple of sorts to make the JIT compile / optimize the code
+        // which should produce somewhat more fair times
+        warmup();
+
+        long[][] times = config.createTimesArray();
+
+        for (int size = 0; size < sizes.getIterations(); size++) {
+            runForSize(parallelism, sizes.get(size), times, size);
+        }
+
+        printResults(sizes, parallelism, times);
+    }
+
+    /**
+     * Prints the results as a table
+     * @param sizes the different sizes of the arrays
+     * @param parallelism the different parallelism levels used
+     * @param times the median times for the different sizes / parallelism
+     */
+    private void printResults(Range sizes, Range parallelism, long[][] times) {
+        System.out.println("Time in milliseconds. Y-axis: number of elements. X-axis parallelism used.");
+        long[] sums = new long[times[0].length];
+        System.out.format("%8s  ", "");
+        for (int i = 0; i < times[0].length; i++) {
+            System.out.format("%4d ", parallelism.get(i));
+        }
+        System.out.println("");
+        for (int size = 0; size < sizes.getIterations(); size++) {
+            System.out.format("%8d: ", sizes.get(size));
+            for (int i = 0; i < times[size].length; i++) {
+                sums[i] += times[size][i];
+                System.out.format("%4d ", times[size][i]);
+            }
+            System.out.println("");
+        }
+        System.out.format("%8s: ", "Total");
+        for (long sum : sums) {
+            System.out.format("%4d ", sum);
+        }
+        System.out.println("");
+    }
+
+    private void runForSize(Range parallelism, int elements, long[][] times, int size) {
+        for (int step = 0; step < parallelism.getIterations(); step++) {
+            long time = runForParallelism(ITERATIONS, elements, parallelism.get(step));
+            times[size][step] = time;
+        }
+    }
+
+    /**
+     * Runs <i>iterations</i> number of test sorts of a random array of <i>element</i> length
+     * @param iterations number of iterations
+     * @param elements number of elements in the random array
+     * @param parallelism parallelism for the ForkJoin framework
+     * @return the median time of runs
+     */
+    private long runForParallelism(int iterations, int elements, int parallelism) {
+        MergeSort mergeSort = new MergeSort(parallelism);
+        long[] times = new long[iterations];
+
+        for (int i = 0; i < iterations; i++) {
+            // Suggest the VM to run a garbage collection to reduce the risk of getting one
+            // while running the test run
+            System.gc();
+            long start = System.currentTimeMillis();
+            mergeSort.sort(generateArray(elements));
+            times[i] = System.currentTimeMillis() - start;
+        }
+
+        return medianValue(times);
+    }
+
+    /**
+     * Calculates the median value of the array
+     * @param times array of times
+     * @return the median value
+     */
+    private long medianValue(long[] times) {
+        if (times.length == 0) {
+            throw new IllegalArgumentException("Empty array");
+        }
+        // Make a copy of times to avoid having side effects on the parameter value
+        Arrays.sort(times.clone());
+        long median = times[times.length / 2];
+        if (times.length > 1 && times.length % 2 != 0) {
+            median = (median + times[times.length / 2 + 1]) / 2;
+        }
+        return median;
+    }
+
+    /**
+     * Generates 1000 arrays of 1000 elements and sorts them as a warmup
+     */
+    private void warmup() {
+        MergeSort mergeSort = new MergeSort(Runtime.getRuntime().availableProcessors());
+        for (int i = 0; i < 1000; i++) {
+            mergeSort.sort(generateArray(1000));
+        }
+    }
+
+    public static void main(String[] args) {
+        Configuration configuration = Configuration.parse(args);
+        if (configuration == null) {
+            System.exit(1);
+        }
+        System.out.println(configuration);
+        new MergeDemo().run(configuration);
+    }
+}
diff --git a/linux-x86/sample/forkjoin/mergesort/MergeSort.java b/linux-x86/sample/forkjoin/mergesort/MergeSort.java
new file mode 100644
index 0000000..0ae48dc
--- /dev/null
+++ b/linux-x86/sample/forkjoin/mergesort/MergeSort.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.util.Arrays;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.ForkJoinTask;
+import java.util.concurrent.RecursiveAction;
+
+/**
+ * A class for sorting an array of {@code ints} in parallel.
+ * A {@code ForkJoinPool} is used for the parallelism, using the merge sort
+ * algorithm the array is split into halves and a new sub task is created
+ * for each part. Each sub task is dispatched to the {@code ForkJoinPool}
+ * which will schedule the task to a {@code Thread}.
+ * This happens until the size of the array is at most 2
+ * elements long. At this point the array is sorted using a simple compare
+ * and possibly a swap. The tasks then finish by using insert sort to
+ * merge the two just sorted arrays.
+ *
+ * The idea of this class is to demonstrate the usage of RecursiveAction not
+ * to implement the best possible parallel merge sort. This version creates
+ * a small array for each merge (creating a lot of objects), this could
+ * be avoided by keeping a single array.
+ */
+public class MergeSort {
+    private final ForkJoinPool pool;
+
+    private static class MergeSortTask extends RecursiveAction {
+        private final int[] array;
+        private final int low;
+        private final int high;
+        private static final int THRESHOLD = 8;
+
+        /**
+         * Creates a {@code MergeSortTask} containing the array and the bounds of the array
+         *
+         * @param array the array to sort
+         * @param low the lower element to start sorting at
+         * @param high the non-inclusive high element to sort to
+         */
+        protected MergeSortTask(int[] array, int low, int high) {
+            this.array = array;
+            this.low = low;
+            this.high = high;
+        }
+
+        @Override
+        protected void compute() {
+            if (high - low <= THRESHOLD) {
+                Arrays.sort(array, low, high);
+            } else {
+                int middle = low + ((high - low) >> 1);
+                // Execute the sub tasks and wait for them to finish
+                invokeAll(new MergeSortTask(array, low, middle), new MergeSortTask(array, middle, high));
+                // Then merge the results
+                merge(middle);
+            }
+        }
+
+        /**
+         * Merges the two sorted arrays this.low, middle - 1 and middle, this.high - 1
+         * @param middle the index in the array where the second sorted list begins
+         */
+        private void merge(int middle) {
+            if (array[middle - 1] < array[middle]) {
+                return; // the arrays are already correctly sorted, so we can skip the merge
+            }
+            int[] copy = new int[high - low];
+            System.arraycopy(array, low, copy, 0, copy.length);
+            int copyLow = 0;
+            int copyHigh = high - low;
+            int copyMiddle = middle - low;
+
+            for (int i = low, p = copyLow, q = copyMiddle; i < high; i++) {
+                if (q >= copyHigh || (p < copyMiddle && copy[p] < copy[q]) ) {
+                    array[i] = copy[p++];
+                } else {
+                    array[i] = copy[q++];
+                }
+            }
+        }
+    }
+
+    /**
+     * Creates a {@code MergeSort} containing a ForkJoinPool with the indicated parallelism level
+     * @param parallelism the parallelism level used
+     */
+    public MergeSort(int parallelism) {
+        pool = new ForkJoinPool(parallelism);
+    }
+
+    /**
+     * Sorts all the elements of the given array using the ForkJoin framework
+     * @param array the array to sort
+     */
+    public void sort(int[] array) {
+        ForkJoinTask<Void> job = pool.submit(new MergeSortTask(array, 0, array.length));
+        job.join();
+    }
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/build.properties b/linux-x86/sample/jmx/jmx-scandir/build.properties
new file mode 100644
index 0000000..cad4a6a
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/build.properties
@@ -0,0 +1,58 @@
+# IMPORTANT NOTE
+#
+# If you made a private copy of this project you may have to update the
+# nbjdk.home variable at the end of this file.
+#  
+# To be able to run the test-suite, you will also have to set the
+# variable:
+#
+# libs.junit.classpath=<junit.jar> 
+#
+
+main.dir=.
+
+src.dir=${main.dir}/src
+test.src.dir=${main.dir}/test
+
+build.dir=build
+classes.dir=${build.dir}/classes
+
+dist.dir=dist
+jar=${dist.dir}/jmx-scandir.jar
+javadoc.dir=${dist.dir}/javadoc
+
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+
+build.sysclasspath=ignore
+# E.g.: cp=lib/x.jar:lib/y.jar
+cp=
+extra.run.cp=
+
+# To be able to run the test-suite, set the following property:
+# libs.junit.classpath=...
+
+javac.test.classpath=\
+    ${classes.dir}:\
+    ${libs.junit.classpath}
+
+main.agent.class=com.sun.jmx.examples.scandir.ScanDirAgent
+main.client.class=com.sun.jmx.examples.scandir.ScanDirClient
+main.class=${main.client.class}
+
+run.jvmargs=-Djava.util.logging.config.file=logging.properties
+common.jvmargs=${run.jvmargs} -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=truststore -Djavax.net.ssl.trustStorePassword=trustword
+client.jvmargs=${common.jvmargs}
+agent.jvmargs=${common.jvmargs} -Dcom.sun.management.config.file=src/etc/management.properties -Dscandir.config.file=src/etc/testconfig.xml
+
+client.args=localhost 4545
+
+run.cp=${cp}:${classes.dir}:${extra.run.cp}
+run.test.classpath=${run.cp}:${build.test.classes.dir}
+
+debug=true
+deprecation=false
+
+# Update this variable if need be to point to the JDK 6 location.
+# 
+nbjdk.home=${basedir}/../../..
diff --git a/linux-x86/sample/jmx/jmx-scandir/build.xml b/linux-x86/sample/jmx/jmx-scandir/build.xml
new file mode 100644
index 0000000..e54fcec
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/build.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+
+<!-- 
+  This is ant (http://ant.apache.org) build script to build the
+  "jmx-scandir" sample. Either this build.xml can be used standalone 
+  with "ant" tool or can be opened as a project with NetBeans IDE
+  (http://www.netbeans.org).
+-->
+
+<project name="jmx-scandir" default="jar" basedir=".">
+
+    <import file="nbproject/jdk.xml"/>
+    
+
+    <target name="-prop-init">
+        <property file="user.build.properties"/>
+        <property file="build.properties"/>
+    </target>
+
+    <target name="-init" depends="-prop-init,-jdk-init"/>
+
+    <target name="compile" depends="-init" description="Compile main sources.">
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+        </javac>
+        <copy todir="${classes.dir}">
+            <fileset dir="${src.dir}"/>
+        </copy>
+    </target>
+
+    <target name="jar" depends="compile" description="Build JAR file for main sources.">
+        <mkdir dir="${dist.dir}" />
+        <jar jarfile="${jar}" compress="true">
+            <manifest>
+                <attribute name="Main-Class" value="${main.agent.class}"/>
+            </manifest>
+            <fileset dir="${classes.dir}"/>
+        </jar>
+    </target>
+
+    <target name="run-client" depends="compile" description="Run client.">
+        <fail unless="main.client.class">Must set property 'main.client.class' (e.g. in build.properties)</fail>
+        <java classname="${main.client.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg line="${client.jvmargs}" />
+            <arg line="${client.args}" />
+        </java>
+    </target>
+
+    <target name="run-agent" depends="compile" description="Run agent.">
+        <fail unless="main.agent.class">Must set property 'main.agent.class' (e.g. in build.properties)</fail>
+        <java classname="${main.agent.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg line="${agent.jvmargs}" />
+        </java>
+    </target>
+
+    <target name="run" depends="run-agent" description="Run agent." />
+
+    <target name="run-single" depends="-init,compile">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <java classname="${run.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+        </java>
+    </target>
+
+    <target name="javadoc" depends="-init" description="Build Javadoc.">
+        <mkdir dir="${javadoc.dir}"/>
+        <javadoc destdir="${javadoc.dir}">
+            <classpath path="${cp}"/>
+            <sourcepath>
+                <pathelement location="${src.dir}"/>
+            </sourcepath>
+            <fileset dir="${src.dir}"/>
+        </javadoc>
+    </target>
+
+    <target name="clean" depends="-init" description="Clean build products.">
+        <delete dir="${build.dir}"/>
+        <delete file="${jar}"/>
+        <delete dir="${dist.dir}"/>
+    </target>
+
+    <target name="profile">
+        <ant antfile="nbproject/netbeans-targets.xml" target="profile"/>
+    </target>
+
+    <!-- JUnit targets -->
+
+    <target name="compile-test" depends="-init,compile">
+        <fail unless="libs.junit.classpath">Must set libs.junit.classpath variable to the JUnit classpath in the build.properties file.</fail>
+        <mkdir dir="${build.test.classes.dir}"/>
+        <javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="${debug}" classpath="${javac.test.classpath}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="**/*.java"/>
+        </copy>
+    </target>
+
+    <target name="-do-test-run" depends="-init,compile-test">
+        <mkdir dir="${build.test.results.dir}"/>
+        <junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
+            <batchtest todir="${build.test.results.dir}">
+                <fileset dir="${test.src.dir}" includes="**/*Test.java"/>
+            </batchtest>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper type="glob" from="test-sys-prop.*" to="*"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+            <jvmarg line="${run.jvmargs}"/>
+        </junit>
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+    
+    <target name="test" depends="-init,compile-test,-do-test-run" description="Run unit tests."/>
+
+    <target name="-do-test-run-single" depends="-init,compile-test">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
+            <batchtest todir="${build.test.results.dir}">
+                <fileset dir="${test.src.dir}" includes="${test.includes}"/>
+            </batchtest>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper type="glob" from="test-sys-prop.*" to="*"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+            <jvmarg line="${run.jvmargs}"/>
+        </junit>
+        <fail if="tests.failed">Some tests failed; see details above.</fail>
+    </target>
+
+    <target name="test-single" depends="-init,compile-test,-do-test-run-single" description="Run single unit test."/>
+</project>
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local-ant-run.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local-ant-run.jpg
new file mode 100644
index 0000000..6a58f0e
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local-ant-run.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local-java-jar.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local-java-jar.jpg
new file mode 100644
index 0000000..86add09
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local-java-jar.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local.jpg
new file mode 100644
index 0000000..0259e96
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/connect-local.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/remote-connection-failed.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/remote-connection-failed.jpg
new file mode 100644
index 0000000..001b0fa
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/remote-connection-failed.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/remote-connection.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/remote-connection.jpg
new file mode 100644
index 0000000..90d07a0
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/remote-connection.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-config.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-config.jpg
new file mode 100644
index 0000000..9e0a10c
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-config.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-result.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-result.jpg
new file mode 100644
index 0000000..75e7baf
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-result.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-start.jpg b/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-start.jpg
new file mode 100644
index 0000000..5bceae5
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/docfiles/scandir-start.jpg
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/index.html b/linux-x86/sample/jmx/jmx-scandir/index.html
new file mode 100644
index 0000000..4fd2ae6
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/index.html
@@ -0,0 +1,2217 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+<!--
+ Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+    <title>JMX(TM) "scandir" Example</title>
+  </head>
+  <body>
+  
+  <h1><center>Java<font size="-1"><sup>TM</sup></font> Management Extensions (JMX<font size="-1"><sup>TM</sup></font>) <i>scandir</i> Example</center></h1>
+  
+  <h2><a name="h2-Introduction">Introduction</a></h2>
+  <ul>
+  <p>The JMX <i>scandir</i> example is an application that
+     scans parts of a filesystem - e.g. a set of directories
+     used by a number of lab machines when running tests - in
+     order to clean up and optimize disk space by removing
+     obsolete files - e.g. files that are leaked by the test
+     suites running on those machines, like coredump files, or
+     temporary files that might remain after a test crash.
+     It could also serve as a basis for an application that
+     would monitor disk usage and suggest removal of old big
+     long-unaccessed files.
+  </p>
+  <p>The JMX <i>scandir</i> example does not however implement
+     the full fledged logic that such an application might
+     have. It implements a subset of this logic which is
+     sufficient to demonstrate common patterns and
+     solutions used when implementing a monitoring and
+     management interface for an application with JMX
+     Technology.</p>
+  <p>This example is an advanced JMX example, which presents 
+     advanced JMX concepts. It is assumed that the reader is already
+     familiar with the JMX API. Newcomers to JMX Technology are
+     invited to have a look at the <a
+     href="http://java.sun.com/javase/6/docs/technotes/guides/jmx/"
+     >JMX API Overview, Tutorial and Examples</a> before going any further.
+  </p>
+  <p></p>
+      <hr>
+  <blockquote>
+    <u>Note:</u> This example was developed using <a 
+     href="http://www.netbeans.org">NetBeans 5.0 IDE</a>. The instructions
+     given in this document to build, run, and test the example assume that
+     you have at your disposal:
+     <ul><li>either <a href="http://www.netbeans.org">NetBeans 5.0 IDE</a>,</li>
+         <li>or <a href="http://ant.apache.org/">Apache Ant 1.6.5</a> and 
+             <a href="http://sourceforge.net/projects/junit/">JUnit 3.8.1 or
+             3.8.2</a><br>
+             (JUnit is only needed to run the example's unit tests).
+         </li>
+     </ul>
+     <p><a name="setup">In order to build the example</a>, 
+     <u>you may need to copy the jmx-scandir</u>
+     directory to somewhere where you have write permissions. 
+     <br>In that case, you will need to update the <i>nbjdk.home</i> variable
+     in the copied <i><a href="build.properties">build.properties</a></i> 
+     file located at the root of the copied project directory. 
+     Please make sure that this variable points to the JDK 6 home directory.
+     </p>
+     <p>If you wish to run the testsuite from within the <a 
+     href="http://www.netbeans.org">NetBeans IDE</a> you will also have
+     to set the <i>libs.junit.classpath</i> variable in 
+     <a href="build.properties">build.properties</a>. 
+     The <i>libs.junit.classpath</i>  variable should point to your
+     <a href="http://sourceforge.net/projects/junit/">junit.jar</a>, 
+     version 3.8.1 or 3.8.2.
+     </p>
+  </blockquote>
+     <hr>
+     <p></p>
+     <p><u>Table Of Contents:</u></p>
+  <p><center>[<a href="#h2-Generating">Generating&nbsp;the&nbsp;Java&nbsp;Documentation</a>]
+  [<a href="#h2-Overview">Overview&nbsp;of&nbsp;the&nbsp;<i>scandir</i>&nbsp;Example</a>]
+  [<a href="#h2-API-Doc">API&nbsp;Documentation&nbsp;and&nbsp;Sources</a>]
+  [<a href="#h2-Patterns">Patterns,&nbsp;Best&nbsp;Practices,&nbsp;and&nbsp;Common&nbsp;Pitfalls</a>]
+  [<a href="#h2-Testing">Testing&nbsp;the&nbsp;<i>scandir</i>&nbsp;Example</a>]
+  [<a href="#h2-Running">Running&nbsp;the&nbsp;<i>scandir</i>&nbsp;Example</a>]
+  [<a href="#h2-Playing">Playing&nbsp;with&nbsp;JConsole</a>]
+  [<a href="#h2-Turning">Turning&nbsp;the&nbsp;example&nbsp;into&nbsp;a&nbsp;Secure&nbsp;JMX&nbsp;Application</a>]
+  [<a href="#h2-Connecting">Connecting&nbsp;to&nbsp;the&nbsp;Secure&nbsp;JMX&nbsp;Application</a>]
+  [<a href="#h2-Conclusion">Conclusion</a>]
+  [<a href="#h2-References">References</a>]</center></p>
+
+  </ul>
+  <h2><a name="h2-Generating">Generating the Java Documentation</a></h2>
+
+    <ul>
+        <p>Before reading further, you will need to generate the 
+        Java Documentation for the example's sources.</p>
+        <p>In the example root directory (where the <code>build.xml</code> 
+           file is located) run the following command:
+           <pre>ant javadoc</pre>
+        </p>
+        <p>Alternatively you can open the jmx-scandir project with the 
+           NetBeans IDE and generate the Javadoc from its <code>Build</code>
+           menu.
+        </p>
+        <p>If building the documentation fails, please make sure to read the 
+           <a href="#setup">note</a> at the beginning of this document.</p> 
+    </ul>
+  
+  <h2><a name="h2-Overview">Overview of the <i>scandir</i> Example</a></h2>
+  
+  <ul>
+    <p>The JMX <i>scandir</i> example is built around the
+    following MBeans:</p>
+    <ul>
+        <li>The first MBean we will present here is the
+        <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBean</a>. <br>A
+        <code>DirectoryScannerMXBean</code> is an MBean that scans a
+        file system starting at a given root directory, and then looks
+        for files that match the given criteria.  When such a file is
+        found, the <code>DirectoryScannerMXBean</code> takes the
+        action for which it was configured: emit a notification,
+        <i>and/or</i> log a <code>record</code> for this file,
+        <i>and/or</i> delete that file. The code that would actually
+        delete the file is commented out - so that nothing valuable is
+        lost if the example is run by mistake on the wrong set of
+        directories.<br> <code>DirectoryScannerMXBeans</code> are
+        created by the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a> - see next item on the list, from its
+        configuration.
+        </li>
+        <li>
+            The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+            >ScanManagerMXBean</a> is the actual entry point of the
+            application. It reads the application's
+            configuration, and from that configuration,
+            will create a <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManager.html"
+title="The ResultLogManager is in charge of managing result logs"
+        >ResultLogManager</a> and some <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a>.
+            <br>The <code>ScanManagerMXBean</code> lets you start, stop, and
+            schedule directory scans. The
+            <code>ScanManagerMXBean</code> is a singleton
+            MBean: there can be at most one instance of such
+            an MBean registered in a given MBeanServer.
+        </li>
+        <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> is an MBean which is able to
+           load/save the configuration to/from an XML file. It
+           will also let you modify that configuration - by e.g.
+           creating new directory scanners in there.
+           The corresponding MBeans will be created later, only 
+           when you later
+           ask the <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> </code> to apply the
+           configuration again.<br>
+           The <code>ScanDirConfigMXBean</code> is created by the
+           <code>ScanManagerMXBean</code>, when the
+           <code>ScanManagerMXBean</code> is registered.
+           It is also possible to create an alternate
+           <code>ScanDirConfigMXBean</code>, and to switch the
+           <code>ScanDirConfigMXBean</code> to use one or the other
+           configuration.
+           <br>An example of XML configuration file is given
+           <a href="src/etc/testconfig.xml"
+           title="An Example Of Configuration"
+           >here</a>. Although you could edit such a file by
+           hand, it is easier to do it programmatically (or
+           with <a href="#JConsole">JConsole</a>) through
+           the <code>ScanDirConfigMXBean</code> interface.
+        </li>
+        <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a> is in charge of managing result logs.
+        <br>Directory Scanners can be configured to log a
+        <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/config/ResultRecord.html"
+title="A ResultRecord contains information about a file matching the criteria of a Directory Scanner"
+        >ResultRecord</a> whenever they take action upon a file that
+        matches their criteria. The <code>ResultLogManagerMXBean</code> is
+        responsible for logging these result records.
+        The <code>ResultLogManagerMXBean</code> can be configured to log
+        such records to a flat file, or into a log held in memory, or
+        both. Both logs (file and memory) can be configured with a
+        maximum capacity. 
+        <br>When the maximum capacity of the memory
+        log is reached, its first entry (i.e. its oldest entry) is
+        removed to make place for the latest one.
+        <br>When the maximum
+        capacity of the file log is reached, the file is
+        renamed by appending a tilde '~' to its name and a
+        new result log is created. 
+        <br>The <code>ResultLogManagerMXBean</code>
+        will let you interactively clear these result logs, change their
+        capacity, and decide where (memory or file) to log.
+        The memory log is useful in that its content can be interactively
+        returned by the <code>ResultLogManagerMXBean</code>, while
+        the file log doesn't have this facility.<br>
+        The result logs are intended to be used by e.g. an offline
+        program that would take some actions on the files that
+        matched the scan criteria:
+        <br>The <i>scandir</i> application
+        could be configured to only produce logs (i.e. takes no
+        action but logging the matching files), and the real
+        action could be performed by another program or module (e.g. mail the result log to the engineer who
+        maintains the lab, or parse that log and delete all the
+        files listed there, or parse the log and prepare and send
+        a single mail to each owner of matching files, containing
+        the list of files they should consider deleting).<br>
+        The <code>ResultLogManagerMXBean</code> is a singleton
+        MBean created by the <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> </code>
+        which reads and writes its configuration from the
+        <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code>.
+        </li>
+    </ul>
+    <p>An application <code>main()</code> method is
+       provided in the <a 
+       href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirAgent.html"
+       >ScanDirAgent</a> class. The <code>main()</code> simply registers 
+       a <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> </code> in the platform MBeanServer, and
+       then waits for someone to call <code>close()</code> on the
+       <code>ScanManagerMXBean</code>.
+    </p>
+     <p>When the <code>ScanManagerMXBean</code> is registered, it
+        will create a default <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code> bound
+        to a default XML config file.
+     </p>
+     <p>The application's default XML config file is determined as
+        follows:
+        <ol>
+            <li>If the property <code>scandir.config.file</code> is
+                defined, the default application file will be the
+                file pointed to by this property. If that file
+                doesn't exist, it will be created when 
+                <code>ScanDirConfigMXBean.save()</code> is
+                invoked.
+            </li>
+            <li>Otherwise the application config file is
+                assumed to be a file called <code>jmx-scandir.xml</code>,
+                located in the user's directory (as defined by
+                the System property <code>user.home</code>). 
+                If that file doesn't exists, it will be created when 
+                <code>ScanDirConfigMXBean.save()</code> is
+                invoked.
+            </li>
+        </ol>
+        <p>It is worth noting that this project is defined to
+           run with the following properties:
+           <pre>-Djava.util.logging.config.file=logging.properties</pre>
+           <pre>-Dscandir.config.file=src/etc/testconfig.xml</pre>
+           With <code>ScanDirAgent</code> defined as the project's
+           main class. Hence when you invoke from the NetBeans IDE 
+           <i>Run Project</i> on the <i>jmx-scandir</i> project, 
+           or <i>Run file</i> on the <code>ScanDirAgent</code>, the
+           application starts with the test configuration provided in
+           <a href="src/etc/testconfig.xml"
+           title="An Example Of Configuration"
+           >src/etc/testconfig.xml</a>
+        </p>
+  </ul>
+  <h2><a name="h2-API-Doc">API Documentation and Sources</a></h2>
+  <ul>
+      <p>Once generated, the Javadoc of example classes can
+      be found starting from <a href="dist/javadoc/index.html"
+      title="The API Documentation"
+      ><code>dist/javadoc/index.html</code></a>.</p>
+      <p>You can view the sources in the <a
+      href="src"
+      title="The Example Source Tree"
+      ><code>src</code></a> subdirectory.</p>
+  </ul>
+  <h2><a name="h2-Patterns">Patterns, Best Practices, and Common Pitfalls</a></h2>
+  <ul>  
+  <p>This section discusses some common patterns and
+     design choices that this example demonstrates, and some pitfalls that
+     it avoids.
+  </ul>
+  <h3>MBeans or MXBeans?</h3>
+  <ul>
+  <p>What is an MXBean? MXBeans made their appearance in
+     J2SE 5.0 (Tiger), with the Management and Monitoring
+     API of the JVM. However, Java SE 6 is the first
+     Java SE release that contains a standard framework which
+     makes it possible to create and register your own MXBeans.
+  </p>
+  <p>MXBeans are a special kind of MBean, which once registered
+     in the MBeanServer, get automatically transformed into
+     OpenMBeans. From a developer point of view, nothing changes:
+     A Wombat MBean can become an MXBean simply by renaming
+     its <code>WombatMBean</code> interface into <code>WombatMXBean</code>.</p>
+  <p>Using MXBeans rather than plain Standard MBean brings its
+     own advantages:</p>
+     <ul>
+         <li>
+             Generic tools, like JConsole, will be able to
+             display and interact with your MXBeans nicely, even
+             if your MXBean interfaces reference custom types
+             - e.g. custom Java enums. This is because all the types
+             exposed by your MXBeans are converted to Open Types.
+             Just look at the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+             >ScanDirConfigMXBean</a> with JConsole and you will
+             understand the benefits.
+         </li>
+         <li>
+             When writing a programmatic client, you can obtain
+             a proxy that implements the original MXBean interface,
+             and forget about the Open Type conversion.
+             The JUnit unit tests that come with this example
+             use this feature very widely. Have a look at them.
+         </li>
+         <li>
+            The MXBean framework also lets you nicely navigate
+            from one MXBean to another: your MXBeans can
+            have attributes and parameters which are proxies
+            to other MXBeans! We demonstrate this in the
+            <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+            >ScanManagerMXBean</a> which exposes a list
+            of <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBean</a></code> and points
+            towards a <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code>.
+         </li>
+     </ul>
+     <p>In short, MXBeans are so much easier to use that
+        this example doesn't even have a single regular
+        Standard MBean.
+     </p>
+     <p>See also <a
+href="http://weblogs.java.net/blog/emcmanus/archive/2006/02/what_is_an_mxbe.html"
+title="What is an MXBean?"
+     >What is an MXBean?</a>
+     and <a
+href="http://weblogs.java.net/blog/emcmanus/archive/2006/06/intermxbean_ref.html"
+title="Inter-MXBean references"
+     >Inter-MXBean References</a>.
+     </p>
+     <blockquote><u>Hint:</u> In order to simplify the task of coding a 
+        JMX programmatic client, we recommend that getters, setters, and
+        operations defined in MBean and MXBean interfaces throw 
+        <code>IOException</code>. Proxy objects will then be able
+        to rethrow directly any <code>IOException</code> received from
+        their underlying MBean Server connection, without wrapping
+        them into <code>UndeclaredThrowableExceptions</code>.<br>
+        Since the life cycle of the proxy object is not directly tied to 
+        the life cycle of the MBean it proxies, you may also want to
+        have all methods in the MBean or MXBean interface throw
+        <code>InstanceNotFoundException</code> or more generally
+        <code>JMException</code>.
+    </blockquote>
+  </ul>
+  <h3>MBean Names - aka ObjectNames</h3>
+  <ul>
+  <p>As you must know if you've been studying JMX, MBeans are
+     named objects. The names of MBeans are represented by
+     instances of <code>ObjectName</code>. An ObjectName is
+     composed of a <i>domain</i>, followed by a colon ':',
+     followed by a comma-separated list of <i>key=value</i>
+     pairs.<br>
+     The ordering of the <i>key=value</i> pairs is not
+     important, but <code>ObjectNames</code> are case sensitive
+     (both keys and values are case sensitive) and <b>white space
+     is not ignored</b>.<br>
+     A common pitfall for JMX beginners is to inadvertently
+     insert white space after commas into an ObjectName,
+     and expect that two ObjectNames which differ only by such white
+     space will be considered identical. This is not the
+     case.<br>
+     As an example, the ObjectName '<b><code>D:k1=v1, k2=v2, k3=v3</code></b>' has
+     three keys, which are '<b><code>k1</code></b>', '<b><code> k2</code></b>',
+     and '<b><code> k3</code></b>': beware
+     of the space in the name of the second and third
+     keys!<br>
+     It is therefore a different ObjectName from
+     '<b><code>D:k1=v1,k2=v2,k3=v3</code></b>' (the keys are now
+     '<b><code>k1</code></b>', '<b><code>k2</code></b>', and
+     '<b><code>k3</code></b>'), but the same ObjectName as
+     '<b><code>D: k2=v2, k3=v3,k1=v1</code></b>', and yet different
+     from '<b><code>D:k2=v2, k3=v3, k1=v1</code></b>'!
+     <p>In this example, we are following the rules
+        for ObjectName suggested in the <a
+href="http://java.sun.com/products/JavaManagement/best-practices.html"
+        >JMX Best Practices</a>:</p>
+     <ul>
+         <li>ObjectNames should be <a
+         href="http://java.sun.com/products/JavaManagement/best-practices.html#mozTocId654884"
+         >predictable</a>
+         </li>
+        <li>The domain part of our ObjectNames starts with a Java
+            package name
+        </li>
+        <li>Our ObjectNames contain a <code>type=</code>
+            key property. This property is different for every
+            object type in our domain.
+        </li>
+        <li>For every ObjectName with a given type, we have the same set of key
+            properties with the same syntax and semantics for their values - in
+            fact we only use an additional <code>name=</code> key.
+        </li>
+        <li>When there can only be one instance of a given type
+            there aren't any other key properties than <code>type=</code>.
+            The ObjectNames of the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+            >ScanManagerMXBean</a> and <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a>, which are both singleton MBeans, are
+        composed in this way.
+        </li>
+        <li>When there can be several instances of a given type,
+            we differentiate them by further key properties.
+            To achieve this, we are using the most usual key property
+            in addition to <code>type=</code>: the <code>name=</code> key.
+            In this example, a key property list of the form
+            <code>type=X,name=Y</code> is always enough to uniquely name
+            an MBean. Tools like jconsole are usually aware
+            of the semantics of the <code>type=</code> key and
+            <code>name=</code> key, and are therefore able to
+            display this form of name in a way that
+            is easier to read than other name forms.
+        </li>
+     </ul>
+     <p>The rules listed above are implemented by a couple
+        of static helper functions in the <a
+href="src/com/sun/jmx/examples/scandir/ScanManager.java"
+title="ScanManager.java"
+      >ScanManager</a> class. See the code of the
+      <b><code>makeSingletonName</code></b> and
+      <b><code>makeMBeanName</code></b> methods.
+     </p>
+  </ul>
+  <h3>Inter MBean Navigation</h3>
+  <ul>
+  <p>One of the most common problems that needs to be solved
+     when designing a management interface with JMX is to
+     choose a representation for inter-MBean relationships.<br>
+     Prior to Java 6, there were basically three possible
+     choices:</p>
+     <ul>
+         <li><b>Make the relation appear in the ObjectName</b>.
+             For instance, if MBean B was contained in
+             MBean A, you could choose to name MBean B so
+             that its parent relationship with MBean A
+             appeared in its name. <br>
+             The obvious limitation of this solution is that
+             it only allows to model one such relation (an
+             MBean has only one name) and the relation must
+             be fixed - it cannot change during the life of
+             the MBean since the name of an MBean cannot
+             change.<br>
+             This scheme is therefore mostly used when
+             the application MBeans are modeling objects
+             which are conceptually contained within
+             each other in a tree-like structure.
+             <br>For instance, most MBean names defined by 
+             <a href="http://jcp.org/en/jsr/detail?id=77"
+              >J2EE Management (JSR 77)</a> follow
+              this scheme.
+         </li>
+         <li><b>Design getters and setters (or operations) which
+             return <code>ObjectName</code> or
+             <code>ObjectName[]</code> values</b>. The ObjectNames
+             point to the MBeans which are related to that
+             object. For instance , <a 
+             href="http://glassfish.dev.java.net/"
+             title="Open Source Java EE 5 Application Server"
+             >GlassFish</a>
+             defines MBeans which also use this pattern.
+         </li>
+         <li><b>Use the JMX RelationService</b>. The JMX RelationService
+             is quite powerful, but simple relationships often
+             do not justify that overhead.
+         </li>
+     </ul>
+     <p>In Java 6, these three possibilities still remain, but
+        the new MXBean framework brings up an interesting
+        alternative. Instead of returning an ObjectName or
+        an ObjectName array, <b>an MXBean can return a proxy</b>
+        to its related MXBeans. This is how we have chosen to
+        implement our inter MBean relationships in this
+        example:
+        <br>For instance the
+        <code>ScanManagerMXBean</code>/<code>DirectoryScannerMXBean</code>
+        relationship and the
+        <code>ScanManagerMXBean</code>/<code>ScanDirConfigMXBean</code>
+        relationships are implemented in this way.
+        <p>
+        The additional benefit, as compared to returning ObjectNames or
+        using the RelationService is that interface type of the MBeans
+        which are pointed to by the relationship becomes directly
+        apparent. The method:
+        <pre>
+            public Map&lt;String,DirectoryScannerMXBean&gt; getDirectoryScanners();
+        </pre>
+        makes it immediately obvious that the MBeans to which we point are
+        <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a>. It would have been much less obvious in prior
+        versions of Java SE, were the returned type would have had to be
+        <code>Map&lt;String,ObjectName&gt;</code>, or
+        even worse just <code>Map</code>.
+     </p>
+     <p>However, it must be clear that the behaviour will be
+        quite different when an MXBean is returned as compared
+        to when a simple bean is returned.
+     </p>
+     <p>When an MXBean is returned, the remote client sees either
+        an ObjectName, if it is a generic client like jconsole, or
+        a proxy to a remote MXBean, if the client is working with the
+        MXBean interface. Invoking an operation on one of the
+        proxy returned by a method such as
+        <code>getDirectoryScanners</code> will cause the
+        MBean to be invoked on the remote server side.
+     </p>
+     <p>If <code>getDirectoryScanners</code> were
+        defined as:
+        <pre>
+            public Map&lt;String,DirectoryScannerConfig&gt; getDirectoryScanners();
+        </pre>
+        then invoking a method on one of the returned objects
+        would have absolutely no effect on the remote
+        server side - because the returned objects in this
+        case would simply be a bunch of serialized data objects.
+     </p>
+     <p>It is worth noting that although an MXBean interface
+        can have getters and operations which return an MXBean
+        interface, a regular standard MBean shouldn't have
+        any getters or methods which return MBean interfaces or
+        MXBean interfaces.
+     </p>
+     <p>For more information see also <a
+href="http://weblogs.java.net/blog/emcmanus/archive/2006/06/intermxbean_ref.html"
+title="Inter-MXBean references"
+     >Inter-MXBean References</a>.
+     </p>
+  </ul>
+  <h3>The MBeanRegistration interface, or how an MBean can
+      know or provide its own name</h3>
+  <ul>
+      <p>
+        Sometimes, an MBean needs to have a reference to the
+        MBeanServer in which it is registered, or needs to know
+        with which ObjectName it has been registered.
+      </p>
+      <p>
+         Sometimes also, an MBean may need to perform some
+         checks before being registered, or will need
+         to carry out some actions right after it has been 
+         successfully registered in the MBeanServer.
+      </p>
+      <p>
+        Sometimes again, an MBean may need to perform some
+        checks, or some cleaning actions, just before, or
+        just after, it is unregistered.
+      </p>
+      <p>
+      When an MBean has such needs, the easiest solution
+      for it is to implement the <code>MBeanRegistration</code>
+      interface.
+      </p>
+      <p>The <code>MBeanRegistration</code> interface is a callback 
+      interface which defines pre and post registration and 
+      unregistration callbacks.
+      </p>
+      <p>
+       When an MBean implementing this interface is created
+      (with <code>createMBean</code>) or registered 
+      (with <code>registerMBean</code>) in an MBeanServer,
+      the MBeanServer will call the <code>preRegister</code>
+      and <code>postRegister</code> method implemented by
+      the MBean. The <code>preRegister</code> method
+      has an <code>MBeanServer</code> and <code>ObjectName</code>
+      parameter, which are passed by the MBeanServer to the
+      MBean. The MBean can store the reference it is being passed
+      in a private instance variable for later use. 
+      </p>
+      <p>
+      Most of the MXBeans we have defined in this example
+      implement the <code>MBeanRegistration</code> interface. The table
+      below show how our MBeans use this interface to control
+      their own names, make sanity checks, perform 
+      initialization steps or cleanup actions.
+      </p>
+      <p><br><center>
+      <table border="1" cellpadding="4" cellspacing="2" 
+             bgcolor="#eeeeee" width="95%">
+          <thead>
+              <tr bgcolor="#cecece">
+                  <th width="20%">MBean Requirement</th>
+                  <th>callback</th>
+                  <th>use case example</th>
+              </tr>
+          </thead>
+          <tbody>
+              <tr>
+                  <td bgcolor="#dedede">get a reference to the MBeanServer</td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  needs a reference
+                  to the MBeanServer in order to create and
+                  register other MBeans, such as the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a>, and the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a>.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">reject registration if conditions are
+                      not met.
+                  </td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html"
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  will throw
+                  an IllegalArgumentException in <code>preRegister</code>
+                  if the ObjectName it is being passed is
+                  illegal. Throwing an exception in 
+                  <code>preRegister</code> makes the registration fail.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">get my client-assigned MBean name</td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> propagates the
+                  value of the <code>name=</code> property of 
+                  the ObjectName it is given into its
+                  ScanManagerConfig bean.  
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">provide my own default ObjectName if none
+                      was given to the MBeanServer
+                  </td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The name that is returned by <code>preRegister</code>
+                  is the ObjectName with which the MBean will be
+                  eventually registered. 
+                  The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> is able to suggest
+                  a value for its own ObjectName if none was
+                  provided. Similarly, the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> 
+                  always returns its singleton ObjectName
+                  defined by <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html#SCAN_MANAGER_NAME" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean.SCAN_MANAGER_NAME</a>.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">perform initialization steps</td>
+                  <td><code>preRegister</code></td>
+                  <td bgcolor="#fafafa">The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> uses <code>preRegister</code>
+                  to initialize its internal ScanManagerConfig bean.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">perform initialization steps, once it is
+                  known that the registration was successful.
+                  </td>
+                  <td><code>postRegister</code></td>
+                  <td bgcolor="#fafafa">The <code>postRegister</code> method 
+                  can be used to implement
+                  initialization steps that need to be done once it
+                  is known that the registration was successful, or to
+                  undo any action performed by <code>preRegister</code> once it
+                  is known that registration was not successful.
+                  The <code>postRegister</code> method has a Boolean parameter
+                  which tells the MBean whether it was or wasn't
+                  successfully registered in the MBeanServer.
+                  The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses <code>postRegister</code> to create
+                  and register other MBeans, such as the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a> and the default
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a>.
+                  Note that <code>postRegister</code> is not expected to throw any
+                  exception. If an exception needs to be thrown, it should
+                  be thrown in <code>preRegister</code>.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">check whether the MBean can be deregistered</td>
+                  <td><code>preDeregister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses this method to verify
+                   that its state allows it to be deregistered. 
+                   In particular, it will refuse to be deregistered
+                   if it is in the RUNNING or SCHEDULED state.
+                   If <code>preDeregister</code> throws an exception, the unregisterMBean
+                   call will fail and the MBean will remain registered in
+                   the MBeanServer. 
+                   Take particular care when implementing business logic
+                   in this method: if the logic you implement has an 
+                   unfortunate bug which makes it always throw an 
+                   exception, you will never be able to unregister
+                   that MBean.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">clean up resources, refusing to be deregistered if
+                      it fails
+                  </td>
+                  <td><code>preDeregister</code></td>
+                  <td bgcolor="#fafafa">The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses this method to unregister
+                  all the other MBeans it has created and registered in the
+                  MBeanServer. This includes the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a>, the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBeans</a> it has created, and the 
+                  <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a> it has created when
+                  applying its configuration.
+                  </td>
+              </tr>
+              <tr>
+                  <td bgcolor="#dedede">clean up resources which need to be released in
+                  a best-effort way, when it is known that the MBean is no
+                  longer registered.
+                  </td>
+                  <td><code>postDeregister</code></td>
+                  <td bgcolor="#fafafa"><code>postDeregister</code> is only called if the MBean was succesfully
+                  unregistered.
+                  The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a>  uses this method to cancel
+                  its internal java.util.Timer.
+                  </td>
+              </tr>
+          </tbody>
+      </table>
+      </center><br></p>
+  </ul>
+  <h3>The Singleton MBean Pattern</h3>
+  <ul>
+      <p>
+        A singleton MBean is an MBean which can only have one
+        instance registered in a given MBeanServer. <br>
+        A singleton MBean usually has a well-known name,
+        which can be defined as a constant. In that case,
+        clients no longer need to call <code>new ObjectName(...)</code> 
+        and catch the declared <code>MalformedObjectNameException</code>.
+      </p>
+      <p>There are already quite a few examples of singleton
+         MBeans in the java.lang.management API. The 
+         ThreadingMXBean, ClassLoadingMXBean, RuntimeMXBean, etc.
+         are all singleton MBeans.
+      </p>
+      <p>In this example, we have two singleton MBeans:
+         The <code><a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a></code> and the 
+         <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a></code>. But in fact,
+         the only real singleton MBean is the 
+        <code>ScanManagerMXBean</code>. The 
+        <code>ResultLogManagerMXBean</code> just happens to
+        be a singleton MBean because it has a 1-1 relationship
+        with the <code>ScanManagerMXBean</code>.
+      </p>
+      <p>The <code>ScanManagerMXBean</code> implements the
+         singleton MBean pattern in this way:
+      </p>
+      <ul>
+          <li>The <code>ScanManagerMXBean</code> name has a single 
+              key property: <code>type=ScanManagerMXBean</code>.</li>
+          <li>Its name is defined by an ObjectName constant called
+              <code>SCAN_MANAGER_NAME</code> in the <code>ScanManager</code> class</li>
+          <li>The <code>ScanManagerMXBean</code> enforces its status of 
+              singleton MBean. It will refuse to be registered
+              with a name other than
+              the <code>SCAN_MANAGER_NAME</code>. You can therefore depend on
+              the fact that the <code>ScanManagerMXBean</code> will always 
+              be registered with its singleton <code>SCAN_MANAGER_NAME</code>
+              (see <code>preRegister</code>)
+          </li>
+          <li>You are not obliged to provide a name when you
+              register the <code>ScanManagerMXBean</code>: if you pass null,
+              then the <code>ScanManager</code> will be registered with
+              its singleton <code>SCAN_MANAGER_NAME</code>
+              (see <code>preRegister</code>).
+          </li>
+          <li>The <code>ScanManager</code> class has a no-arg static 
+              <code>register</code> method that will register
+              the singleton instance in the Platform MBeanServer.
+              This static <code>register</code> method returns
+              a proxy to the registered singleton.
+          </li>
+          <li>The <code>ScanManager</code> class has also a static 
+              <code>register</code> method that will create
+              a singleton instance in a (possibly remote)
+              MBeanServerConnection - using 
+              <code>createMBean</code>.
+              This static <code>register</code> method 
+              also returns a proxy to the registered singleton.
+          </li>
+          <li>Only the MBeanServer has a reference to the
+              singleton instance. The singleton instance is
+              not returned to the caller, and not kept
+              in any other static data structure.
+          </li>
+      </ul>
+      <p>
+      On the other hand, the <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a></code>
+      has a much more relaxed implementation of the pattern:
+      <br>It simply provides its own singleton name if it is
+      registered with a null ObjectName, but will not enforce 
+      the use of that name.
+      </p>
+      <p>Note that all singleton MBean names in this example
+      are created using the <code>ScanManager.makeSingletonName</code>
+      method, which implements the pattern for ObjectNames suggested
+      in the JMX Best Practices.
+      </p>
+  </ul>
+  <h3>Managing the Life Cycle of dependent MBeans</h3>
+  <ul>
+      <p>A common task that many JMX applications have
+        is to manage the life cycle of MBeans registered
+        in the MBeanServer.</p>
+      <p>In this example, we have decided to follow a simple
+      pattern:</p>
+      <ul>
+          <li>The application is initialized simply 
+              by registering the singleton 
+              <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> in 
+              the MBeanServer.
+          </li>
+          <li>The <code>ScanManagerMXBean</code> will then
+              in turn register any other MBean that the 
+              application might need:
+              <ul>
+                  <li>It creates and registers the singleton
+                      <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a></code>
+                  </li>
+                  <li>It creates and registers the default
+                      <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a></code>
+                      which loads the initial configuration
+                  </li>
+                  <li>It creates as many 
+                     <code><a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBeans</a></code> as
+                     needed when the configuration is applied
+                  </li>
+                  <li>It lets you create alternate 
+                      <code>ScanDirConfigMXBean</code>, to
+                      which you can later switch in order
+                      to apply a new alternate configuration.
+                  </li>
+              </ul>
+          </li>
+          <li>When a new configuration is applied (or if the
+              current configuration is reapplied), the 
+              <code>ScanManagerMXBean</code> will unregister
+              any <code>DirectoryScannerMXBeans</code> it has
+              previously registered, and will re-create
+              brand new <code>DirectoryScannerMXBeans</code>
+              from the applied configuration.
+          </li>
+          <li>When you unregister the <code>ScanManagerMXBean</code>,
+              it does all the cleanup for you, by unregistering
+              all the MBeans that it has created during the
+              course of the application.
+          </li>
+      </ul>
+      <p>The <code>ScanManagerMXBean</code> makes use of its
+         <code>MBeanRegistration</code> interface in order
+         to register the other MBeans it needs (see the
+         <code>ScanManager.postRegister</code> method) and to unregister
+         every MBean it has created (see the <code>ScanManager.preDeregister</code>
+         method).
+      </p>
+      <p>You will note that the <code>ScanManagerMXBean</code>
+         will only allow itself to be deregistered if it can be 
+         closed - that is if there's no other action in
+         progress. 
+         This is to make sure that the deregistration of
+         dependent MBeans will work smoothly. 
+         <br>
+         The deregistration of related MBeans will happen
+         in the <code>ScanManager.preDeregister</code>
+         method.
+         <br>
+         If one of these MBeans could not be deregistered,
+         then the <code>ScanManagerMXBean</code> will throw
+         an exception, refusing to be deregistered.
+         <br>This leaves you a chance to try to deregister it
+         again later. Since the <code>ScanManagerMXBean</code>
+         has switched its state to CLOSED before starting
+         to unregister its dependent MBeans, it will refuse
+         any further actions, ensuring that e.g. nobody
+         can try to start it or schedule it while it
+         is in that partially-deregistered state.
+      </p>
+      <p>Handling the LifeCycle of all the application's
+         MBeans in a single MBean is usually a good design
+         pattern, especially if the application is a 
+         module which is intended to share a JVM - or
+         an MBeanServer - with other modules.
+      </p>
+      <p>This is specially useful if the application needs to
+         be loaded and unloaded on demand: in that 
+         case, simply registering or unregistering the top level 
+         MBean (in our example the <code>ScanManagerMXBean</code>) does
+         the trick.
+      </p>
+  </ul>
+  <h3>Emitting Notifications</h3>
+  <ul>
+       <p>In order to emit notifications, an MBean must be
+       an instance of <code>NotificationEmitter</code>. 
+       The <code>NotificationEmitter</code> interface defines methods 
+       that the MBeanServer will call on the MBean in order
+       to register <code>NotificationListeners</code> with the MBean.
+       </p>
+       <p>It is worth noting that the MBean may not be
+          invoked each time a JMX client wants to register
+          a listener. For instance, the RMIConnectorServer
+          registers <i>only once</i> a single listener with each MBean 
+          which is a <code>NotificationEmitter</code>.
+          In that specific case, the listener may even be registered
+          with the MBean before any client has actually subscribed
+          for notifications from that particular MBean.
+       </p>
+       <p>An MBean can therefore make no assumption about 
+          which client or how many clients have registered for
+          notifications.
+       </p>
+       <p>It is also worth noting that the logic of the
+       methods defined in <code>NotificationEmitter</code> would not
+       be trivial to implement from scratch. Fortunately
+       the JMX API defines a helper class, called 
+       <code>NotificationBroadcasterSupport</code>, which 
+       provides an implementation for these methods.
+       </p>
+       <p>There are actually three ways for an MBean to
+       implement <code>NotificationEmitter</code>, of which only two
+       are recommended.
+       </p>
+  </ul>
+
+  <h4>Extending NotificationBroadcasterSupport</h4>
+  <ul>
+    <p>This is the simplest way of coding an MBean which
+       is a <code>NotificationEmitter</code>:
+    </p>
+    <p>Simply extend <code>NotificationBroadcasterSupport</code>,
+    then override its <code>getNotificationInfo</code> method
+    which returns the <code>MBeanNotificationInfo[]</code> array
+    that should be included in your MBean's <code>MBeanInfo</code>
+    and that's it. 
+    <br>You just need to call the <code>sendNotification</code> method
+    inherited from <code>NotificationBroadcasterSupport</code> whenever
+    your MBean needs to send a notification.
+    </p>
+    <p>In our example, both the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+           >ScanDirConfigMXBean</a> and <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+        >ResultLogManagerMXBean</a> extend 
+      <code>NotificationBroadcasterSupport</code> in order
+      to send notifications.
+    </p>
+  </ul>
+  <h4>The Delegation Pattern: delegating to a 
+      NotificationBroadcasterSupport delegate</h4>
+  <ul>
+      <p>There may be cases however where delegating to a
+      wrapped <code>NotificationBroadcasterSupport</code> 
+      object may be preferred to extending 
+      <code>NotificationBroadcasterSupport</code>.
+      </p>
+      <p>For instance, if your MBeans already derive from
+      some base class, extending <code>NotificationBroadcasterSupport</code>
+      might not be an option.
+      </p>
+      <p>Similarly, if you do not want to have the inherited 
+      <code>public void sendNotification(Notification notification)</code>
+      method appear in the Javadoc of the concrete class of your
+      MBean, you may want to consider using the delegation
+      pattern instead of extending 
+      <code>NotificationBroadcasterSupport</code>
+      </p>
+      <p>In our example both the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> and the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+        >DirectoryScannerMXBean</a> use the delegation 
+       pattern rather than extending 
+       <code>NotificationBroadcasterSupport</code>.
+       In the end, choosing between one or the other method
+       is more a question of taste, although the delegation 
+       pattern could be considered more flexible since it
+       doesn't require extending any given superclass.
+      </p>
+      <p>It may be also worth noting that some tools like
+      the JMX Module of <a 
+href="http://www.netbeans.org"
+      >NetBeans IDE</a>, will be able to 
+      generate for you all the code that delegates to a
+      wrapped <code>NotificationBroadcasterSupport</code>.
+      </p>
+  </ul>
+      
+  <h4>Implementing NotificationEmitter from scratch</h4>
+  <ul>
+    <p>This is the last possibility for an MBean that
+    needs to send notifications: simply implement 
+    <code>NotificationEmitter</code> from scratch. This is highly
+    discouraged since that logic is not trivial, and 
+    already provided by 
+    <code>NotificationBroadcasterSupport</code> anyway.
+    </p>
+  </ul>
+    
+  <h4>Beware of Synchronization Locks</h4>
+  <ul>
+       
+       <p>One thing you must keep in mind when sending
+       notifications is not to send them from within
+       a synchronized block, or while holding a lock on
+       some resource.</p>
+       <p>Indeed, what happens when you send a notification
+          may vary greatly depending on whether the client
+          which has registered for notifications has done
+          so through a <code>JMXConnector</code> (like the 
+          <code>JMXRMIConnector</code>)
+          or through a direct reference to the MBeanServer
+          (by calling 
+          <code>MBeanServer.addNotificationListener</code>).
+       </p>
+       <p>In this latter case, the listener will be invoked
+       synchronously in the same thread that your MBean is
+       using to send its notification. If by misfortune, the
+       code of that listener now re-enters your MBean through a
+       call that flows through a JMXConnector, a deadlock
+       could occur. It is therefore very important to release
+       any lock you may have before calling 
+       <code>sendNotification</code>.</p>
+       <p>An easy way to do that is demonstrated in the
+          <code>ScanManager</code> class. The ScanManager
+          has an internal private queue of pending notifications.
+          When a notification needs to be sent (e.g. because the
+          ScanManager state is being switched), the notification
+          is simply prepared and put into the pending notification
+          queue. 
+          The notification queue is then processed later on, 
+          at the end of the method, when the processing is finally
+          completed and all the locks have been released.
+          <br>At this point the notification queue might already
+          have been emptied by another thread - in which case
+          the pending notifications will have already been
+          removed from the queue. Which thread actually gets 
+          to send the notifications is of no importance. The 
+          important point is that all the locks detained by
+          your MBean code in that thread were released before
+          the notification was sent.
+       </p>
+       <p>In our example the <code>ScanManager</code> class 
+          ensures this by:
+          <ul>
+              <li>Only calling <code>sendNotification</code>
+                  in its private <code>sendQueuedNotifications</code>
+                  method.
+              </li>
+              <li>Only calling <code>sendQueuedNotifications</code>
+                  when all locks have been released.
+              </li>
+              <li>Never calling a method that calls 
+                  <code>sendQueuedNotifications</code> from within
+                  a synchronized block.</li>
+          </ul>
+       </p>
+  </ul>
+       
+       
+
+  <h4>Don't subclass Notification</h4>
+  <ul>
+       <p>Another common best practice when you want
+          to improve interoperability is to use directly
+          the Notification base classes provided in the
+          JMX<sup>TM</sup> API. Do not create your own
+          subclasses of these standard classes.
+       </p>
+       <p>Indeed, if you code your own subclass, a generic
+       client, like jconsole, will not be able to receive
+       that notification unless it has that custom 
+       subclass in its classpath.
+       </p>
+       <p>
+       If you want your application to be interoperable, it is
+       therefore preferable not to subclass any of the standard
+       Notification classes. You can define your own 
+       Notification type string, and if you need to send
+       additional data, you can put a CompositeData, or a 
+       HashMap of serializable standard types in the 
+       Notification's user data fields.
+       </p>
+       <p>In this example, we are using directly the 
+       standard notification classes:
+       <ul>
+           <li>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> and the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+             >DirectoryScannerMXBean</a> both use directly
+             <code>AttributeChangeNotification</code> to notify
+             changes in their <code>State</code> attribute.
+           </li>
+           <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+             >DirectoryScannerMXBean</a>
+             also uses the base <code>Notification</code>
+             class directly in order to notify whenever
+             it finds a matching file.
+             <br>In that case, we simply use the base
+             <code>Notification</code>
+             class with a new 
+             <b><code>com.sun.jmx.examples.scandir.filematch</code></b>
+             type.
+           </li>
+           <li>The <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+             >ScanDirConfigMXBean</a> and <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html"
+title="The ResultLogManagerMXBean is in charge of managing result logs"
+             >ResultLogManagerMXBean</a> also both use the base 
+             <code>Notification</code> class.
+           </li>
+       </ul>
+       <p>Careful readers will have noted that the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+             >ScanManagerMXBean</a> and the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html"
+title="A DirectoryScannerMXBean looks for file matching a given set of criteria, starting at a given root."
+             >DirectoryScannerMXBean</a> both use the 
+             <code>AttributeChangeNotification</code> class
+             to notify about their state change, whereas the
+             <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+             >ScanDirConfigMXBean</a> uses the base
+             <code>Notification</code> class.
+       </p>
+       <p>In fact, this is because the semantics of these
+          notifications is not exactly the same - although
+          both denote a state change:
+          <ul>
+              <p>In the case of <code>ScanManagerMXBean</code>
+              and <code>DirectoryScannerMXBean</code>, the 
+              notification which is emitted is more about a
+              state transition, from one state to another.
+              For instance, going from <code>RUNNING</code>
+              to <code>STOPPED</code>, or from 
+              <code>SCHEDULED</code> to <code>STOPPED</code>.
+              <br>In that case, the 
+              <code>AttributeChangeNotification</code> was
+              more appropriate because it made it possible
+              to send the previous and the new value of the 
+              state attribute, thus reflecting the whole
+              state transition.
+              </p>
+              <p>In the case of the <code>ScanDirConfigMXBean</code>
+              however, what is of interest is the state in
+              which the MBean has arrived. Using the base
+              <code>Notification</code> class with three different 
+              notification type strings -  
+              <b><code>com.sun.jmx.examples.scandir.config.loaded</code></b>,
+              <b><code>com.sun.jmx.examples.scandir.config.modified</code></b>,
+              and
+              <b><code>com.sun.jmx.examples.scandir.config.saved</code></b> - 
+              was therefore closer to what we wanted to model.
+              </p>
+          </ul>
+       </p>
+  </ul>
+       
+  <h3>Configuration MBeans</h3>
+    <ul>
+    <p>A common practice when designing a management application is
+    to have an MBean, or a set of MBeans, dedicated to configuration. 
+    Separating configuration from control and monitoring allows
+    more appropriate logic, and often simplifies the design and 
+    implementation of the management interface.
+    </p>
+    <p>
+    In our example, the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+     >ScanDirConfigMXBean</a> is dedicated to the application configuration.
+    </p>
+    <p>The <code>ScanDirConfigMXBean</code> will let you interactively 
+        modify, save, or load the application configuration. The modifications
+        will not be taken into account until it is applied, by invoking
+        <code>applyConfiguration</code> on the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a>. 
+    It is also possible to create many configurations, by creating as
+    many <code>ScanDirConfigMXBean</code>s, and then to choose and apply
+    one of these configurations by calling 
+    <code>ScanManagerMXBean.setConfigurationMBean</code> and then
+    <code>ScanManagerMXBean.applyConfiguration</code>.
+    </p>
+    <p>In this way, all configurations aspects are gathered and concentrated
+    inside the <code>ScanDirConfigMXBean</code> instead of being scattered
+    throughout all the MBeans that compose the application.
+    </p>
+    <p>In order to save and store the application configuration data, the
+    <code>ScanDirConfigMXBean</code> uses a set of XML serializable Java beans
+    defined in the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/config/package-summary.html" 
+title="The com.sun.jmx.examples.scandir.config package defines XML serializable beans"
+        >com.sun.jmx.examples.scandir.config</a> package. These beans are very
+   simple Java beans which have been lightly annotated for XML binding.
+    </p>
+    <p>It is worth noting that these same beans can also be handled by the
+    MXBean framework (our beans don't contain recursive data structures) and can 
+    therefore be used directly as attributes and parameters of MXBeans, without
+    needing to be Java-serializable (the MXBean framework transform them in
+    CompositeData objects - which <b>are</b> serializable).
+    </p>
+    <p>The same <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/config/ScanManagerConfig.html" 
+title="The com.sun.jmx.examples.scandir.config package defines XML serializable beans"
+        >ScanManagerConfig</a> bean that we use to read from and write to the
+        XML configuration file is thus also used as attribute of the <a
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html"
+title="The ScanDirConfigMXBean is in charge of the configuration"
+     >ScanDirConfigMXBean</a>. It is transformed into a <code>CompositeData</code> 
+       by the MXBean framework, and can be easily introspected with
+       <a href="#JConsole">jconsole</a>.
+    </p>
+    </ul>
+  <h3>MBeans Must Be Thread-Safe</h3>
+    <ul>
+    <p>A question often asked by newcomers to JMX technology
+    is whether the MBeanServer is thread-safe. Well, the MBeanServer <b>is</b> 
+    thread safe, but it doesn't put any locks on the MBeans it contains. The
+    MBeans can be concurrently accessed by multiple threads, and must therefore
+    take care of their own thread safety.
+    </p>
+    <p>In this example, we have been using two methods to ensure thread
+    safety for our MBeans: synchronized blocks, and semaphores.
+    </p>
+    <p>Using synchronized blocks is probably the most common and easiest way
+    to implement thread safety in Java. When dealing with MBeans though, here
+    are a couple of rules to keep in mind:
+    <ul>
+        <li>Don't send notifications from within a synchronized block: there's
+        no way to tell whether the listener's code will be executed in the
+        same thread or a different thread, and holding a lock in these
+        conditions is therefore dangerous, as it could lead to deadlocks.</li>
+        <li>Also avoid invoking another MBean from a synchronized block
+        unless you are completely in control of both MBeans, and you can
+        ascertain that it won't lead to any deadlock. Indeed, if you invoke an
+        MBean exposed by another application, it can be sometime hard to
+        know with certainty whether holding a lock while invoking that
+        MBean will have any side effect. Maybe that MBean will make
+        further calls to other MBeans which will in turn try to call
+        your MBean, or maybe it will emit a
+        notification, and we'll be back to the considerations just 
+        above.</li>
+    </ul>
+    </p>
+    <p>Another means of implementing thread-safe code is to use semaphores.
+    The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a> uses a semaphore called
+        <code>sequencer</code> to ensure
+    that critical code sections are not executed concurrently. In this
+    MBean, we use <code>Semaphore.tryAcquire</code> to lock the sequencer
+    semaphore before entering the critical section. If the 
+    <code>Semaphore.tryAcquire</code> returns true then we enter the critical
+    section. If it returns false, we throw an IllegalStateException, stating
+    that we couldn't acquire the lock. The code looks like this:
+    <pre>
+        if (!sequencer.tryAcquire())
+            throw new IllegalStateException("resource locked");
+        try {
+            // critical code here ...
+        } finally {
+            // Always use try/finally to ensure that the semaphore
+            // will be released, even if exceptions or errors are raised!
+            sequencer.release();
+        }
+    </pre>
+    </p>
+    <p>Using <code>Semaphore.tryAcquire</code> and throwing an exception if
+        the semaphore is already locked makes it safer to call other MBeans
+        from within the critical section: in potential deadlock situations
+        the calling code will get the <code>IllegalStateException</code>
+        instead of being blocked on the deadlocked lock.
+    </p>
+    <p>It is worth noting that each of these techniques has its own 
+    advantages and disadvantages - which can make one of them more or less
+    appropriate depending on the inner logic of the MBean you're implementing.
+    </p>
+    <p>Careful readers will also have noted that we used 
+       <code>IllegalStateException</code> directly, instead of defining 
+       our own subclass of RuntimeException, which could have had a more
+       precise semantics. If you define a new exception for your JMX application,
+       you must keep in mind that your client will need to have the class
+       of your exception in its classpath to get that exception. 
+       Otherwise your client will get a completely different exception, indicating a
+       deserialization issue.
+    </p>
+    </ul>
+    
+  <h3>Waiting for Notifications</h3>
+    <ul>
+    <p>Implementing code that needs to wait for notifications is sometimes
+       difficult. Because notifications are asynchronous, doing something
+       like:
+        <pre>
+          // register a notification listener
+          ...
+          // start a management action
+          ...
+          // wait for a notification
+          ...
+          // do something based on whether the expected notification
+          // is received
+          ...
+        </pre>
+       is not always trivial. However, there's a very easy way to do that: use
+       a blocking queue of notifications.
+       <pre>
+       final BlockingQueue&lt;Notification&gt; notifQueue = 
+                new LinkedBlockingQueue&lt;Notification&gt;();
+                
+       final NotificationListener listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                                           Object handback) {
+                try {
+                    // Just put the received notification in the queue.
+                    // It will be consumed later on.
+                    //
+                    notifQueue.put(notification);
+                } catch (InterruptedException ex) {
+                    // OK
+                }
+            }
+          };
+
+       // register the listener - possibly also as a JMXConnectionNotification
+       // listener to get Notification Lost notification
+       ...
+       // start management action
+       ...
+       // wait for notification
+       while (expected notif not received and delay not expired) {
+            Notification n = notifQueue.poll(3,TimeUnit.SECONDS);
+            // if expected notif, do something
+            ...
+       }
+       // if expected notification not received do something else.
+       ....
+       </pre>
+    </p>
+    <p>You will note that this is a technique we've been using in the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirAgent.html" 
+title="The ScanDirAgent class defines a main method for the scandir application"
+        >ScanDirAgent</a> class and in the example unit tests.
+    </p>
+    </ul>
+    
+  <h3>Holding hard references to other MBeans: proxy or direct reference?</h3>
+  <ul>
+    <p>We have seen that MXBeans will let you return proxy references to other
+    MXBeans. But should that MXBean hold a direct reference to the MXBeans it
+    relates to, or would it be better for it to hold only a proxy?
+    </p>
+    <p>
+    As a general rule it is better when an MBean reference is
+    only held by the MBeanServer. It is a better design
+    to hold a reference to a proxy, rather than to hold
+    a hard reference to an MBean. However there are two cases
+    when holding a hard reference might be preferred: 
+     <ol>
+        <li>When MBean A needs to call a method of method B which
+           is not part of its MBean interface</li>
+        <li>When the overhead of going through the MBeanServer
+           plus the MXBean framework is too great (frequently-called
+           method, with creation of OpenType)</li>
+     </ol>
+    However - holding a hard reference is only advisable
+    when both MBeans are created by the same piece of code,
+    and the application can ensure that the life cycle
+    of each MBean is consistent with regard to the other.
+    </p>
+    <p>In our example, the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+        >ScanManagerMXBean</a> holds only proxy references to the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.html" 
+        >ScanDirConfigMXBean</a> and the  <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.html" 
+        >DirectoryScannerMXBeans</a>. <br>
+    However it holds a direct reference to the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManager.html" 
+        >ResultLogManager</a>. This makes it possible to pass a direct 
+        reference to the <code>DirectoryScannerMXBeans</code>, 
+        which can then log their results
+        more efficiently, and would also make it possible to remove
+        the <code>log</code> method from the <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.html" 
+        >ResultLogManagerMXBean</a> interface - leaving it in the 
+        <code>ResultLogManager</code> class (possibly as a package method)
+        should we wish to do so.
+    </p>
+    
+    </ul>
+
+  <h3>Agent Class</h3>
+    <ul>
+   <p>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirAgent.html" 
+title="The ScanDirAgent class defines a main method for the scandir application"
+     >ScanDirAgent</a> is the Agent class for the <i>scandir</i> application.
+    This class contains the <code>main</code> method to start a standalone  
+    <i>scandir</i> application.
+    </p>
+    <p>The <code>main</code> method simply registers a <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+       >ScanManagerMXBean</a> in the platform MBeanServer, and then waits
+    for someone to call <code>ScanManagerMXBean.close</code>.
+    </p>
+    <p>
+    When the <code>ScanManagerMXBean</code> state is switched to 
+    <code>ScanManagerMXBean.ScanState.CLOSED</code>, the 
+    <code>ScanManagerMXBean</code> is unregistered, and the application
+    terminates (i.e. the main thread completes).
+    </p>
+    <p>Standalone JMX applications usually have an Agent class that contain 
+       their <code>main</code> method, which performs all the MBean
+       registration steps.
+       However, it is usually not a bad idea if that class can
+       be easily turned into an MBean. Indeed, this will make your
+       application easier to integrate in an environment where it would
+       no longer be standalone and would no longer control the implementation
+       of <code>main</code>. In our example the Agent
+       class could be easily turned into an MBean, exposing its three
+    <code>init</code>, <code>waitForClose</code> and <code>cleanup</code> 
+    method. However we didn't go as far as turning it into an MBean since 
+    the application can be already easily started by registering an instance
+    of <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanManagerMXBean.html" 
+title="The ScanManagerMXBean is the main MBean of the scandir application"
+       >ScanManagerMXBean</a>.
+    </p>
+    </ul>
+  <h3>Secure Client Class</h3>
+    <ul>
+   <p>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirClient.html" 
+title="The ScanDirClient class is a very short example of secure programmatic client"
+     >ScanDirClient</a> is an example class that shows how a
+    programmatic client can connect to a secured <i>scandir</i> application.
+    This class contains a <code>main</code> method which creates and
+    configures a <code>JMXConnector</code> client to connect with
+    a secured <i>scandir</i> daemon. This class will not work with
+    the default unsecured agent since it requires mutual authentication.
+    </p>
+    <p>How to secure a JMX <i>scandir</i> application and run
+    the secure <code>ScanDirClient</code> is discussed <a href="#secure"
+    >later</a> in this document.
+    </p>
+    <p>The <code>ScanDirClient</code> is not really part of the
+       application - and is given here only for the sake of
+       the example.
+    </p>
+    </ul>
+    
+  <h2><a name="h2-Testing">Testing the <i>scandir</i> Example</a></h2>
+    <ul>
+        <p>Make sure that you have access to junit.jar (either 3.8.1 or 3.8.2).
+           Make sure also that you have junit.jar in your 
+           <code>CLASSPATH</code>.<br>
+           Then in the example root directory (where the <code>build.xml</code> 
+           file is located) run the following command:
+           <pre>ant test -Dlibs.junit.classpath=<i><u>path to junit jar (either 3.8.1 or 3.8.2)</u></i></pre>
+        </p>
+        <p>Alternatively you can open the jmx-scandir project with the 
+           NetBeans IDE and test the jmx-scandir project from the 
+           <code>Run</code> menu.
+        </p>
+
+    </ul>
+
+  <h2><a name="h2-Running">Running the <i>scandir</i> Example</a></h2>
+    <ul>
+        <p>In the example root directory (where the <code>build.xml</code> 
+           file is located) run the following commands:
+        <pre>ant jar
+ant run-single -Drun.class=com.sun.jmx.examples.scandir.ScanDirAgent -Djavac.includes=src</pre>
+           or simply <pre>ant run</pre>
+        </p>
+        
+        <p>This will run the example using the configuration
+           file provided in the src/etc directory.
+        </p>
+        <p>Alternatively you can open the jmx-scandir project with the 
+           NetBeans IDE. You can run the example by 
+           selecting the <code>ScanDirAgent</code> file
+           and run it with <code>Run File</code> in the
+           <code>Run</code> menu or simply
+           set the <i>jmx-scandir</i> project as main project and
+           select <code>Run Main Project</code> from the
+           main menu. Both targets will use the configuration
+           file provided in the src/etc directory.
+        </p>
+        <p>When the application is started, you can connect to
+           it with <a href="#JConsole">jconsole</a>.
+        </p>
+        <blockquote>
+            <u>Note:</u> You can also run the <i>scandir</i> 
+            application directly from the <code>java</code> 
+            command line. Make sure to build the project jar
+            first. 
+            <br>On Unix systems:
+            <pre>ant jar
+java -Djava.util.logging.config.file=logging.properties \
+     -Dscandir.config.file=src/etc/testconfig.xml \
+     -jar dist/jmx-scandir.jar</pre>
+            <br>On Windows systems:
+            <p><code>ant jar<br>
+java &nbsp;-Djava.util.logging.config.file=logging.properties
+     &nbsp;-Dscandir.config.file=src\etc\testconfig.xml
+     &nbsp;-jar&nbsp;dist\jmx-scandir.jar</code></p>
+        </blockquote>
+    </ul>
+    
+    <h2><a name="h2-Playing">Playing with JConsole</a></h2>
+    <ul>
+    <p>Run the example as explained in the previous section, so
+    that it uses the provided <code>src/etc/testconfig.xml</code> 
+    configuration file. Then start
+    jconsole. In the connection window choose the process that runs
+    <code>com.sun.jmx.examples.scandir.ScanDirAgent</code> or
+    <code>jmx-scandir.jar</code>.
+    </p>
+    <p><center>
+        <table border="0" cellpadding="2" cellspacing="2">
+        <tr><td>
+    <a href="docfiles/connect-local-ant-run.jpg"
+    title="jconsole connection window - connect to local process"
+    ><img height="440"
+    src="docfiles/connect-local-ant-run.jpg"
+    alt="jconsole connection window - connect to local process"
+    /></a>
+    </td>
+    <td>
+    <a href="docfiles/connect-local-java-jar.jpg"
+    title="jconsole connection window - connect to local process"
+    ><img height="440"
+    src="docfiles/connect-local-java-jar.jpg"
+    alt="jconsole connection window - connect to local process"
+    /></a>
+    </td></tr></table>
+    </center>
+    </p>
+    <p>Open the MBeans tab, and look for the 
+       <code>ScanDirConfigMXBean</code>.
+       Click on its <code>Attributes</code> node and double click on its
+       <code>Configuration</code> attribute, to look at
+       the loaded configuration - values in bold can
+       be expanded by a double-click.
+    </p>
+    <p><center><a href="docfiles/scandir-config.jpg"
+    title="jconsole MBean tab: ScanDirConfigMXBean"
+    ><img 
+    src="docfiles/scandir-config.jpg"
+    alt="jconsole MBean tab: ScanDirConfigMXBean"
+    /></a></center>
+    </p>
+    <p>Now go to the <code>ScanManagerMXBean</code>, click on
+       its <code>Notifications</code> node, and subscribe
+       for notifications. Then click on the 
+       <code>Operations</code> node and invoke the
+       <code>start()</code> operation:
+    </p>
+    <p><center><a href="docfiles/scandir-start.jpg"
+    title="jconsole MBean tab: ScanDirConfigMXBean"
+    ><img 
+    src="docfiles/scandir-start.jpg"
+    alt="jconsole MBean tab: ScanDirConfigMXBean"
+    /></a></center>
+    </p>
+    <p>You can see that the notifications counter was 
+       incremented by three: you have just scheduled, 
+       run, and completed a batch of directory scans.
+    </p>
+    <p>Now go to the <code>ResultLogManagerMXBean</code>,
+       click on its <code>Attributes</code> node, and 
+       expand its <code>MemoryLog</code> attribute:
+    </p>
+    <p><center><a href="docfiles/scandir-result.jpg"
+    title="jconsole MBean tab: ScanDirConfigMXBean"
+    ><img 
+    src="docfiles/scandir-result.jpg"
+    alt="jconsole MBean tab: ScanDirConfigMXBean"
+    /></a></center>
+    </p>
+    <p>You can see that the directory scan results have
+       been logged.</p>
+    <p>To make the application terminate go back to the 
+       <code>ScanManagerMXBean</code> and invoke
+       <code>close()</code>. The <code>ScanDirAgent</code>
+       will receive the notification, step out of 
+       the application main thread, and the application
+       will terminate.
+    </p>
+    <p>This is of course a very limited scenario. Feel free
+    to improvise with all the features of the example, creating
+    a new configuration - 
+    <code>ScanManagerMXBean.createOtherConfigurationMBean</code> -
+    adding multiple directory scanners to that configuration -
+    <code>ScanDirConfigMXBean.addDirectoryScanner</code> -
+    then switching the <code>ScanManagerMXBean</code> current
+    configuration by changing the value of the <i>ConfigurationMBean</i>
+    attribute - <code>ScanManagerMXBean.setConfigurationMBean</code>
+    - then applying the new configuration - 
+    <code>ScanManagerMXBean.applyConfiguration(true)</code> - 
+    then scheduling repeated directory scans every 10 seconds - 
+    <code>ScanManagerMXBean.schedule(0,10000)</code> - 
+    subscribing for notifications, etc...
+    </p>
+    </ul>
+    
+  <a name="secure"></a>
+  <h2><a name="h2-Turning">Turning the example into a Secure JMX Application</a></h2>
+    <ul>
+    <p>In this section, we will see how to configure and
+    start the <i>scandir</i> example so that the JVM agent
+    is bootstrapped with a secure JMXConnectorServer. Indeed, until 
+    now we have only used the insecure local connection, 
+    which can only be used as long as both the client and
+    the server run on the same machine. This section will
+    explain how to start the <code>ScanDirAgent</code> so 
+    that a real secure RMIConnectorServer is started at bootstrap.
+    </p>
+    <p>To achieve this we will: <a href="#management.properties"
+        >provide our own management.properties</a>, <a 
+        href="#password-access">create our own password and access files</a>,
+        <a href="#keystore-truststore">provide a keystore and truststore</a>,
+        <a href="#start-secure-agent">start the ScanDirAgent with the
+        appropriate system properties</a>.
+    </ul>
+    <h3>Configuring the JVM Agent for Secure Remote Connection</h3>
+    <ul>
+        <p>The easiest way to <a name="management.properties">configure the 
+            JVM Agent</a> for Secure Remote 
+           Connection is to use your own <a
+           href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#properties"
+           title="This page describes the properties you can put in your management.properties file"
+           >management.properties</a> file.
+           In this example, we have copied the default 
+           <code>$JRE/lib/management/management.properties</code>
+           file to the example's <code>src/etc</code> directory and
+           modified it in <a href="src/etc/management.properties"
+           title="our modified management.properties"
+           >this way</a>:
+           <ul>
+               <li>We have set the RMI port to <u>4545</u> - this is just a 
+                   random port number we have picked up. Feel free to use your 
+                   own value suited to your environment.
+               <pre># For setting the JMX RMI agent port use the following line
+com.sun.management.jmxremote.port=<b>4545</b></pre>
+               </li>
+               <li>We have <u>switched on</u> SSL <u>mutual authentication</u>
+               <pre># For RMI monitoring with SSL client authentication use the following line
+com.sun.management.jmxremote.ssl.<b>need.client.auth</b>=<b>true</b></pre>
+               </li>
+               <li>We have also <u>secured the RMI Registry</u> with SSL
+               <pre># For using an SSL/TLS <b>protected</b> RMI Registry use the following line
+com.sun.management.jmxremote.<b>registry.ssl</b>=<b>true</b></pre>
+               </li>
+               <li>We have provided <a 
+                href="src/etc/password.properties">our own password file</a>
+               <pre># For a non-default password file location use the following line
+com.sun.management.jmxremote.password.file=<i>src/etc/password.properties</i></pre>
+               </li>
+               <li>We have provided <a 
+                href="src/etc/access.properties">our own access file</a>
+               <pre># For a non-default password file location use the following line
+com.sun.management.jmxremote.access.file=<i>src/etc/access.properties</i></pre>
+               </li>
+           </ul>
+           <p>You will note that we haven't provided any value
+              for the other security properties, like 
+              <code>com.sun.management.jmxremote.authenticate=true</code>,
+              because these properties already default to a value
+              which enables security by default. 
+              Note however that protecting the RMI Registry with SSL
+              improves the application security, but only as long as
+              mutual authentication is also switched on. Otherwise, just
+              anybody would be able to connect to the registry and 
+              get the RMIServer stub.
+           </p>
+           <p>We do recommend that you <u>use the most secure configuration
+              when you deploy a JMX agent</u> - which means <u>switching on
+              SSL protection for the RMI registry</u> <b>and</b> <u>requiring
+              mutual authentication</u>, as we show in this example.
+           </p>
+           <p>We will use the <code>com.sun.management.config.file</code>
+           system property to pass our <a 
+           href="src/etc/management.properties">management.properties</a>
+           file to the <code>ScanDirAgent</code>.
+           </p>
+    </ul>
+    
+    <h3>Creating a password and access file</h3>
+    <ul>
+        <p>As explained above, we have created our own
+        <a href="src/etc/password.properties">password file</a> 
+        and <a href="src/etc/access.properties">access file</a> 
+        for <a name="password-access">access control and authorization</a>.
+        </p>
+        <p>In the password file, we have defined two logins: 
+           <i>guest</i> and <i>admin</i>. The password for 
+           <i>guest</i> is <i>guestpasswd</i> and the password
+           for <i>admin</i> is <i>adminpasswd</i>.
+        </p>
+        <p>In the access file, we have mapped these two logins
+        to access rights: the <i>admin</i> login has <i>read-write</i>
+        access, while the <i>guest</i> login only has <i>read-only</i>.
+        </p>
+        <p>Before starting the <code>ScanDirAgent</code>, you will
+           need to restrict access permission to the password file, 
+           in such a way that nobody but you can read it. Otherwise, the
+           JVM Agent will refuse to start the JMXConnectorServer, as it will
+           fear that security can be compromised if other parties can
+           have read access to the password file. How to restrict
+           read access to the password file is explained in detail
+           <a href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#PasswordAccessFiles"
+           title="Using Password and Access Files"
+           >here</a>.
+        </p>
+        <p>As we have seen above, the location
+           of our access and password files is configured in our own <a 
+           href="src/etc/management.properties">management.properties</a>
+           file.
+        </p>
+    </ul>
+    <h3>Keystore and Truststore</h3>
+    <ul>
+        <p>Using SSL with mutual authentication means that both
+           client and server will need a <a name="keystore-truststore"
+           >keystore and a truststore</a>
+           to store their own certificates, and the certificates of
+           the parties they trust. Usually, client and server will 
+           have their own keystore and truststore. 
+        </p>
+        <p>For the sake of simplicity - and to get you started
+        without the tedious necessity of creating your own keystore
+        and truststore, we are providing a dummy keystore and 
+        truststore, containing a certificate self-signed by duke.
+        The password for our keystore is <i>password</i>, and the
+        password for our truststore is <i>trustword</i>.
+        We suggest that you first get the example running with the
+        keystore and truststore we are providing before attempting 
+        to use your own keystore and truststore.
+        </p>
+        <p>A secure application will obviously need to use its own
+        keystore and truststore, <b><u>and should not rely on the keystore
+        and truststore we are providing here!</u></b>
+        </p>
+        <p>How to create your own keystore and truststore, is explained
+        in <a
+href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#SSL_enabled"
+title="Monitoring and Management Using JMX"
+        >here</a>.          
+        As shown <a href="#start-secure-agent">later</a>, 
+        we will need to use <a 
+        href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#SSL_enabled"
+        >system properties</a> to pass our truststore
+        and keystore to the <code>ScanDirAgent</code>.
+        </p>
+    </ul>
+    <h3>Starting a Secure <i>scandir</i> agent</h3>
+    <ul>
+        <p>To start a <a name="start-secure-agent"
+        >secure <i>scandir</i> agent</a>, go to the
+        <i>scandir</i> example root directory and type the
+        following command:</p>
+        <p>On Unix Systems:
+<pre>ant jar
+java \
+    -Djava.util.logging.config.file=logging.properties \
+    -Djavax.net.ssl.keyStore=keystore \
+    -Djavax.net.ssl.keyStorePassword=password \
+    -Djavax.net.ssl.trustStore=truststore \
+    -Djavax.net.ssl.trustStorePassword=trustword \
+    -Dcom.sun.management.config.file=src/etc/management.properties \
+    -Dscandir.config.file=src/etc/testconfig.xml \
+    -jar dist/jmx-scandir.jar</pre>
+        </p>
+         <p>On Windows Systems:
+<p><code>ant jar<br>
+java 
+    &nbsp;-Djava.util.logging.config.file=logging.properties
+    &nbsp;-Djavax.net.ssl.keyStore=keystore
+    &nbsp;-Djavax.net.ssl.keyStorePassword=password
+    &nbsp;-Djavax.net.ssl.trustStore=truststore
+    &nbsp;-Djavax.net.ssl.trustStorePassword=trustword
+    &nbsp;-Dcom.sun.management.config.file=src\etc\management.properties
+    &nbsp;-Dscandir.config.file=src\etc\testconfig.xml
+    &nbsp;-jar&nbsp;dist\jmx-scandir.jar</code></p>
+         </p>
+    <p>If you start jconsole now, you will see that you
+       are still able to connect to the agent using the 
+       local connection. However, if you try to connect
+       through the remote connector, using 
+       <a href="docfiles/remote-connection.jpg">localhost:4545</a>, 
+       the connection will <a href="docfiles/remote-connection-failed.jpg"
+       >fail</a>, even if you provide a correct login/password
+       pair. Indeed, since the JMXConnectorServer is now protected with SSL,
+       jconsole must also be configured with the appropriate SSL parameters
+       so that it can authenticate the server and get authenticated by the
+       server too as the SSL configuration of the server requires mutual
+       authentication.
+    </p>
+    <p>The next section will discuss how to connect to the 
+    secure agent.
+    </p>
+   </ul>
+   
+  <h2><a name="h2-Connecting">Connecting to the Secure JMX Application</a></h2>
+    <ul>
+    <p>We will now see how to connect to the secure agent,
+       using jconsole, and using a programmatic client.
+    </p>
+    </ul>
+    
+    <h3>Using jconsole to connect to the secure agent</h3>
+    <ul>
+    <p>The only special thing you need to do in order to
+        be able to connect to your secure agent with
+        jconsole, is to give it a keystore (containing
+        its client certificate) and a truststore (containing
+        the certificates of the servers it can trust).
+        In our example, we use the same keystore/truststore
+        pair on the client and server side - but this is
+        not what a real application would do.
+        Indeed a real application would have different 
+        certificates for the client and the server, and 
+        thus use different keystores (and probably truststores).
+        More information on SSL authentication can be obtained from the <a
+        href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
+        title="How SSL Works"
+        >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>.
+    </p>
+    <p>To start jconsole with our provided keystore and
+    truststore, go to the scandir example root directory and 
+    type in the following command:
+    <p><code>jconsole 
+    &nbsp;-J-Djava.util.logging.config.file=logging.properties 
+    &nbsp;-J-Djavax.net.ssl.keyStore=keystore 
+    &nbsp;-J-Djavax.net.ssl.keyStorePassword=password 
+    &nbsp;-J-Djavax.net.ssl.trustStore=truststore 
+    &nbsp;-J-Djavax.net.ssl.trustStorePassword=trustword</code></p>
+    </p>
+    <p>The <code>-J-Djava.util.logging.config.file=logging.properties</code>
+       flag is not mandatory, but passing a <code>logging.properties</code>
+       may help you debug connection problems if anything goes wrong.
+    </p>
+    <p>In jconsole connection window, choose to connect to a 
+       remote process, using the address <i>localhost:4545</i>
+       and the guest login:
+    </p>
+    <p><center><a href="docfiles/remote-connection.jpg"
+       ><img src="docfiles/remote-connection.jpg"
+        alt="jconsole connection window"/></a></center>
+    </p>
+    <p>You will see that the agent will let view all the
+       MBeans and their attributes, but will reject any
+       attribute modification or remote method invocation.
+    </p>
+    <hr>
+    <p><u>Note:</u> if jconsole fails to connect and show
+    you <a href="docfiles/remote-connection-failed.jpg">this screen</a>
+    you have probably misspelled some of the properties on jconsole
+    command line, or you didn't start jconsole from the 
+    scandir example root directory where our <code>truststore</code>
+    and <code>keystore</code> files are located. This article - <a 
+    href="http://blogs.sun.com/roller/page/jmxetc?entry=troubleshooting_connection_problems_in_jconsole"
+    title="Troubleshooting connection problems in JConsole"
+    >Troubleshooting connection problems in JConsole</a> - may help
+    you figure out what is going wrong.
+    </p>
+    <hr>
+    </ul>
+    
+    <h3>Writing a programmatic client to connect to the secure agent</h3>
+    <ul>
+        <p>
+        In this section we will show the steps involved in writing 
+        a programmatic client that will connect to our secure agent.
+        </p>
+   <p>The <a 
+href="dist/javadoc/com/sun/jmx/examples/scandir/ScanDirClient.html" 
+title="The ScanDirClient class is a very short example of secure programmatic client"
+     >ScanDirClient</a> is an example class that shows how a
+    programmatic client can connect to a secured <i>scandir</i> application.
+    This class contains a <code>main</code> method which creates and
+    configures a <code>JMXConnector</code> client to connect with
+    the secured <i>scandir</i> agent. 
+    </p>
+    <p>The secure client differs only from a non secure client in
+    so far as it needs to use SSL RMI Factories and credentials to
+    connect to the secure agent. The steps required mainly involve:
+       <ul>
+           <li>Creating an empty environment map:
+           <pre>            
+            // Create an environment map to hold connection properties
+            // like credentials etc... We will later pass this map
+            // to the JMX Connector.
+            //
+            System.out.println("\nInitialize the environment map");
+            final Map&lt;String,Object> env = new HashMap&lt;String,Object>();
+           </pre>
+           </li>
+           <li>Putting the client's credentials in that map:
+           <i>(here the client will log in as <b>guest</b>)</i>
+           <pre>            
+            // Provide the credentials required by the server
+            // to successfully perform user authentication
+            //
+            final String[] credentials = new String[] { "guest" , "guestpasswd" };
+            env.put("jmx.remote.credentials", credentials);
+           </pre>
+           </li>
+           <li>Providing an <code>SslRMIClientSocketFactory</code> to interact
+           with the secure RMI Registry:
+           <pre>            
+            // Provide the SSL/TLS-based RMI Client Socket Factory required
+            // by the JNDI/RMI Registry Service Provider to communicate with
+            // the SSL/TLS-protected RMI Registry
+            //
+            env.put("com.sun.jndi.rmi.factory.socket",
+                    new SslRMIClientSocketFactory());
+           </pre>
+           </li>
+           <li>Creating a JMXConnector and connecting with the
+               secure server:
+           <pre>
+            // Create the RMI connector client and
+            // connect it to the secure RMI connector server.
+            // args[0] is the server's host - localhost
+            // args[1] is the secure server port - 4545
+            //
+            System.out.println("\nCreate the RMI connector client and " +
+                    "connect it to the RMI connector server");
+            final JMXServiceURL url = new JMXServiceURL(
+                    "service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1]+ 
+                    "/jmxrmi");
+            final JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
+           </pre>
+           </li>
+       </ul>
+       <p>For this to work, we also need to start the <code>ScanDirClient</code>
+       with the appropriate system properties that will point to our 
+       <code>keystore</code> and <code>truststore</code>. To start the secure 
+       client, go to the <i>scandir</i> example root directory and type
+       the following command:
+       <p><code>ant jar<br>
+java 
+    &nbsp;-Djava.util.logging.config.file=logging.properties 
+    &nbsp;-Djavax.net.ssl.keyStore=keystore
+    &nbsp;-Djavax.net.ssl.keyStorePassword=password
+    &nbsp;-Djavax.net.ssl.trustStore=truststore
+    &nbsp;-Djavax.net.ssl.trustStorePassword=trustword
+    &nbsp;-classpath&nbsp;dist/jmx-scandir.jar
+     &nbsp;com.sun.jmx.examples.scandir.ScanDirClient&nbsp;localhost&nbsp;4545
+       </code></p>
+       </p>
+       <p>You should be seeing this trace:
+<center><table width="90%" border="0" bgcolor="#eeeeee">
+<tr><td>
+<pre>
+Initialize the environment map
+
+Create the RMI connector client and connect it to the RMI connector server
+Connecting to: service:jmx:rmi:///jndi/rmi://localhost:4545/jmxrmi
+
+Get the MBeanServerConnection
+
+Get ScanDirConfigMXBean from ScanManagerMXBean
+
+Get 'Configuration' attribute on ScanDirConfigMXBean
+
+Configuration:
+
+&lt;ScanManager xmlns="jmx:com.sun.jmx.examples.scandir.config" name="testconfig">
+    &lt;InitialResultLogConfig>
+        &lt;LogFileMaxRecords>2048&lt;/LogFileMaxRecords>
+        &lt;LogFileName>build/scandir.log&lt;/LogFileName>
+        &lt;MemoryMaxRecords>128&lt;/MemoryMaxRecords>
+    &lt;/InitialResultLogConfig>
+    &lt;DirectoryScannerList>
+        &lt;DirectoryScanner name="scan-build">
+            &lt;Actions>NOTIFY LOGRESULT&lt;/Actions>
+            &lt;ExcludeFiles/>
+            &lt;IncludeFiles>
+                &lt;FileFilter>
+                    &lt;FilePattern>.*\.class&lt;/FilePattern>
+                    &lt;SizeExceedsMaxBytes>4096&lt;/SizeExceedsMaxBytes>
+                &lt;/FileFilter>
+            &lt;/IncludeFiles>
+            &lt;RootDirectory>build&lt;/RootDirectory>
+        &lt;/DirectoryScanner>
+    &lt;/DirectoryScannerList>
+&lt;/ScanManager>
+
+Invoke 'close' on ScanManagerMXBean
+
+Got expected security exception: java.lang.SecurityException: Access denied! 
+Invalid access level for requested MBeanServer operation.
+
+Close the connection to the server
+
+Bye! Bye!
+</pre>
+</td></tr></table></center>
+    <p>If the <code>ScanDirClient</code> fails to connect with 
+       the secure agent, then this article - <a 
+    href="http://blogs.sun.com/roller/page/jmxetc?entry=troubleshooting_connection_problems_in_jconsole"
+    title="Troubleshooting connection problems in JConsole"
+    >Troubleshooting connection problems in JConsole</a> - may help
+    you figure out what is going wrong. Indeed the connection steps
+    performed by the <code>ScanDirClient</code> are very similar to
+    those performed by <code>jconsole</code>, and the problems you
+    could encounter are identical. Just remember that 
+   <code>jconsole</code> needs the extra <code>-J</code> flag to pass
+   system properties to the VM, which is not needed with regular
+   <code>java</code> launcher invocations.
+    </p>
+    </ul>
+    
+    <h2><a name="h2-Conclusion">Conclusion</a></h2>
+    <ul>
+    <p>
+        In this document, we have presented an advanced 
+        JMX example, and shown how to run a secure 
+        JMX agent in a production environment. 
+        We have also shown how to connect to such a 
+        secure agent with both jconsole and a programmatic 
+        client. We have also discuss various JMX 
+        design-patterns and best practices. 
+        Readers who would wish to learn more about JMX, and
+        Monitoring and Management of the JVM, are invited
+        to follow the links given in reference below.
+    </p>
+    </ul>
+  <h2><a name="h2-References">References</a></h2>
+  <ol>
+     <li><a href="http://java.sun.com/products/JavaManagement/best-practices.html"
+        >JMX Best Practices</a>: This document describes best practices that
+      have been identified for modeling using the JMX API. </li>
+     <li><a href="http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html"
+      >Monitoring and Management Using JMX</a>: How to enable, configure, and 
+      connect to the JVM JMX agent.</li> 
+     <li><a name="JConsole"><a 
+href="http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html"
+>Using JConsole</a>: JConsole is a JMX-Compliant monitoring tool which allows
+     you to interact graphically with your own MBeans.
+     </li>
+     <li><a href="http://java.sun.com/javase/6/docs/technotes/guides/management/"
+     >Monitoring and Management for the Java Platform</a>: The Java Platform 
+      Standard Edition (Java SE) 6 provides comprehensive monitoring and 
+      management support for the Java platform. </li>
+     <li><a href="http://java.sun.com/products/JavaManagement/community/jmx_blogs.html"
+         >List of JMX-related Blogs</a>: This page provides links to the 
+          different web logs written by members of the Sun team working on the 
+          JMX API.</li>
+     <li><a
+        href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
+        title="The JSSE Reference Guide"
+        >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>:
+        comprehensive documentation about the Java<sup>TM</sup> Secure Socket 
+        Extension (JSSE)
+     </li>
+     <li><a href="http://java.sun.com/javase/6/docs/"
+         >Java SE 6 Documentation Index</a>: This document covers the
+          Java<sup>TM</sup> Platform, Standard Edition 6 JDK.</li>
+  </ol>
+  <p>
+  <hr>
+  <p>
+  </body>
+</html>
diff --git a/linux-x86/sample/jmx/jmx-scandir/keystore b/linux-x86/sample/jmx/jmx-scandir/keystore
new file mode 100644
index 0000000..05f5356
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/keystore
Binary files differ
diff --git a/linux-x86/sample/jmx/jmx-scandir/logging.properties b/linux-x86/sample/jmx/jmx-scandir/logging.properties
new file mode 100644
index 0000000..1714bee
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/logging.properties
@@ -0,0 +1,17 @@
+handlers= java.util.logging.ConsoleHandler
+
+.level=INFO
+
+
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+java.util.logging.ConsoleHandler.level = FINEST
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+javax.management.level=INFO
+com.sun.jmx.level=INFO
+com.sun.jmx.examples.level=FINE
+
diff --git a/linux-x86/sample/jmx/jmx-scandir/manifest.mf b/linux-x86/sample/jmx/jmx-scandir/manifest.mf
new file mode 100644
index 0000000..328e8e5
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
diff --git a/linux-x86/sample/jmx/jmx-scandir/nbproject/file-targets.xml b/linux-x86/sample/jmx/jmx-scandir/nbproject/file-targets.xml
new file mode 100644
index 0000000..42da880
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/nbproject/file-targets.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="jmx-scandir/file">
+    
+    <import file="../build.xml"/>
+    
+    <target name="compile-selected" depends="-init">
+        <fail unless="includes">Must set property 'includes'</fail>
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}" includes="${includes}">
+            <classpath path="${cp}"/>
+        </javac>
+    </target>
+    
+</project>
diff --git a/linux-x86/sample/jmx/jmx-scandir/nbproject/jdk.xml b/linux-x86/sample/jmx/jmx-scandir/nbproject/jdk.xml
new file mode 100644
index 0000000..2b85b77
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/nbproject/jdk.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project name="jdk" basedir=".">
+
+    <target name="-jdk-preinit">
+        <condition property=".exe" value=".exe">
+            <os family="windows"/>
+        </condition>
+        <property name=".exe" value=""/>
+        <property name="nbjdk.javac" value="${nbjdk.home}/bin/javac${.exe}"/>
+        <property name="nbjdk.java" value="${nbjdk.home}/bin/java${.exe}"/>
+        <property name="nbjdk.javadoc" value="${nbjdk.home}/bin/javadoc${.exe}"/>
+        <property name="nbjdk.appletviewer" value="${nbjdk.home}/bin/appletviewer${.exe}"/>
+        <property name="nbjdk.bootclasspath" value="${nbjdk.home}/jre/lib/rt.jar"/>
+    </target>
+
+    <target name="-jdk-presetdef-basic" depends="-jdk-preinit" unless="nbjdk.presetdef.basic.done">
+        <macrodef name="javac-presetdef">
+            <attribute name="javacval"/>
+            <sequential>
+                <presetdef name="javac">
+                    <javac fork="yes" executable="@{javacval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javac-presetdef javacval="${nbjdk.javac}"/>
+        <macrodef name="java-presetdef">
+            <attribute name="javaval"/>
+            <sequential>
+                <presetdef name="java">
+                    <java fork="yes" jvm="@{javaval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <java-presetdef javaval="${nbjdk.java}"/>
+        <macrodef name="javadoc-presetdef">
+            <attribute name="javadocval"/>
+            <sequential>
+                <presetdef name="javadoc">
+                    <javadoc executable="@{javadocval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javadoc-presetdef javadocval="${nbjdk.javadoc}"/>
+        <property name="nbjdk.presetdef.basic.done" value="true"/>
+    </target>
+
+    <target name="-jdk-presetdef-nbjpdastart" depends="-jdk-preinit" unless="nbjdk.presetdef.nbjpdastart.done">
+        <macrodef name="nbjpdastart-presetdef">
+            <attribute name="bootcpval"/>
+            <sequential>
+                <presetdef name="nbjpdastart">
+                    <nbjpdastart>
+                        <bootclasspath>
+                            <path path="@{bootcpval}"/>
+                        </bootclasspath>
+                    </nbjpdastart>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <nbjpdastart-presetdef bootcpval="${nbjdk.bootclasspath}"/>
+        <property name="nbjdk.presetdef.nbjpdastart.done" value="true"/>
+    </target>
+
+    <target name="-jdk-init" depends="-jdk-preinit,-jdk-presetdef-basic"/>
+
+</project>
diff --git a/linux-x86/sample/jmx/jmx-scandir/nbproject/netbeans-targets.xml b/linux-x86/sample/jmx/jmx-scandir/nbproject/netbeans-targets.xml
new file mode 100644
index 0000000..facdb4e
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/nbproject/netbeans-targets.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="jmx-scandir/NB">
+
+    <import file="../build.xml"/>
+
+    <target name="debug" depends="compile,-jdk-presetdef-nbjpdastart">
+        <nbjpdastart addressproperty="jpda.address" name="jmx-scandir" transport="dt_socket">
+            <classpath path="${run.cp}"/>
+        </nbjpdastart>
+        <java classname="${main.client.class}" failonerror="true" fork="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="-Xdebug"/>
+            <jvmarg value="-Xnoagent"/>
+            <jvmarg value="-Djava.compiler=none"/>
+            <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
+            <arg line="${client.args}" />
+        </java>
+    </target>
+    
+    <target name="debug-fix" depends="-init">
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+            <include name="${class}.java"/>
+        </javac>
+        <nbjpdareload>
+            <fileset dir="${classes.dir}">
+                <include name="${class}.class"/>
+            </fileset>
+        </nbjpdareload>
+    </target>
+    
+    <target name="show-info" depends="-init">
+        <nbbrowse file="${main.dir}/index.html"/>
+    </target>
+    
+    <target name="show-javadoc" depends="javadoc">
+        <nbbrowse file="${javadoc.dir}/index.html"/>
+    </target>
+    
+    <target name="profile" depends="compile">
+        <nbprofiledirect>
+            <classpath path="${run.cp}"/>
+        </nbprofiledirect>
+        <property environment="env"/>
+        <java classname="${main.client.class}" fork="true" failonerror="true" dir="${profiler.session.working.dir}" jvm="${profiler.info.jvm}">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <arg line="localhost 4545" />
+            <env key="LD_LIBRARY_PATH" path="${profiler.info.agentpath}:${env.LD_LIBRARY_PATH}"/>
+            <env key="Path" path="${profiler.info.agentpath}:${env.Path}"/>
+        </java>
+    </target>
+
+</project>
diff --git a/linux-x86/sample/jmx/jmx-scandir/nbproject/project.xml b/linux-x86/sample/jmx/jmx-scandir/nbproject/project.xml
new file mode 100644
index 0000000..a988de6
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/nbproject/project.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>jmx-scandir</name>
+            <properties>
+                <property-file>user.build.properties</property-file>
+                <property-file>build.properties</property-file>
+                <property name="nbjdk.bootclasspath">${nbjdk.home}/jre/lib/rt.jar</property>
+            </properties>
+            <folders>
+                <source-folder>
+                    <label>JDK Demo</label>
+                    <location>${main.dir}</location>
+                </source-folder>
+                <source-folder>
+                    <label>Sources</label>
+                    <type>java</type>
+                    <location>${src.dir}</location>
+                </source-folder>
+                <source-folder>
+                    <label>test</label>
+                    <type>java</type>
+                    <location>test</location>
+                </source-folder>
+            </folders>
+            <ide-actions>
+                <action name="build">
+                    <target>jar</target>
+                </action>
+                <action name="clean">
+                    <target>clean</target>
+                </action>
+                <action name="rebuild">
+                    <target>clean</target>
+                    <target>jar</target>
+                </action>
+                <action name="run">
+                    <target>run</target>
+                </action>
+                <action name="ReadMe">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>show-info</target>
+                </action>
+                <action name="javadoc">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>show-javadoc</target>
+                </action>
+                <action name="debug">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                </action>
+                <action name="compile.single">
+                    <script>nbproject/file-targets.xml</script>
+                    <target>compile-selected</target>
+                    <context>
+                        <property>includes</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug-fix</target>
+                    <context>
+                        <property>class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="test">
+                    <target>test</target>
+                </action>
+            </ide-actions>
+            <export>
+                <type>folder</type>
+                <location>${classes.dir}</location>
+                <build-target>jar</build-target>
+            </export>
+            <export>
+                <type>jar</type>
+                <location>${jar}</location>
+                <build-target>jar</build-target>
+            </export>
+            <export>
+                <type>folder</type>
+                <location>${build.test.classes.dir}</location>
+                <build-target>jar</build-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="packages">
+                        <label>Sources</label>
+                        <location>${src.dir}</location>
+                    </source-folder>
+                    <source-folder style="packages">
+                        <label>test</label>
+                        <location>test</location>
+                    </source-folder>
+                    <source-file>
+                        <location>${main.dir}/index.html</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <ide-action name="ReadMe"/>
+                    <ide-action name="build"/>
+                    <ide-action name="clean"/>
+                    <ide-action name="rebuild"/>
+                    <ide-action name="javadoc"/>
+                    <ide-action name="debug"/>
+                    <!-- ide-action name="test"/ -->
+                    <separator/>
+                    <action>
+                        <label>Run Agent</label>
+                        <target>run-agent</target>
+                    </action>
+                    <action>
+                        <label>Run Client</label>
+                        <target>run-client</target>
+                    </action>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/2">
+            <compilation-unit>
+                <package-root>${src.dir}</package-root>
+                <classpath mode="compile">${cp}</classpath>
+                <classpath mode="execute">${run.cp}</classpath>
+                <classpath mode="boot">${nbjdk.bootclasspath}</classpath>
+                <built-to>${classes.dir}</built-to>
+                <built-to>${jar}</built-to>
+                <javadoc-built-to>${javadoc.dir}</javadoc-built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>test</package-root>
+                <unit-tests/>
+                <built-to>${build.test.classes.dir}</built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+        </java-data>
+    </configuration>
+</project>
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScanner.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScanner.java
new file mode 100644
index 0000000..0ff58a2
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScanner.java
@@ -0,0 +1,591 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import static com.sun.jmx.examples.scandir.config.DirectoryScannerConfig.Action.*;
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig.Action;
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.AttributeChangeNotification;
+import javax.management.InstanceNotFoundException;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+
+/**
+ * A <code>DirectoryScanner</code> is an MBean that
+ * scans a file system starting at a given root directory,
+ * and then looks for files that match a given criteria.
+ * <p>
+ * When such a file is found, the <code>DirectoryScanner</code> takes
+ * the action for which it was configured: emit a notification,
+ * <i>and or</i> log a {@link
+ * com.sun.jmx.examples.scandir.config.ResultRecord} for this file,
+ * <i>and or</i> delete that file.
+ * </p>
+ * <p>
+ * The code that would actually delete the file is commented out - so that
+ * nothing valuable is lost if this example is run by mistake on the wrong
+ * set of directories.<br>
+ * Logged results are logged by sending them to the {@link ResultLogManager}.
+ * </p>
+ * <p>
+ * <code>DirectoryScannerMXBeans</code> are created, initialized, and
+ * registered by the {@link ScanManagerMXBean}.
+ * The {@link ScanManagerMXBean} will also schedule and run them in
+ * background by calling their {@link #scan} method.
+ * </p>
+ * <p>Client code is not expected to create or register directly any such
+ * MBean. Instead, clients are expected to modify the configuration, using
+ * the {@link ScanDirConfigMXBean}, and then apply it, using the {@link
+ * ScanManagerMXBean}. Instances of <code>DirectoryScannerMXBeans</code>
+ * will then be created and registered (or unregistered and garbage collected)
+ * as a side effect of applying that configuration.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class DirectoryScanner implements
+        DirectoryScannerMXBean, NotificationEmitter {
+
+    /**
+     * The type for <i>com.sun.jmx.examples.scandir.filematch</i> notifications.
+     * Notifications of this type will be emitted whenever a file that
+     * matches this {@code DirectoryScanner} criteria is found, but only if
+     * this {@code DirectoryScanner} was configured to {@link
+     * Action#NOTIFY notify} for matching files.
+     **/
+    public static final String FILE_MATCHES_NOTIFICATION =
+            "com.sun.jmx.examples.scandir.filematch";
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(DirectoryScanner.class.getName());
+
+    // Attribute : State
+    //
+    private volatile ScanState state = STOPPED;
+
+    // The DirectoryScanner delegates the implementation of
+    // the NotificationEmitter interface to a wrapped instance
+    // of NotificationBroadcasterSupport.
+    //
+    private final NotificationBroadcasterSupport broadcaster;
+
+    // The root directory at which this DirectoryScanner will start
+    // scanning. Constructed from config.getRootDirectory().
+    //
+    private final File rootFile;
+
+    // This DirectoryScanner config - this is a constant which is
+    // provided at construction time by the {@link ScanManager}.
+    //
+    private final DirectoryScannerConfig config;
+
+    // The set of actions for which this DirectoryScanner is configured.
+    // Constructed from config.getActions()
+    //
+    final Set<Action> actions;
+
+    // The ResultLogManager that this DirectoryScanner will use to log
+    // info. This is a hard reference to another MBean, provided
+    // at construction time by the ScanManager.
+    // The ScanManager makes sure that the life cycle of these two MBeans
+    // is consistent.
+    //
+    final ResultLogManager logManager;
+
+    /**
+     * Constructs a new {@code DirectoryScanner}.
+     * <p>This constructor is
+     * package protected, and this MBean cannot be created by a remote
+     * client, because it needs a reference to the {@link ResultLogManager},
+     * which cannot be provided from remote.
+     * </p>
+     * <p>This is a conscious design choice: {@code DirectoryScanner} MBeans
+     * are expected to be completely managed (created, registered, unregistered)
+     * by the {@link ScanManager} which does provide this reference.
+     * </p>
+     *
+     * @param config This {@code DirectoryScanner} configuration.
+     * @param logManager The info log manager with which to log the info
+     *        records.
+     * @throws IllegalArgumentException if one of the parameter is null, or if
+     *         the provided {@code config} doesn't have its {@code name} set,
+     *         or if the {@link DirectoryScannerConfig#getRootDirectory
+     *         root directory} provided in the {@code config} is not acceptable
+     *         (not provided or not found or not readable, etc...).
+     **/
+    public DirectoryScanner(DirectoryScannerConfig config,
+                            ResultLogManager logManager)
+        throws IllegalArgumentException {
+        if (logManager == null)
+            throw new IllegalArgumentException("log=null");
+        if (config == null)
+            throw new IllegalArgumentException("config=null");
+        if (config.getName() == null)
+            throw new IllegalArgumentException("config.name=null");
+
+         broadcaster = new NotificationBroadcasterSupport();
+
+         // Clone the config: ensure data encapsulation.
+         //
+         this.config = XmlConfigUtils.xmlClone(config);
+
+         // Checks that the provided root directory is valid.
+         // Throws IllegalArgumentException if it isn't.
+         //
+         rootFile = validateRoot(config.getRootDirectory());
+
+         // Initialize the Set<Action> for which this DirectoryScanner
+         // is configured.
+         //
+         if (config.getActions() == null)
+             actions = Collections.emptySet();
+         else
+             actions = EnumSet.copyOf(Arrays.asList(config.getActions()));
+         this.logManager = logManager;
+    }
+
+    // see DirectoryScannerMXBean
+    public void stop() {
+        // switch state to stop and send AttributeValueChangeNotification
+        setStateAndNotify(STOPPED);
+    }
+
+    // see DirectoryScannerMXBean
+    public String getRootDirectory() {
+        return rootFile.getAbsolutePath();
+    }
+
+
+    // see DirectoryScannerMXBean
+    public ScanState getState() {
+        return state;
+    }
+
+    // see DirectoryScannerMXBean
+    public DirectoryScannerConfig getConfiguration() {
+        return config;
+    }
+
+    // see DirectoryScannerMXBean
+    public String getCurrentScanInfo() {
+        final ScanTask currentOrLastTask = currentTask;
+        if (currentOrLastTask == null) return "Never Run";
+        return currentOrLastTask.getScanInfo();
+    }
+
+    // This variable points to the current (or latest) scan.
+    //
+    private volatile ScanTask currentTask = null;
+
+    // see DirectoryScannerMXBean
+    public void scan() {
+        final ScanTask task;
+
+        synchronized (this) {
+            final LinkedList<File> list;
+            switch (state) {
+                case RUNNING:
+                case SCHEDULED:
+                    throw new IllegalStateException(state.toString());
+                case STOPPED:
+                case COMPLETED:
+                    // only accept to scan if state is STOPPED or COMPLETED.
+                    list = new LinkedList<File>();
+                    list.add(rootFile);
+                    break;
+                default:
+                    throw new IllegalStateException(String.valueOf(state));
+            }
+
+            // Create a new ScanTask object for our root directory file.
+            //
+            currentTask = task = new ScanTask(list,this);
+
+            // transient state... will be switched to RUNNING when
+            // task.execute() is called. This code could in fact be modified
+            // to use java.util.concurent.Future and, to push the task to
+            // an executor. We would then need to wait for the task to
+            // complete before returning.  However, this wouldn't buy us
+            // anything - since this method should wait for the task to
+            // finish anyway: so why would we do it?
+            // As it stands, we simply call task.execute() in the current
+            // thread - brave and fearless readers may want to attempt the
+            // modification ;-)
+            //
+            setStateAndNotify(SCHEDULED);
+        }
+        task.execute();
+    }
+
+    // This method is invoked to carry out the configured actions on a
+    // matching file.
+    // Do not call this method from within synchronized() { } as this
+    // method may send notifications!
+    //
+    void actOn(File file) {
+
+        // Which action were actually taken
+        //
+        final Set<Action> taken = new HashSet<Action>();
+        boolean logresult = false;
+
+        // Check out which actions are configured and carry them out.
+        //
+        for (Action action : actions) {
+            switch (action) {
+                case DELETE:
+                    if (deleteFile(file)) {
+                        // Delete succeeded: add DELETE to the set of
+                        // actions carried out.
+                        taken.add(DELETE);
+                    }
+                    break;
+                case NOTIFY:
+                    if (notifyMatch(file)) {
+                        // Notify succeeded: add NOTIFY to the set of
+                        // actions carried out.
+                        taken.add(NOTIFY);
+                    }
+                    break;
+                case LOGRESULT:
+                    // LOGRESULT was configured - log actions carried out.
+                    // => we must execute this action as the last action.
+                    //    simply set logresult=true for now. We will do
+                    //    the logging later
+                    logresult = true;
+                    break;
+                default:
+                    LOG.fine("Failed to execute action: " +action +
+                            " - action not supported");
+                    break;
+            }
+        }
+
+        // Now is time for logging:
+        if (logresult) {
+            taken.add(LOGRESULT);
+            if (!logResult(file,taken.toArray(new Action[taken.size()])))
+                taken.remove(LOGRESULT); // just for the last trace below...
+        }
+
+        LOG.finest("File processed: "+taken+" - "+file.getAbsolutePath());
+    }
+
+    // Deletes a matching file.
+    private boolean deleteFile(File file) {
+        try {
+            // file.delete() is commented so that we don't do anything
+            // bad if the example is mistakenly run on the wrong set of
+            // directories.
+            //
+            /* file.delete(); */
+            System.out.println("DELETE not implemented for safety reasons.");
+            return true;
+        } catch (Exception x) {
+            LOG.fine("Failed to delete: "+file.getAbsolutePath());
+        }
+        return false;
+    }
+
+    // Notifies of a matching file.
+    private boolean notifyMatch(File file) {
+        try {
+            final Notification n =
+                    new Notification(FILE_MATCHES_NOTIFICATION,this,
+                    getNextSeqNumber(),
+                    file.getAbsolutePath());
+
+            // This method *is not* called from any synchronized block, so
+            // we can happily call broadcaster.sendNotification() here.
+            // Note that verifying whether a method is called from within
+            // a synchronized block demends a thoroughful code reading,
+            // examining each of the 'parent' methods in turn.
+            //
+            broadcaster.sendNotification(n);
+            return true;
+        } catch (Exception x) {
+            LOG.fine("Failed to notify: "+file.getAbsolutePath());
+        }
+        return false;
+    }
+
+    // Logs a result with the ResultLogManager
+    private boolean logResult(File file,Action[] actions) {
+        try {
+            logManager.log(new ResultRecord(config, actions,file));
+            return true;
+        } catch (Exception x) {
+            LOG.fine("Failed to log: "+file.getAbsolutePath());
+        }
+        return false;
+    }
+
+
+    // Contextual object used to store info about current
+    // (or last) scan.
+    //
+    private static class ScanTask {
+
+        // List of Files that remain to scan.
+        // When files are discovered they are added to the list.
+        // When they are being handled, they are removed from the list.
+        // When the list is empty, the scanning is finished.
+        //
+        private final LinkedList<File>   list;
+        private final DirectoryScanner scan;
+
+        // Some statistics...
+        //
+        private volatile long scanned=0;
+        private volatile long matching=0;
+
+        private volatile String info="Not started";
+
+        ScanTask(LinkedList<File> list, DirectoryScanner scan) {
+            this.list = list; this.scan = scan;
+        }
+
+        public void execute() {
+            scan(list);
+        }
+
+        private void scan(LinkedList<File> list) {
+             scan.scan(this,list);
+        }
+
+        public String getScanInfo() {
+            return info+" - ["+scanned+" scanned, "+matching+" matching]";
+        }
+    }
+
+    // The actual scan logic. Switches state to RUNNING,
+    // and scan the list of given dirs.
+    // The list is a live object which is updated by this method.
+    // This would allow us to implement methods like "pause" and "resume",
+    // since all the info needed to resume would be in the list.
+    //
+    private void scan(ScanTask task, LinkedList<File> list) {
+        setStateAndNotify(RUNNING);
+        task.info = "In Progress";
+        try {
+
+            // The FileFilter will tell us which files match and which don't.
+            //
+            final FileFilter filter = config.buildFileFilter();
+
+            // We have two condition to end the loop: either the list is
+            // empty, meaning there's nothing more to scan, or the state of
+            // the DirectoryScanner was asynchronously switched to STOPPED by
+            // another thread, e.g. because someone called "stop" on the
+            // ScanManagerMXBean
+            //
+            while (!list.isEmpty() && state == RUNNING) {
+
+                // Get and remove the first element in the list.
+                //
+                final File current = list.poll();
+
+                // Increment number of file scanned.
+                task.scanned++;
+
+                // If 'current' is a file, it's already been matched by our
+                // file filter (see below): act on it.
+                // Note that for the first iteration of this loop, there will
+                // be one single file in the list: the root directory for this
+                // scanner.
+                //
+                if (current.isFile()) {
+                    task.matching++;
+                    actOn(current);
+                }
+
+                // If 'current' is a directory, then
+                // find files and directories that match the file filter
+                // in this directory
+                //
+                if (current.isDirectory()) {
+
+                    // Gets matching files and directories
+                    final File[] content = current.listFiles(filter);
+                    if (content == null) continue;
+
+                    // Adds all matching file to the list.
+                    list.addAll(0,Arrays.asList(content));
+                }
+            }
+
+            // The loop terminated. If the list is empty, then we have
+            // completed our task. If not, then somebody must have called
+            // stop() on this directory scanner.
+            //
+            if (list.isEmpty()) {
+                task.info = "Successfully Completed";
+                setStateAndNotify(COMPLETED);
+            }
+        } catch (Exception x) {
+            // We got an exception: stop the scan
+            //
+            task.info = "Failed: "+x;
+            if (LOG.isLoggable(Level.FINEST))
+                LOG.log(Level.FINEST,"scan task failed: "+x,x);
+            else if (LOG.isLoggable(Level.FINE))
+                LOG.log(Level.FINE,"scan task failed: "+x);
+            setStateAndNotify(STOPPED);
+        } catch (Error e) {
+            // We got an Error:
+            // Should not happen unless we ran out of memory or
+            // whatever - don't even try to notify, but
+            // stop the scan anyway!
+            //
+            state=STOPPED;
+            task.info = "Error: "+e;
+
+            // rethrow error.
+            //
+            throw e;
+        }
+    }
+
+    /**
+     * MBeanNotification support - delegates to broadcaster.
+     */
+    public void addNotificationListener(NotificationListener listener,
+            NotificationFilter filter, Object handback)
+            throws IllegalArgumentException {
+        broadcaster.addNotificationListener(listener, filter, handback);
+    }
+
+    // Switch this object state to the desired value an send
+    // a notification. Don't call this method from within a
+    // synchronized block!
+    //
+    private final void setStateAndNotify(ScanState desired) {
+        final ScanState old = state;
+        if (old == desired) return;
+        state = desired;
+        final AttributeChangeNotification n =
+                new AttributeChangeNotification(this,
+                getNextSeqNumber(),System.currentTimeMillis(),
+                "state change","State",ScanState.class.getName(),
+                String.valueOf(old),String.valueOf(desired));
+        broadcaster.sendNotification(n);
+    }
+
+
+    /**
+     * The {@link DirectoryScannerMXBean} may send two types of
+     * notifications: filematch, and state attribute changed.
+     **/
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[] {
+            new MBeanNotificationInfo(
+                    new String[] {FILE_MATCHES_NOTIFICATION},
+                    Notification.class.getName(),
+                    "Emitted when a file that matches the scan criteria is found"
+                    ),
+            new MBeanNotificationInfo(
+                    new String[] {AttributeChangeNotification.ATTRIBUTE_CHANGE},
+                    AttributeChangeNotification.class.getName(),
+                    "Emitted when the State attribute changes"
+                    )
+        };
+    }
+
+    /**
+     * MBeanNotification support - delegates to broadcaster.
+     */
+    public void removeNotificationListener(NotificationListener listener)
+        throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener);
+    }
+
+    /**
+     * MBeanNotification support - delegates to broadcaster.
+     */
+    public void removeNotificationListener(NotificationListener listener,
+            NotificationFilter filter, Object handback)
+            throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener, filter, handback);
+    }
+
+    // Validates the given root directory, returns a File object for
+    // that directory.
+    // Throws IllegalArgumentException if the given root is not
+    // acceptable.
+    //
+    private static File validateRoot(String root) {
+        if (root == null)
+            throw new IllegalArgumentException("no root specified");
+        if (root.length() == 0)
+            throw new IllegalArgumentException("specified root \"\" is invalid");
+        final File f = new File(root);
+        if (!f.canRead())
+            throw new IllegalArgumentException("can't read "+root);
+        if (!f.isDirectory())
+            throw new IllegalArgumentException("no such directory: "+root);
+        return f;
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.java
new file mode 100644
index 0000000..2ca3548
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/DirectoryScannerMXBean.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import java.io.IOException;
+import javax.management.InstanceNotFoundException;
+
+/**
+ * A <code>DirectoryScannerMXBean</code> is an MBean that
+ * scans a file system starting at a given root directory,
+ * and then looks for files that match a given criteria.
+ * <p>
+ * When such a file is found, the <code>DirectoryScannerMXBean</code> takes
+ * the actions for which it was configured: see {@link #scan scan()}.
+ * <p>
+ * <code>DirectoryScannerMXBeans</code> are created, initialized, and
+ * registered by the {@link ScanManagerMXBean}.
+ * The {@link ScanManagerMXBean} will also schedule and run them in
+ * background by calling their {@link #scan} method.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public interface DirectoryScannerMXBean {
+    /**
+     * Get The {@link DirectoryScanner} state.
+     * @return the current state of the <code>DirectoryScanner</code>.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanState getState()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Stops the current scan if {@link ScanState#RUNNING running}.
+     * After this method completes the state of the application will
+     * be {@link ScanState#STOPPED STOPPED}.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void stop()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Scans the file system starting at the specified {@link #getRootDirectory
+     * root directory}.
+     * <p>If a file that matches this <code>DirectoryScannerMXBean</code>
+     * {@link #getConfiguration} criteria is found,
+     * the <code>DirectoryScannerMXBean</code> takes the {@link
+     * DirectoryScannerConfig#getActions() actions} for which
+     * it was {@link #getConfiguration configured}: emit a notification,
+     * <i>and or</i> log a {@link
+     * com.sun.jmx.examples.scandir.config.ResultRecord} for this file,
+     * <i>and or</i> delete that file.
+     * </p>
+     * <p>
+     * The code that would actually delete the file is commented out - so that
+     * nothing valuable is lost if this example is run by mistake on the wrong
+     * set of directories.
+     * </p>
+     * <p>This method returns only when the directory scan is completed, or
+     *    if it was {@link #stop stopped} by another thread.
+     * </p>
+     * @throws IllegalStateException if already {@link ScanState#RUNNING}
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void scan()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the root directory at which this <code>DirectoryScannerMXBean</code>
+     * will start scanning the file system.
+     * <p>
+     * This is a shortcut to {@link #getConfiguration
+     * getConfiguration()}.{@link
+     * DirectoryScannerConfig#getRootDirectory
+     * getRootDirectory()}.
+     * </p>
+     * @return This <code>DirectoryScannerMXBean</code> root directory.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getRootDirectory()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * The configuration data from which this {@link DirectoryScanner} was
+     * created.
+     * <p>
+     * You cannot change this configuration here. You can however
+     * {@link ScanDirConfigMXBean#setConfiguration modify} the
+     * {@link ScanDirConfigMXBean} configuration, and ask the
+     * {@link ScanManagerMXBean} to {@link ScanManagerMXBean#applyConfiguration
+     * apply} it. This will get all <code>DirectoryScannerMXBean</code>
+     * replaced by new MBeans created from the modified configuration.
+     * </p>
+     *
+     * @return This <code>DirectoryScannerMXBean</code> configuration data.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public DirectoryScannerConfig getConfiguration()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * A short string describing what's happening in current/latest scan.
+     * @return a short info string.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getCurrentScanInfo()
+        throws IOException, InstanceNotFoundException;
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManager.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManager.java
new file mode 100644
index 0000000..a0a4bb9
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManager.java
@@ -0,0 +1,534 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber;
+import com.sun.jmx.examples.scandir.config.ResultLogConfig;
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Logger;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.ObjectName;
+import javax.xml.bind.JAXBException;
+
+/**
+ * The <code>ResultLogManager</code> is in charge of managing result logs.
+ * {@link DirectoryScanner DirectoryScanners} can be configured to log a
+ * {@link ResultRecord} whenever they take action upon a file that
+ * matches their set of matching criteria.
+ * The <code>ResultLogManagerMXBean</code> is responsible for storing these
+ * results in its result logs.
+ * <p>The <code>ResultLogManagerMXBean</code> can be configured to log
+ * these records to a flat file, or into a log held in memory, or both.
+ * Both logs (file and memory) can be configured with a maximum capacity.
+ * <br>When the maximum capacity of the memory log is reached - its first
+ * entry (i.e. its eldest entry) is removed to make place for the latest.
+ * <br>When the maximum capacity of the file log is reached, the file is
+ * renamed by appending a tilde '~' to its name and a new result log is created.
+ *
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ResultLogManager extends NotificationBroadcasterSupport
+        implements ResultLogManagerMXBean, MBeanRegistration {
+
+    /**
+     * The default singleton name of the {@link ResultLogManagerMXBean}.
+     **/
+    public static final ObjectName RESULT_LOG_MANAGER_NAME =
+            ScanManager.makeSingletonName(ResultLogManagerMXBean.class);
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ResultLogManager.class.getName());
+
+    // The memory log
+    //
+    private final List<ResultRecord> memoryLog;
+
+    // Whether the memory log capacity was reached. In that case every
+    // new entry triggers the deletion of the eldest one.
+    //
+    private volatile boolean memCapacityReached = false;
+
+    // The maximum number of record that the memory log can
+    // contain.
+    //
+    private volatile int memCapacity;
+
+    // The maximum number of record that the ResultLogManager can
+    // log in the log file before creating a new file.
+    //
+    private volatile long fileCapacity;
+
+    // The current log file.
+    //
+    private volatile File logFile;
+
+    // The OutputStream of the current log file.
+    //
+    private volatile OutputStream logStream = null;
+
+    // number of record that this object has logged in the log file
+    // since the log file was created. Creating a new file or clearing
+    // the log file reset this value to '0'
+    //
+    private volatile long logCount = 0;
+
+    // The ResultLogManager config - modified whenever
+    // ScanManager.applyConfiguration is called.
+    //
+    private volatile ResultLogConfig config;
+
+    /**
+     * Create a new ResultLogManagerMXBean. This constructor is package
+     * protected: only the {@link ScanManager} can create a
+     * <code>ResultLogManager</code>.
+     **/
+    ResultLogManager() {
+        // Instantiate the memory log - override the add() method so that
+        // it removes the head of the list when the maximum capacity is
+        // reached. Note that add() is the only method we will be calling,
+        // otherwise we would have to override all the other flavors
+        // of adding methods. Note also that this implies that the memoryLog
+        // will *always* remain encapsulated in this object and is *never*
+        // handed over (otherwise we wouldn't be able to ensure that
+        // add() is the only method ever called to add a record).
+        //
+        memoryLog =
+                Collections.synchronizedList(new LinkedList<ResultRecord>() {
+            public synchronized boolean add(ResultRecord e) {
+                final int max = getMemoryLogCapacity();
+                while (max > 0 && size() >= max) {
+                    memCapacityReached = true;
+                    removeFirst();
+                }
+                return super.add(e);
+            }
+        });
+
+        // default memory capacity
+        memCapacity = 2048;
+
+        // default file capacity: 0 means infinite ;-)
+        fileCapacity = 0;
+
+        // by default logging to file is disabled.
+        logFile = null;
+
+        // Until the ScanManager apply a new configuration, we're going to
+        // work with a default ResultLogConfig object.
+        config = new ResultLogConfig();
+        config.setMemoryMaxRecords(memCapacity);
+        config.setLogFileName(getLogFileName(false));
+        config.setLogFileMaxRecords(fileCapacity);
+    }
+
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * registered in the MBean server.
+     * <p>If the name of the MBean is not
+     * specified, the MBean can provide a name for its registration. If
+     * any exception is raised, the MBean will not be registered in the
+     * MBean server.</p>
+     * <p>The {@code ResultLogManager} uses this method to supply its own
+     * default singleton ObjectName (if <var>name</var> parameter is null).
+     * @param server The MBean server in which the MBean will be registered.
+     * @param name The object name of the MBean. This name is null if the
+     * name parameter to one of the createMBean or registerMBean methods in
+     * the MBeanServer interface is null. In that case, this method must
+     * return a non-null ObjectName for the new MBean.
+     * @return The name under which the MBean is to be registered. This value
+     * must not be null. If the name parameter is not null, it will usually
+     * but not necessarily be the returned value.
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name)
+    throws Exception {
+        if (name == null)
+            name = RESULT_LOG_MANAGER_NAME;
+        objectName = name;
+        mbeanServer = server;
+        return name;
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having
+     * been registered in the MBean server or after the registration has
+     * failed.
+     * <p>This implementation does nothing.</p>
+     * @param registrationDone Indicates whether or not the MBean has been
+     * successfully registered in the MBean server. The value false means
+     * that the registration has failed.
+     */
+    public void postRegister(Boolean registrationDone) {
+        // Don't need to do anything here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * unregistered by the MBean server.
+     * <p>This implementation does nothing.</p>
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        // Don't need to do anything here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having been
+     * unregistered in the MBean server.
+     * <p>Closes the log file stream, if it is still open.</p>
+     */
+    public void postDeregister() {
+        try {
+            if (logStream != null) {
+                synchronized(this)  {
+                    logStream.flush();
+                    logStream.close();
+                    logFile = null;
+                    logStream = null;
+                }
+            }
+        } catch (Exception x) {
+            LOG.finest("Failed to close log properly: "+x);
+        }
+    }
+
+    /**
+     * Create a new empty log file from the given basename, renaming
+     * previously existing file by appending '~' to its name.
+     **/
+    private File createNewLogFile(String basename) throws IOException {
+        return XmlConfigUtils.createNewXmlFile(basename);
+    }
+
+    /**
+     * Check whether a new log file should be created.
+     * If a new file needs to be created, creates it, renaming
+     * previously existing file by appending '~' to its name.
+     * Also reset the log count and file capacity.
+     * Sends a notification indicating that the log file was changed.
+     * Returns the new log stream;
+     * Creation of a new file can be forced by passing force=true.
+     **/
+    private OutputStream checkLogFile(String basename, long maxRecords,
+                                      boolean force)
+    throws IOException {
+        final OutputStream newStream;
+        synchronized(this) {
+            if ((force==false) && (logCount < maxRecords))
+                return logStream;
+            final OutputStream oldStream = logStream;
+
+            // First close the stream. On some platforms you cannot rename
+            // a file that has open streams...
+            //
+            if (oldStream != null) {
+                oldStream.flush();
+                oldStream.close();
+            }
+            final File newFile = (basename==null)?null:createNewLogFile(basename);
+
+            newStream = (newFile==null)?null:new FileOutputStream(newFile,true);
+            logStream = newStream;
+            logFile = newFile;
+            fileCapacity = maxRecords;
+            logCount = 0;
+        }
+        sendNotification(new Notification(LOG_FILE_CHANGED,objectName,
+                getNextSeqNumber(),
+                basename));
+        return newStream;
+    }
+
+    // see ResultLogManagerMXBean
+    public void log(ResultRecord record)
+    throws IOException {
+        if (memCapacity > 0) logToMemory(record);
+        if (logFile != null) logToFile(record);
+    }
+
+    // see ResultLogManagerMXBean
+    public ResultRecord[] getMemoryLog() {
+        return memoryLog.toArray(new ResultRecord[0]);
+    }
+
+    // see ResultLogManagerMXBean
+    public int getMemoryLogCapacity() {
+        return memCapacity;
+    }
+
+    // see ResultLogManagerMXBean
+    public void setMemoryLogCapacity(int maxRecords)  {
+        synchronized(this) {
+            memCapacity = maxRecords;
+            if (memoryLog.size() < memCapacity)
+                memCapacityReached = false;
+            config.setMemoryMaxRecords(maxRecords);
+        }
+    }
+
+    // see ResultLogManagerMXBean
+    public void setLogFileCapacity(long maxRecords)
+    throws IOException {
+        synchronized (this) {
+            fileCapacity = maxRecords;
+            config.setLogFileMaxRecords(maxRecords);
+        }
+        checkLogFile(getLogFileName(),fileCapacity,false);
+    }
+
+    // see ResultLogManagerMXBean
+    public long getLogFileCapacity()  {
+        return fileCapacity;
+    }
+
+    // see ResultLogManagerMXBean
+    public long getLoggedCount() {
+        return logCount;
+    }
+
+    // see ResultLogManagerMXBean
+    public void newLogFile(String logname, long maxRecord)
+    throws IOException {
+        checkLogFile(logname,maxRecord,true);
+        config.setLogFileName(getLogFileName(false));
+        config.setLogFileMaxRecords(getLogFileCapacity());
+    }
+
+    // see ResultLogManagerMXBean
+    public String getLogFileName() {
+        return getLogFileName(true);
+    }
+
+    // see ResultLogManagerMXBean
+    public void clearLogs() throws IOException {
+        clearMemoryLog();
+        clearLogFile();
+    }
+
+    // Clear the memory log, sends a notification indicating that
+    // the memory log was cleared.
+    //
+    private void clearMemoryLog()throws IOException {
+        synchronized(this) {
+            memoryLog.clear();
+            memCapacityReached = false;
+        }
+        sendNotification(new Notification(MEMORY_LOG_CLEARED,
+                objectName,
+                getNextSeqNumber(),"memory log cleared"));
+    }
+
+    // Clears the log file.
+    //
+    private void clearLogFile() throws IOException {
+        // simply force the creation of a new log file.
+        checkLogFile(getLogFileName(),fileCapacity,true);
+    }
+
+    // Log a record to the memory log. Send a notification if the
+    // maximum capacity of the memory log is reached.
+    //
+    private void logToMemory(ResultRecord record) {
+
+        final boolean before = memCapacityReached;
+        final boolean after;
+        synchronized(this) {
+            memoryLog.add(record);
+            after = memCapacityReached;
+        }
+        if (before==false && after==true)
+            sendNotification(new Notification(MEMORY_LOG_MAX_CAPACITY,
+                    objectName,
+                    getNextSeqNumber(),"memory log capacity reached"));
+    }
+
+
+    // Log a record to the memory log. Send a notification if the
+    // maximum capacity of the memory log is reached.
+    //
+    private void logToFile(ResultRecord record) throws IOException {
+        final String basename;
+        final long   maxRecords;
+        synchronized (this) {
+            if (logFile == null) return;
+            basename = getLogFileName(false);
+            maxRecords = fileCapacity;
+        }
+
+        // Get the stream into which we should log.
+        final OutputStream stream =
+                checkLogFile(basename,maxRecords,false);
+
+        // logging to file now disabled - too bad.
+        if (stream == null) return;
+
+        synchronized (this) {
+            try {
+                XmlConfigUtils.write(record,stream,true);
+                stream.flush();
+                // don't increment logCount if we were not logging in logStream.
+                if (stream == logStream) logCount++;
+            } catch (JAXBException x) {
+                final IllegalArgumentException iae =
+                        new IllegalArgumentException("bad record",x);
+                LOG.finest("Failed to log record: "+x);
+                throw iae;
+            }
+        }
+    }
+
+    /**
+     * The notification type which indicates that the log file was switched:
+     * <i>com.sun.jmx.examples.scandir.log.file.switched</i>.
+     * The message contains the name of the new file (or null if log to file
+     * is now disabled).
+     **/
+    public final static String LOG_FILE_CHANGED =
+            "com.sun.jmx.examples.scandir.log.file.switched";
+
+    /**
+     * The notification type which indicates that the memory log capacity has
+     * been reached:
+     * <i>com.sun.jmx.examples.scandir.log.memory.full</i>.
+     **/
+    public final static String MEMORY_LOG_MAX_CAPACITY =
+            "com.sun.jmx.examples.scandir.log.memory.full";
+
+    /**
+     * The notification type which indicates that the memory log was
+     * cleared:
+     * <i>com.sun.jmx.examples.scandir.log.memory.cleared</i>.
+     **/
+    public final static String MEMORY_LOG_CLEARED =
+            "com.sun.jmx.examples.scandir.log.memory.cleared";
+
+    /**
+     * This MBean emits three kind of notifications:
+     * <pre>
+     *    <i>com.sun.jmx.examples.scandir.log.file.switched</i>
+     *    <i>com.sun.jmx.examples.scandir.log.memory.full</i>
+     *    <i>com.sun.jmx.examples.scandir.log.memory.cleared</i>
+     * </pre>
+     **/
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[] {
+            new MBeanNotificationInfo(new String[] {
+                LOG_FILE_CHANGED},
+                    Notification.class.getName(),
+                    "Emitted when the log file is switched")
+                    ,
+            new MBeanNotificationInfo(new String[] {
+                MEMORY_LOG_MAX_CAPACITY},
+                    Notification.class.getName(),
+                    "Emitted when the memory log capacity is reached")
+                    ,
+            new MBeanNotificationInfo(new String[] {
+                MEMORY_LOG_CLEARED},
+                    Notification.class.getName(),
+                    "Emitted when the memory log is cleared")
+        };
+    }
+
+    // Return the name of the log file, or null if logging to file is
+    // disabled.
+    private String getLogFileName(boolean absolute) {
+        synchronized (this) {
+            if (logFile == null) return null;
+            if (absolute) return logFile.getAbsolutePath();
+            return logFile.getPath();
+        }
+    }
+
+    // This method is be called by the ScanManagerMXBean when a configuration
+    // is applied.
+    //
+    void setConfig(ResultLogConfig logConfigBean) throws IOException {
+        if (logConfigBean == null)
+            throw new IllegalArgumentException("logConfigBean is null");
+        synchronized (this) {
+            config = logConfigBean;
+            setMemoryLogCapacity(config.getMemoryMaxRecords());
+        }
+        final String filename = config.getLogFileName();
+        final String logname  = getLogFileName(false);
+        if ((filename != null && !filename.equals(logname))
+        || (filename == null && logname != null)) {
+            newLogFile(config.getLogFileName(),
+                    config.getLogFileMaxRecords());
+        } else {
+            setLogFileCapacity(config.getLogFileMaxRecords());
+        }
+    }
+
+    // This method is called by the ScanManagerMXBean when
+    // applyCurrentResultLogConfig() is called.
+    //
+    ResultLogConfig getConfig() {
+        return config;
+    }
+
+
+    // Set by preRegister().
+    private MBeanServer mbeanServer;
+    private ObjectName objectName;
+
+
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.java
new file mode 100644
index 0000000..eb1f0f6
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ResultLogManagerMXBean.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import java.io.IOException;
+import javax.management.InstanceNotFoundException;
+
+/**
+ * The <code>ResultLogManagerMXBean</code> is in charge of managing result logs.
+ * {@link DirectoryScanner DirectoryScanners} can be configured to log a
+ * {@link ResultRecord} whenever they take action upon a file that
+ * matches their set of matching criteria.
+ * The <code>ResultLogManagerMXBean</code> is responsible for storing these
+ * results in its result logs.
+ * <p>The <code>ResultLogManagerMXBean</code>
+ * will let you interactively clear these result logs, change their
+ * capacity, and decide where (memory or file or both) the
+ * {@link ResultRecord ResultRecords} should be stored.
+ * <p>The memory log is useful in so far that its content can be interactively
+ * returned by the <code>ResultLogManagerMXBean</code>.
+ * The file log doesn't have this facility.
+ * <p>The result logs are intended to be used by e.g. an offline program that
+ * would take some actions on the files that were matched by the scanners
+ * criteria:
+ * <p>The <i>scandir</i> application could be configured to only produce logs
+ * (i.e. takes no action but logging the matching files), and the real
+ * action (e.g. mail the result log to the engineer which maintains the lab,
+ * or parse the log and prepare and send a single mail to the matching
+ * files owners, containing the list of file he/she should consider deleting)
+ * could be performed by such another program/module.
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public interface ResultLogManagerMXBean {
+
+    /**
+     * Creates a new log file in which to store results.
+     * <p>When this method is called, the {@link ResultLogManager} will stop
+     * logging in its current log file and use the new specified file instead.
+     * If that file already exists, it will be renamed by appending a '~' to
+     * its name, and a new empty file with the name specified by
+     * <var>basename</var> will be created.
+     * </p>
+     * <p>Calling this method has no side effect on the {@link
+     * com.sun.jmx.examples.scandir.config.ScanManagerConfig#getInitialResultLogConfig
+     * InitialResultLogConfig} held in the {@link ScanDirConfigMXBean}
+     * configuration. To apply these new values to the
+     * {@link ScanDirConfigMXBean}
+     * configuration, you must call {@link
+     * ScanManagerMXBean#applyCurrentResultLogConfig
+     * ScanManagerMXBean.applyCurrentResultLogConfig}.
+     *<p>
+     * @param basename The name of the new log file. This will be the
+     *        new name returned by {@link #getLogFileName}.
+     * @param maxRecord maximum number of records to log in the specified file
+     *        before creating a new file. <var>maxRecord</var> will be the
+     *        new value returned by {@link #getLogFileCapacity}.
+     *        When that maximum number of
+     *        records is reached the {@link ResultLogManager} will rename
+     *        the file by appending a '~' to its name, and a new empty
+     *        log file will be created.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void newLogFile(String basename, long maxRecord)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Logs a result record to the active result logs (memory,file,both,or none)
+     * depending on how this MBean is currently configured.
+     * @see #getLogFileName()
+     * @see #getMemoryLogCapacity()
+     * @param record The result record to log.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void log(ResultRecord record)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the name of the current result log file.
+     * <p><code>null</code> means that no log file is configured: logging
+     * to file is disabled.
+     * </p>
+     * @return The name of the current result log file, or <code>null</code>
+     *         if logging to file is disabled.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getLogFileName()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the whole content of the memory log. This cannot exceed
+     * {@link #getMemoryLogCapacity} records.
+     *
+     * @return the whole content of the memory log.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ResultRecord[] getMemoryLog()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the maximum number of records that can be logged in the
+     * memory log.
+     * <p>
+     * A non positive value - <code>0</code> or negative - means that
+     * logging in memory is disabled.
+     * </p>
+     * <p>The memory log is a FIFO: when its maximum capacity is reached, its
+     *    head element is removed to make place for a new element at its tail.
+     * </p>
+     * @return The maximum number of records that can be logged in the
+     * memory log. A value {@code <= 0} means that logging in memory is
+     * disabled.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public int getMemoryLogCapacity()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Sets the maximum number of records that can be logged in the
+     * memory log.
+     * <p>The memory log is a FIFO: when its maximum capacity is reached, its
+     *    head element is removed to make place for a new element at its tail.
+     * </p>
+     * @param size The maximum number of result records that can be logged in the memory log.  <p>
+     * A non positive value - <code>0</code> or negative - means that
+     * logging in memory is disabled. It will also have the side
+     * effect of clearing the memory log.
+     * </p>
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void setMemoryLogCapacity(int size)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Sets the maximum number of records that can be logged in the result log
+     * file.
+     * <p>When that maximum number of
+     * records is reached the {@link ResultLogManager} will rename
+     * the result log file by appending a '~' to its name, and a new empty
+     * log file will be created.
+     * </p>
+     * <p>If logging to file is disabled calling this method
+     *    is irrelevant.
+     * </p>
+     * @param maxRecord maximum number of records to log in the result log file.
+     * @see #getLogFileName()
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void setLogFileCapacity(long maxRecord)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the maximum number of records that can be logged in the result log
+     * file.
+     * <p>When that maximum number of
+     * records is reached the {@link ResultLogManager} will rename
+     * the result log file by appending a '~' to its name, and a new empty
+     * log file will be created.
+     * </p>
+     * @see #getLogFileName()
+     * @return The maximum number of records that can be logged in the result
+     *         log file.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public long getLogFileCapacity()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets The number of records that have been logged in the
+     * current result log file. This will always be less than
+     * {@link #getLogFileCapacity()}.
+     * @return The number of records in the
+     *         current result log file.
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public long getLoggedCount()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Clears the memory log and result log file.
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void clearLogs()
+        throws IOException, InstanceNotFoundException;
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirAgent.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirAgent.java
new file mode 100644
index 0000000..f4bf1b6
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirAgent.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
+import javax.management.JMException;
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationListener;
+
+/**
+ * <p>
+ * The <code>ScanDirAgent</code> is the Agent class for the <i>scandir</i>
+ * application.
+ * This class contains the {@link #main} method to start a standalone
+ * <i>scandir</i> application.
+ * </p>
+ * <p>
+ * The {@link #main main()} method simply registers a {@link
+ * ScanManagerMXBean} in the platform MBeanServer - see {@link #init init},
+ * and then waits for someone to call {@link ScanManagerMXBean#close close}
+ * on that MBean.
+ * </p>
+ * <p>
+ * When the {@link ScanManagerMXBean} state is switched to {@link
+ * ScanManagerMXBean.ScanState#CLOSED CLOSED}, {@link #cleanup cleanup} is
+ * called, the {@link ScanManagerMXBean} is unregistered, and the application
+ * terminates (i.e. the main thread completes).
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+public class ScanDirAgent {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ScanDirAgent.class.getName());
+
+    // Proxy to the ScanManagerMXBean - created by init();
+    //
+    private volatile ScanManagerMXBean proxy = null;
+
+    // A queue to put received Notifications.
+    //
+    private final BlockingQueue<Notification> queue;
+
+    // A listener that will put notifications into the queue.
+    //
+    private final NotificationListener listener;
+
+    /**
+     * Creates a new instance of ScanDirAgent
+     * You will need to call {@link #init()} later on in order to initialize
+     * the application.
+     * @see #main
+     **/
+    public ScanDirAgent() {
+        // Initialize the notification queue
+        queue = new LinkedBlockingQueue<Notification>();
+
+        // Creates the listener.
+        listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                                           Object handback) {
+                try {
+                    // Just put the received notification in the queue.
+                    // It will be consumed later on by 'waitForClose()'
+                    //
+                    LOG.finer("Queuing received notification "+notification);
+                    queue.put(notification);
+                } catch (InterruptedException ex) {
+                    // OK
+                }
+            }
+        };
+    }
+
+    /**
+     * Initialize the application by registering a ScanManagerMXBean in
+     * the platform MBeanServer
+     * @throws java.io.IOException Registration failed for communication-related reasons.
+     * @throws javax.management.JMException Registration failed for JMX-related reasons.
+     */
+    public void init() throws IOException, JMException {
+
+        // Registers the ScanManagerMXBean singleton in the
+        // platform MBeanServer
+        //
+        proxy = ScanManager.register();
+
+        // Registers a NotificationListener with the ScanManagerMXBean in
+        // order to receive state changed notifications.
+        //
+        ((NotificationEmitter)proxy).addNotificationListener(listener,null,null);
+    }
+
+    /**
+     * Cleanup after close: unregister the ScanManagerMXBean singleton.
+     * @throws java.io.IOException Cleanup failed for communication-related reasons.
+     * @throws javax.management.JMException Cleanup failed for JMX-related reasons.
+     */
+    public void cleanup() throws IOException, JMException {
+        try {
+            ((NotificationEmitter)proxy).
+                    removeNotificationListener(listener,null,null);
+        } finally {
+            ManagementFactory.getPlatformMBeanServer().
+                unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+        }
+    }
+
+    /**
+     * Wait for someone to call 'close()' on the ScanManagerMXBean singleton.
+     * Every time its state changes, the ScanManagerMXBean emits a notification.
+     * We don't rely on the notification content (if we were using a remote
+     * connection, we could miss some notifications) - we simply use the
+     * state change notifications to react more quickly to state changes.
+     * We do so simply by polling the {@link BlockingQueue} in which our
+     * listener is pushing notifications, and checking the ScanManagerMXBean
+     * state every time that a notification is received.
+     * <p>
+     * We can do so because we know that once the ScanManagerMXBean state is
+     * switched to 'CLOSED', it will remain 'CLOSED' whatsoever. <br>
+     * Therefore we don't need to concern ourselves with the possibility of
+     * missing the window in which the ScanManagerMXBean state's will be
+     * CLOSED, because that particular window stays opened forever.
+     * <p>
+     * Had we wanted to wait for 'RUNNING', we would have needed to apply
+     * a different strategy - e.g. by taking into account the actual content
+     * of the state changed notifications we received.
+     * @throws java.io.IOException wait failed - a communication problem occurred.
+     * @throws javax.management.JMException wait failed - the MBeanServer threw an exception.
+     */
+    public void waitForClose() throws IOException, JMException {
+
+        // Wait until state is closed
+        while(proxy.getState() != ScanState.CLOSED ) {
+            try {
+                // Wake up at least every 30 seconds - if we missed a
+                // notification - we will at least get a chance to
+                // call getState(). 30 seconds is obviously quite
+                // arbitrary - if this were a real daemon - id'be tempted
+                // to wait 30 minutes - knowing that any incoming
+                // notification will wake me up anyway.
+                // Note: we simply use the state change notifications to
+                // react more quickly to state changes: see javadoc above.
+                //
+                queue.poll(30,TimeUnit.SECONDS);
+            } catch (InterruptedException ex) {
+                // OK
+            }
+        }
+    }
+
+    /**
+     * The agent's main: {@link #init registers} a {@link ScanManagerMXBean},
+     * {@link #waitForClose waits} until its state is {@link
+     * ScanManagerMXBean.ScanState#CLOSED CLOSED}, {@link #cleanup cleanup}
+     * and exits.
+     * @param args the command line arguments - ignored
+     * @throws java.io.IOException A communication problem occurred.
+     * @throws javax.management.JMException A JMX problem occurred.
+     */
+    public static void main(String[] args)
+        throws IOException, JMException {
+        System.out.println("Initializing ScanManager...");
+        final ScanDirAgent agent = new ScanDirAgent();
+        agent.init();
+        try {
+            System.out.println("Waiting for ScanManager to close...");
+            agent.waitForClose();
+        } finally {
+            System.out.println("Cleaning up...");
+            agent.cleanup();
+        }
+    }
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirClient.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirClient.java
new file mode 100644
index 0000000..442a607
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirClient.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.management.MBeanServerConnection;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.rmi.ssl.SslRMIClientSocketFactory;
+
+/**
+ * The ScanDirClient class is a very simple programmatic client example
+ * which is able to connect to a secured JMX <i>scandir</i> application.
+ * <p>The program initialize the connection environment map with the
+ * appropriate properties and credentials, and then connects to the
+ * secure JMX <i>scandir</i> daemon.</p>
+ * <p>It gets the application's current configuration and prints it on
+ * its <code>System.out</code>.</p>
+ * <p>The {@link #main main} method takes two arguments: the host on which
+ * the server is running (localhost), and the port number
+ * that was configured to start the server RMI Connector (4545).
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+public class ScanDirClient {
+
+    // This class has only a main.
+    private ScanDirClient() { }
+
+    /**
+     * The usage string for the ScanDirClient.
+     */
+    public static final String USAGE = ScanDirClient.class.getSimpleName() +
+            " <server-host> <rmi-port-number>";
+
+    /**
+     * Connects to a secured JMX <i>scandir</i> application.
+     * @param args The {@code main} method takes two parameters:
+     *        <ul>
+     *        <li>args[0] must be the server's host</li>
+     *        <li>args[1] must be the rmi port number at which the
+     *        JMX <i>scandir</i> daemon is listening for connections
+     *        - that is, the port number of its JMX RMI Connector which
+     *        was configured in {@code management.properties}
+     *        </li>
+     *        <ul>
+     **/
+    public static void main(String[] args) {
+        try {
+            // Check args
+            //
+            if (args==null || args.length!=2) {
+                System.err.println("Bad number of arguments: usage is: \n\t" +
+                        USAGE);
+                System.exit(1);
+            }
+            try {
+                InetAddress.getByName(args[0]);
+            } catch (UnknownHostException x) {
+                System.err.println("No such host: " + args[0]+
+                            "\n usage is: \n\t" + USAGE);
+                System.exit(2);
+            } catch (Exception x) {
+                System.err.println("Bad address: " + args[0]+
+                            "\n usage is: \n\t" + USAGE);
+                System.exit(2);
+            }
+            try {
+                if (Integer.parseInt(args[1]) <= 0) {
+                    System.err.println("Bad port value: " + args[1]+
+                            "\n usage is: \n\t" + USAGE);
+                    System.exit(2);
+                }
+            } catch (Exception x) {
+                System.err.println("Bad argument: " + args[1]+
+                        "\n usage is: \n\t" + USAGE);
+                System.exit(2);
+            }
+
+            // Create an environment map to hold connection properties
+            // like credentials etc... We will later pass this map
+            // to the JMX Connector.
+            //
+            System.out.println("\nInitialize the environment map");
+            final Map<String,Object> env = new HashMap<String,Object>();
+
+            // Provide the credentials required by the server
+            // to successfully perform user authentication
+            //
+            final String[] credentials = new String[] { "guest" , "guestpasswd" };
+            env.put("jmx.remote.credentials", credentials);
+
+            // Provide the SSL/TLS-based RMI Client Socket Factory required
+            // by the JNDI/RMI Registry Service Provider to communicate with
+            // the SSL/TLS-protected RMI Registry
+            //
+            env.put("com.sun.jndi.rmi.factory.socket",
+                    new SslRMIClientSocketFactory());
+
+            // Create the RMI connector client and
+            // connect it to the RMI connector server
+            // args[0] is the server's host - localhost
+            // args[1] is the secure server port - 4545
+            //
+            System.out.println("\nCreate the RMI connector client and " +
+                    "connect it to the RMI connector server");
+            final JMXServiceURL url = new JMXServiceURL(
+                    "service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1] +
+                    "/jmxrmi");
+
+            System.out.println("Connecting to: "+url);
+            final JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
+
+            // Get an MBeanServerConnection
+            //
+            System.out.println("\nGet the MBeanServerConnection");
+            final MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
+
+            // Create a proxy for the ScanManager MXBean
+            //
+            final ScanManagerMXBean proxy =
+                    ScanManager.newSingletonProxy(mbsc);
+
+            // Get the ScanDirConfig MXBean from the scan manager
+            //
+            System.out.println(
+                    "\nGet ScanDirConfigMXBean from ScanManagerMXBean");
+            final ScanDirConfigMXBean configMBean =
+                    proxy.getConfigurationMBean();
+
+            // Print the scan dir configuration
+            //
+            System.out.println(
+                    "\nGet 'Configuration' attribute on ScanDirConfigMXBean");
+            System.out.println("\nConfiguration:\n" +
+                    configMBean.getConfiguration());
+
+            // Try to invoke the "close" method on the ScanManager MXBean.
+            //
+            // Should get a SecurityException as the user "guest" doesn't
+            // have readwrite access.
+            //
+            System.out.println("\nInvoke 'close' on ScanManagerMXBean");
+            try {
+                proxy.close();
+            } catch (SecurityException e) {
+                System.out.println("\nGot expected security exception: " + e);
+            }
+
+            // Close MBeanServer connection
+            //
+            System.out.println("\nClose the connection to the server");
+            jmxc.close();
+            System.out.println("\nBye! Bye!");
+        } catch (Exception e) {
+            System.out.println("\nGot unexpected exception: " + e);
+            e.printStackTrace();
+            System.exit(3);
+        }
+    }
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfig.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfig.java
new file mode 100644
index 0000000..7ecd8a1
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfig.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber;
+import static com.sun.jmx.examples.scandir.ScanDirConfigMXBean.SaveState.*;
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.FileMatch;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.*;
+import javax.xml.bind.JAXBException;
+
+/**
+ * <p>The <code>ScanDirConfig</code> MBean is in charge of the
+ * <i>scandir</i> application configuration.
+ * </p>
+ * <p>The <code>ScanDirConfig</code> MBean is able to
+ * load and save the <i>scandir</i> application configuration to and from an
+ * XML file.
+ * </p>
+ * <p>
+ * It will let you also interactively modify that configuration, which you
+ * can later save to the file, by calling {@link #save}, or discard, by
+ * reloading the file without saving - see {@link #load}.
+ * </p>
+ * <p>
+ * There can be as many <code>ScanDirConfigMXBean</code> registered
+ * in the MBeanServer as you like, but only one of them will be identified as
+ * the current configuration of the {@link ScanManagerMXBean}.
+ * You can switch to another configuration by calling {@link
+ * ScanManagerMXBean#setConfigurationMBean
+ * ScanManagerMXBean.setConfigurationMBean}.
+ * </p>
+ * <p>
+ * Once the current configuration has been loaded (by calling {@link #load})
+ * or modified (by calling one of {@link #addDirectoryScanner
+ * addDirectoryScanner}, {@link #removeDirectoryScanner removeDirectoryScanner}
+ * or {@link #setConfiguration setConfiguration}) it can be pushed
+ * to the {@link ScanManagerMXBean} by calling {@link
+ * ScanManagerMXBean#applyConfiguration
+ * ScanManagerMXBean.applyConfiguration(true)} -
+ * <code>true</code> means that we apply the configuration from memory,
+ * without first reloading the file.
+ * </p>
+ * <p>
+ * The <code>ScanDirConfig</code> uses the XML annotated Java Beans defined
+ * in the {@link com.sun.jmx.examples.scandir.config} package.
+ * </p>
+ * <p>
+ * <u>Note:</u> The <code>ScanDirConfig</code> should probably use
+ * {@code java.nio.channels.FileLock} and lock its configuration file so that
+ * two <code>ScanDirConfig</code> object do not share the same file, but it
+ * doesn't. Feel free to improve the application in that way.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanDirConfig extends NotificationBroadcasterSupport
+        implements ScanDirConfigMXBean, MBeanRegistration {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ScanDirConfig.class.getName());
+
+    // We will emit a notification when the save state of this object
+    // chenges. We use directly the base notification class, with a
+    // notification type that indicates the new state at which the
+    // object has arrived.
+    //
+    // All these notification types will have the same prefix, which is
+    // 'com.sun.jmx.examples.scandir.config'.
+    //
+    private final static String NOTIFICATION_PREFIX =
+            ScanManagerConfig.class.getPackage().getName();
+
+    /**
+     * The <i>com.sun.jmx.examples.scandir.config.saved</i> notification
+     * indicates that the configuration data was saved.
+     **/
+    public final static String NOTIFICATION_SAVED =
+            NOTIFICATION_PREFIX+".saved";
+    /**
+     * The <i>com.sun.jmx.examples.scandir.config.loaded</i> notification
+     * indicates that the configuration data was loaded.
+     **/
+    public final static String NOTIFICATION_LOADED =
+            NOTIFICATION_PREFIX+".loaded";
+
+    /**
+     * The <i>com.sun.jmx.examples.scandir.config.modified</i> notification
+     * indicates that the configuration data was modified.
+     **/
+    public final static String NOTIFICATION_MODIFIED =
+            NOTIFICATION_PREFIX+".modified";
+
+    // The array of MBeanNotificationInfo that will be exposed in the
+    // ScanDirConfigMXBean MBeanInfo.
+    // We will pass this array to the NotificationBroadcasterSupport
+    // constructor.
+    //
+    private static MBeanNotificationInfo[] NOTIFICATION_INFO = {
+        new MBeanNotificationInfo(
+                new String[] {NOTIFICATION_SAVED},
+                Notification.class.getName(),
+                "Emitted when the configuration is saved"),
+        new MBeanNotificationInfo(
+                new String[] {NOTIFICATION_LOADED},
+                Notification.class.getName(),
+                "Emitted when the configuration is loaded"),
+        new MBeanNotificationInfo(
+                new String[] {NOTIFICATION_MODIFIED},
+                Notification.class.getName(),
+                "Emitted when the configuration is modified"),
+    };
+
+     // The ScanDirConfigMXBean configuration data.
+    private volatile ScanManagerConfig config;
+
+    // The name of the configuration file
+    private String filename = null;
+
+    // The name of this configuration. This is usually both equal to
+    // config.getName() and objectName.getKeyProperty(name).
+    private volatile String configname = null;
+
+    // This object save state. CREATED is the initial state.
+    //
+    private volatile SaveState status = CREATED;
+
+    /**
+     * Creates a new {@link ScanDirConfigMXBean}.
+     * <p>{@code ScanDirConfigMXBean} can be created by the {@link
+     * ScanManagerMXBean}, or directly by a remote client, using
+     * {@code createMBean} or {@code registerMBean}.
+     * </p>
+     * <p>{@code ScanDirConfigMXBean} created by the {@link
+     * ScanManagerMXBean} will be unregistered by the
+     * {@code ScanManagerMXBean}. {@code ScanDirConfigMXBean} created
+     * directly by a remote client will not be unregistered by the
+     * {@code ScanManagerMXBean} - this will remain to the responsibility of
+     * the code/client that created them.
+     * </p>
+     * <p>This object is created empty, you should call load() if you want it
+     *    to load its data from the configuration file.
+     * </p>
+     * @param  filename The configuration file used by this MBean.
+     *         Can be null (in which case load() and save() will fail).
+     *         Can point to a file that does not exists yet (in which case
+     *         load() will fail if called before save(), and save() will
+     *         attempt to create that file). Can point to an existing file,
+     *         in which case load() will load that file and save() will save
+     *         to that file.
+     *
+     **/
+    public ScanDirConfig(String filename) {
+        this(filename,null);
+    }
+
+    /**
+     * Create a new ScanDirConfig MBean with an initial configuration.
+     * @param filename The name of the configuration file.
+     * @param initialConfig an initial configuration.
+     **/
+    public ScanDirConfig(String filename, ScanManagerConfig initialConfig) {
+        super(NOTIFICATION_INFO);
+        this.filename = filename;
+        this.config = initialConfig;
+    }
+
+
+    // see ScanDirConfigMXBean
+    public void load() throws IOException {
+        if (filename == null)
+            throw new UnsupportedOperationException("load");
+
+        synchronized(this) {
+            config = new XmlConfigUtils(filename).readFromFile();
+            if (configname != null) config = config.copy(configname);
+            else configname = config.getName();
+
+            status=LOADED;
+        }
+        sendNotification(NOTIFICATION_LOADED);
+    }
+
+    // see ScanDirConfigMXBean
+    public void save() throws IOException {
+        if (filename == null)
+            throw new UnsupportedOperationException("load");
+        synchronized (this) {
+            new XmlConfigUtils(filename).writeToFile(config);
+            status = SAVED;
+        }
+        sendNotification(NOTIFICATION_SAVED);
+    }
+
+    // see ScanDirConfigMXBean
+    public ScanManagerConfig getConfiguration() {
+        synchronized (this) {
+            return XmlConfigUtils.xmlClone(config);
+        }
+    }
+
+
+    // sends a notification indicating the new save state.
+    private void sendNotification(String type) {
+        final Object source = (objectName==null)?this:objectName;
+        final Notification n = new Notification(type,source,
+                getNextSeqNumber(),
+                "The configuration is "+
+                type.substring(type.lastIndexOf('.')+1));
+        sendNotification(n);
+    }
+
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * registered in the MBean server. If the name of the MBean is not
+     * specified, the MBean can provide a name for its registration. If
+     * any exception is raised, the MBean will not be registered in the
+     * MBean server.
+     * @param server The MBean server in which the MBean will be registered.
+     * @param name The object name of the MBean. This name is null if the
+     * name parameter to one of the createMBean or registerMBean methods in
+     * the MBeanServer interface is null. In that case, this method will
+     * try to guess its MBean name by examining its configuration data.
+     * If its configuration data is null (nothing was provided in the
+     * constructor) or doesn't contain a name, this method returns {@code null},
+     * and registration will fail.
+     * <p>
+     * Otherwise, if {@code name} wasn't {@code null} or if a default name could
+     * be constructed, the name of the configuration will be set to
+     * the value of the ObjectName's {@code name=} key, and the configuration
+     * data will always be renamed to reflect this change.
+     * </p>
+     *
+     * @return The name under which the MBean is to be registered.
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name)
+        throws Exception {
+        if (name == null) {
+            if (config == null) return null;
+            if (config.getName() == null) return null;
+            name = ScanManager.
+                    makeMBeanName(ScanDirConfigMXBean.class,config.getName());
+        }
+        objectName = name;
+        mbeanServer = server;
+        synchronized (this) {
+            configname = name.getKeyProperty("name");
+            if (config == null) config = new ScanManagerConfig(configname);
+            else config = config.copy(configname);
+        }
+        return name;
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having
+     * been registered in the MBean server or after the registration has
+     * failed.
+     * <p>This implementation does nothing</p>
+     * @param registrationDone Indicates whether or not the MBean has been
+     * successfully registered in the MBean server. The value false means
+     * that the registration has failed.
+     */
+    public void postRegister(Boolean registrationDone) {
+        // Nothing to do here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * unregistered by the MBean server.
+     * <p>This implementation does nothing</p>
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        // Nothing to do here.
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having been
+     * unregistered in the MBean server.
+     * <p>This implementation does nothing</p>
+     */
+    public void postDeregister() {
+        // Nothing to do here.
+    }
+
+    // see ScanDirConfigMXBean
+    public String getConfigFilename() {
+        return filename;
+    }
+
+    // see ScanDirConfigMXBean
+    public void setConfiguration(ScanManagerConfig config) {
+        synchronized (this) {
+            if (config == null) {
+                this.config = null;
+                return;
+            }
+
+            if (configname == null)
+                configname = config.getName();
+
+            this.config = config.copy(configname);
+            status = MODIFIED;
+        }
+        sendNotification(NOTIFICATION_MODIFIED);
+    }
+
+    // see ScanDirConfigMXBean
+    public DirectoryScannerConfig
+            addDirectoryScanner(String name, String dir, String filePattern,
+                                long sizeExceedsMaxBytes, long sinceLastModified) {
+         final DirectoryScannerConfig scanner =
+                 new DirectoryScannerConfig(name);
+         scanner.setRootDirectory(dir);
+         if (filePattern!=null||sizeExceedsMaxBytes>0||sinceLastModified>0) {
+            final FileMatch filter = new FileMatch();
+            filter.setFilePattern(filePattern);
+            filter.setSizeExceedsMaxBytes(sizeExceedsMaxBytes);
+            if (sinceLastModified > 0)
+                filter.setLastModifiedBefore(new Date(new Date().getTime()
+                                                -sinceLastModified));
+            scanner.addIncludeFiles(filter);
+         }
+         synchronized (this) {
+            config.putScan(scanner);
+            status = MODIFIED;
+         }
+         LOG.fine("config: "+config);
+         sendNotification(NOTIFICATION_MODIFIED);
+         return scanner;
+    }
+
+    // see ScanDirConfigMXBean
+    public DirectoryScannerConfig removeDirectoryScanner(String name)
+        throws IOException, InstanceNotFoundException {
+        final DirectoryScannerConfig scanner;
+        synchronized (this) {
+            scanner = config.removeScan(name);
+            if (scanner == null)
+                throw new IllegalArgumentException(name+": scanner not found");
+            status = MODIFIED;
+        }
+        sendNotification(NOTIFICATION_MODIFIED);
+        return scanner;
+    }
+
+    // see ScanDirConfigMXBean
+    public SaveState getSaveState() {
+        return status;
+    }
+
+    // These methods are used by ScanManager to guess a configuration name from
+    // a configuration filename.
+    //
+    static String DEFAULT = "DEFAULT";
+
+    private static String getBasename(String name) {
+        final int dot = name.indexOf('.');
+        if (dot<0)  return name;
+        if (dot==0) return getBasename(name.substring(1));
+        return name.substring(0,dot);
+    }
+
+    static String guessConfigName(String configFileName,String defaultFile) {
+        try {
+            if (configFileName == null) return DEFAULT;
+            final File f = new File(configFileName);
+            if (f.canRead()) {
+                final String confname = XmlConfigUtils.read(f).getName();
+                if (confname != null && confname.length()>0) return confname;
+            }
+            final File f2 = new File(defaultFile);
+            if (f.equals(f2)) return DEFAULT;
+            final String guess = getBasename(f.getName());
+            if (guess == null) return DEFAULT;
+            if (guess.length()==0) return DEFAULT;
+            return guess;
+        } catch (Exception x) {
+            return DEFAULT;
+        }
+    }
+
+    // Set by preRegister()
+    private volatile MBeanServer mbeanServer;
+    private volatile ObjectName objectName;
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.java
new file mode 100644
index 0000000..eb4f375
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanDirConfigMXBean.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.IOException;
+import javax.management.InstanceNotFoundException;
+
+/**
+ * <p>The <code>ScanDirConfigMXBean</code> is in charge of the
+ * <i>scandir</i> application configuration.
+ * </p>
+ * <p>The <code>ScanDirConfigMXBean</code> is an MBean which is able to
+ * load and save the <i>scandir</i> application configuration to and from an
+ * XML file.
+ * </p>
+ * <p>
+ * It will let you also interactively modify that configuration, which you
+ * can later save to the file, by calling {@link #save}, or discard, by
+ * reloading the file without saving - see {@link #load}.
+ * </p>
+ * <p>
+ * There can be as many <code>ScanDirConfigMXBean</code> registered
+ * in the MBeanServer as you like, but only one of them will be identified as
+ * the current configuration of the {@link ScanManagerMXBean}.
+ * You can switch to another configuration by calling {@link
+ * ScanManagerMXBean#setConfigurationMBean
+ * ScanManagerMXBean.setConfigurationMBean}.
+ * </p>
+ * <p>
+ * Once the current configuration has been loaded (by calling {@link #load})
+ * or modified (by calling one of {@link #addDirectoryScanner
+ * addDirectoryScanner}, {@link #removeDirectoryScanner removeDirectoryScanner}
+ * or {@link #setConfiguration setConfiguration}) it can be pushed
+ * to the {@link ScanManagerMXBean} by calling {@link
+ * ScanManagerMXBean#applyConfiguration
+ * ScanManagerMXBean.applyConfiguration(true)} -
+ * <code>true</code> means that we apply the configuration from memory,
+ * without first reloading the file.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public interface ScanDirConfigMXBean {
+    /**
+     * This state tells whether the configuration reflected by the
+     * {@link ScanDirConfigMXBean} was loaded in memory, saved to the
+     * configuration file, or modified since last saved.
+     * Note that this state doesn't tell whether the configuration was
+     * applied by the {@link ScanManagerMXBean}.
+     **/
+    public enum SaveState {
+        /**
+         * Initial state: the {@link ScanDirConfigMXBean} is created, but
+         * neither {@link #load} or  {@link #save} was yet called.
+         **/
+        CREATED,
+
+        /**
+         * The configuration reflected by the {@link ScanDirConfigMXBean} has
+         * been loaded, but not modified yet.
+         **/
+        LOADED,
+
+        /**
+         * The configuration was modified. The modifications are held in memory.
+         * Call {@link #save} to save them to the file, or {@link #load} to
+         * reload the file and discard them.
+         **/
+        MODIFIED,
+
+        /**
+         * The configuration was saved.
+         **/
+        SAVED
+    };
+
+    /**
+     * Loads the configuration from the {@link
+     * #getConfigFilename configuration file}.
+     * <p>Any unsaved modification will be lost. The {@link #getSaveState state}
+     * is switched to {@link SaveState#LOADED LOADED}.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @see #getSaveState()
+     * @throws IOException The configuration couldn't be loaded from the file,
+     *                     e.g. because the file doesn't exist or isn't
+     *                     readable.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void load()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Saves the configuration to the {@link
+     * #getConfigFilename configuration file}.
+     *
+     * <p>If the configuration file doesn't exists, this method will
+     *    attempt to create it. Otherwise, the existing file will
+     *    be renamed by appending a '~' to its name, and a new file
+     *    will be created, in which the configuration will be saved.
+     * The {@link #getSaveState state}
+     * is switched to {@link SaveState#SAVED SAVED}.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean}.
+     * </p>
+     * @see #getSaveState()
+     *
+     * @throws IOException The configuration couldn't be saved to the file,
+     *                     e.g. because the file couldn't be created.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void save()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the name of the configuration file.
+     * <p>If the configuration file doesn't exists, {@link #load} will fail
+     * and {@link #save} will attempt to create the file.
+     * </p>
+     *
+     * @return The configuration file name for this MBean.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public String getConfigFilename()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the current configuration data.
+     * <p>
+     * This method returns the configuration data which is currently held
+     * in memory.
+     * </p>
+     * <p>Call {@link #load} to reload the data from the configuration
+     *    file, and {@link #save} to save the data to the configuration
+     *    file.
+     * </p>
+     * @see #getSaveState()
+     * @return The current configuration data in memory.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanManagerConfig getConfiguration()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Sets the current configuration data.
+     * <p>
+     * This method replaces the configuration data in memory.
+     * The {@link #getSaveState state} is switched to {@link
+     * SaveState#MODIFIED MODIFIED}.
+     * </p>
+     * <p>Calling {@link #load} will reload the data from the configuration
+     *    file, and all modifications will be lost.
+     *    Calling {@link #save} will save the modified data to the configuration
+     *    file.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @param config The new configuration data.
+     * @see #getSaveState()
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void setConfiguration(ScanManagerConfig config)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Adds a new directory scanner to the current configuration data.
+     * <p>
+     * This method updates the configuration data in memory, adding
+     * a {@link DirectoryScannerConfig} to the {@link
+     * ScanManagerConfig#getScanList directory scanner list}.
+     * The {@link #getSaveState state} is switched to {@link
+     * SaveState#MODIFIED MODIFIED}.
+     * </p>
+     * <p>Calling {@link #load} will reload the data from the configuration
+     *    file, and all modifications will be lost.
+     *    Calling {@link #save} will save the modified data to the configuration
+     *    file.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @param name A name for the new directory scanner. This is the value
+     *             that will be later used in the {@link DirectoryScannerMXBean}
+     *             ObjectName for the <code>name=</code> key.
+     * @param dir The root directory at which this scanner will start scanning.
+     * @param filePattern A {@link java.util.regex.Pattern regular expression}
+     *        to match against a selected file name.
+     * @param sizeExceedsMaxBytes Only file whose size exceeds that limit will
+     *        be selected. <code.0</code> or  a
+     *        negative value means no limit.
+     * @param sinceLastModified Select files which haven't been modified for
+     *        that number of milliseconds - i.e.
+     *        {@code sinceLastModified=3600000} will exclude files which
+     *        have been modified in the last hour.
+     *        The date of last modification is ignored if <code>0</code> or  a
+     *        negative value is provided.
+     * @see #getSaveState()
+     * @return The added <code>DirectoryScannerConfig</code>.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public DirectoryScannerConfig
+            addDirectoryScanner(String name, String dir, String filePattern,
+                                long sizeExceedsMaxBytes, long sinceLastModified)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Removes a directory scanner from the current configuration data.
+     * <p>
+     * This method updates the configuration data in memory, removing
+     * a {@link DirectoryScannerConfig} from the {@link
+     * ScanManagerConfig#getScanList directory scanner list}.
+     * The {@link #getSaveState state} is switched to {@link
+     * SaveState#MODIFIED MODIFIED}.
+     * </p>
+     * <p>Calling {@link #load} will reload the data from the configuration
+     *    file, and all modifications will be lost.
+     *    Calling {@link #save} will save the modified data to the configuration
+     *    file.
+     * </p>
+     * <p>
+     * This action has no effect on the {@link ScanManagerMXBean} until
+     * {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
+     * points to this MBean and {@link ScanManagerMXBean#applyConfiguration
+     * ScanManagerMXBean.applyConfiguration} is called.
+     * </p>
+     * @param name The name of the new directory scanner. This is the value
+     *             that is used in the {@link DirectoryScannerMXBean}
+     *             ObjectName for the <code>name=</code> key.
+     * @return The removed <code>DirectoryScannerConfig</code>.
+     * @throws IllegalArgumentException if there's no directory scanner by
+     *         that name in the current configuration data.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public DirectoryScannerConfig
+            removeDirectoryScanner(String name)
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the save state of the current configuration data.
+     * <p>
+     * {@link SaveState#CREATED CREATED} means that the configuration data was just
+     * created. It has not been loaded from the configuration file.
+     * Calling {@link #load} will load the data from the configuration file.
+     * Calling {@link #save} will write the empty data to the configuration
+     * file.
+     * </p>
+     * <p>
+     * {@link SaveState#LOADED LOADED} means that the configuration data
+     * was loaded from the configuration file.
+     * </p>
+     * <p>
+     * {@link SaveState#MODIFIED MODIFIED} means that the configuration data
+     * was modified since it was last loaded or saved.
+     * Calling {@link #load} will reload the data from the configuration file,
+     * and all modifications will be lost.
+     * Calling {@link #save} will write the modified data to the configuration
+     * file.
+     * </p>
+     * <p>
+     * {@link SaveState#SAVED SAVED} means that the configuration data
+     * was saved to the configuration file.
+     * </p>
+     * <p>
+     * This state doesn't indicate whether this MBean configuration data
+     * was {@link ScanManagerMXBean#applyConfiguration applied} by the
+     * {@link ScanManagerMXBean}.
+     * </p>
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     * @return The save state of the {@code ScanDirConfigMXBean}.
+     */
+    public SaveState getSaveState()
+        throws IOException, InstanceNotFoundException;
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManager.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManager.java
new file mode 100644
index 0000000..e34b12a
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManager.java
@@ -0,0 +1,1160 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.File;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.management.AttributeChangeNotification;
+import javax.management.InstanceNotFoundException;
+import javax.management.JMException;
+import javax.management.JMX;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+/**
+ * <p>
+ * The <code>ScanManager</code> is responsible for applying a configuration,
+ * starting and scheduling directory scans, and reporting application state.
+ * </p>
+ * <p>
+ * The ScanManager MBean is a singleton MBean which controls
+ * scan session. The ScanManager name is defined by
+ * {@link #SCAN_MANAGER_NAME ScanManager.SCAN_MANAGER_NAME}.
+ * </p>
+ * <p>
+ * The <code>ScanManager</code> MBean is the entry point of the <i>scandir</i>
+ * application management interface. It is from this MBean that all other MBeans
+ * will be created and registered.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanManager implements ScanManagerMXBean,
+        NotificationEmitter, MBeanRegistration {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(ScanManager.class.getName());
+
+    /**
+     * The name of the ScanManager singleton MBean.
+     **/
+    public final static ObjectName SCAN_MANAGER_NAME =
+            makeSingletonName(ScanManagerMXBean.class);
+
+    /**
+     * Sequence number used for sending notifications. We use this
+     * sequence number throughout the application.
+     **/
+    private static long seqNumber=0;
+
+    /**
+     * The NotificationBroadcasterSupport object used to handle
+     * listener registration.
+     **/
+    private final NotificationBroadcasterSupport broadcaster;
+
+    /**
+     * The MBeanServer in which this MBean is registered. We obtain
+     * this reference by implementing the {@link MBeanRegistration}
+     * interface.
+     **/
+    private volatile MBeanServer mbeanServer;
+
+    /**
+     * A queue of pending notifications we are about to send.
+     * We're using a BlockingQueue in order to avoid sending
+     * notifications from within a synchronized block.
+     **/
+    private final BlockingQueue<Notification> pendingNotifs;
+
+    /**
+     * The state of the scan session.
+     **/
+    private volatile ScanState state = STOPPED;
+
+    /**
+     * The list of DirectoryScannerMBean that are run by a scan session.
+     **/
+    private final Map<ObjectName,DirectoryScannerMXBean> scanmap;
+
+    /**
+     * The list of ScanDirConfigMXBean that were created by this MBean.
+     **/
+    private final Map<ObjectName, ScanDirConfigMXBean> configmap;
+
+    // The ResultLogManager for this application.
+    private final ResultLogManager log;
+
+    /**
+     * We use a semaphore to ensure proper sequencing of exclusive
+     * action. The logic we have implemented is to fail - rather
+     * than block, if an exclusive action is already in progress.
+     **/
+    private final Semaphore sequencer = new Semaphore(1);
+
+    // A proxy to the current ScanDirConfigMXBean which holds the current
+    // configuration data.
+    //
+    private volatile ScanDirConfigMXBean config = null;
+
+    // Avoid to write parameters twices when creating a new ConcurrentHashMap.
+    //
+    private static <K, V> Map<K, V> newConcurrentHashMap() {
+        return new ConcurrentHashMap<K, V>();
+    }
+
+    // Avoid to write parameters twices when creating a new HashMap.
+    //
+    private static <K, V> Map<K, V> newHashMap() {
+        return new HashMap<K, V>();
+    }
+
+    /**
+     * Creates a default singleton ObjectName for a given class.
+     * @param clazz The interface class of the MBean for which we want to obtain
+     *        a default singleton name, or its implementation class.
+     *        Give one or the other depending on what you wish to see in
+     *        the value of the key {@code type=}.
+     * @return A default singleton name for a singleton MBean class.
+     * @throws IllegalArgumentException if the name can't be created
+     *         for some unfathomable reason (e.g. an unexpected
+     *         exception was raised).
+     **/
+    public final static ObjectName makeSingletonName(Class clazz) {
+        try {
+            final Package p = clazz.getPackage();
+            final String packageName = (p==null)?null:p.getName();
+            final String className   = clazz.getSimpleName();
+            final String domain;
+            if (packageName == null || packageName.length()==0) {
+                // We use a reference to ScanDirAgent.class to ease
+                // to keep track of possible class renaming.
+                domain = ScanDirAgent.class.getSimpleName();
+            } else {
+                domain = packageName;
+            }
+            final ObjectName name = new ObjectName(domain,"type",className);
+            return name;
+        } catch (Exception x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException(String.valueOf(clazz),x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Creates a default ObjectName with keys <code>type=</code> and
+     * <code>name=</code> for an instance of a given MBean interface class.
+     * @param clazz The interface class of the MBean for which we want to obtain
+     *        a default name, or its implementation class.
+     *        Give one or the other depending on what you wish to see in
+     *        the value of the key {@code type=}.
+     * @param name The value of the <code>name=</code> key.
+     * @return A default name for an instance of the given MBean interface class.
+     * @throws IllegalArgumentException if the name can't be created.
+     *         (e.g. an unexpected exception was raised).
+     **/
+    public static final ObjectName makeMBeanName(Class clazz, String name) {
+        try {
+            return ObjectName.
+                getInstance(makeSingletonName(clazz)
+                        .toString()+",name="+name);
+        } catch (MalformedObjectNameException x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException(String.valueOf(name),x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Return the ObjectName for a DirectoryScannerMXBean of that name.
+     * This is {@code makeMBeanName(DirectoryScannerMXBean.class,name)}.
+     * @param name The value of the <code>name=</code> key.
+     * @return the ObjectName for a DirectoryScannerMXBean of that name.
+     */
+    public static final ObjectName makeDirectoryScannerName(String name) {
+        return makeMBeanName(DirectoryScannerMXBean.class,name);
+    }
+
+    /**
+     * Return the ObjectName for a {@code ScanDirConfigMXBean} of that name.
+     * This is {@code makeMBeanName(ScanDirConfigMXBean.class,name)}.
+     * @param name The value of the <code>name=</code> key.
+     * @return the ObjectName for a {@code ScanDirConfigMXBean} of that name.
+     */
+    public static final ObjectName makeScanDirConfigName(String name) {
+        return makeMBeanName(ScanDirConfigMXBean.class,name);
+    }
+
+    /**
+     * Create and register a new singleton instance of the ScanManager
+     * MBean in the given {@link MBeanServerConnection}.
+     * @param mbs The MBeanServer in which the new singleton instance
+     *         should be created.
+     * @throws JMException The MBeanServer connection raised an exception
+     *         while trying to instantiate and register the singleton MBean
+     *         instance.
+     * @throws IOException There was a connection problem while trying to
+     *         communicate with the underlying MBeanServer.
+     * @return A proxy for the registered MBean.
+     **/
+    public static ScanManagerMXBean register(MBeanServerConnection mbs)
+        throws IOException, JMException {
+        final ObjectInstance moi =
+                mbs.createMBean(ScanManager.class.getName(),SCAN_MANAGER_NAME);
+        final ScanManagerMXBean proxy =
+                JMX.newMXBeanProxy(mbs,moi.getObjectName(),
+                                  ScanManagerMXBean.class,true);
+        return proxy;
+    }
+
+    /**
+     * Creates a new {@code ScanManagerMXBean} proxy over the given
+     * {@code MBeanServerConnection}. Does not check whether a
+     * {@code ScanManagerMXBean}
+     * is actually registered in that {@code MBeanServerConnection}.
+     * @return a new {@code ScanManagerMXBean} proxy.
+     * @param mbs The {@code MBeanServerConnection} which holds the
+     * {@code ScanManagerMXBean} to proxy.
+     */
+    public static ScanManagerMXBean
+            newSingletonProxy(MBeanServerConnection mbs) {
+        final ScanManagerMXBean proxy =
+                JMX.newMXBeanProxy(mbs,SCAN_MANAGER_NAME,
+                                  ScanManagerMXBean.class,true);
+        return proxy;
+    }
+
+    /**
+     * Creates a new {@code ScanManagerMXBean} proxy over the platform
+     * {@code MBeanServer}. This is equivalent to
+     * {@code newSingletonProxy(ManagementFactory.getPlatformMBeanServer())}.
+     * @return a new {@code ScanManagerMXBean} proxy.
+     **/
+    public static ScanManagerMXBean newSingletonProxy() {
+        return newSingletonProxy(ManagementFactory.getPlatformMBeanServer());
+    }
+
+    /**
+     * Create and register a new singleton instance of the ScanManager
+     * MBean in the given {@link MBeanServerConnection}.
+     * @throws JMException The MBeanServer connection raised an exception
+     *         while trying to instantiate and register the singleton MBean
+     *         instance.
+     * @throws IOException There was a connection problem while trying to
+     *         communicate with the underlying MBeanServer.
+     * @return A proxy for the registered MBean.
+     **/
+    public static ScanManagerMXBean register()
+        throws IOException, JMException {
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        return register(mbs);
+    }
+
+    /**
+     * Create a new ScanManager MBean
+     **/
+    public ScanManager() {
+        broadcaster = new NotificationBroadcasterSupport();
+        pendingNotifs = new LinkedBlockingQueue<Notification>(100);
+        scanmap = newConcurrentHashMap();
+        configmap = newConcurrentHashMap();
+        log = new ResultLogManager();
+    }
+
+
+    // Creates a new DirectoryScannerMXBean, from the given configuration data.
+    DirectoryScannerMXBean createDirectoryScanner(DirectoryScannerConfig config) {
+            return new DirectoryScanner(config,log);
+    }
+
+    // Applies a configuration.
+    // throws IllegalStateException if lock can't be acquired.
+    // Unregisters all existing directory scanners, the create and registers
+    // new directory scanners according to the given config.
+    // Then pushes the log config to the result log manager.
+    //
+    private void applyConfiguration(ScanManagerConfig bean)
+        throws IOException, JMException {
+        if (bean == null) return;
+        if (!sequencer.tryAcquire()) {
+            throw new IllegalStateException("Can't acquire lock");
+        }
+        try {
+            unregisterScanners();
+            final DirectoryScannerConfig[] scans = bean.getScanList();
+            if (scans == null) return;
+            for (DirectoryScannerConfig scan : scans) {
+                addDirectoryScanner(scan);
+            }
+            log.setConfig(bean.getInitialResultLogConfig());
+        } finally {
+            sequencer.release();
+        }
+    }
+
+    // See ScanManagerMXBean
+    public void applyConfiguration(boolean fromMemory)
+        throws IOException, JMException {
+        if (fromMemory == false) config.load();
+        applyConfiguration(config.getConfiguration());
+    }
+
+    // See ScanManagerMXBean
+    public void applyCurrentResultLogConfig(boolean toMemory)
+        throws IOException, JMException {
+        final ScanManagerConfig bean = config.getConfiguration();
+        bean.setInitialResultLogConfig(log.getConfig());
+        config.setConfiguration(bean);
+        if (toMemory==false) config.save();
+    }
+
+    // See ScanManagerMXBean
+    public void setConfigurationMBean(ScanDirConfigMXBean config) {
+        this.config = config;
+    }
+
+    // See ScanManagerMXBean
+    public ScanDirConfigMXBean getConfigurationMBean() {
+        return config;
+    }
+
+    // Creates and registers a new directory scanner.
+    // Called by applyConfiguration.
+    // throws IllegalStateException if state is not STOPPED or COMPLETED
+    // (you cannot change the config while scanning is scheduled or running).
+    //
+    private DirectoryScannerMXBean addDirectoryScanner(
+                DirectoryScannerConfig bean)
+        throws JMException {
+        try {
+            final DirectoryScannerMXBean scanner;
+            final ObjectName scanName;
+            synchronized (this) {
+                if (state != STOPPED && state != COMPLETED)
+                   throw new IllegalStateException(state.toString());
+                scanner = createDirectoryScanner(bean);
+                scanName = makeDirectoryScannerName(bean.getName());
+            }
+            LOG.fine("server: "+mbeanServer);
+            LOG.fine("scanner: "+scanner);
+            LOG.fine("scanName: "+scanName);
+            final ObjectInstance moi =
+                mbeanServer.registerMBean(scanner,scanName);
+            final ObjectName moiName = moi.getObjectName();
+            final DirectoryScannerMXBean proxy =
+                JMX.newMXBeanProxy(mbeanServer,moiName,
+                DirectoryScannerMXBean.class,true);
+            scanmap.put(moiName,proxy);
+            return proxy;
+        } catch (RuntimeException x) {
+            final String msg = "Operation failed: "+x;
+            if (LOG.isLoggable(Level.FINEST))
+                LOG.log(Level.FINEST,msg,x);
+            else LOG.fine(msg);
+            throw x;
+        } catch (JMException x) {
+            final String msg = "Operation failed: "+x;
+            if (LOG.isLoggable(Level.FINEST))
+                LOG.log(Level.FINEST,msg,x);
+            else LOG.fine(msg);
+            throw x;
+        }
+    }
+
+    // See ScanManagerMXBean
+    public ScanDirConfigMXBean createOtherConfigurationMBean(String name,
+            String filename)
+        throws JMException {
+        final ScanDirConfig profile = new ScanDirConfig(filename);
+        final ObjectName profName = makeScanDirConfigName(name);
+        final ObjectInstance moi = mbeanServer.registerMBean(profile,profName);
+        final ScanDirConfigMXBean proxy =
+                JMX.newMXBeanProxy(mbeanServer,profName,
+                    ScanDirConfigMXBean.class,true);
+        configmap.put(moi.getObjectName(),proxy);
+        return proxy;
+    }
+
+
+    // See ScanManagerMXBean
+    public Map<String,DirectoryScannerMXBean> getDirectoryScanners() {
+        final Map<String,DirectoryScannerMXBean> proxyMap = newHashMap();
+        for (Entry<ObjectName,DirectoryScannerMXBean> item : scanmap.entrySet()){
+            proxyMap.put(item.getKey().getKeyProperty("name"),item.getValue());
+        }
+        return proxyMap;
+    }
+
+    // ---------------------------------------------------------------
+    // State Management
+    // ---------------------------------------------------------------
+
+    /**
+     * For each operation, this map stores a list of states from
+     * which the corresponding operation can be legally called.
+     * For instance, it is legal to call "stop" regardless of the
+     * application state. However, "schedule" can be called only if
+     * the application state is STOPPED, etc...
+     **/
+    private final static Map<String,EnumSet<ScanState>> allowedStates;
+    static {
+        allowedStates = newHashMap();
+        // You can always call stop
+        allowedStates.put("stop",EnumSet.allOf(ScanState.class));
+
+        // You can only call closed when stopped
+        allowedStates.put("close",EnumSet.of(STOPPED,COMPLETED,CLOSED));
+
+        // You can call schedule only when the current task is
+        // completed or stopped.
+        allowedStates.put("schedule",EnumSet.of(STOPPED,COMPLETED));
+
+        // switch reserved for background task: goes from SCHEDULED to
+        //    RUNNING when it enters the run() method.
+        allowedStates.put("scan-running",EnumSet.of(SCHEDULED));
+
+        // switch reserved for background task: goes from RUNNING to
+        //    SCHEDULED when it has completed but needs to reschedule
+        //    itself for specified interval.
+        allowedStates.put("scan-scheduled",EnumSet.of(RUNNING));
+
+        // switch reserved for background task:
+        //     goes from RUNNING to COMPLETED upon successful completion
+        allowedStates.put("scan-done",EnumSet.of(RUNNING));
+    }
+
+    // Get this object's state. No need to synchronize because
+    // state is volatile.
+    // See ScanManagerMXBean
+    public ScanState getState() {
+        return state;
+    }
+
+    /**
+     * Enqueue a state changed notification for the given states.
+     **/
+    private void queueStateChangedNotification(
+                    long sequence,
+                    long time,
+                    ScanState old,
+                    ScanState current) {
+        final AttributeChangeNotification n =
+                new AttributeChangeNotification(SCAN_MANAGER_NAME,sequence,time,
+                "ScanManager State changed to "+current,"State",
+                ScanState.class.getName(),old.toString(),current.toString());
+        // Queue the notification. We have created an unlimited queue, so
+        // this method should always succeed.
+        try {
+            if (!pendingNotifs.offer(n,2,TimeUnit.SECONDS)) {
+                LOG.fine("Can't queue Notification: "+n);
+            }
+        } catch (InterruptedException x) {
+                LOG.fine("Can't queue Notification: "+x);
+        }
+    }
+
+    /**
+     * Send all notifications present in the queue.
+     **/
+    private void sendQueuedNotifications() {
+        Notification n;
+        while ((n = pendingNotifs.poll()) != null) {
+            broadcaster.sendNotification(n);
+        }
+    }
+
+    /**
+     * Checks that the current state is allowed for the given operation,
+     * and if so, switch its value to the new desired state.
+     * This operation also enqueue the appropriate state changed
+     * notification.
+     **/
+    private ScanState switchState(ScanState desired,String forOperation) {
+        return switchState(desired,allowedStates.get(forOperation));
+    }
+
+    /**
+     * Checks that the current state is one of the allowed states,
+     * and if so, switch its value to the new desired state.
+     * This operation also enqueue the appropriate state changed
+     * notification.
+     **/
+    private ScanState switchState(ScanState desired,EnumSet<ScanState> allowed) {
+        final ScanState old;
+        final long timestamp;
+        final long sequence;
+        synchronized(this) {
+            old = state;
+            if (!allowed.contains(state))
+               throw new IllegalStateException(state.toString());
+            state = desired;
+            timestamp = System.currentTimeMillis();
+            sequence  = getNextSeqNumber();
+        }
+        LOG.fine("switched state: "+old+" -> "+desired);
+        if (old != desired)
+            queueStateChangedNotification(sequence,timestamp,old,desired);
+        return old;
+    }
+
+
+    // ---------------------------------------------------------------
+    // schedule() creates a new SessionTask that will be executed later
+    // (possibly right away if delay=0) by a Timer thread.
+    // ---------------------------------------------------------------
+
+    // The timer used by this object. Lazzy evaluation. Cleaned in
+    // postDeregister()
+    //
+    private Timer timer = null;
+
+    // See ScanManagerMXBean
+    public void schedule(long delay, long interval) {
+        if (!sequencer.tryAcquire()) {
+            throw new IllegalStateException("Can't acquire lock");
+        }
+        try {
+            LOG.fine("scheduling new task: state="+state);
+            final ScanState old = switchState(SCHEDULED,"schedule");
+            final boolean scheduled =
+                scheduleSession(new SessionTask(interval),delay);
+            if (scheduled)
+                LOG.fine("new task scheduled: state="+state);
+        } finally {
+            sequencer.release();
+        }
+        sendQueuedNotifications();
+    }
+
+    // Schedule a SessionTask. The session task may reschedule
+    // a new identical task when it eventually ends.
+    // We use this logic so that the 'interval' time is measured
+    // starting at the end of the task that finishes, rather than
+    // at its beginning. Therefore if a repeated task takes x ms,
+    // it will be repeated every x+interval ms.
+    //
+    private synchronized boolean scheduleSession(SessionTask task, long delay) {
+        if (state == STOPPED) return false;
+        if (timer == null) timer = new Timer("ScanManager");
+        tasklist.add(task);
+        timer.schedule(task,delay);
+        return true;
+    }
+
+    // ---------------------------------------------------------------
+    // start() is equivalent to schedule(0,0)
+    // ---------------------------------------------------------------
+
+    // See ScanManagerMXBean
+    public void start() throws IOException, InstanceNotFoundException {
+        schedule(0,0);
+    }
+
+    // ---------------------------------------------------------------
+    // Methods used to implement stop() -  stop() is asynchronous,
+    // and needs to notify any running background task that it needs
+    // to stop. It also needs to prevent scheduled task from being
+    // run.
+    // ---------------------------------------------------------------
+
+    // See ScanManagerMXBean
+    public void stop() {
+        if (!sequencer.tryAcquire())
+            throw new IllegalStateException("Can't acquire lock");
+        int errcount = 0;
+        final StringBuilder b = new StringBuilder();
+
+        try {
+            switchState(STOPPED,"stop");
+
+            errcount += cancelSessionTasks(b);
+            errcount += stopDirectoryScanners(b);
+        } finally {
+            sequencer.release();
+        }
+
+        sendQueuedNotifications();
+        if (errcount > 0) {
+            b.insert(0,"stop partially failed with "+errcount+" error(s):");
+            throw new RuntimeException(b.toString());
+        }
+    }
+
+    // See ScanManagerMXBean
+    public void close() {
+        switchState(CLOSED,"close");
+        sendQueuedNotifications();
+    }
+
+    // Appends exception to a StringBuilder message.
+    //
+    private void append(StringBuilder b,String prefix,Throwable t) {
+        final String first = (prefix==null)?"\n":"\n"+prefix;
+        b.append(first).append(String.valueOf(t));
+        Throwable cause = t;
+        while ((cause = cause.getCause())!=null) {
+            b.append(first).append("Caused by:").append(first);
+            b.append('\t').append(String.valueOf(cause));
+        }
+    }
+
+    // Cancels all scheduled session tasks
+    //
+    private int cancelSessionTasks(StringBuilder b) {
+        int errcount = 0;
+        // Stops scheduled tasks if any...
+        //
+        for (SessionTask task : tasklist) {
+            try {
+                task.cancel();
+                tasklist.remove(task);
+            } catch (Exception ex) {
+                errcount++;
+                append(b,"\t",ex);
+            }
+        }
+        return errcount;
+    }
+
+    // Stops all DirectoryScanners configured for this object.
+    //
+    private int stopDirectoryScanners(StringBuilder b) {
+        int errcount = 0;
+        // Stops directory scanners if any...
+        //
+        for (DirectoryScannerMXBean s : scanmap.values()) {
+            try {
+                s.stop();
+            } catch (Exception ex) {
+                errcount++;
+                append(b,"\t",ex);
+            }
+        }
+        return errcount;
+    }
+
+
+    // ---------------------------------------------------------------
+    // We start scanning in background in a Timer thread.
+    // The methods below implement that logic.
+    // ---------------------------------------------------------------
+
+    private void scanAllDirectories()
+        throws IOException, InstanceNotFoundException {
+
+        int errcount = 0;
+        final StringBuilder b = new StringBuilder();
+        for (ObjectName key : scanmap.keySet()) {
+            final DirectoryScannerMXBean s = scanmap.get(key);
+            try {
+                if (state == STOPPED) return;
+                s.scan();
+            } catch (Exception ex) {
+                LOG.log(Level.FINE,key + " failed to scan: "+ex,ex);
+                errcount++;
+                append(b,"\t",ex);
+            }
+        }
+        if (errcount > 0) {
+            b.insert(0,"scan partially performed with "+errcount+" error(s):");
+            throw new RuntimeException(b.toString());
+        }
+    }
+
+    // List of scheduled session task. Needed by stop() to cancel
+    // scheduled sessions. There's usually at most 1 session in
+    // this list (unless there's a bug somewhere ;-))
+    //
+    private final ConcurrentLinkedQueue<SessionTask> tasklist =
+            new ConcurrentLinkedQueue<SessionTask>();
+
+    // Used to give a unique id to session task - useful for
+    // debugging.
+    //
+    private volatile static long taskcount = 0;
+
+    /**
+     * A session task will be scheduled to run in background in a
+     * timer thread. There can be at most one session task running
+     * at a given time (this is ensured by using a timer - which is
+     * a single threaded object).
+     *
+     * If the session needs to be repeated, it will reschedule an
+     * identical session when it finishes to run. This ensure that
+     * two session runs are separated by the given interval time.
+     *
+     **/
+    private class SessionTask extends TimerTask {
+
+        /**
+         * Delay after which the next iteration of this task will
+         * start. This delay is measured  starting at the end of
+         * the previous iteration.
+         **/
+        final long delayBeforeNext;
+
+        /**
+         * A unique id for this task.
+         **/
+        final long taskid;
+
+        /**
+         * Whether it's been cancelled by stop()
+         **/
+        volatile boolean cancelled=false;
+
+        /**
+         * create a new SessionTask.
+         **/
+        SessionTask(long scheduleNext) {
+            delayBeforeNext = scheduleNext;
+            taskid = taskcount++;
+        }
+
+        /**
+         * When run() begins, the state is switched to RUNNING.
+         * When run() ends then:
+         *      If the task is repeated, the state will be switched
+         *      to SCHEDULED (because a new task was scheduled).
+         *      Otherwise the state will be switched to either
+         *      STOPPED (if it was stopped before it could complete)
+         *      or COMPLETED (if it completed gracefully)
+         * This method is used to switch to the desired state and
+         * send the appropriate notifications.
+         * When entering the method, we check whether the state is
+         * STOPPED. If so, we return false - and the SessionTask will
+         * stop. Otherwise, we switch the state to the desired value.
+         **/
+        private boolean notifyStateChange(ScanState newState,String condition) {
+            synchronized (ScanManager.this) {
+                if (state == STOPPED || state == CLOSED) return false;
+                switchState(newState,condition);
+            }
+            sendQueuedNotifications();
+            return true;
+        }
+
+        // Cancels this task.
+        public boolean cancel() {
+            cancelled=true;
+            return super.cancel();
+        }
+
+        /**
+         * Invoke all directories scanners in sequence. At each
+         * step, checks to see whether the task should stop.
+         **/
+        private boolean execute() {
+            final String tag = "Scheduled session["+taskid+"]";
+            try {
+                if (cancelled) {
+                    LOG.finer(tag+" cancelled: done");
+                    return false;
+                }
+                if (!notifyStateChange(RUNNING,"scan-running")) {
+                    LOG.finer(tag+" stopped: done");
+                    return false;
+                }
+                scanAllDirectories();
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST)) {
+                    LOG.log(Level.FINEST,
+                            tag+" failed to scan: "+x,x);
+                } else if (LOG.isLoggable(Level.FINE)) {
+                    LOG.fine(tag+" failed to scan: "+x);
+                }
+            }
+            return true;
+        }
+
+        /**
+         * Schedule an identical task for next iteration.
+         **/
+        private boolean scheduleNext() {
+            final String tag = "Scheduled session["+taskid+"]";
+
+            // We need now to reschedule a new task for after 'delayBeforeNext' ms.
+            try {
+                LOG.finer(tag+": scheduling next session for "+ delayBeforeNext + "ms");
+                if (cancelled || !notifyStateChange(SCHEDULED,"scan-scheduled")) {
+                    LOG.finer(tag+" stopped: do not reschedule");
+                    return false;
+                }
+                final SessionTask nextTask = new SessionTask(delayBeforeNext);
+                if (!scheduleSession(nextTask,delayBeforeNext)) return false;
+                LOG.finer(tag+": next session successfully scheduled");
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST)) {
+                    LOG.log(Level.FINEST,tag+
+                            " failed to schedule next session: "+x,x);
+                } else if (LOG.isLoggable(Level.FINE)) {
+                    LOG.fine(tag+" failed to schedule next session: "+x);
+                }
+            }
+            return true;
+        }
+
+
+        /**
+         * The run method:
+         * executes scanning logic, the schedule next iteration if needed.
+         **/
+        public void run() {
+            final String tag = "Scheduled session["+taskid+"]";
+            LOG.entering(SessionTask.class.getName(),"run");
+            LOG.finer(tag+" starting...");
+            try {
+                if (execute()==false) return;
+
+                LOG.finer(tag+" terminating - state is "+state+
+                    ((delayBeforeNext >0)?(" next session is due in "+delayBeforeNext+" ms."):
+                        " no additional session scheduled"));
+
+                // if delayBeforeNext <= 0 we are done, either because the session was
+                // stopped or because it successfully completed.
+                if (delayBeforeNext <= 0) {
+                    if (!notifyStateChange(COMPLETED,"scan-done"))
+                        LOG.finer(tag+" stopped: done");
+                    else
+                        LOG.finer(tag+" completed: done");
+                    return;
+                }
+
+                // we need to reschedule a new session for 'delayBeforeNext' ms.
+                scheduleNext();
+
+            } finally {
+                tasklist.remove(this);
+                LOG.finer(tag+" finished...");
+                LOG.exiting(SessionTask.class.getName(),"run");
+            }
+        }
+    }
+
+    // ---------------------------------------------------------------
+    // ---------------------------------------------------------------
+
+    // ---------------------------------------------------------------
+    // MBean Notification support
+    // The methods below are imported from {@link NotificationEmitter}
+    // ---------------------------------------------------------------
+
+    /**
+     * Delegates the implementation of this method to the wrapped
+     * {@code NotificationBroadcasterSupport} object.
+     **/
+    public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException {
+        broadcaster.addNotificationListener(listener, filter, handback);
+    }
+
+
+    /**
+     * We emit an {@code AttributeChangeNotification} when the {@code State}
+     * attribute changes.
+     **/
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[] {
+            new MBeanNotificationInfo(new String[] {
+                AttributeChangeNotification.ATTRIBUTE_CHANGE},
+                AttributeChangeNotification.class.getName(),
+                "Emitted when the State attribute changes")
+            };
+    }
+
+    /**
+     * Delegates the implementation of this method to the wrapped
+     * {@code NotificationBroadcasterSupport} object.
+     **/
+    public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener);
+    }
+
+    /**
+     * Delegates the implementation of this method to the wrapped
+     * {@code NotificationBroadcasterSupport} object.
+     **/
+    public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException {
+        broadcaster.removeNotificationListener(listener, filter, handback);
+    }
+
+    /**
+     * Returns and increment the sequence number used for
+     * notifications. We use the same sequence number throughout the
+     * application - this is why this method is only package protected.
+     * @return A unique sequence number for the next notification.
+     */
+    static synchronized long getNextSeqNumber() {
+        return seqNumber++;
+    }
+
+    // ---------------------------------------------------------------
+    // End of MBean Notification support
+    // ---------------------------------------------------------------
+
+    // ---------------------------------------------------------------
+    // MBeanRegistration support
+    // The methods below are imported from {@link MBeanRegistration}
+    // ---------------------------------------------------------------
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * registered in the MBean server. If the name of the MBean is not
+     * specified, the MBean can provide a name for its registration. If
+     * any exception is raised, the MBean will not be registered in the
+     * MBean server.
+     * <p>In this implementation, we check that the provided name is
+     * either {@code null} or equals to {@link #SCAN_MANAGER_NAME}. If it
+     * isn't then we throw an IllegalArgumentException, otherwise we return
+     * {@link #SCAN_MANAGER_NAME}.</p>
+     * <p>This ensures that there will be a single instance of ScanManager
+     * registered in a given MBeanServer, and that it will always be
+     * registered with the singleton's {@link #SCAN_MANAGER_NAME}.</p>
+     * <p>We do not need to check whether an MBean by that name is
+     *    already registered because the MBeanServer will perform
+     *    this check just after having called preRegister().</p>
+     * @param server The MBean server in which the MBean will be registered.
+     * @param name The object name of the MBean. This name is null if the
+     * name parameter to one of the createMBean or registerMBean methods in
+     * the MBeanServer interface is null. In that case, this method must
+     * return a non-null ObjectName for the new MBean.
+     * @return The name under which the MBean is to be registered. This value
+     * must not be null. If the name parameter is not null, it will usually
+     * but not necessarily be the returned value.
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
+        if (name != null) {
+            if (!SCAN_MANAGER_NAME.equals(name))
+                throw new IllegalArgumentException(String.valueOf(name));
+        }
+        mbeanServer = server;
+        return SCAN_MANAGER_NAME;
+    }
+
+    // Returns the default configuration filename
+    static String getDefaultConfigurationFileName() {
+        // This is a file calles 'jmx-scandir.xml' located
+        // in the user directory.
+        final String user = System.getProperty("user.home");
+        final String defconf = user+File.separator+"jmx-scandir.xml";
+        return defconf;
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having
+     * been registered in the MBean server or after the registration has
+     * failed.
+     * <p>
+     * If registration was not successful, the method returns immediately.
+     * <p>
+     * If registration is successful, register the {@link ResultLogManager}
+     * and default {@link ScanDirConfigMXBean}. If registering these
+     * MBean fails, the {@code ScanManager} state will be switched to
+     * {@link #close CLOSED}, and postRegister ends there.
+     * </p>
+     * <p>Otherwise the {@code ScanManager} will ask the
+     * {@link ScanDirConfigMXBean} to load its configuration.
+     * If it succeeds, the configuration will be {@link
+     * #applyConfiguration applied}. Otherwise, the method simply returns,
+     * assuming that the user will later create/update a configuration and
+     * apply it.
+     * @param registrationDone Indicates whether or not the MBean has been
+     * successfully registered in the MBean server. The value false means
+     * that the registration has failed.
+     */
+    public void postRegister(Boolean registrationDone) {
+        if (!registrationDone) return;
+        Exception test=null;
+        try {
+            mbeanServer.registerMBean(log,
+                    ResultLogManager.RESULT_LOG_MANAGER_NAME);
+            final String defconf = getDefaultConfigurationFileName();
+            final String conf = System.getProperty("scandir.config.file",defconf);
+            final String confname = ScanDirConfig.guessConfigName(conf,defconf);
+            final ObjectName defaultProfileName =
+                    makeMBeanName(ScanDirConfigMXBean.class,confname);
+            if (!mbeanServer.isRegistered(defaultProfileName))
+                mbeanServer.registerMBean(new ScanDirConfig(conf),
+                        defaultProfileName);
+            config = JMX.newMXBeanProxy(mbeanServer,defaultProfileName,
+                    ScanDirConfigMXBean.class,true);
+            configmap.put(defaultProfileName,config);
+        } catch (Exception x) {
+            LOG.config("Failed to populate MBeanServer: "+x);
+            close();
+            return;
+        }
+        try {
+            config.load();
+        } catch (Exception x) {
+            LOG.finest("No config to load: "+x);
+            test = x;
+        }
+        if (test == null) {
+            try {
+                applyConfiguration(config.getConfiguration());
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST))
+                    LOG.log(Level.FINEST,"Failed to apply config: "+x,x);
+                LOG.config("Failed to apply config: "+x);
+            }
+        }
+    }
+
+    // Unregisters all created DirectoryScanners
+    private void unregisterScanners() throws JMException {
+        unregisterMBeans(scanmap);
+    }
+
+    // Unregisters all created ScanDirConfigs
+    private void unregisterConfigs() throws JMException {
+        unregisterMBeans(configmap);
+    }
+
+    // Unregisters all MBeans named by the given map
+    private void unregisterMBeans(Map<ObjectName,?> map) throws JMException {
+        for (ObjectName key : map.keySet()) {
+            if (mbeanServer.isRegistered(key))
+                mbeanServer.unregisterMBean(key);
+            map.remove(key);
+        }
+    }
+
+    // Unregisters the ResultLogManager.
+    private void unregisterResultLogManager() throws JMException {
+        final ObjectName name = ResultLogManager.RESULT_LOG_MANAGER_NAME;
+        if (mbeanServer.isRegistered(name)) {
+            mbeanServer.unregisterMBean(name);
+        }
+    }
+
+    /**
+     * Allows the MBean to perform any operations it needs before being
+     * unregistered by the MBean server.
+     * This implementation also unregisters all the MXBeans
+     * that were created by this object.
+     * @throws IllegalStateException if the lock can't be acquire, or if
+     *         the MBean's state doesn't allow the MBean to be unregistered
+     *         (e.g. because it's scheduled or running).
+     * @throws Exception This exception will be caught by the MBean server and
+     * re-thrown as an MBeanRegistrationException.
+     */
+    public void preDeregister() throws Exception {
+        try {
+            close();
+            if (!sequencer.tryAcquire())
+                throw new IllegalStateException("can't acquire lock");
+            try {
+                unregisterScanners();
+                unregisterConfigs();
+                unregisterResultLogManager();
+            } finally {
+                sequencer.release();
+            }
+        } catch (Exception x) {
+            LOG.log(Level.FINEST,"Failed to unregister: "+x,x);
+            throw x;
+        }
+    }
+
+    /**
+     * Allows the MBean to perform any operations needed after having been
+     * unregistered in the MBean server.
+     * Cancels the internal timer - if any.
+     */
+    public synchronized void postDeregister() {
+        if (timer != null) {
+            try {
+                timer.cancel();
+            } catch (Exception x) {
+                if (LOG.isLoggable(Level.FINEST))
+                    LOG.log(Level.FINEST,"Failed to cancel timer",x);
+                else if (LOG.isLoggable(Level.FINE))
+                    LOG.fine("Failed to cancel timer: "+x);
+            } finally {
+                timer = null;
+            }
+        }
+   }
+
+    // ---------------------------------------------------------------
+    // End of MBeanRegistration support
+    // ---------------------------------------------------------------
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManagerMXBean.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManagerMXBean.java
new file mode 100644
index 0000000..1f6d4ff
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/ScanManagerMXBean.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.io.IOException;
+import java.util.Map;
+import javax.management.InstanceNotFoundException;
+import javax.management.JMException;
+
+/**
+ * The <code>ScanManagerMXBean</code> is responsible for applying a
+ * configuration, starting and scheduling directory scans, and reporting
+ * application state.
+ * <p>
+ * The <code>ScanManagerMXBean</code> is a singleton MBean: there can be
+ * at most one instance of such an MBean registered in a given MBeanServer.
+ * The name of that MBean is a constant defined in
+ * {@link ScanManager#SCAN_MANAGER_NAME ScanManager.SCAN_MANAGER_NAME}.
+ * </p>
+ * <p>
+ * The <code>ScanManagerMXBean</code> is the entry point of the <i>scandir</i>
+ * application management interface. It is from this MBean that all other
+ * MBeans will be created and registered.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+public interface ScanManagerMXBean {
+    /**
+     * This state tells whether directory scans are running, scheduled,
+     * successfully completed, or stopped.
+     * <p>
+     * The {@link #CLOSED} state means
+     * that the {@link ScanManagerMXBean} was closed and is no longer usable.
+     * This state is used when the {@link ScanManagerMXBean} needs to be
+     * unregistered.
+     * </p>
+     **/
+    public enum ScanState {
+        /**
+         * Scanning of directories is in process.
+         **/
+        RUNNING,
+
+        /**
+         * Scanning of directories is not in process, but is scheduled
+         * for a later date.
+         **/
+        SCHEDULED,
+
+        /**
+         * Scanning is successfully completed.
+         **/
+        COMPLETED,
+
+        /**
+         * Scanning is stopped. No scanning is scheduled.
+         **/
+        STOPPED,
+
+        /**
+         * close() was called.
+         **/
+        CLOSED
+
+    }
+
+    /**
+     * Returns the current state of the application.
+     * @return the current state of the application.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanState getState()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Schedule a scan session for a later date.
+     * <p>
+     * A scan session is a background task that will sequentially call {@link
+     * DirectoryScannerMXBean#scan scan()} on every {@link
+     * DirectoryScannerMXBean} configured for this MBean.
+     * </p>
+     * @see #getDirectoryScanners
+     * @param delay The first scan session will be started after
+     *        the given delay. 0 means start now.
+     * @param interval Scan session will be rescheduled periodically
+     *        at the specified interval. The interval starts at the
+     *        the end of the scan session: if a scan session takes
+     *        on average x milliseconds to complete, then a scan session will
+     *        be started on average every x+interval milliseconds.
+     *        if (interval == 0) then scan session will not be
+     *        rescheduled, and will run only once.
+     * @throws IllegalStateException if a scan session is already
+     *         running or scheduled, or the MBean is closed.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void schedule(long delay, long interval)
+        throws IOException, InstanceNotFoundException;
+
+
+    /**
+     * Stops current running or scheduled scan sessions if any.
+     * <p>
+     * A scan session is a background task that will sequentially call {@link
+     * DirectoryScannerMXBean#scan scan()} on every {@link
+     * DirectoryScannerMXBean} configured for this MBean.
+     * </p>
+     * <p>
+     * Scan sessions are started/scheduled by calls to {@link #start start} or
+     * {@link #schedule schedule}.
+     * </p>
+     * After this method completes the state of the application will
+     * be {@link ScanState#STOPPED}.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void stop()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Switches the state to CLOSED.
+     * When closed, this MBean cannot be used any more.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void close()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Starts a scan session immediately.
+     * This is equivalent to {@link #schedule(long,long) schedule(0,0)}.
+     * @throws IllegalStateException if a scan session is already
+     *         running or scheduled, or the MBean is closed.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public void start()
+        throws IOException, InstanceNotFoundException;
+
+    /**
+     * Gets the list of directory scanners configured for this MBean.
+     * @return A {@code Map<String,DirectoryScannerMXBean>} where the
+     *         key in the map is the value of the <code>name=</code> key
+     *         of the {@link DirectoryScannerMXBean} ObjectName.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     **/
+    public Map<String,DirectoryScannerMXBean> getDirectoryScanners()
+        throws IOException, JMException;
+
+    /**
+     * Apply the configuration handled by the {@link
+     * #getConfigurationMBean configuration MBean}.
+     * <p>
+     * When the configuration is applied, all the {@link DirectoryScannerMXBean}
+     * created by this MBean will be unregistered, and new {@link
+     * DirectoryScannerMXBean} will be created and registered from the
+     * new {@link ScanDirConfigMXBean#getConfiguration configuration data}.
+     * </p>
+     * <p>
+     * The initial result log configuration held by the {@link
+     * #getConfigurationMBean configuration MBean} will also be pushed to the
+     * {@link ResultLogManagerMXBean}. If you don't want to lose your current
+     * {@link ResultLogManagerMXBean} configuration, you should therefore call
+     * {@link #applyCurrentResultLogConfig
+     * applyCurrentResultLogConfig} before calling
+     * {@link #applyConfiguration applyConfiguration}
+     * </p>
+     * @param fromMemory if {@code true}, the configuration will be applied
+     *        from memory. if {@code false}, the {@code ScanManagerMXBean} will
+     *        ask the {@link
+     * #getConfigurationMBean configuration MBean} to {@link
+     * ScanDirConfigMXBean#load reload its configuration} before applying
+     * it.
+     * @throws IllegalStateException if a scan session is
+     *         running or scheduled, or the MBean is closed.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     **/
+    public void applyConfiguration(boolean fromMemory)
+        throws IOException, JMException;
+    /**
+     * Replaces the {@link
+     * #getConfigurationMBean configuration MBean}'s {@link
+     * com.sun.jmx.examples.scandir.config.ScanManagerConfig#getInitialResultLogConfig
+     * initial result log configuration} with the current {@link
+     * ResultLogManagerMXBean}
+     * configuration. This prevents the <code>ResultLogManagerMXBean</code>
+     * current configuration from being reset when {@link #applyConfiguration
+     * applyConfiguration} is called.
+     * @param toMemory if {@code true} only replaces the initial result log
+     *                 configuration held in memory.
+     *                 if {@code false}, the {@link
+     * #getConfigurationMBean configuration MBean} will be asked to commit
+     * the whole configuration to the configuration file.
+     *
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     **/
+    public void applyCurrentResultLogConfig(boolean toMemory)
+        throws IOException, JMException;
+
+    /**
+     * Instruct the {@code ScanManagerMXBean} to use another {@link
+     * ScanDirConfigMXBean configuration MBean}.
+     * <p>This method doesn't {@link #applyConfiguration apply} the new
+     * configuration. If you want to apply the new configuration, you should
+     * additionally call {@link #applyConfiguration
+     * applyConfiguration(true|false)}. Note that you cannot apply a
+     * configuration as long as a scan session is scheduled or running.
+     * In that case you will need to wait for that session to complete
+     * or call {@link #stop} to stop it.
+     * </p>
+     * @param config A proxy to the {@link ScanDirConfigMXBean} that holds
+     * the new configuration for the application.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     */
+    public void setConfigurationMBean(ScanDirConfigMXBean config)
+        throws IOException, InstanceNotFoundException;
+    /**
+     * Gets the current configuration MBean.
+     * @return A proxy to the current configuration MBean.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws InstanceNotFoundException The underlying MBean is not
+     *         registered in the MBeanServer.
+     **/
+    public ScanDirConfigMXBean getConfigurationMBean()
+        throws IOException, InstanceNotFoundException;
+    /**
+     * This method creates a new alternate {@link ScanDirConfigMXBean}.
+     *
+     * <p>You will need to call {@link #setConfigurationMBean
+     * setConfigurationMBean} if you
+     * want this new {@link ScanDirConfigMXBean} to become the
+     * current configuration MBean.
+     * </p>
+     * <p>
+     * This new {@link ScanDirConfigMXBean} will be unregistered automatically
+     * by the {@code ScanManagerMXBean} when the {@code ScanManagerMXBean}
+     * is unregistered.
+     * </p>
+     * @param name The short name for the new {@link ScanDirConfigMXBean}.
+     *        This name will be used in the ObjectName <code>name=</code> key
+     *        of the new {@link ScanDirConfigMXBean}.
+     * @param filename The path of the file from which the new {@link
+     *        ScanDirConfigMXBean} can {@link ScanDirConfigMXBean#load load} or
+     *        {@link ScanDirConfigMXBean#save save} its configuration data.
+     *        Note that even if the file exists and contain a valid
+     *        configuration, you will still need to call {@link
+     *        ScanDirConfigMXBean#load load} to make the {@link
+     *        ScanDirConfigMXBean} load its configuration data.
+     * @throws IOException A connection problem occurred when accessing
+     *                     the underlying resource.
+     * @throws JMException The MBeanServer failed to call the underlying MBean.
+     * @return A proxy to the created {@link ScanDirConfigMXBean}.
+     */
+    public ScanDirConfigMXBean createOtherConfigurationMBean(String name,
+            String filename)
+        throws JMException, IOException;
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/DirectoryScannerConfig.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/DirectoryScannerConfig.java
new file mode 100644
index 0000000..b3f8e9f
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/DirectoryScannerConfig.java
@@ -0,0 +1,392 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Logger;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlList;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * The <code>DirectoryScannerConfig</code> Java Bean is used to model
+ * the configuration of a {@link
+ * com.sun.jmx.examples.scandir.DirectoryScannerMXBean}.
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="DirectoryScanner",
+        namespace=XmlConfigUtils.NAMESPACE)
+public class DirectoryScannerConfig {
+
+    //
+    // A logger for this class.
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(DirectoryScannerConfig.class.getName());
+
+    /**
+     * This enumeration is used to model the actions that a {@link
+     * com.sun.jmx.examples.scandir.DirectoryScannerMXBean
+     * DirectoryScannerMXBean} should take when a file matches its set
+     * of matching criteria.
+     **/
+    public enum Action {
+        /**
+         * Indicates that the {@code DirectoryScannerMXBean} should
+         * emit a {@code Notification} when a matching file is found.
+         */
+        NOTIFY,
+        /**
+         * Indicates that the {@code DirectoryScannerMXBean} should
+         * delete the matching files.
+         */
+        DELETE,
+        /**
+         * Indicates that the {@code DirectoryScannerMXBean} should
+         * log the actions that were taken on the matching files.
+         */
+        LOGRESULT };
+
+    // A short name for the Directory Scanner
+    // This name is used for the value of the {@code name=} key in the
+    // {@code DirectoryScannerMXBean} ObjectName.
+    private String name;
+
+    // The root directory of the Directory Scanner
+    private String rootDirectory;
+
+    // List of filters identifying files that should be selected.
+    // A file is selected if at least one filter matches.
+    //
+    private final List<FileMatch> includeFiles =
+            new ArrayList<FileMatch>();
+
+    // List of filters identifying files that should be excluded.
+    // A file is excluded if at least one filter matches.
+    //
+    private final List<FileMatch> excludeFiles =
+            new ArrayList<FileMatch>();
+
+
+    // The actions that this Directory Scanner should carry out when a
+    // file is selected. Default is NOTIFY and LOGRESULT.
+    //
+    private Action[] actions = { Action.NOTIFY, Action.LOGRESULT };
+
+    /**
+     * Creates a new instance of {@code DirectoryScannerConfig}.
+     * We keep this empty constructor to make XML binding easier.
+     * You shouldn't use this constructor directly:
+     * use {@link #DirectoryScannerConfig(String)
+     * DirectoryScannerConfig(String name)} instead.
+     * @deprecated <p>Tagged deprecated so that a compiler warning is issued.
+     *             Use {@link #DirectoryScannerConfig(String)
+     *                  DirectoryScannerConfig(String name)} instead.
+     *             </p>
+     **/
+    public DirectoryScannerConfig() {
+        this(null);
+    }
+
+    /**
+     * Creates a new instance of {@code DirectoryScannerConfig}.
+     * @param name A short name for the Directory Scanner. This name is used for
+     *        the value of the {@code name=} key in the
+     *        {@code DirectoryScannerMXBean} ObjectName.
+     **/
+    public DirectoryScannerConfig(String name) {
+        this.name = name;
+        rootDirectory = null;
+    }
+
+    /**
+     * Gets the root directory configured for that Directory Scanner.
+     * @return the root directory at which the directory scanner should start
+     *         scanning.
+     **/
+    @XmlElement(name="RootDirectory",namespace=XmlConfigUtils.NAMESPACE)
+    public String getRootDirectory() {
+        return rootDirectory;
+    }
+
+    /**
+     * Configures a root directory for that Directory Scanner.
+     * @param root The root directory at which the directory scanner should
+     *        start scanning.
+     **/
+    public void setRootDirectory(String root) {
+        rootDirectory=root;
+    }
+
+
+    /**
+     * Gets the short name of this directory scanner.
+     *
+     * <p>
+     * This name is used for the value of the {@code name=} key in the
+     * {@code DirectoryScannerMXBean} ObjectName.
+     * </p>
+     *
+     * @return the short name of this directory scanner.
+     **/
+    @XmlAttribute(name="name",required=true)
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Setter for property {@link #getName() name}.
+     * Once set its value cannot change.
+     * @param name New value of property name.
+     * @throws IllegalArgumentException if {@code name} is already set to a
+     *         different non null value.
+     */
+    public void setName(String name) {
+        if (this.name == null)
+            this.name = name;
+        else if (name == null)
+            throw new IllegalArgumentException("name=null");
+        else if (!name.equals(this.name))
+            throw new IllegalArgumentException("name="+name);
+    }
+
+    /**
+     * Getter for property includeFiles.
+     * This is an array of filters identifying files that should be selected.
+     * A file is selected if at least one filter matches.
+     * @return Value of property includeFiles.
+     */
+    @XmlElementWrapper(name="IncludeFiles",
+            namespace=XmlConfigUtils.NAMESPACE)
+    @XmlElementRef
+    public FileMatch[] getIncludeFiles() {
+        synchronized(includeFiles) {
+            return includeFiles.toArray(new FileMatch[0]);
+        }
+    }
+
+    /**
+     * Adds a filter to the includeFiles property.
+     * A file is selected if at least one filter matches.
+     * @param include A filter identifying files that should be selected.
+     */
+    public void addIncludeFiles(FileMatch include) {
+        if (include == null)
+            throw new IllegalArgumentException("null");
+        synchronized (includeFiles) {
+            includeFiles.add(include);
+        }
+    }
+
+    /**
+     * Setter for property includeFiles.
+     * @param includeFiles New value of property includeFiles.
+     *        This is an array of filters identifying files
+     *        that should be selected. A file is selected if at least
+     *        one filter matches.
+     */
+    public void setIncludeFiles(FileMatch[] includeFiles) {
+        synchronized (this.includeFiles) {
+            this.includeFiles.clear();
+            if (includeFiles == null) return;
+            this.includeFiles.addAll(Arrays.asList(includeFiles));
+        }
+    }
+
+    /**
+     * Getter for property excludeFiles.
+     * This is an array of filters identifying files that should be excluded.
+     * A file is excluded if at least one filter matches.
+     * @return Value of property excludeFiles.
+     */
+    @XmlElementWrapper(name="ExcludeFiles",
+            namespace=XmlConfigUtils.NAMESPACE)
+    @XmlElementRef
+    public FileMatch[] getExcludeFiles() {
+        synchronized(excludeFiles) {
+            return excludeFiles.toArray(new FileMatch[0]);
+        }
+    }
+
+    /**
+     * Setter for property excludeFiles.
+     * @param excludeFiles New value of property excludeFiles.
+     *        This is an array of filters identifying files
+     *        that should be excluded. A file is excluded if at least
+     *        one filter matches.
+     */
+    public void setExcludeFiles(FileMatch[] excludeFiles) {
+        synchronized (this.excludeFiles) {
+            this.excludeFiles.clear();
+            if (excludeFiles == null) return;
+            this.excludeFiles.addAll(Arrays.asList(excludeFiles));
+        }
+    }
+
+    /**
+     * Adds a filter to the excludeFiles property.
+     * A file is excluded if at least one filter matches.
+     * @param exclude A filter identifying files that should be excluded.
+     */
+    public void addExcludeFiles(FileMatch exclude) {
+        if (exclude == null)
+            throw new IllegalArgumentException("null");
+        synchronized (excludeFiles) {
+            this.excludeFiles.add(exclude);
+        }
+    }
+
+    /**
+     * Gets the list of actions that this Directory Scanner should carry
+     * out when a file is selected. Default is NOTIFY and LOGRESULT.
+
+     * @return The list of actions that this Directory Scanner should carry
+     * out when a file is selected.
+     */
+    @XmlElement(name="Actions",namespace=XmlConfigUtils.NAMESPACE)
+    @XmlList
+    public Action[] getActions() {
+       return  (actions == null)?null:actions.clone();
+    }
+
+    /**
+     * Sets the list of actions that this Directory Scanner should carry
+     * out when a file is selected. Default is NOTIFY and LOGRESULT.
+
+     * @param actions The list of actions that this Directory Scanner should
+     * carry out when a file is selected.
+     */
+    public void setActions(Action[] actions) {
+        this.actions = (actions == null)?null:actions.clone();
+    }
+
+    /**
+     * Builds a {@code FileFilter} from the {@link #getIncludeFiles
+     * includeFiles} and {@link #getExcludeFiles excludeFiles} lists.
+     * A file will be accepted if it is selected by at least one of
+     * the filters in {@link #getIncludeFiles includeFiles}, and is
+     * not excluded by any of the filters in {@link
+     * #getExcludeFiles excludeFiles}. If there's no filter in
+     * {@link #getIncludeFiles includeFiles}, then a file is accepted
+     * simply if it is not excluded by any of the filters in {@link
+     * #getExcludeFiles excludeFiles}.
+     *
+     * @return A new {@code FileFilter}  created from the current snapshot
+     *         of the {@link #getIncludeFiles
+     * includeFiles} and {@link #getExcludeFiles excludeFiles} lists.
+     *         Later modification of these lists will not affect the
+     *         returned {@code FileFilter}.
+     **/
+    public FileFilter buildFileFilter() {
+        final FileFilter[] ins = getIncludeFiles();
+        final FileFilter[] outs = getExcludeFiles();
+        final FileFilter filter = new FileFilter() {
+            public boolean accept(File f) {
+                boolean result = false;
+                // If no include filter, all files are included.
+                if (ins != null) {
+                    for (FileFilter in: ins) {
+                        // if one filter accepts it, file is included
+                        if (!in.accept(f)) continue;
+
+                        // file is accepted, include it
+                        result=true;
+                        break;
+                    }
+                } else result= true;
+                if (result == false) return false;
+
+                // The file is in the include list. Let's see if it's not
+                // in the exclude list...
+                //
+                if (outs != null) {
+                    for (FileFilter out: outs) {
+                        // if one filter accepts it, file is excluded
+                        if (!out.accept(f)) continue;
+
+                        // file is accepted, exclude it.
+                        result=false;
+                        break;
+                    }
+                }
+                return result;
+            }
+        };
+        return filter;
+    }
+
+    // Used for equality - see equals().
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            name,rootDirectory,actions,excludeFiles,includeFiles
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof DirectoryScannerConfig)) return false;
+        final DirectoryScannerConfig other = (DirectoryScannerConfig)o;
+        final Object[] thisconfig = toArray();
+        final Object[] otherconfig = other.toArray();
+        return Arrays.deepEquals(thisconfig,otherconfig);
+    }
+
+    @Override
+    public int hashCode() {
+        final String key = name;
+        if (key == null) return 0;
+        else return key.hashCode();
+    }
+
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/FileMatch.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/FileMatch.java
new file mode 100644
index 0000000..31f44ce
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/FileMatch.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.logging.Logger;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * The <code>FileMatch</code> Java Bean is used to model
+ * the configuration of a {@link FileFilter} which
+ * matches {@link File files} against a set of criteria.
+ * <p>
+ * The <code>FileMatch</code> class also implements
+ * {@link FileFilter} - applying an {@code AND} on all
+ * its conditions. {@code OR} conditions can be obtained
+ * by supplying several instances of <code>FileMatch</code>
+ * to the encapsulating {@link DirectoryScannerConfig}, which
+ * respectively applies an {@code OR} on all its
+ * {@code <FileFilter>} elements.
+ * </p>
+ *
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="FileFilter",
+        namespace=XmlConfigUtils.NAMESPACE)
+public class FileMatch implements FileFilter {
+
+    //
+    // A logger for this class.
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(FileMatch.class.getName());
+
+    /**
+     * A regular expression against which directory names should be matched.
+     */
+    private String directoryPattern;
+
+    /**
+     * A regular expression against which file names should be matched.
+     */
+    private String filePattern;
+
+    /**
+     * File whose size in bytes exceeds this limit will be selected.
+     */
+    private long sizeExceedsMaxBytes;
+
+    /**
+     * A file which will be selected only if it was last modified after
+     * this date
+     */
+    private Date lastModifiedAfter;
+
+    /**
+     * A file which will be selected only if it was last modified before
+     * this date
+     */
+    private Date lastModifiedBefore;
+
+    /**
+     * Creates a new instance of FileMatch
+     */
+    public FileMatch() {
+    }
+
+    /**
+     * Getter for property directoryPattern. This is a regular expression
+     * against which directory names should be matched.
+     * Applies only to directory, and tells whether a directory should be
+     * included or excluded from the search.
+     * <p>If File.isDirectory() && directoryPattern!=null &&
+     *    File.getName().matches(directoryPattern),
+     *    then File matches this filter.<br>
+     *    If File.isDirectory() && directoryPattern!=null &&
+     *    File.getName().matches(directoryPattern)==false,
+     *    then File doesn't match this filter.<br>
+     * </p>
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     * @return Value of property directoryPattern.
+     */
+    @XmlElement(name="DirectoryPattern",namespace=XmlConfigUtils.NAMESPACE)
+    public String getDirectoryPattern() {
+        return this.directoryPattern;
+    }
+
+    /**
+     * Setter for property directoryPattern.
+     * @param directoryPattern New value of property directoryPattern.
+     * This is a regular expression
+     * against which directory names should be {@link #getDirectoryPattern
+     * matched}.
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     */
+    public void setDirectoryPattern(String directoryPattern) {
+        this.directoryPattern = directoryPattern;
+    }
+
+    /**
+     * Getter for property filePattern. This is a regular expression
+     * against which file names should be matched.
+     * Applies only to files.
+     * <p>
+     *    If File.isDirectory()==false && filePattern!=null &&
+     *    File.getName().matches(filePattern)==false,
+     *    then File doesn't match this filter.
+     * </p>
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     * @return Value of property filePatern.
+     */
+    @XmlElement(name="FilePattern",namespace=XmlConfigUtils.NAMESPACE)
+    public String getFilePattern() {
+        return this.filePattern;
+    }
+
+    /**
+     * Setter for property filePattern.
+     * @param filePattern New value of property filePattern.
+     * This is a regular expression
+     * against which file names should be {@link #getFilePattern matched}.
+     * @see java.util.regex.Pattern
+     * @see java.lang.String#matches(java.lang.String)
+     */
+    public void setFilePattern(String filePattern) {
+        this.filePattern = filePattern;
+    }
+
+    /**
+     * Getter for property sizeExceedsMaxBytes.
+     * Ignored if 0 or negative. Otherwise, files whose size in bytes does
+     * not exceed this limit will be excluded by this filter.
+     *
+     * @return Value of property sizeExceedsMaxBytes.
+     */
+    @XmlElement(name="SizeExceedsMaxBytes",namespace=XmlConfigUtils.NAMESPACE)
+    public long getSizeExceedsMaxBytes() {
+        return this.sizeExceedsMaxBytes;
+    }
+
+    /**
+     * Setter for property sizeExceedsMaxBytes.
+     * @param sizeLimitInBytes New value of property sizeExceedsMaxBytes.
+     * Ignored if 0 or negative. Otherwise, files whose size in bytes does
+     * not exceed this limit will be excluded by this filter.
+     *
+     */
+    public void setSizeExceedsMaxBytes(long sizeLimitInBytes) {
+        this.sizeExceedsMaxBytes = sizeLimitInBytes;
+    }
+
+    /**
+     * Getter for property {@code lastModifiedAfter}.
+     * A file will be selected only if it was last modified after
+     * {@code lastModifiedAfter}.
+     * <br>This condition is ignored if {@code lastModifiedAfter} is
+     * {@code null}.
+     * @return Value of property {@code lastModifiedAfter}.
+     */
+    @XmlElement(name="LastModifiedAfter",namespace=XmlConfigUtils.NAMESPACE)
+    public Date getLastModifiedAfter() {
+        return (lastModifiedAfter==null)?null:(Date)lastModifiedAfter.clone();
+    }
+
+    /**
+     * Setter for property {@code lastModifiedAfter}.
+     * @param lastModifiedAfter  A file will be selected only if it was
+     * last modified after  {@code lastModifiedAfter}.
+     * <br>This condition is ignored if {@code lastModifiedAfter} is
+     * {@code null}.
+     */
+    public void setLastModifiedAfter(Date lastModifiedAfter) {
+        this.lastModifiedAfter =
+                (lastModifiedAfter==null)?null:(Date)lastModifiedAfter.clone();
+    }
+
+    /**
+     * Getter for property {@code lastModifiedBefore}.
+     * A file will be selected only if it was last modified before
+     * {@code lastModifiedBefore}.
+     * <br>This condition is ignored if {@code lastModifiedBefore} is
+     * {@code null}.
+     * @return Value of property {@code lastModifiedBefore}.
+     */
+    @XmlElement(name="LastModifiedBefore",namespace=XmlConfigUtils.NAMESPACE)
+    public Date getLastModifiedBefore() {
+        return (lastModifiedBefore==null)?null:(Date)lastModifiedBefore.clone();
+    }
+
+    /**
+     * Setter for property {@code lastModifiedBefore}.
+     * @param lastModifiedBefore  A file will be selected only if it was
+     * last modified before {@code lastModifiedBefore}.
+     * <br>This condition is ignored if {@code lastModifiedBefore} is
+     * {@code null}.
+     */
+    public void setLastModifiedBefore(Date lastModifiedBefore) {
+        this.lastModifiedBefore =
+             (lastModifiedBefore==null)?null:(Date)lastModifiedBefore.clone();
+    }
+
+    // Accepts or rejects a file with regards to the values of the fields
+    // configured in this bean. The accept() method is the implementation
+    // of FileFilter.accept(File);
+    //
+    /**
+     * A file is accepted when all the criteria that have been set
+     * are matched.
+     * @param f The file to match against the configured criteria.
+     * @return {@code true} if the file matches all criteria,
+     * {@code false} otherwise.
+     */
+    public boolean accept(File f) {
+
+        // Directories are accepted if they match against the directory pattern.
+        //
+        if (f.isDirectory()) {
+            if (directoryPattern != null
+                && !f.getName().matches(directoryPattern))
+                return false;
+            else return true;
+        }
+
+        // If we reach here, the f is not a directory.
+        //
+        // Files are accepted if they match all other conditions.
+
+        // Check whether f matches filePattern
+        if (filePattern != null
+                && !f.getName().matches(filePattern))
+            return false;
+
+        // Check whether f exceeeds size limit
+        if (sizeExceedsMaxBytes > 0 && f.length() <= sizeExceedsMaxBytes)
+            return false;
+
+        // Check whether f was last modified after lastModifiedAfter
+        if (lastModifiedAfter != null &&
+                lastModifiedAfter.after(new Date(f.lastModified())))
+            return false;
+
+        // Check whether f was last modified before lastModifiedBefore
+        if (lastModifiedBefore != null &&
+                lastModifiedBefore.before(new Date(f.lastModified())))
+            return false;
+
+        // All conditions were met: accept file.
+        return true;
+    }
+
+    // used by equals()
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            directoryPattern, filePattern, lastModifiedAfter,
+            lastModifiedBefore, sizeExceedsMaxBytes
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof FileMatch)) return false;
+        final FileMatch other = (FileMatch)o;
+        final Object[] thisconfig = toArray();
+        final Object[] otherconfig = other.toArray();
+        return Arrays.deepEquals(thisconfig,otherconfig);
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.deepHashCode(toArray());
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultLogConfig.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultLogConfig.java
new file mode 100644
index 0000000..5f3d668
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultLogConfig.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.util.Arrays;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * The <code>ResultLogConfig</code> Java Bean is used to model
+ * the initial configuration of the {@link
+ * com.sun.jmx.examples.scandir.ResultLogManagerMXBean}.
+ *
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="ResultLogConfig",
+        namespace=XmlConfigUtils.NAMESPACE)
+public class ResultLogConfig {
+
+    //
+    // A logger for this class.
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(ResultLogConfig.class.getName());
+
+    /**
+     * The path to the result log file. {@code null} means that logging to
+     * file is disabled.
+     */
+    private String logFileName;
+
+    /**
+     * Maximum number of record that will be logged in the log file before
+     * switching to a new log file.
+     */
+    private long logFileMaxRecords;
+
+    /**
+     * The maximum number of records that can be contained in the memory log.
+     * When this number is reached, the memory log drops its eldest record
+     * to make way for the new one.
+     */
+    private int memoryMaxRecords;
+
+    /**
+     * Creates a new instance of ResultLogConfig
+     */
+    public ResultLogConfig() {
+    }
+
+    /**
+     * Gets the path to the result log file. {@code null} means that logging to
+     * file is disabled.
+     * @return the path to the result log file.
+     */
+    @XmlElement(name="LogFileName",namespace=XmlConfigUtils.NAMESPACE)
+    public String getLogFileName() {
+        return this.logFileName;
+    }
+
+    /**
+     * Sets the path to the result log file. {@code null} means that
+     * logging to file is disabled.
+     * @param logFileName the path to the result log file.
+     */
+    public void setLogFileName(String logFileName) {
+        this.logFileName = logFileName;
+    }
+
+    /**
+     * Gets the maximum number of record that will be logged in the log file
+     * before switching to a new log file.
+     * A 0 or negative value means no limit.
+     * @return the maximum number of record that will be logged in the log file.
+     */
+    @XmlElement(name="LogFileMaxRecords",namespace=XmlConfigUtils.NAMESPACE)
+    public long getLogFileMaxRecords() {
+        return this.logFileMaxRecords;
+    }
+
+    /**
+     * Sets the maximum number of record that will be logged in the log file
+     * before switching to a new log file.
+     * A 0 or negative value means no limit.
+     * @param logFileMaxRecords the maximum number of record that will be
+     * logged in the log file.
+     */
+    public void setLogFileMaxRecords(long logFileMaxRecords) {
+        this.logFileMaxRecords = logFileMaxRecords;
+    }
+
+    /**
+     * Gets the maximum number of records that can be contained in the memory
+     * log.
+     * When this number is reached, the memory log drops its eldest record
+     * to make way for the new one.
+     * @return the maximum number of records that can be contained in the
+     * memory log.
+     */
+    @XmlElement(name="MemoryMaxRecords",namespace=XmlConfigUtils.NAMESPACE)
+    public int getMemoryMaxRecords() {
+        return this.memoryMaxRecords;
+    }
+
+    /**
+     * Sets the maximum number of records that can be contained in the memory
+     * log.
+     * When this number is reached, the memory log drops its eldest record
+     * to make way for the new one.
+     * @param memoryMaxRecords the maximum number of records that can be
+     * contained in the memory log.
+     */
+    public void setMemoryMaxRecords(int memoryMaxRecords) {
+        this.memoryMaxRecords = memoryMaxRecords;
+    }
+
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            memoryMaxRecords,logFileMaxRecords,logFileName
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof ResultLogConfig)) return false;
+        final ResultLogConfig other = (ResultLogConfig)o;
+        return Arrays.deepEquals(toArray(),other.toArray());
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.deepHashCode(toArray());
+    }
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultRecord.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultRecord.java
new file mode 100644
index 0000000..5e3188a
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ResultRecord.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.util.Date;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlList;
+import javax.xml.bind.annotation.XmlRootElement;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig.Action;
+import java.io.File;
+import java.util.Arrays;
+
+/**
+ * The <code>ResultRecord</code> Java Bean is used to write the
+ * results of a directory scan to a result log.
+ *
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+@XmlRootElement(name="ResultRecord",namespace=XmlConfigUtils.NAMESPACE)
+public class ResultRecord {
+
+    /**
+     * The name of the file for which this result record is built.
+     */
+    private String filename;
+
+    /**
+     * The Date at which this result was obtained.
+     */
+    private Date date;
+
+    /**
+     * The short name of the directory scanner which performed the operation.
+     * @see DirectoryScannerConfig#getName()
+     */
+    private String directoryScanner;
+
+    /**
+     * The list of actions that were successfully carried out.
+     */
+    private Action[] actions;
+
+    /**
+     * Creates a new empty instance of ResultRecord.
+     */
+    public ResultRecord() {
+    }
+
+    /**
+     * Creates a new instance of ResultRecord.
+     * @param scan The DirectoryScannerConfig for which this result was
+     *        obtained.
+     * @param actions The list of actions that were successfully carried out.
+     * @param f The file for which these actions were successfully carried out.
+     */
+    public ResultRecord(DirectoryScannerConfig scan, Action[] actions,
+                     File f) {
+        directoryScanner = scan.getName();
+        this.actions = actions;
+        date = new Date();
+        filename = f.getAbsolutePath();
+    }
+
+    /**
+     * Gets the name of the file for which this result record is built.
+     * @return The name of the file for which this result record is built.
+     */
+    @XmlElement(name="Filename",namespace=XmlConfigUtils.NAMESPACE)
+    public String getFilename() {
+        return this.filename;
+    }
+
+    /**
+     * Sets the name of the file for which this result record is being built.
+     * @param filename the name of the file for which this result record is
+     *        being built.
+     */
+    public void setFilename(String filename) {
+        this.filename = filename;
+    }
+
+    /**
+     * Gets the Date at which this result was obtained.
+     * @return the Date at which this result was obtained.
+     */
+    @XmlElement(name="Date",namespace=XmlConfigUtils.NAMESPACE)
+    public Date getDate() {
+        synchronized(this) {
+            return (date==null)?null:(new Date(date.getTime()));
+        }
+    }
+
+    /**
+     * Sets the Date at which this result was obtained.
+     * @param date the Date at which this result was obtained.
+     */
+    public void setDate(Date date) {
+        synchronized (this) {
+            this.date = (date==null)?null:(new Date(date.getTime()));
+        }
+    }
+
+    /**
+     * Gets the short name of the directory scanner which performed the
+     * operation.
+     * @see DirectoryScannerConfig#getName()
+     * @return the short name of the directory scanner which performed the
+     * operation.
+     */
+    @XmlElement(name="DirectoryScanner",namespace=XmlConfigUtils.NAMESPACE)
+    public String getDirectoryScanner() {
+        return this.directoryScanner;
+    }
+
+    /**
+     * Sets the short name of the directory scanner which performed the
+     * operation.
+     * @see DirectoryScannerConfig#getName()
+     * @param directoryScanner the short name of the directory scanner which
+     * performed the operation.
+     */
+    public void setDirectoryScanner(String directoryScanner) {
+        this.directoryScanner = directoryScanner;
+    }
+
+    /**
+     * Gets the list of actions that were successfully carried out.
+     * @return the list of actions that were successfully carried out.
+     */
+    @XmlElement(name="Actions",namespace=XmlConfigUtils.NAMESPACE)
+    @XmlList
+    public Action[] getActions() {
+        return (actions == null)?null:actions.clone();
+    }
+
+    /**
+     * Sets the list of actions that were successfully carried out.
+     * @param actions the list of actions that were successfully carried out.
+     */
+    public void setActions(Action[] actions) {
+        this.actions = (actions == null)?null:actions.clone();
+    }
+
+    // Used for equality
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            filename, date, directoryScanner, actions
+        };
+        return thisconfig;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ResultRecord)) return false;
+        return Arrays.deepEquals(toArray(),((ResultRecord)o).toArray());
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.deepHashCode(toArray());
+    }
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ScanManagerConfig.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ScanManagerConfig.java
new file mode 100644
index 0000000..e1afcce
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/ScanManagerConfig.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+
+/**
+ * The <code>ScanManagerConfig</code> Java Bean is used to model
+ * the configuration of the {@link
+ * com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean}.
+ *
+ * The {@link
+ * com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean} will
+ * use this configuration to initialize the {@link
+ * com.sun.jmx.examples.scandir.ResultLogManagerMXBean ResultLogManagerMXBean}
+ * and create the {@link
+ * com.sun.jmx.examples.scandir.DirectoryScannerMXBean DirectoryScannerMXBeans}
+ * <p>
+ * This class is annotated for XML binding.
+ * </p>
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ **/
+@XmlRootElement(name="ScanManager",
+        namespace="jmx:com.sun.jmx.examples.scandir.config")
+public class ScanManagerConfig {
+
+    // A logger for this class
+    //
+    // private static final Logger LOG =
+    //        Logger.getLogger(ScanManagerConfig.class.getName());
+
+    /**
+     * A set of DirectoryScannerConfig objects indexed by their names.
+     **/
+    private final Map<String, DirectoryScannerConfig> directoryScanners;
+
+    /**
+     * The initial Result Log configuration.
+     */
+    private ResultLogConfig initialResultLogConfig;
+
+    /**
+     * Holds value of property name. The name of the configuration
+     *       usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     **/
+    private String name;
+
+    /**
+     * Creates a new instance of ScanManagerConfig.
+     * <p>You should not use this constructor directly, but use
+     *    {@link #ScanManagerConfig(String)} instead.
+     * </p>
+     * <p>This constructor is tagged deprecated so that the compiler
+     *    will generate a warning if it is used by mistake.
+     * </p>
+     * @deprecated Use {@link #ScanManagerConfig(String)} instead. This
+     *             constructor is used through reflection by the XML
+     *             binding framework.
+     */
+    public ScanManagerConfig() {
+        this(null,true);
+    }
+
+    /**
+     * Creates a new instance of ScanManagerConfig.
+     * @param name The name of the configuration which usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     **/
+    public ScanManagerConfig(String name) {
+        this(name,false);
+    }
+
+    // Our private constructor...
+    private ScanManagerConfig(String name, boolean allowsNull) {
+        if (name == null && allowsNull==false)
+            throw new IllegalArgumentException("name=null");
+        this.name = name;
+        directoryScanners = new LinkedHashMap<String,DirectoryScannerConfig>();
+        this.initialResultLogConfig = new ResultLogConfig();
+        this.initialResultLogConfig.setMemoryMaxRecords(1024);
+    }
+
+    // Creates an array for deep equality.
+    private Object[] toArray() {
+        final Object[] thisconfig = {
+            name,directoryScanners,initialResultLogConfig
+        };
+        return thisconfig;
+    }
+
+    // equals
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) return true;
+        if (!(o instanceof ScanManagerConfig)) return false;
+        final ScanManagerConfig other = (ScanManagerConfig)o;
+        if (this.directoryScanners.size() != other.directoryScanners.size())
+            return false;
+        return Arrays.deepEquals(toArray(),other.toArray());
+    }
+
+    @Override
+    public int hashCode() {
+        final String key = name;
+        if (key == null) return 0;
+        else return key.hashCode();
+    }
+
+    /**
+     * Gets the name of this configuration. The name of the configuration
+     *       usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     * @return The name of this configuration.
+     */
+    @XmlAttribute(name="name",required=true)
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Sets the name of this configuration. The name of the configuration
+     *       usually corresponds to
+     *       the value of the {@code name=} key of the {@code ObjectName}
+     *       of the {@link
+     *       com.sun.jmx.examples.scandir.ScanDirConfigMXBean
+     *       ScanDirConfigMXBean} which owns this configuration.
+     *       <p>Once set this value cannot change.</p>
+     * @param name The name of this configuration.
+     */
+    public void setName(String name) {
+        if (this.name == null)
+            this.name = name;
+        else if (name == null)
+            throw new IllegalArgumentException("name=null");
+        else if (!name.equals(this.name))
+            throw new IllegalArgumentException("name="+name);
+    }
+
+   /**
+    * Gets the list of Directory Scanner configured by this
+    * configuration. From each element in this list, the
+    * {@link com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean}
+    * will create, initialize, and register a {@link
+    * com.sun.jmx.examples.scandir.DirectoryScannerMXBean}.
+    * @return The list of Directory Scanner configured by this configuration.
+    */
+    @XmlElementWrapper(name="DirectoryScannerList",
+            namespace=XmlConfigUtils.NAMESPACE)
+    @XmlElementRef
+    public DirectoryScannerConfig[] getScanList() {
+        return directoryScanners.values().toArray(new DirectoryScannerConfig[0]);
+    }
+
+   /**
+    * Sets the list of Directory Scanner configured by this
+    * configuration. From each element in this list, the
+    * {@link com.sun.jmx.examples.scandir.ScanManagerMXBean ScanManagerMXBean}
+    * will create, initialize, and register a {@link
+    * com.sun.jmx.examples.scandir.DirectoryScannerMXBean}.
+    * @param scans The list of Directory Scanner configured by this configuration.
+    */
+    public void setScanList(DirectoryScannerConfig[] scans) {
+        directoryScanners.clear();
+        for (DirectoryScannerConfig scan : scans)
+            directoryScanners.put(scan.getName(),scan);
+    }
+
+    /**
+     * Get a directory scanner by its name.
+     *
+     * @param name The name of the directory scanner. This is the
+     *             value returned by {@link
+     *             DirectoryScannerConfig#getName()}.
+     * @return The named {@code DirectoryScannerConfig}
+     */
+    public DirectoryScannerConfig getScan(String name) {
+        return directoryScanners.get(name);
+    }
+
+    /**
+     * Adds a directory scanner to the list.
+     * <p>If a directory scanner
+     * configuration by that name already exists in the list, it will
+     * be replaced by the given <var>scan</var>.
+     * </p>
+     * @param scan The {@code DirectoryScannerConfig} to add to the list.
+     * @return The replaced {@code DirectoryScannerConfig}, or {@code null}
+     *         if there was no {@code DirectoryScannerConfig} by that name
+     *         in the list.
+     */
+    public DirectoryScannerConfig putScan(DirectoryScannerConfig scan) {
+        return this.directoryScanners.put(scan.getName(),scan);
+    }
+
+    // XML value of  this object.
+    public String toString() {
+        return XmlConfigUtils.toString(this);
+    }
+
+    /**
+     * Removes the named directory scanner from the list.
+     *
+     * @param name The name of the directory scanner. This is the
+     *             value returned by {@link
+     *             DirectoryScannerConfig#getName()}.
+     * @return The removed {@code DirectoryScannerConfig}, or {@code null}
+     *         if there was no directory scanner by that name in the list.
+     */
+    public DirectoryScannerConfig removeScan(String name) {
+       return this.directoryScanners.remove(name);
+    }
+
+    /**
+     * Gets the initial Result Log Configuration.
+     * @return The initial Result Log Configuration.
+     */
+    @XmlElement(name="InitialResultLogConfig",namespace=XmlConfigUtils.NAMESPACE)
+    public ResultLogConfig getInitialResultLogConfig() {
+        return this.initialResultLogConfig;
+    }
+
+    /**
+     * Sets the initial Result Log Configuration.
+     * @param initialLogConfig The initial Result Log Configuration.
+     */
+    public void setInitialResultLogConfig(ResultLogConfig initialLogConfig) {
+        this.initialResultLogConfig = initialLogConfig;
+    }
+
+    /**
+     * Creates a copy of this object, with the specified name.
+     * @param newname the name of the copy.
+     * @return A copy of this object.
+     **/
+    public ScanManagerConfig copy(String newname) {
+        return copy(newname,this);
+    }
+
+    // Copy by XML cloning, then change the name.
+    //
+    private static ScanManagerConfig
+            copy(String newname, ScanManagerConfig other) {
+        ScanManagerConfig newbean = XmlConfigUtils.xmlClone(other);
+        newbean.name = newname;
+        return newbean;
+    }
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/XmlConfigUtils.java b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/XmlConfigUtils.java
new file mode 100644
index 0000000..a3e663d
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/XmlConfigUtils.java
@@ -0,0 +1,393 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.logging.Logger;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+/**
+ * The class XmlConfigUtils is used to deal with XML serialization
+ * and XML files.
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class XmlConfigUtils {
+
+    /**
+     * A URI for our XML configuration namespace. This doesn't start with
+     * http:// because we are not going to publish this private schema
+     * anywhere.
+     **/
+    public static final String NAMESPACE =
+            "jmx:com.sun.jmx.examples.scandir.config";
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(XmlConfigUtils.class.getName());
+
+    // Our JAXBContext.
+    private static JAXBContext context;
+
+    // The file name of the XML file in which an instance of this object
+    // will read and write XML data.
+    final String file;
+
+    /**
+     * Creates a new instance of XmlConfigUtils.
+     * @param file The file name of the XML file in which an instance of this
+     *        object will read and write XML data.
+     */
+    public XmlConfigUtils(String file) {
+        this.file = file;
+    }
+
+    /**
+     * Write the given bean to the XML file.
+     * <p>
+     * Performs an atomic write, first writing in {@code <file>.new}, then
+     * renaming {@code <file>} to {@code <file>~}, then renaming
+     * renaming {@code <file>.new} to {@code <file>}.
+     * </p>
+     * @param bean The configuration to write in the XML file.
+     * @throws IOException if write to file failed.
+     **/
+    public synchronized void writeToFile(ScanManagerConfig bean)
+        throws IOException {
+
+        // Creates a new file named <file>.new
+        final File f = newXmlTmpFile(file);
+        try {
+            final FileOutputStream out = new FileOutputStream(f);
+            boolean failed = true;
+            try {
+                // writes to <file>.new
+                write(bean,out,false);
+
+                // no exception: set failed=false for finaly {} block.
+                failed = false;
+            } finally {
+                out.close();
+                // An exception was raised: delete temporary file.
+                if (failed == true) f.delete();
+            }
+
+            // rename <file> to <file>~ and <file>.new to <file>
+            commit(file,f);
+        } catch (JAXBException x) {
+            final IOException io =
+                    new IOException("Failed to write SessionConfigBean to " +
+                    file+": "+x,x);
+            throw io;
+        }
+    }
+
+    /**
+     * Creates an XML string representation of the given bean.
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XMLbinding context.
+     * @return An XML string representation of the given bean.
+     **/
+    public static String toString(Object bean) {
+        try {
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            final Marshaller m = createMarshaller();
+            m.setProperty(m.JAXB_FRAGMENT,Boolean.TRUE);
+            m.marshal(bean, baos);
+            return baos.toString();
+        } catch (JAXBException x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException(
+                        "Failed to write SessionConfigBean: "+x,x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Creates an XML clone of the given bean.
+     * <p>
+     * In other words, this method XML-serializes the given bean, and
+     * XML-deserializes a copy of that bean.
+     * </p>
+     * @return A deep-clone of the given bean.
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XML binding context.
+     * @param bean The bean to clone.
+     */
+    public static ScanManagerConfig xmlClone(ScanManagerConfig bean) {
+        final Object clone = copy(bean);
+        return (ScanManagerConfig)clone;
+    }
+
+    /**
+     * Creates an XML clone of the given bean.
+     * <p>
+     * In other words, this method XML-serializes the given bean, and
+     * XML-deserializes a copy of that bean.
+     * </p>
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XML binding context.
+     * @return A deep-clone of the given bean.
+     **/
+    private static Object copy(Object bean) {
+        try {
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            final Marshaller m = createMarshaller();
+            m.marshal(bean, baos);
+            final ByteArrayInputStream bais =
+                    new ByteArrayInputStream(baos.toByteArray());
+            return createUnmarshaller().unmarshal(bais);
+        } catch (JAXBException x) {
+            final IllegalArgumentException iae =
+                    new IllegalArgumentException("Failed to write SessionConfigBean: "+x,x);
+            throw iae;
+        }
+    }
+
+    /**
+     * Creates an XML clone of the given bean.
+     * <p>
+     * In other words, this method XML-serializes the given bean, and
+     * XML-deserializes a copy of that bean.
+     * </p>
+     * @return A deep-clone of the given bean.
+     * @throws IllegalArgumentException if the bean class is not known by the
+     *         underlying XML binding context.
+     * @param bean The bean to clone.
+     */
+    public static DirectoryScannerConfig xmlClone(DirectoryScannerConfig bean) {
+        final Object clone = copy(bean);
+        return (DirectoryScannerConfig)clone;
+    }
+
+    /**
+     * Reads the configuration from the XML configuration file.
+     * @throws IOException if it fails to read the configuration.
+     * @return A {@code ScanManagerConfig} bean read from the
+     *         XML configuration file.
+     **/
+    public synchronized ScanManagerConfig readFromFile() throws IOException {
+        final File f = new File(file);
+        if (!f.exists())
+            throw new IOException("No such file: "+file);
+        if (!f.canRead())
+            throw new IOException("Can't read file: "+file);
+        try {
+            return read(f);
+        } catch (JAXBException x) {
+            final IOException io =
+                    new IOException("Failed to read SessionConfigBean from " +
+                    file+": "+x,x);
+            throw io;
+        }
+    }
+
+    /**
+     * Reads the configuration from the given XML configuration file.
+     * @param f the file to read from.
+     * @return A {@code ScanManagerConfig} bean read from the
+     *         XML configuration file.
+     * @throws javax.xml.bind.JAXBException if it fails to read the configuration.
+     */
+    public static ScanManagerConfig read(File f)
+        throws JAXBException {
+        final Unmarshaller u = createUnmarshaller();
+        return (ScanManagerConfig) u.unmarshal(f);
+
+    }
+
+    /**
+     * Writes the given bean to the given output stream.
+     * @param bean the bean to write.
+     * @param os the output stream to write to.
+     * @param fragment whether the {@code <?xml ... ?>} header should be
+     *        included. The header is not included if the bean is just an
+     *        XML fragment encapsulated in a higher level XML element.
+     * @throws JAXBException An XML Binding exception occurred.
+     **/
+    public static void write(ScanManagerConfig bean, OutputStream os,
+            boolean fragment)
+        throws JAXBException {
+        writeXml((Object)bean,os,fragment);
+    }
+
+    /**
+     * Writes the given bean to the given output stream.
+     * @param bean the bean to write.
+     * @param os the output stream to write to.
+     * @param fragment whether the {@code <?xml ... ?>} header should be
+     *        included. The header is not included if the bean is just an
+     *        XML fragment encapsulated in a higher level XML element.
+     * @throws JAXBException An XML Binding exception occurred.
+     **/
+    public static void write(ResultRecord bean, OutputStream os, boolean fragment)
+        throws JAXBException {
+        writeXml((Object)bean,os,fragment);
+    }
+
+    /**
+     * Writes the given bean to the given output stream.
+     * @param bean the bean to write.
+     * @param os the output stream to write to.
+     * @param fragment whether the {@code <?xml ... ?>} header should be
+     *        included. The header is not included if the bean is just an
+     *        XML fragment encapsulated in a higher level XML element.
+     * @throws JAXBException An XML Binding exception occurred.
+     **/
+    private static void writeXml(Object bean, OutputStream os, boolean fragment)
+        throws JAXBException {
+        final Marshaller m = createMarshaller();
+        if (fragment) m.setProperty(m.JAXB_FRAGMENT,Boolean.TRUE);
+        m.marshal(bean,os);
+    }
+
+    // Creates a JAXB Unmarshaller.
+    private static Unmarshaller createUnmarshaller() throws JAXBException {
+        return getContext().createUnmarshaller();
+    }
+
+    // Creates a JAXB Marshaller - for nicely XML formatted output.
+    private static Marshaller createMarshaller() throws JAXBException {
+        final  Marshaller m = getContext().createMarshaller();
+        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
+        return m;
+    }
+
+    // Creates a JAXBContext if needed, and returns it.
+    // The JAXBContext instance we create will be able to handle the
+    // ScanManagerConfig and ResultRecord classes, plus all the property
+    // classes they reference (DirectoryScannerBean etc...).
+    //
+    private static synchronized JAXBContext getContext() throws JAXBException {
+        if (context == null)
+            context = JAXBContext.newInstance(ScanManagerConfig.class,
+                                              ResultRecord.class);
+        return context;
+    }
+
+
+    // Creates a new XML temporary file called <basename>.new
+    // This method is used to implement atomic writing to file.
+    // The usual sequence is:
+    //
+    // Final tmp = newXmlTmpFile(basename);
+    // boolean failed = true;
+    // try {
+    //      ... write to 'tmp' ...
+    //      // no exception: set failed=false for finaly {} block.
+    //      failed = false;
+    // } finally
+    //      // failed==true means there was an exception and
+    //      // commit won't be called...
+    //      if (failed==true) tmp.delete();
+    // }
+    // commit(tmp,basename)
+    //
+    private static File newXmlTmpFile(String basename) throws IOException {
+        final File f = new File(basename+".new");
+        if (!f.createNewFile())
+            throw new IOException("file "+f.getName()+" already exists");
+
+        try {
+            final OutputStream newStream = new FileOutputStream(f);
+            try {
+                final String decl =
+                    "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
+                newStream.write(decl.getBytes("UTF-8"));
+                newStream.flush();
+            } finally {
+                newStream.close();
+            }
+        } catch (IOException x) {
+            f.delete();
+            throw x;
+        }
+        return f;
+    }
+
+    // Commit the temporary file by renaming <basename> to <baesname>~
+    // and tmpFile to <basename>.
+    private static File commit(String basename, File tmpFile)
+        throws IOException {
+        try {
+            final String backupName = basename+"~";
+            final File desired = new File(basename);
+            final File backup = new File(backupName);
+            backup.delete();
+            if (desired.exists()) {
+                if (!desired.renameTo(new File(backupName)))
+                    throw new IOException("can't rename to "+backupName);
+            }
+            if (!tmpFile.renameTo(new File(basename)))
+                throw new IOException("can't rename to "+basename);
+        } catch (IOException x) {
+            tmpFile.delete();
+            throw x;
+        }
+        return new File(basename);
+    }
+
+    /**
+     * Creates a new committed XML file for {@code <basename>}, containing only
+     * the {@code <?xml ...?>} header.
+     * <p>This method will rename {@code <basename>} to {@code <basename>~},
+     * if it exists.
+     * </p>
+     * @return A newly created XML file containing the regular
+     *         {@code <?xml ...?>} header.
+     * @param basename The name of the new file.
+     * @throws IOException if the new XML file couldn't be created.
+     */
+    public static File createNewXmlFile(String basename) throws IOException {
+        return commit(basename,newXmlTmpFile(basename));
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/package.html b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/package.html
new file mode 100644
index 0000000..5390c29
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/config/package.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+    <title>com.sun.jmx.examples.scandir.config</title>
+  </head>
+  <body>
+  <p>
+     This package defines plain Java Beans, annotated for
+     XML bindings, and used to store and model the scandir 
+     application configuration.
+  </p>
+  <p>All the Java Beans defined in this package have been 
+     designed to be <i>naturally serialized</i> by JAXB.
+     Their bean properties were designed to minimize
+     the number of XML annotation required, as well as 
+     making them transparently convertible by the 
+     JMX MXBean framework.
+  </p>
+  <p>The {@link com.sun.jmx.examples.scandir.config.ScanManagerConfig} 
+     bean corresponds to the root element of the application's configuration.
+     From an instance of this element, the 
+     {@link com.sun.jmx.examples.scandir.ScanManagerMXBean} will be
+     able to initialize the 
+     {@link com.sun.jmx.examples.scandir.ResultLogManagerMXBean} and will
+     create, register and initialize 
+     {@link com.sun.jmx.examples.scandir.DirectoryScannerMXBean DirectoryScannerMXBeans}
+  </p>
+  <p>The {@link com.sun.jmx.examples.scandir.config.XmlConfigUtils} class is a simple utility
+     classes used to deal with XML and XML configuration files.
+  </p>
+  <p>The {@link com.sun.jmx.examples.scandir.config.ResultRecord ResultRecords} 
+     are used to store the results of directory scans in the result logs
+     managed by the {@link com.sun.jmx.examples.scandir.ResultLogManagerMXBean}
+  </p>
+  </body>
+</html>
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/package.html b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/package.html
new file mode 100644
index 0000000..54d3172
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/com/sun/jmx/examples/scandir/package.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+  <head>
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+    <title>com.sun.jmx.examples.scandir</title>
+  </head>
+  <body>
+  <p>
+  This package defines the set of MBeans which compose the
+  management interface of the scandir application.
+  </p>
+  
+  </body>
+</html>
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/etc/access.properties b/linux-x86/sample/jmx/jmx-scandir/src/etc/access.properties
new file mode 100644
index 0000000..c8286ed
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/etc/access.properties
@@ -0,0 +1,51 @@
+######################################################################
+#     Default Access Control File for Remote JMX(TM) Monitoring
+######################################################################
+#
+# Access control file for Remote JMX API access to monitoring.
+# This file defines the allowed access for different roles.  The
+# password file (jmxremote.password by default) defines the roles and their
+# passwords.  To be functional, a role must have an entry in
+# both the password and the access files.
+#
+# Default location of this file is $JRE/lib/management/jmxremote.access
+# You can specify an alternate location by specifying a property in 
+# the management config file $JRE/lib/management/management.properties
+# (See that file for details)
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format.  The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# Typical access file has multiple  lines, where each line is blank,
+# a comment (like this one), or an access control entry.
+#
+# An access control entry consists of a role name, and an
+# associated access level.  The role name is any string that does not
+# itself contain spaces or tabs.  It corresponds to an entry in the
+# password file (jmxremote.password).  The access level is one of the
+# following:
+#       "readonly" grants access to read attributes of MBeans.
+#                   For monitoring, this means that a remote client in this
+#                   role can read measurements but cannot perform any action
+#                   that changes the environment of the running program.
+#       "readwrite" grants access to read and write attributes of MBeans,
+#                   to invoke operations on them, and to create or remove them.
+#		    This access should be granted to only trusted clients, 
+#                   since they can potentially interfere with the smooth
+#		    operation of a running program 
+#
+# A given role should have at most one entry in this file.  If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last
+# access entry is used.
+#
+#
+# Default access control entries:
+# o The "monitorRole" role has readonly access.  
+# o The "controlRole" role has readwrite access.
+#
+# monitorRole   readonly
+# controlRole   readwrite
+
+guest   readonly
+admin   readwrite
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/etc/management.properties b/linux-x86/sample/jmx/jmx-scandir/src/etc/management.properties
new file mode 100644
index 0000000..5035139
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/etc/management.properties
@@ -0,0 +1,273 @@
+#####################################################################
+#	Default Configuration File for Java Platform Management
+#####################################################################
+#
+# The Management Configuration file (in java.util.Properties format)
+# will be read if one of the following system properties is set:
+#    -Dcom.sun.management.jmxremote.port=<port-number>
+# or -Dcom.sun.management.snmp.port=<port-number> 
+# or -Dcom.sun.management.config.file=<this-file>
+#
+# The default Management Configuration file is:
+#
+#       $JRE/lib/management/management.properties
+#
+# Another location for the Management Configuration File can be specified
+# by the following property on the Java command line:
+#
+#    -Dcom.sun.management.config.file=<this-file>
+# 
+# If -Dcom.sun.management.config.file=<this-file> is set, the port
+# number for the management agent can be specified in the config file 
+# using the following lines:
+# 
+# ################ Management Agent Port #########################
+# 
+# For setting the JMX RMI agent port use the following line
+com.sun.management.jmxremote.port=4545
+#
+# For setting the SNMP agent port use the following line
+# com.sun.management.snmp.port=<port-number>
+
+#####################################################################
+#                   Optional Instrumentation
+#####################################################################
+#
+# By default only the basic instrumentation with low overhead is on.
+# The following properties allow to selectively turn on optional
+# instrumentation which are off by default and may have some
+# additional overhead.
+#
+# com.sun.management.enableThreadContentionMonitoring
+#
+#      This option enables thread contention monitoring if the
+#      Java virtual machine supports such instrumentation.
+#      Refer to the specification for the java.lang.management.ThreadMBean
+#      interface - see isThreadContentionMonitoringSupported() method.
+#
+ 
+# To enable thread contention monitoring, uncomment the following line
+# com.sun.management.enableThreadContentionMonitoring
+
+#####################################################################
+#			SNMP Management Properties
+#####################################################################
+#
+# If the system property -Dcom.sun.management.snmp.port=<port-number> 
+# is set then
+#	- The SNMP agent (with the Java virtual machine MIB) is started 
+#	  that listens on the specified port for incoming SNMP requests.
+#	- the following properties for read for SNMP management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to the above system property (e.g. via setProperty method), this
+# config file, or the ACL file has no effect to the running SNMP agent.
+#
+
+#
+# ##################### SNMP Trap Port #########################
+#
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+#      Specifies the remote port number at which managers are expected
+#      to listen for trap. For each host defined in the ACL file,
+#      the SNMP agent will send traps at <host>:<trap-destination-port-number>
+#      Default for this property is 162.
+#
+
+# To set port for sending traps to a different port use the following line
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+
+#
+# ################ SNMP listen interface #########################
+#
+# com.sun.management.snmp.interface=<InetAddress>
+#      Specifies the local interface on which the SNMP agent will bind.
+#      This is usefull when running on machines which have several
+#      interfaces defined. It makes it possible to listen to a specific
+#      subnet accessible through that interface.
+#      Default for this property is "localhost".
+#
+#      The format of the value for that property is any string accepted
+#      by java.net.InetAddress.getByName(String).
+# 
+
+# For restricting the port on which SNMP agent listens use the following line
+# com.sun.management.snmp.interface=<InetAddress>
+
+#
+# #################### SNMP ACL file #########################
+#
+# com.sun.management.snmp.acl=true|false
+#      Default for this property is true. (Case for true/false ignored)
+#      If this property is specified as false then the ACL file
+#      is not checked:  all manager hosts are allowed all access.
+#
+
+# For SNMP without checking ACL file uncomment the following line
+# com.sun.management.snmp.acl=false
+
+#
+# com.sun.management.snmp.acl.file=filepath
+#      Specifies location for ACL file
+#      This is optional - default location is
+#      $JRE/lib/management/snmp.acl
+# 
+#      If the property "com.sun.management.snmp.acl" is set to false,
+#      then this property and the ACL file are ignored.
+#      Otherwise the ACL file must exist and be in the valid format.
+#      If the ACL file is empty or non existent then no access is allowed.
+# 
+#      The SNMP agent will read the ACL file at startup time. 
+#      Modification to the ACL file has no effect to any running SNMP 
+#      agents which read that ACL file at startup.
+#
+
+# For a non-default acl file location use the following line
+# com.sun.management.snmp.acl.file=filepath
+
+#####################################################################
+#			RMI Management Properties
+#####################################################################
+#
+# If system property -Dcom.sun.management.jmxremote.port=<port-number>
+# is set then
+#     - A MBean server is started 
+#     - JRE Platform MBeans are registered in the MBean server
+#     - RMI connector is published  in a private readonly registry at
+#       specified port using a well known name, "jmxrmi"
+#     - the following properties are read for JMX remote management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to above system property (e.g. via setProperty method),
+# this config file, the password file, or the access file have no effect to the
+# running MBean server, the connector, or the registry. 
+#
+
+#
+# ###################### RMI SSL #############################
+#
+# com.sun.management.jmxremote.ssl=true|false
+#      Default for this property is true. (Case for true/false ignored)
+#      If this property is specified as false then SSL is not used.
+# 
+
+# For RMI monitoring without SSL use the following line
+# com.sun.management.jmxremote.ssl=false
+
+# com.sun.management.jmxremote.ssl.enabled.cipher.suites=<cipher-suites>
+#      The value of this property is a string that is a comma-separated list
+#      of SSL/TLS cipher suites to enable. This property can be specified in
+#      conjunction with the previous property "com.sun.management.jmxremote.ssl"
+#      in order to control which particular SSL/TLS cipher suites are enabled
+#      for use by accepted connections. If this property is not specified then
+#      the SSL/TLS RMI Server Socket Factory uses the SSL/TLS cipher suites that
+#      are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.enabled.protocols=<protocol-versions>
+#      The value of this property is a string that is a comma-separated list
+#      of SSL/TLS protocol versions to enable. This property can be specified in
+#      conjunction with the previous property "com.sun.management.jmxremote.ssl"
+#      in order to control which particular SSL/TLS protocol versions are
+#      enabled for use by accepted connections. If this property is not
+#      specified then the SSL/TLS RMI Server Socket Factory uses the SSL/TLS
+#      protocol versions that are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.need.client.auth=true|false
+#      Default for this property is false. (Case for true/false ignored)
+#      If this property is specified as true in conjunction with the previous
+#      property "com.sun.management.jmxremote.ssl" then the SSL/TLS RMI Server
+#      Socket Factory will require client authentication.
+#
+
+# For RMI monitoring with SSL client authentication use the following line
+com.sun.management.jmxremote.ssl.need.client.auth=true
+
+# com.sun.management.jmxremote.registry.ssl=true|false
+#      Default for this property is false. (Case for true/false ignored)
+#      If this property is specified as true then the RMI registry used
+#      to bind the RMIServer remote object is protected with SSL/TLS
+#      RMI Socket Factories that can be configured with the properties:
+#          com.sun.management.jmxremote.ssl.enabled.cipher.suites
+#          com.sun.management.jmxremote.ssl.enabled.protocols
+#          com.sun.management.jmxremote.ssl.need.client.auth
+#      If the two properties below are true at the same time, i.e.
+#          com.sun.management.jmxremote.ssl=true
+#          com.sun.management.jmxremote.registry.ssl=true
+#      then the RMIServer remote object and the RMI registry are
+#      both exported with the same SSL/TLS RMI Socket Factories.
+#
+
+# For using an SSL/TLS protected RMI registry use the following line
+com.sun.management.jmxremote.registry.ssl=true
+
+#
+# ################ RMI User authentication ################
+#
+# com.sun.management.jmxremote.authenticate=true|false
+#      Default for this property is true. (Case for true/false ignored)
+#      If this property is specified as false then no authentication is
+#      performed and all users are allowed all access.
+#
+
+# For RMI monitoring without any checking use the following line
+# com.sun.management.jmxremote.authenticate=false
+
+#
+# ################ RMI Login configuration ###################
+#
+# com.sun.management.jmxremote.login.config=<config-name>
+#      Specifies the name of a JAAS login configuration entry to use when 
+#      authenticating users of RMI monitoring. 
+#
+#      Setting this property is optional - the default login configuration
+#      specifies a file-based authentication that uses the password file.
+#
+#      When using this property to override the default login configuration 
+#      then the named configuration entry must be in a file that gets loaded 
+#      by JAAS. In addition, the login module(s) specified in the configuration
+#      should use the name and/or password callbacks to acquire the user's 
+#      credentials. See the NameCallback and PasswordCallback classes in the 
+#      javax.security.auth.callback package for more details.
+#
+#      If the property "com.sun.management.jmxremote.authenticate" is set to 
+#      false, then this property and the password & access files are ignored.
+#
+
+# For a non-default login configuration use the following line
+# com.sun.management.jmxremote.login.config=<config-name>
+
+#
+# ################ RMI Password file location ##################
+#
+# com.sun.management.jmxremote.password.file=filepath
+#      Specifies location for password file
+#      This is optional - default location is
+#      $JRE/lib/management/jmxremote.password
+# 
+#      If the property "com.sun.management.jmxremote.authenticate" is set to 
+#      false, then this property and the password & access files are ignored.
+#      Otherwise the password file must exist and be in the valid format.
+#      If the password file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+com.sun.management.jmxremote.password.file=src/etc/password.properties
+
+#
+# ################ RMI Access file location #####################
+#
+# com.sun.management.jmxremote.access.file=filepath
+#      Specifies location for access  file
+#      This is optional - default location is
+#      $JRE/lib/management/jmxremote.access
+# 
+#      If the property "com.sun.management.jmxremote.authenticate" is set to 
+#      false, then this property and the password & access files are ignored.
+#      Otherwise, the access file must exist and be in the valid format.
+#      If the access file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+com.sun.management.jmxremote.access.file=src/etc/access.properties
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/etc/password.properties b/linux-x86/sample/jmx/jmx-scandir/src/etc/password.properties
new file mode 100644
index 0000000..d90c8c8
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/etc/password.properties
@@ -0,0 +1,55 @@
+##############################################################
+#        Password File for Remote JMX Monitoring
+##############################################################
+#
+# Password file for Remote JMX API access to monitoring.  This
+# file defines the different roles and their passwords.  The access
+# control file (jmxremote.access by default) defines the allowed
+# access for each role.  To be functional, a role must have an entry
+# in both the password and the access files.
+#
+# Default location of this file is $JRE/lib/management/jmxremote.password
+# You can specify an alternate location by specifying a property in 
+# the management config file $JRE/lib/management/management.properties
+# or by specifying a system property (See that file for details).
+
+
+##############################################################
+#    File permissions of the jmxremote.password file
+##############################################################
+#      Since there are cleartext passwords stored in this file,
+#      this file must be readable by ONLY the owner,
+#      otherwise the program will exit with an error. 
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format.  The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# Typical password file has multiple  lines, where each line is blank,
+# a comment (like this one), or a password entry.
+#
+#
+# A password entry consists of a role name and an associated
+# password.  The role name is any string that does not itself contain
+# spaces or tabs.  The password is again any string that does not
+# contain spaces or tabs.  Note that passwords appear in the clear in
+# this file, so it is a good idea not to use valuable passwords.
+#
+# A given role should have at most one entry in this file.  If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last one
+# is used.
+#
+# In a typical installation, this file can be read by anybody on the
+# local machine, and possibly by people on other machines.
+# For # security, you should either restrict the access to this file,
+# or specify another, less accessible file in the management config file
+# as described above.
+#
+# Following are two commented-out entries.  The "measureRole" role has
+# password "QED".  The "controlRole" role has password "R&D".
+#
+# monitorRole  QED
+# controlRole   R&D
+
+guest  guestpasswd
+admin  adminpasswd
diff --git a/linux-x86/sample/jmx/jmx-scandir/src/etc/testconfig.xml b/linux-x86/sample/jmx/jmx-scandir/src/etc/testconfig.xml
new file mode 100644
index 0000000..cf0fece
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/src/etc/testconfig.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<ScanManager xmlns="jmx:com.sun.jmx.examples.scandir.config" name="testconfig">
+    <InitialResultLogConfig>
+        <LogFileMaxRecords>2048</LogFileMaxRecords>
+        <LogFileName>build/scandir.log</LogFileName>
+        <MemoryMaxRecords>128</MemoryMaxRecords>
+    </InitialResultLogConfig>
+    <DirectoryScannerList>
+        <DirectoryScanner name="scan-build">
+            <Actions>NOTIFY LOGRESULT</Actions>
+            <ExcludeFiles/>
+            <IncludeFiles>
+                <FileFilter>
+                    <FilePattern>.*\.class</FilePattern>
+                    <SizeExceedsMaxBytes>4096</SizeExceedsMaxBytes>
+                </FileFilter>
+            </IncludeFiles>
+            <RootDirectory>build</RootDirectory>
+        </DirectoryScanner>
+    </DirectoryScannerList>
+</ScanManager>
diff --git a/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/DirectoryScannerTest.java b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/DirectoryScannerTest.java
new file mode 100644
index 0000000..06d1559
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/DirectoryScannerTest.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ResultRecord;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.util.LinkedList;
+import java.util.concurrent.BlockingQueue;
+import junit.framework.*;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import com.sun.jmx.examples.scandir.ScanManagerTest.Call;
+import java.util.EnumSet;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import javax.management.AttributeChangeNotification;
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+
+import static com.sun.jmx.examples.scandir.ScanManagerTest.*;
+import static com.sun.jmx.examples.scandir.TestUtils.*;
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+/**
+ * Unit tests for {@code DirectoryScanner}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class DirectoryScannerTest extends TestCase {
+
+    public DirectoryScannerTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(DirectoryScannerTest.class);
+
+        return suite;
+    }
+
+    private void doTestOperation(
+            DirectoryScannerMXBean proxy,
+            Call op,
+            EnumSet<ScanState> after,
+            String testName)
+        throws Exception {
+        System.out.println("doTestOperation: "+testName);
+
+        final LinkedBlockingQueue<Notification> queue =
+                new LinkedBlockingQueue<Notification>();
+
+        NotificationListener listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                        Object handback) {
+                try {
+                    queue.put(notification);
+                } catch (Exception x) {
+                    System.err.println("Failed to queue notif: "+x);
+                }
+            }
+        };
+        NotificationFilter filter = null;
+        Object handback = null;
+        final ScanState before;
+        final NotificationEmitter emitter = (NotificationEmitter)
+                makeNotificationEmitter(proxy,DirectoryScannerMXBean.class);
+        emitter.addNotificationListener(listener, filter, handback);
+        before = proxy.getState();
+        op.call();
+        try {
+            final Notification notification =
+                    queue.poll(3000,TimeUnit.MILLISECONDS);
+            assertEquals(AttributeChangeNotification.ATTRIBUTE_CHANGE,
+                    notification.getType());
+            assertEquals(AttributeChangeNotification.class,
+                    notification.getClass());
+            assertEquals(getObjectName(proxy),
+                    notification.getSource());
+            AttributeChangeNotification acn =
+                    (AttributeChangeNotification)notification;
+            assertEquals("State",acn.getAttributeName());
+            assertEquals(ScanState.class.getName(),acn.getAttributeType());
+            assertEquals(before,ScanState.valueOf((String)acn.getOldValue()));
+            assertContained(after,ScanState.valueOf((String)acn.getNewValue()));
+            emitter.removeNotificationListener(listener,filter,handback);
+        } finally {
+            try {
+                op.cancel();
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+
+    /**
+     * Test of getRootDirectory method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testGetRootDirectory() throws Exception {
+        System.out.println("getRootDirectory");
+
+       final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            final String tmpdir = System.getProperty("java.io.tmpdir");
+            final ScanDirConfigMXBean config = manager.getConfigurationMBean();
+            System.err.println("Configuration MXBean is: " + config);
+            final DirectoryScannerConfig bean =
+                    config.addDirectoryScanner("test",tmpdir,".*",0,0);
+            final String root = bean.getRootDirectory();
+            if (root == null)
+                throw new NullPointerException("bean.getRootDirectory()");
+            if (config.getConfiguration().getScan("test").getRootDirectory() == null)
+                throw new NullPointerException("config.getConfig().getScan(\"test\").getRootDirectory()");
+            manager.applyConfiguration(true);
+            final DirectoryScannerMXBean proxy =
+                    manager.getDirectoryScanners().get("test");
+            final File tmpFile =  new File(tmpdir);
+            final File rootFile = new File(proxy.getRootDirectory());
+            assertEquals(tmpFile,rootFile);
+        } catch (Exception x) {
+            x.printStackTrace();
+            throw x;
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+
+    /**
+     * Test of scan method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testScan() throws Exception {
+        System.out.println("scan");
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            final String tmpdir = System.getProperty("java.io.tmpdir");
+            final ScanDirConfigMXBean config = manager.getConfigurationMBean();
+            final DirectoryScannerConfig bean =
+                    config.addDirectoryScanner("test1",tmpdir,".*",0,0);
+            config.addDirectoryScanner("test2",tmpdir,".*",0,0);
+            config.addDirectoryScanner("test3",tmpdir,".*",0,0);
+            manager.applyConfiguration(true);
+            final DirectoryScannerMXBean proxy =
+                    manager.getDirectoryScanners().get("test1");
+            final Call op = new Call() {
+                public void call() throws Exception {
+                    final BlockingQueue<Notification> queue =
+                            new LinkedBlockingQueue<Notification>();
+                    final NotificationListener listener = new NotificationListener() {
+                        public void handleNotification(Notification notification,
+                                Object handback) {
+                            try {
+                               queue.put(notification);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    };
+                    manager.start();
+                    while(true) {
+                        final Notification n = queue.poll(10,TimeUnit.SECONDS);
+                        if (n == null) break;
+                        final AttributeChangeNotification at =
+                                (AttributeChangeNotification) n;
+                        if (RUNNING == ScanState.valueOf((String)at.getNewValue()))
+                            break;
+                        else {
+                            System.err.println("New state: "+(String)at.getNewValue()
+                            +" isn't "+RUNNING);
+                        }
+                    }
+                    assertContained(EnumSet.of(SCHEDULED,RUNNING,COMPLETED),
+                            proxy.getState());
+                }
+                public void cancel() throws Exception {
+                    manager.stop();
+                }
+            };
+            doTestOperation(proxy,op,
+                    EnumSet.of(RUNNING,SCHEDULED,COMPLETED),
+                    "scan");
+        } catch (Exception x) {
+            x.printStackTrace();
+            throw x;
+        } finally {
+            try {
+                manager.stop();
+            } catch (Exception x) {
+                System.err.println("Failed to stop: "+x);
+            }
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of getState method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testGetState() {
+        System.out.println("getState");
+
+        final DirectoryScannerConfig bean =
+                new DirectoryScannerConfig("test");
+        bean.setRootDirectory(System.getProperty("java.io.tmpdir"));
+        final ResultLogManager log = new ResultLogManager();
+        DirectoryScanner instance =
+                new DirectoryScanner(bean,log);
+
+        ScanState expResult = STOPPED;
+        ScanState result = instance.getState();
+        assertEquals(STOPPED, result);
+        instance.scan();
+        result = instance.getState();
+        assertEquals(COMPLETED, result);
+    }
+
+    /**
+     * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.DirectoryScanner.
+     */
+    public void testAddNotificationListener() throws Exception {
+        System.out.println("addNotificationListener");
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        final Call op = new Call() {
+            public void call() throws Exception {
+                manager.start();
+            }
+            public void cancel() throws Exception {
+                manager.stop();
+            }
+        };
+        try {
+            final String tmpdir = System.getProperty("java.io.tmpdir");
+            final ScanDirConfigMXBean config = manager.getConfigurationMBean();
+            final DirectoryScannerConfig bean =
+                    config.addDirectoryScanner("test1",tmpdir,".*",0,0);
+            manager.applyConfiguration(true);
+            final DirectoryScannerMXBean proxy =
+                    manager.getDirectoryScanners().get("test1");
+           doTestOperation(proxy,op,
+                            EnumSet.of(RUNNING,SCHEDULED),
+                            "scan");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanDirConfigTest.java b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanDirConfigTest.java
new file mode 100644
index 0000000..c7e9599
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanDirConfigTest.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import com.sun.jmx.examples.scandir.config.XmlConfigUtils;
+import com.sun.jmx.examples.scandir.config.FileMatch;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import junit.framework.*;
+import com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
+import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
+import java.io.File;
+import java.util.concurrent.BlockingQueue;
+import javax.management.*;
+
+/**
+ * Unit tests for {@code ScanDirConfig}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanDirConfigTest extends TestCase {
+
+    public ScanDirConfigTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(ScanDirConfigTest.class);
+
+        return suite;
+    }
+
+    /**
+     * Test of load method, of class com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testLoad() throws Exception {
+        System.out.println("load");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+        final ScanManagerConfig bean =
+                new  ScanManagerConfig("testLoad");
+        final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+        dir.setRootDirectory(file.getParent());
+        bean.putScan(dir);
+        XmlConfigUtils.write(bean,new FileOutputStream(file),false);
+        instance.load();
+
+        assertEquals(bean,instance.getConfiguration());
+        bean.removeScan(dir.getName());
+        XmlConfigUtils.write(bean,new FileOutputStream(file),false);
+
+        assertNotSame(bean,instance.getConfiguration());
+
+        instance.load();
+
+        assertEquals(bean,instance.getConfiguration());
+
+    }
+
+    /**
+     * Test of save method, of class com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testSave() throws Exception {
+        System.out.println("save");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ScanManagerMXBean manager = ScanManager.register(mbs);
+
+        try {
+            final ScanDirConfigMXBean instance =
+                    manager.createOtherConfigurationMBean("testSave",file.getAbsolutePath());
+            assertTrue(mbs.isRegistered(
+                    ScanManager.makeScanDirConfigName("testSave")));
+            final ScanManagerConfig bean =
+                new  ScanManagerConfig("testSave");
+            final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+            dir.setRootDirectory(file.getParent());
+            bean.putScan(dir);
+            instance.setConfiguration(bean);
+            instance.save();
+            final ScanManagerConfig loaded =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded);
+            assertEquals(bean,loaded);
+
+            instance.getConfiguration().removeScan("tmp");
+            instance.save();
+            assertNotSame(loaded,instance.getConfiguration());
+            final ScanManagerConfig loaded2 =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded2);
+        } finally {
+            manager.close();
+            mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+        }
+        final ObjectName all =
+                new ObjectName(ScanManager.SCAN_MANAGER_NAME.getDomain()+":*");
+        assertEquals(0,mbs.queryNames(all,null).size());
+    }
+
+    /**
+     * Test of saveTo method, of class com.sun.jmx.examples.scandir.ScanProfile.
+     */
+    /*
+    public void testSaveTo() throws Exception {
+        System.out.println("saveTo");
+
+        String filename = "";
+        ScanDirConfig instance = null;
+
+        instance.saveTo(filename);
+
+        // TODO review the generated test code and remove the default call to fail.
+        fail("The test case is a prototype.");
+    }
+    */
+
+    /**
+     * Test of getXmlConfigString method, of class com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testGetXmlConfigString() throws Exception {
+        System.out.println("getXmlConfigString");
+
+        try {
+            final File file = File.createTempFile("testconf",".xml");
+            final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+            final ScanManagerConfig bean =
+                new  ScanManagerConfig("testGetXmlConfigString");
+            final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+            dir.setRootDirectory(file.getParent());
+            bean.putScan(dir);
+            instance.setConfiguration(bean);
+            System.out.println("Expected: " + XmlConfigUtils.toString(bean));
+            System.out.println("Received: " +
+                    instance.getConfiguration().toString());
+            assertEquals(XmlConfigUtils.toString(bean),
+                instance.getConfiguration().toString());
+        } catch (Exception x) {
+            x.printStackTrace();
+            throw x;
+        }
+    }
+
+
+    /**
+     * Test of addNotificationListener method, of class
+     * com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testAddNotificationListener() throws Exception {
+        System.out.println("addNotificationListener");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        final ScanManagerMXBean manager = ScanManager.register(mbs);
+
+        try {
+            final ScanDirConfigMXBean instance =
+                TestUtils.makeNotificationEmitter(
+                    manager.createOtherConfigurationMBean("testSave",
+                        file.getAbsolutePath()),
+                    ScanDirConfigMXBean.class);
+            assertTrue(mbs.isRegistered(
+                    ScanManager.makeScanDirConfigName("testSave")));
+            DirectoryScannerConfig dir =
+                    instance.addDirectoryScanner("tmp",file.getParent(),".*",0,0);
+
+            final BlockingQueue<Notification> queue =
+                    new LinkedBlockingQueue<Notification>();
+            final NotificationListener listener = new NotificationListener() {
+                public void handleNotification(Notification notification,
+                            Object handback) {
+                    queue.add(notification);
+                }
+            };
+            NotificationFilter filter = null;
+            Object handback = null;
+
+            ((NotificationEmitter)instance).addNotificationListener(listener,
+                    filter, handback);
+
+            instance.save();
+            final ScanManagerConfig loaded =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded);
+
+            final ScanManagerConfig newConfig =
+                    instance.getConfiguration();
+            newConfig.removeScan("tmp");
+            instance.setConfiguration(newConfig);
+            instance.save();
+            assertNotSame(loaded,instance.getConfiguration());
+            final ScanManagerConfig loaded2 =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+            assertEquals(instance.getConfiguration(),loaded2);
+            instance.load();
+            for (int i=0;i<4;i++) {
+                final Notification n = queue.poll(3,TimeUnit.SECONDS);
+                assertNotNull(n);
+                assertEquals(TestUtils.getObjectName(instance),n.getSource());
+                switch(i) {
+                    case 0: case 2:
+                        assertEquals(ScanDirConfig.NOTIFICATION_SAVED,n.getType());
+                        break;
+                    case 1:
+                        assertEquals(ScanDirConfig.NOTIFICATION_MODIFIED,n.getType());
+                        break;
+                    case 3:
+                        assertEquals(ScanDirConfig.NOTIFICATION_LOADED,n.getType());
+                        break;
+                    default: break;
+                }
+            }
+        } finally {
+            manager.close();
+            mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+        }
+        final ObjectName all =
+                new ObjectName(ScanManager.SCAN_MANAGER_NAME.getDomain()+":*");
+        assertEquals(0,mbs.queryNames(all,null).size());
+    }
+
+    /**
+     * Test of getConfigFilename method, of class
+     * com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testGetConfigFilename() throws Exception {
+        System.out.println("getConfigFilename");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+
+        String result = instance.getConfigFilename();
+        assertEquals(file.getAbsolutePath(), new File(result).getAbsolutePath());
+
+    }
+
+    /**
+     * Test of addDirectoryScanner method, of class
+     * com.sun.jmx.examples.scandir.ScanDirConfig.
+     */
+    public void testAddDirectoryScanner() throws IOException {
+        System.out.println("addDirectoryScanner");
+
+        System.out.println("save");
+
+        final File file = File.createTempFile("testconf",".xml");
+        final ScanDirConfig instance = new ScanDirConfig(file.getAbsolutePath());
+        final ScanManagerConfig bean =
+                new  ScanManagerConfig("testSave");
+        final DirectoryScannerConfig dir =
+                new DirectoryScannerConfig("tmp");
+        dir.setRootDirectory(file.getParent());
+        FileMatch filter = new FileMatch();
+        filter.setFilePattern(".*");
+        dir.setIncludeFiles(new FileMatch[] {
+            filter
+        });
+        instance.setConfiguration(bean);
+        instance.addDirectoryScanner(dir.getName(),
+                                     dir.getRootDirectory(),
+                                     filter.getFilePattern(),
+                                     filter.getSizeExceedsMaxBytes(),
+                                     0);
+        instance.save();
+        final ScanManagerConfig loaded =
+                new XmlConfigUtils(file.getAbsolutePath()).readFromFile();
+        assertNotNull(loaded.getScan(dir.getName()));
+        assertEquals(dir,loaded.getScan(dir.getName()));
+        assertEquals(instance.getConfiguration(),loaded);
+        assertEquals(instance.getConfiguration().getScan(dir.getName()),dir);
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanManagerTest.java b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanManagerTest.java
new file mode 100644
index 0000000..94e3c98
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/ScanManagerTest.java
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import junit.framework.*;
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+import com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.logging.Logger;
+import javax.management.AttributeChangeNotification;
+import javax.management.JMException;
+import javax.management.JMX;
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import static com.sun.jmx.examples.scandir.ScanManagerMXBean.ScanState.*;
+
+/**
+ * Unit tests for {@code ScanManager}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class ScanManagerTest extends TestCase {
+
+    public ScanManagerTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(ScanManagerTest.class);
+
+        return suite;
+    }
+
+    /**
+     * Test of makeSingletonName method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testMakeSingletonName() {
+        System.out.println("makeSingletonName");
+
+        Class clazz = ScanManagerMXBean.class;
+
+        ObjectName expResult = ScanManager.SCAN_MANAGER_NAME;
+        ObjectName result = ScanManager.makeSingletonName(clazz);
+        assertEquals(expResult, result);
+
+    }
+
+    /**
+     * Test of register method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testRegister() throws Exception {
+        System.out.println("register");
+
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+
+
+        ScanManagerMXBean result = ScanManager.register(mbs);
+        try {
+            assertEquals(STOPPED,result.getState());
+        } finally {
+            try {
+                mbs.unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+
+    }
+
+    public interface Call {
+        public void call() throws Exception;
+        public void cancel() throws Exception;
+    }
+
+    /**
+     * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testAddNotificationListener() throws Exception {
+        System.out.println("addNotificationListener");
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        final Call op = new Call() {
+            public void call() throws Exception {
+                manager.schedule(100000,0);
+            }
+            public void cancel() throws Exception {
+                manager.stop();
+            }
+        };
+        try {
+            doTestOperation(manager,op,
+                            EnumSet.of(RUNNING,SCHEDULED),
+                            "schedule");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of addNotificationListener method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    private void doTestOperation(
+            ScanManagerMXBean proxy,
+            Call op,
+            EnumSet<ScanState> after,
+            String testName)
+        throws Exception {
+        System.out.println("doTestOperation: "+testName);
+
+        final LinkedBlockingQueue<Notification> queue =
+                new LinkedBlockingQueue<Notification>();
+
+        NotificationListener listener = new NotificationListener() {
+            public void handleNotification(Notification notification,
+                        Object handback) {
+                try {
+                    queue.put(notification);
+                } catch (Exception x) {
+                    System.err.println("Failed to queue notif: "+x);
+                }
+            }
+        };
+        NotificationFilter filter = null;
+        Object handback = null;
+        final ScanState before;
+        final NotificationEmitter emitter = (NotificationEmitter)proxy;
+        emitter.addNotificationListener(listener, filter, handback);
+        before = proxy.getState();
+        op.call();
+        try {
+            final Notification notification =
+                    queue.poll(3000,TimeUnit.MILLISECONDS);
+            assertEquals(AttributeChangeNotification.ATTRIBUTE_CHANGE,
+                    notification.getType());
+            assertEquals(AttributeChangeNotification.class,
+                    notification.getClass());
+            assertEquals(ScanManager.SCAN_MANAGER_NAME,
+                    notification.getSource());
+            AttributeChangeNotification acn =
+                    (AttributeChangeNotification)notification;
+            assertEquals("State",acn.getAttributeName());
+            assertEquals(ScanState.class.getName(),acn.getAttributeType());
+            assertEquals(before,ScanState.valueOf((String)acn.getOldValue()));
+            assertContained(after,ScanState.valueOf((String)acn.getNewValue()));
+            emitter.removeNotificationListener(listener,filter,handback);
+        } finally {
+            try {
+                op.cancel();
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of preRegister method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testPreRegister() throws Exception {
+        System.out.println("preRegister");
+
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        ObjectName name = new ObjectName("DownUnder:type=Wombat");
+        ScanManager instance = new ScanManager();
+
+        ObjectName expResult = ScanManager.SCAN_MANAGER_NAME;
+        ObjectName result;
+        try {
+            result = instance.preRegister(server, name);
+            throw new RuntimeException("bad name accepted!");
+        } catch (IllegalArgumentException x) {
+            // OK!
+            result = instance.preRegister(server, null);
+        }
+        assertEquals(expResult, result);
+        result = instance.preRegister(server, ScanManager.SCAN_MANAGER_NAME);
+        assertEquals(expResult, result);
+    }
+
+
+    /**
+     * Test of getState method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testGetState() throws IOException, InstanceNotFoundException {
+        System.out.println("getState");
+
+        ScanManager instance = new ScanManager();
+
+        ScanState expResult = ScanState.STOPPED;
+        ScanState result = instance.getState();
+        assertEquals(expResult, result);
+        instance.start();
+        final ScanState afterStart = instance.getState();
+        assertContained(EnumSet.of(RUNNING,SCHEDULED,COMPLETED),afterStart);
+        instance.stop();
+        assertEquals(STOPPED,instance.getState());
+        instance.schedule(1000000L,1000000L);
+        assertEquals(SCHEDULED,instance.getState());
+        instance.stop();
+        assertEquals(STOPPED,instance.getState());
+    }
+
+    /**
+     * Test of schedule method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testSchedule() throws Exception {
+        System.out.println("schedule");
+
+        final long delay = 10000L;
+        final long interval = 10000L;
+
+        final ScanManagerMXBean manager = ScanManager.register();
+        final Call op = new Call() {
+            public void call() throws Exception {
+                manager.schedule(delay,interval);
+                assertEquals(SCHEDULED,manager.getState());
+            }
+            public void cancel() throws Exception {
+                manager.stop();
+            }
+        };
+        try {
+            doTestOperation(manager,op,EnumSet.of(SCHEDULED),
+                    "schedule");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    public static void assertContained(EnumSet<ScanState> allowed,
+            ScanState state) {
+         final String msg = String.valueOf(state) + " is not one of " + allowed;
+         assertTrue(msg,allowed.contains(state));
+    }
+
+    /**
+     * Test of stop method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testStop() throws Exception {
+        System.out.println("stop");
+        final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            manager.schedule(1000000,0);
+            assertContained(EnumSet.of(SCHEDULED),manager.getState());
+            final Call op = new Call() {
+                public void call() throws Exception {
+                    manager.stop();
+                    assertEquals(STOPPED,manager.getState());
+                }
+                public void cancel() throws Exception {
+                    if (manager.getState() != STOPPED)
+                        manager.stop();
+                }
+            };
+            doTestOperation(manager,op,EnumSet.of(STOPPED),"stop");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+    /**
+     * Test of start method, of class com.sun.jmx.examples.scandir.ScanManager.
+     */
+    public void testStart() throws Exception {
+        final ScanManagerMXBean manager = ScanManager.register();
+        try {
+            final Call op = new Call() {
+                public void call() throws Exception {
+                    assertEquals(STOPPED,manager.getState());
+                    manager.start();
+                    assertContained(EnumSet.of(RUNNING,SCHEDULED,COMPLETED),
+                            manager.getState());
+                }
+                public void cancel() throws Exception {
+                    manager.stop();
+                }
+            };
+            doTestOperation(manager,op,EnumSet.of(RUNNING,SCHEDULED,COMPLETED),
+                    "start");
+        } finally {
+            try {
+                ManagementFactory.getPlatformMBeanServer().
+                        unregisterMBean(ScanManager.SCAN_MANAGER_NAME);
+            } catch (Exception x) {
+                System.err.println("Failed to cleanup: "+x);
+            }
+        }
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/TestUtils.java b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/TestUtils.java
new file mode 100644
index 0000000..4832949
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/TestUtils.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.util.logging.Logger;
+import javax.management.JMX;
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.NotificationEmitter;
+import javax.management.ObjectName;
+
+/**
+ * A utility class defining static methods used by our tests.
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class TestUtils {
+
+    /**
+     * A logger for this class.
+     **/
+    private static final Logger LOG =
+            Logger.getLogger(TestUtils.class.getName());
+
+    /** Creates a new instance of TestUtils */
+    private TestUtils() {
+    }
+
+    /**
+     * Returns the ObjectName of the MBean that a proxy object
+     * is proxying.
+     **/
+    public static ObjectName getObjectName(Object proxy) {
+        if (!(proxy instanceof Proxy))
+            throw new IllegalArgumentException("not a "+Proxy.class.getName());
+        final Proxy p = (Proxy) proxy;
+        final InvocationHandler handler =
+                Proxy.getInvocationHandler(proxy);
+        if (handler instanceof MBeanServerInvocationHandler)
+            return ((MBeanServerInvocationHandler)handler).getObjectName();
+        throw new IllegalArgumentException("not a JMX Proxy");
+    }
+
+    /**
+     * Transfroms a proxy implementing T in a proxy implementing T plus
+     * NotificationEmitter
+     *
+     **/
+    public static <T> T makeNotificationEmitter(T proxy,
+                        Class<T> mbeanInterface) {
+        if (proxy instanceof NotificationEmitter)
+            return proxy;
+        if (proxy == null) return null;
+        if (!(proxy instanceof Proxy))
+            throw new IllegalArgumentException("not a "+Proxy.class.getName());
+        final Proxy p = (Proxy) proxy;
+        final InvocationHandler handler =
+                Proxy.getInvocationHandler(proxy);
+        if (!(handler instanceof MBeanServerInvocationHandler))
+            throw new IllegalArgumentException("not a JMX Proxy");
+        final MBeanServerInvocationHandler h =
+                (MBeanServerInvocationHandler)handler;
+        final ObjectName name = h.getObjectName();
+        final MBeanServerConnection mbs = h.getMBeanServerConnection();
+        final boolean isMXBean = h.isMXBean();
+        final T newProxy;
+        if (isMXBean)
+            newProxy = JMX.newMXBeanProxy(mbs,name,mbeanInterface,true);
+        else
+            newProxy = JMX.newMBeanProxy(mbs,name,mbeanInterface,true);
+        return newProxy;
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/config/XmlConfigUtilsTest.java b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/config/XmlConfigUtilsTest.java
new file mode 100644
index 0000000..e4cea49
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/test/com/sun/jmx/examples/scandir/config/XmlConfigUtilsTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.jmx.examples.scandir.config;
+
+import junit.framework.*;
+import java.io.File;
+
+/**
+ * Unit tests for {@code XmlConfigUtils}
+ *
+ * @author Sun Microsystems, 2006 - All rights reserved.
+ */
+public class XmlConfigUtilsTest extends TestCase {
+
+    public XmlConfigUtilsTest(String testName) {
+        super(testName);
+    }
+
+    protected void setUp() throws Exception {
+    }
+
+    protected void tearDown() throws Exception {
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(XmlConfigUtilsTest.class);
+
+        return suite;
+    }
+
+
+    /**
+     * Test of writeToFile method, of class XmlConfigUtils.
+     */
+    public void testWriteToFile() throws Exception {
+        System.out.println("writeToFile");
+
+        final File file = File.createTempFile("test",".xml");
+        file.deleteOnExit();
+
+        final String tmp = System.getProperty("java.io.tmpdir");
+
+        DirectoryScannerConfig dir1 =
+                new DirectoryScannerConfig("scan2");
+        dir1.setRootDirectory(tmp);
+        ScanManagerConfig bean = new ScanManagerConfig("session2");
+        bean.putScan(dir1);
+        XmlConfigUtils instance = new XmlConfigUtils(file.getPath());
+
+        instance.writeToFile(bean);
+    }
+
+    /**
+     * Test of readFromFile method, of class com.sun.jmx.examples.scandir.config.XmlConfigUtils.
+     */
+    public void testReadFromFile() throws Exception {
+        System.out.println("readFromFile");
+
+        final String tmp = System.getProperty("java.io.tmpdir");
+        final File file = File.createTempFile("test",".xml");
+        file.deleteOnExit();
+
+        DirectoryScannerConfig dir1 =
+                new DirectoryScannerConfig("scan1");
+        dir1.setRootDirectory(tmp);
+        ScanManagerConfig bean = new ScanManagerConfig("session1");
+        bean.putScan(dir1);
+        XmlConfigUtils instance = new XmlConfigUtils(file.getPath());
+
+        instance.writeToFile(bean);
+
+        ScanManagerConfig expResult = bean;
+        ScanManagerConfig result = instance.readFromFile();
+        System.out.println(result);
+        assertEquals(expResult, result);
+
+
+    }
+
+}
diff --git a/linux-x86/sample/jmx/jmx-scandir/truststore b/linux-x86/sample/jmx/jmx-scandir/truststore
new file mode 100644
index 0000000..2f5ba34
--- /dev/null
+++ b/linux-x86/sample/jmx/jmx-scandir/truststore
Binary files differ
diff --git a/linux-x86/sample/lambda/BulkDataOperations/index.html b/linux-x86/sample/lambda/BulkDataOperations/index.html
new file mode 100644
index 0000000..5a16695
--- /dev/null
+++ b/linux-x86/sample/lambda/BulkDataOperations/index.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Bulk Data Operations Demo</title>
+</head>
+<body>
+<h2>Bulk Data Operations Demo</h2>
+
+<p>
+    This demo shows how to use bulk data operations with the new JDK8
+    Collections API.
+    The demo also demonstrates new features of JDK8 such as lambda expressions
+    and method/constructor references.
+</p>
+
+<ul>
+    <li><h3>CSV Processor</h3>
+
+        <p>
+            Analyzes a CSV file, finds and collects useful information, computes
+            different statistics. For more information, see the source file.
+        </p>
+        Source: <a href="src/CSVProcessor.java">src/CSVProcessor.java</a>
+    <li><h3>Grep</h3>
+
+        <p>
+            Behaves like the standard Linux tool Grep. For more information, see
+            the source file.
+        </p>
+        Source: <a href="src/Grep.java">src/Grep.java</a>
+    <li><h3>PasswordGenerator</h3>
+
+        <p>
+            Produces a password of desired length. For more information see
+            source file.
+        </p>
+        Source: <a
+                href="src/PasswordGenerator.java">src/PasswordGenerator.java</a>
+    <li><h3>WC</h3>
+
+        <p>
+            Counts newlines, words, characters, and the maximum line length of a
+            text file. For more information, see the source
+            file.
+        </p>
+        Source: <a href="src/WC.java">src/WC.java</a>
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/linux-x86/sample/lambda/BulkDataOperations/src/CSVProcessor.java b/linux-x86/sample/lambda/BulkDataOperations/src/CSVProcessor.java
new file mode 100644
index 0000000..ded9030
--- /dev/null
+++ b/linux-x86/sample/lambda/BulkDataOperations/src/CSVProcessor.java
@@ -0,0 +1,368 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.function.*;
+import java.util.regex.Pattern;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+import static java.lang.Double.parseDouble;
+import static java.util.stream.Collectors.*;
+
+/**
+ * CSVProcessor is a tool for processing CSV files. There are several
+ * command-line options. Consult the {@link #printUsageAndExit} method for
+ * instructions and command line parameters. This sample shows examples of the
+ * following features:
+ * <ul>
+ * <li>Lambda and bulk operations. Working with streams: map(...), filter(...),
+ * sorted(...) methods. The collect(...) method with different collectors:
+ * Collectors.maxBy(...), Collectors.minBy(...), Collectors.toList(),
+ * Collectors.toCollection(...), Collectors.groupingBy(...),
+ * Collectors.toDoubleSummaryStatistics(...), and a custom Collector.</li>
+ * <li>Static method reference for printing values.</li>
+ * <li>Try-with-resources feature for closing files.</li>
+ * <li>Switch by String feature.</li>
+ * <li>Other new APIs: Pattern.asPredicate(), BinaryOperator
+ * BufferedReader.lines(), Collection.forEach(...), Comparator.comparing(...),
+ * Comparator.reversed(), Arrays.stream(...).</li>
+ * </ul>
+ *
+ */
+public class CSVProcessor {
+
+    //Number of characters that may be read
+    private static final int READ_AHEAD_LIMIT = 100_000_000;
+
+    /**
+     * The main method for the CSVProcessor program. Run the program with an
+     * empty argument list to see possible arguments.
+     *
+     * @param args the argument list for CSVProcessor.
+     */
+    public static void main(String[] args) {
+        if (args.length < 2) {
+            printUsageAndExit();
+        }
+        try (BufferedReader br = new BufferedReader(
+                Files.newBufferedReader(Paths.get(args[args.length - 1])))) {
+            //Assume that the first line contains column names.
+            List<String> header = Arrays.stream(br.readLine().split(","))
+                    .map(String::trim).collect(toList());
+            //Calculate an index of the column in question.
+            int column = getColumnNumber(header, args[1]);
+            switch (args[0]) {
+                case "sort":
+                    verifyArgumentNumber(args, 4);
+                    //Define the sort order.
+                    boolean isAsc;
+                    switch (args[2].toUpperCase()) {
+                        case "ASC":
+                            isAsc = true;
+                            break;
+                        case "DESC":
+                            isAsc = false;
+                            break;
+                        default:
+                            printUsageAndExit("Illegal argument" + args[2]);
+                            return;//Should not be reached.
+                    }
+                    /*
+                     * Create a comparator that compares lines by comparing
+                     * values in the specified column.
+                     */
+                    Comparator<String> cmp
+                            = Comparator.comparing(str -> getCell(str, column),
+                                    String.CASE_INSENSITIVE_ORDER);
+                    /*
+                     * sorted(...) is used to sort records.
+                     * forEach(...) is used to output sorted records.
+                     */
+                    br.lines().sorted(isAsc ? cmp : cmp.reversed())
+                            .forEach(System.out::println);
+                    break;
+                case "search":
+                    verifyArgumentNumber(args, 4);
+                    /*
+                     * Records are filtered by a regex.
+                     * forEach(...) is used to output filtered records.
+                     */
+                    Predicate<String> pattern
+                            = Pattern.compile(args[2]).asPredicate();
+                    br.lines().filter(str -> pattern.test(getCell(str, column)))
+                            .forEach(System.out::println);
+                    break;
+                case "groupby":
+                    verifyArgumentNumber(args, 3);
+                    /*
+                     * Group lines by values in the column with collect(...), and
+                     * print with forEach(...) for every distinct value within
+                     * the column.
+                     */
+                    br.lines().collect(
+                            Collectors.groupingBy(str -> getCell(str, column),
+                                    toCollection(TreeSet::new)))
+                            .forEach((str, set) -> {
+                                System.out.println(str + ":");
+                                set.forEach(System.out::println);
+                            });
+                    break;
+                case "stat":
+                    verifyArgumentNumber(args, 3);
+
+                    /*
+                     * BufferedReader will be read several times.
+                     * Mark this point to return here after each pass.
+                     * BufferedReader will be read right after the headers line
+                     * because it is already read.
+                     */
+                    br.mark(READ_AHEAD_LIMIT);
+
+                    /*
+                     * Statistics can be collected by a custom collector in one
+                     * pass. One pass is preferable.
+                     */
+                    System.out.println(
+                            br.lines().collect(new Statistics(column)));
+
+                    /*
+                     * Alternatively, statistics can be collected
+                     * by a built-in API in several passes.
+                     * This method demonstrates how separate operations can be
+                     * implemented using a built-in API.
+                     */
+                    br.reset();
+                    statInSeveralPasses(br, column);
+                    break;
+                default:
+                    printUsageAndExit("Illegal argument" + args[0]);
+            }
+        } catch (IOException e) {
+            printUsageAndExit(e.toString());
+        }
+    }
+
+    private static void statInSeveralPasses(BufferedReader br, int column)
+            throws IOException {
+        System.out.println("#-----Statistics in several passes-------#");
+        //Create a comparator to compare records by the column.
+        Comparator<String> comparator
+                = Comparator.comparing(
+                        (String str) -> parseDouble(getCell(str, column)));
+        //Find max record by using Collectors.maxBy(...)
+        System.out.println(
+                "Max: " + br.lines().collect(maxBy(comparator)).get());
+        br.reset();
+        //Find min record by using Collectors.minBy(...)
+        System.out.println(
+                "Min: " + br.lines().collect(minBy(comparator)).get());
+        br.reset();
+        //Compute the average value and sum with
+        //Collectors.toDoubleSummaryStatistics(...)
+        DoubleSummaryStatistics doubleSummaryStatistics
+                = br.lines().collect(summarizingDouble(
+                    str -> parseDouble(getCell(str, column))));
+        System.out.println("Average: " + doubleSummaryStatistics.getAverage());
+        System.out.println("Sum: " + doubleSummaryStatistics.getSum());
+    }
+
+    private static void verifyArgumentNumber(String[] args, int n) {
+        if (args.length != n) {
+            printUsageAndExit("Expected " + n + " arguments but was "
+                    + args.length);
+        }
+    }
+
+    private static int getColumnNumber(List<String> header, String name) {
+        int column = header.indexOf(name);
+        if (column == -1) {
+            printUsageAndExit("There is no column with name " + name);
+        }
+        return column;
+    }
+
+    private static String getCell(String record, int column) {
+        return record.split(",")[column].trim();
+    }
+
+    private static void printUsageAndExit(String... str) {
+        System.out.println("Usages:");
+
+        System.out.println("CSVProcessor sort COLUMN_NAME ASC|DESC FILE");
+        System.out.println("Sort lines by column COLUMN_NAME in CSV FILE\n");
+
+        System.out.println("CSVProcessor search COLUMN_NAME REGEX FILE");
+        System.out.println("Search for REGEX in column COLUMN_NAME in CSV FILE\n");
+
+        System.out.println("CSVProcessor groupby COLUMN_NAME FILE");
+        System.out.println("Split lines into different groups according to column "
+                + "COLUMN_NAME value\n");
+
+        System.out.println("CSVProcessor stat COLUMN_NAME FILE");
+        System.out.println("Compute max/min/average/sum  statistics by column "
+                + "COLUMN_NAME\n");
+
+        Arrays.asList(str).forEach(System.err::println);
+        System.exit(1);
+    }
+
+    /*
+     * This is a custom implementation of the Collector interface.
+     * Statistics are objects gather max,min,sum,average statistics.
+     */
+    private static class Statistics
+            implements Collector<String, Statistics, Statistics> {
+
+
+        /*
+         * This implementation does not need to be thread safe because
+         * the parallel implementation of
+         * {@link java.util.stream.Stream#collect Stream.collect()}
+         * provides the necessary partitioning and isolation for safe parallel
+         * execution.
+         */
+        private String maxRecord;
+        private String minRecord;
+
+        private double sum;
+        private int lineCount;
+        private final BinaryOperator<String> maxOperator;
+        private final BinaryOperator<String> minOperator;
+        private final int column;
+
+        public Statistics(int column) {
+            this.column = column;
+            Comparator<String> cmp = Comparator.comparing(
+                    (String str) -> parseDouble(getCell(str, column)));
+            maxOperator = BinaryOperator.maxBy(cmp);
+            minOperator = BinaryOperator.minBy(cmp);
+        }
+
+        /*
+         * Process line.
+         */
+        public Statistics accept(String line) {
+            maxRecord = maxRecord == null
+                    ? line : maxOperator.apply(maxRecord, line);
+            minRecord = minRecord == null
+                    ? line : minOperator.apply(minRecord, line);
+
+            sum += parseDouble(getCell(line, column));
+            lineCount++;
+            return this;
+        }
+
+
+        /*
+         * Merge two Statistics.
+         */
+        public Statistics combine(Statistics stat) {
+            maxRecord = maxOperator.apply(maxRecord, stat.getMaxRecord());
+            minRecord = minOperator.apply(minRecord, stat.getMinRecord());
+            sum += stat.getSum();
+            lineCount += stat.getLineCount();
+            return this;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("#------Statistics------#\n");
+            sb.append("Max: ").append(getMaxRecord()).append("\n");
+            sb.append("Min: ").append(getMinRecord()).append("\n");
+            sb.append("Sum = ").append(getSum()).append("\n");
+            sb.append("Average = ").append(average()).append("\n");
+            sb.append("#------Statistics------#\n");
+            return sb.toString();
+        }
+
+        @Override
+        public Supplier<Statistics> supplier() {
+            return () -> new Statistics(column);
+        }
+
+        @Override
+        public BiConsumer<Statistics, String> accumulator() {
+            return Statistics::accept;
+        }
+
+        @Override
+        public BinaryOperator<Statistics> combiner() {
+            return Statistics::combine;
+
+        }
+
+        @Override
+        public Function<Statistics, Statistics> finisher() {
+            return stat -> stat;
+        }
+
+        @Override
+        public Set<Characteristics> characteristics() {
+            return EnumSet.of(Characteristics.IDENTITY_FINISH);
+        }
+
+        private String getMaxRecord() {
+            return maxRecord;
+        }
+
+        private String getMinRecord() {
+            return minRecord;
+        }
+
+        private double getSum() {
+            return sum;
+        }
+
+        private double average() {
+            return sum / lineCount;
+        }
+
+        private int getLineCount() {
+            return lineCount;
+        }
+
+    }
+
+}
diff --git a/linux-x86/sample/lambda/BulkDataOperations/src/Grep.java b/linux-x86/sample/lambda/BulkDataOperations/src/Grep.java
new file mode 100644
index 0000000..cb4bdf7
--- /dev/null
+++ b/linux-x86/sample/lambda/BulkDataOperations/src/Grep.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Grep prints lines matching a regex. See {@link #printUsageAndExit(String...)}
+ * method for instructions and command line parameters. This sample shows
+ * examples of using next features:
+ * <ul>
+ * <li>Lambda and bulk operations. Working with streams:
+ * map(...),filter(...),flatMap(...),limit(...) methods.</li>
+ * <li>Static method reference for printing values.</li>
+ * <li>New Collections API forEach(...) method.</li>
+ * <li>Try-with-resources feature.</li>
+ * <li>new Files.walk(...), Files.lines(...) API.</li>
+ * <li>Streams that need to be closed.</li>
+ * </ul>
+ *
+ */
+public class Grep {
+
+    private static void printUsageAndExit(String... str) {
+        System.out.println("Usage: " + Grep.class.getSimpleName()
+                + " [OPTION]... PATTERN FILE...");
+        System.out.println("Search for PATTERN in each FILE. "
+                + "If FILE is a directory then whole file tree of the directory"
+                + " will be processed.");
+        System.out.println("Example: grep -m 100 'hello world' menu.h main.c");
+        System.out.println("Options:");
+        System.out.println("    -m NUM: stop analysis after NUM matches");
+        Arrays.asList(str).forEach(System.err::println);
+        System.exit(1);
+    }
+
+    /**
+     * The main method for the Grep program. Run program with empty argument
+     * list to see possible arguments.
+     *
+     * @param args the argument list for Grep.
+     * @throws java.io.IOException If an I/O error occurs.
+     */
+    public static void main(String[] args) throws IOException {
+        long maxCount = Long.MAX_VALUE;
+        if (args.length < 2) {
+            printUsageAndExit();
+        }
+        int i = 0;
+        //parse OPTIONS
+        while (args[i].startsWith("-")) {
+            switch (args[i]) {
+                case "-m":
+                    try {
+                        maxCount = Long.parseLong(args[++i]);
+                    } catch (NumberFormatException ex) {
+                        printUsageAndExit(ex.toString());
+                    }
+                    break;
+                default:
+                    printUsageAndExit("Unexpected option " + args[i]);
+            }
+            i++;
+        }
+        //parse PATTERN
+        Pattern pattern = Pattern.compile(args[i++]);
+        if (i == args.length) {
+            printUsageAndExit("There are no files for input");
+        }
+
+        try {
+            /*
+            * First obtain the list of all paths.
+            * For a small number of arguments there is little to be gained
+            * by producing this list in parallel. For one argument
+            * there will be no parallelism.
+            *
+            * File names are converted to paths. If a path is a directory then
+            * Stream is populated with whole file tree of the directory by
+            * flatMap() method. Files are filtered from directories.
+            */
+            List<Path> files = Arrays.stream(args, i, args.length)
+                    .map(Paths::get)
+                    // flatMap will ensure each I/O-based stream will be closed
+                    .flatMap(Grep::getPathStream)
+                    .filter(Files::isRegularFile)
+                    .collect(toList());
+            /*
+            * Then operate on that list in parallel.
+            * This is likely to give a more even distribution of work for
+            * parallel execution.
+            *
+            * Lines are extracted from files. Lines are filtered by pattern.
+            * Stream is limited by number of matches. Each remaining string is
+            * displayed in std output by method reference System.out::println.
+            */
+            files.parallelStream()
+                    // flatMap will ensure each I/O-based stream will be closed
+                    .flatMap(Grep::path2Lines)
+                    .filter(pattern.asPredicate())
+                    .limit(maxCount)
+                    .forEachOrdered(System.out::println);
+        } catch (UncheckedIOException ioe) {
+            printUsageAndExit(ioe.toString());
+        }
+    }
+
+    /**
+     * Flattens file system hierarchy into a stream. This code is not inlined
+     * for the reason of Files.walk() throwing a checked IOException that must
+     * be caught.
+     *
+     * @param path - the file or directory
+     * @return Whole file tree starting from path, a stream with one element -
+     * the path itself - if it is a file.
+     */
+    private static Stream<Path> getPathStream(Path path) {
+        try {
+            return Files.walk(path);
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+    /**
+     * Produces a stream of lines from a file. The result is a stream in order
+     * to close it later. This code is not inlined for the reason of
+     * Files.lines() throwing a checked IOException that must be caught.
+     *
+     * @param path - the file to read
+     * @return stream of lines from the file
+     */
+    private static Stream<String> path2Lines(Path path) {
+        try {
+            return Files.lines(path);
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        }
+    }
+}
diff --git a/linux-x86/sample/lambda/BulkDataOperations/src/PasswordGenerator.java b/linux-x86/sample/lambda/BulkDataOperations/src/PasswordGenerator.java
new file mode 100644
index 0000000..e467798
--- /dev/null
+++ b/linux-x86/sample/lambda/BulkDataOperations/src/PasswordGenerator.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+
+/**
+ * Generates password of desired length. See {@link #usage} method
+ * for instructions and command line parameters. This sample shows usages of:
+ * <ul>
+ * <li>Method references.</li>
+ * <li>Lambda and bulk operations. A stream of random integers is mapped to
+ * chars, limited by desired length and printed in standard output as password
+ * string.</li>
+ * </ul>
+ *
+ */
+public class PasswordGenerator {
+
+    private static void usage() {
+        System.out.println("Usage: PasswordGenerator LENGTH");
+        System.out.println(
+                "Password Generator produces password of desired LENGTH.");
+    }
+
+    private static final List<Integer> PASSWORD_CHARS = new ArrayList<>();
+
+    //Valid symbols.
+    static {
+        IntStream.rangeClosed('0', '9').forEach(PASSWORD_CHARS::add);    // 0-9
+        IntStream.rangeClosed('A', 'Z').forEach(PASSWORD_CHARS::add);    // A-Z
+        IntStream.rangeClosed('a', 'z').forEach(PASSWORD_CHARS::add);    // a-z
+    }
+
+    /**
+     * The main method for the PasswordGenerator program. Run program with empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for PasswordGenerator.
+     */
+    public static void main(String[] args) {
+
+        if (args.length != 1) {
+            usage();
+            return;
+        }
+
+        long passwordLength;
+        try {
+            passwordLength = Long.parseLong(args[0]);
+            if (passwordLength < 1) {
+                printMessageAndUsage("Length has to be positive");
+                return;
+            }
+        } catch (NumberFormatException ex) {
+            printMessageAndUsage("Unexpected number format" + args[0]);
+            return;
+        }
+        /*
+         * Stream of random integers is created containing Integer values
+         * in range from 0 to PASSWORD_CHARS.size().
+         * The stream is limited by passwordLength.
+         * Valid chars are selected by generated index.
+         */
+        new SecureRandom().ints(passwordLength, 0, PASSWORD_CHARS.size())
+                .map(PASSWORD_CHARS::get)
+                .forEach(i -> System.out.print((char) i));
+    }
+
+    private static void printMessageAndUsage(String message) {
+        System.err.println(message);
+        usage();
+    }
+
+}
diff --git a/linux-x86/sample/lambda/BulkDataOperations/src/WC.java b/linux-x86/sample/lambda/BulkDataOperations/src/WC.java
new file mode 100644
index 0000000..c724f15
--- /dev/null
+++ b/linux-x86/sample/lambda/BulkDataOperations/src/WC.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.function.Consumer;
+import java.util.regex.Pattern;
+
+/**
+ * WC - Prints newline, word, and character counts for each file. See
+ * the {@link #usage} method for instructions and command line parameters. This
+ * sample shows usages of:
+ * <ul>
+ * <li>Lambda and bulk operations. Shows how to create a custom collector to
+ * gather custom statistics. Implements the collection of statistics using a
+ * built-in API.</li>
+ * <li>Constructor reference.</li>
+ * <li>Try-with-resources feature.</li>
+ * </ul>
+ *
+ */
+public class WC {
+
+    //The number of characters that may be read.
+    private static final int READ_AHEAD_LIMIT = 100_000_000;
+
+    //The pattern for splitting strings by non word characters to get words.
+    private static final Pattern nonWordPattern = Pattern.compile("\\W");
+
+    /**
+     * The main method for the WC program. Run the program with an empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for WC
+     * @throws java.io.IOException If an input exception occurred.
+     */
+    public static void main(String[] args) throws IOException {
+
+        if (args.length != 1) {
+            usage();
+            return;
+        }
+
+        try (BufferedReader reader = new BufferedReader(
+                new FileReader(args[0]))) {
+            reader.mark(READ_AHEAD_LIMIT);
+            /*
+             * Statistics can be gathered in four passes using a built-in API.
+             * The method demonstrates how separate operations can be
+             * implemented using a built-in API.
+             */
+            collectInFourPasses(reader);
+            /*
+             * Usage of several passes to collect data is not the best way.
+             * Statistics can be gathered by a custom collector in one pass.
+             */
+            reader.reset();
+            collectInOnePass(reader);
+        } catch (FileNotFoundException e) {
+            usage();
+            System.err.println(e);
+        }
+    }
+
+    private static void collectInFourPasses(BufferedReader reader)
+            throws IOException {
+        /*
+         * Input is read as a stream of lines by lines().
+         * Every line is turned into a stream of chars by the flatMapToInt(...)
+         * method.
+         * Length of the stream is counted by count().
+         */
+        System.out.println("Character count = "
+                + reader.lines().flatMapToInt(String::chars).count());
+        /*
+         * Input is read as a stream of lines by lines().
+         * Every line is split by nonWordPattern into words by flatMap(...)
+         * method.
+         * Empty lines are removed by the filter(...) method.
+         * Length of the stream is counted by count().
+         */
+        reader.reset();
+        System.out.println("Word count = "
+                + reader.lines()
+                .flatMap(nonWordPattern::splitAsStream)
+                .filter(str -> !str.isEmpty()).count());
+
+        reader.reset();
+        System.out.println("Newline count = " + reader.lines().count());
+        /*
+         * Input is read as a stream of lines by lines().
+         * Every line is mapped to its length.
+         * Maximum of the lengths is calculated.
+         */
+        reader.reset();
+        System.out.println("Max line length = "
+                + reader.lines().mapToInt(String::length).max().getAsInt());
+    }
+
+    private static void collectInOnePass(BufferedReader reader) {
+        /*
+         * The collect() method has three parameters:
+         * The first parameter is the {@code WCStatistic} constructor reference.
+         * collect() will create {@code WCStatistics} instances, where
+         * statistics will be aggregated.
+         * The second parameter shows how {@code WCStatistics} will process
+         * String.
+         * The third parameter shows how to merge two {@code WCStatistic}
+         * instances.
+         *
+         * Also {@code Collector} can be used, which would be more reusable
+         * solution. See {@code CSVProcessor} example for how {@code Collector}
+         * can be implemented.
+         *
+         * Note that the any performance increase when going parallel will
+         * depend on the size of the input (lines) and the cost per-element.
+         */
+        WCStatistics wc = reader.lines().parallel()
+                .collect(WCStatistics::new,
+                        WCStatistics::accept,
+                        WCStatistics::combine);
+        System.out.println(wc);
+    }
+
+    private static void usage() {
+        System.out.println("Usage: " + WC.class.getSimpleName() + " FILE");
+        System.out.println("Print newline, word,"
+                + "  character counts and max line length for FILE.");
+    }
+
+    private static class WCStatistics implements Consumer<String> {
+        /*
+         * @implNote This implementation does not need to be thread safe because
+         * the parallel implementation of
+         * {@link java.util.stream.Stream#collect Stream.collect()}
+         * provides the necessary partitioning and isolation for safe parallel
+         * execution.
+         */
+
+        private long characterCount;
+        private long lineCount;
+        private long wordCount;
+        private long maxLineLength;
+
+
+        /*
+         * Processes line.
+         */
+        @Override
+        public void accept(String line) {
+            characterCount += line.length();
+            lineCount++;
+            wordCount += nonWordPattern.splitAsStream(line)
+                    .filter(str -> !str.isEmpty()).count();
+            maxLineLength = Math.max(maxLineLength, line.length());
+        }
+
+        /*
+         * Merges two WCStatistics.
+         */
+        public void combine(WCStatistics stat) {
+            wordCount += stat.wordCount;
+            lineCount += stat.lineCount;
+            characterCount += stat.characterCount;
+            maxLineLength = Math.max(maxLineLength, stat.maxLineLength);
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("#------WCStatistic------#\n");
+            sb.append("Character count = ").append(characterCount).append('\n');
+            sb.append("Word count = ").append(wordCount).append('\n');
+            sb.append("Newline count = ").append(lineCount).append('\n');
+            sb.append("Max line length = ").append(maxLineLength).append('\n');
+            return sb.toString();
+        }
+    }
+}
diff --git a/linux-x86/sample/lambda/DefaultMethods/ArrayIterator.java b/linux-x86/sample/lambda/DefaultMethods/ArrayIterator.java
new file mode 100644
index 0000000..2eca801
--- /dev/null
+++ b/linux-x86/sample/lambda/DefaultMethods/ArrayIterator.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * The code sample illustrates the usage of default methods in the JDK 8. Most
+ * implementations of {@link Iterator} don't provide a useful
+ * {@link Iterator#remove()} method, however,
+ * they still have to implement this method to throw
+ * an UnsupportedOperationException. With the default method, the same
+ * default behavior in interface Iterator itself can be provided.
+ */
+public class ArrayIterator {
+
+    /** Close the constructor because ArrayIterator is part of the utility
+     * class.
+     */
+    protected ArrayIterator() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Returns an iterator that goes over the elements in the array.
+     *
+     * @param <E> type of an array element
+     * @param array source array to iterate over it
+     * @return an iterator that goes over the elements in the array
+     */
+    public static <E> Iterator<E> iterator(final E[] array) {
+        return new Iterator<E>() {
+            /**
+             * Index of the current position
+             *
+             */
+            private int index = 0;
+
+            /**
+             * Returns the next element in the iteration
+             *
+             * @return the next element in the iteration
+             * @throws NoSuchElementException if the iteration has no more
+             * elements
+             */
+            @Override
+            public boolean hasNext() {
+                return (index < array.length);
+            }
+
+            /**
+             * Returns {@code true} if the iteration has more elements. (In
+             * other words, returns {@code true} if {@link #next} returns
+             * an element, rather than throwing an exception.)
+             *
+             * @return {@code true} if the iteration has more elements
+             */
+            @Override
+            public E next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+                return array[index++];
+            }
+
+            /**
+             * This method does not need to be overwritten in JDK 8.
+             */
+            //@Override
+            //public void remove() {
+            //    throw UnsupportedOperationException(
+            //            "Arrays don't support remove.")
+            //}
+        };
+    }
+
+    /**
+     * Sample usage of the ArrayIterator
+     *
+     * @param args command-line arguments
+     */
+    public static void main(final String[] args) {
+        Iterator<String> it = ArrayIterator.iterator(
+                new String[]{"one", "two", "three"});
+
+        while (it.hasNext()) {
+            System.out.println(it.next());
+        }
+    }
+}
diff --git a/linux-x86/sample/lambda/DefaultMethods/DiamondInheritance.java b/linux-x86/sample/lambda/DefaultMethods/DiamondInheritance.java
new file mode 100644
index 0000000..9214d58
--- /dev/null
+++ b/linux-x86/sample/lambda/DefaultMethods/DiamondInheritance.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This sample diamond interface inheritance with <b>default methods</b>.
+ * If there's not already a unique method implementation to inherit,
+ * you must provide it. The inheritance diagram is similar to the following:
+ * <pre>
+ *                   Animal
+ *                    /   \
+ *                 Horse   Bird
+ *                    \   /
+ *                   Pegasus
+ * </pre>
+ *
+ * Both {@link Horse} and {@link Bird} interfaces implements the <code>go</code>
+ * method. The {@link Pegasus} class have to overrides the
+ * <code>go</code> method.
+ *
+ * The new syntax of super-call is used here:
+ * <pre>
+ *     &lt;interface_name&gt;.super.&lt;method&gt;(...);
+ *     For example:  Horse.super.go();
+ * </pre> So, Pegasus moves like a horse.
+ */
+public class DiamondInheritance {
+
+    /**
+     * Base interface to illustrate the diamond inheritance.
+     *
+     * @see DiamondInheritance
+     */
+    public interface Animal {
+
+        /**
+         * Return string representation of the "go" action for concrete animal
+         *
+         * @return string representation of the "go" action for concrete animal
+         */
+        String go();
+    }
+
+    /**
+     * Interface to illustrate the diamond inheritance.
+     *
+     * @see DiamondInheritance
+     */
+    public interface Horse extends Animal {
+
+        /**
+         * Return string representation of the "go" action for horse
+         *
+         * @return string representation of the "go" action for horse
+         */
+        @Override
+        default String go() {
+            return this.getClass().getSimpleName() + " walks on four legs";
+        }
+    }
+
+    /**
+     * Interface to illustrate the diamond inheritance.
+     *
+     * @see DiamondInheritance
+     */
+    public interface Bird extends Animal {
+
+        /**
+         * Return string representation of the "go" action for bird
+         *
+         * @return string representation of the "go" action for bird
+         */
+        @Override
+        default String go() {
+            return this.getClass().getSimpleName() + " walks on two legs";
+        }
+
+        /**
+         * Return string representation of the "fly" action for bird
+         *
+         * @return string representation of the "fly" action for bird
+         */
+        default String fly() {
+            return "I can fly";
+        }
+    }
+
+    /**
+     * Class to illustrate the diamond inheritance. Pegasus must mix horse and
+     * bird behavior.
+     *
+     * @see DiamondInheritance
+     */
+    public static class Pegasus implements Horse, Bird {
+
+        /**
+         * Return string representation of the "go" action for the fictitious
+         * creature Pegasus
+         *
+         * @return string representation of the "go" action for the fictitious
+         * creature Pegasus
+         */
+        @Override
+        public String go() {
+            return Horse.super.go();
+        }
+    }
+
+    /**
+     * Illustrate the behavior of the {@link Pegasus} class
+     *
+     * @param args command line arguments
+     */
+    public static void main(final String[] args) {
+        System.out.println(new Pegasus().go());
+    }
+}
diff --git a/linux-x86/sample/lambda/DefaultMethods/Inheritance.java b/linux-x86/sample/lambda/DefaultMethods/Inheritance.java
new file mode 100644
index 0000000..961de2c
--- /dev/null
+++ b/linux-x86/sample/lambda/DefaultMethods/Inheritance.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The sample illustrates rules to resolve conflicts between inheritance
+ * candidates with <b>default methods</b>. There are two simple rules:
+ * <ul>
+ * <li>Class wins. If the superclass has a concrete or abstract declaration of
+ * this method, then it is preferred over all defaults.</li>
+ * <li>Subtype wins. If an interface extends another interface, and both provide
+ * a default, then the more specific interface wins. </li>
+ * </ul>
+ */
+public class Inheritance {
+
+    /**
+     * The behavior of an creature that can swim
+     */
+    public interface Swimable {
+
+        /**
+         * Return string representation of the swim action for a creature that
+         * can swim
+         *
+         * @return string representation of the swim action for a creature
+         * that can swim
+         */
+        default String swim() {
+            return "I can swim.";
+        }
+    }
+
+    /**
+     * The abstract class that overrides {@link #swim} method
+     */
+    public abstract static class Fish implements Swimable {
+
+        /**
+         * Return string representation of the swim action for a fish
+         *
+         * @return string representation of the swim action for a fish
+         */
+        @Override
+        public String swim() {
+            return this.getClass().getSimpleName() + " swims under water";
+        }
+    }
+
+    /**
+     * This class is used for the illustration rule of 1. See the source code
+     * of the {@link #main} method.
+     * <pre>
+     *      System.out.println(new Tuna().swim()); //"Tuna swims under water" output is suspected here
+     * </pre>
+     */
+    public static class Tuna extends Fish implements Swimable {
+    }
+
+    /**
+     * The behavior of an creature that can dive: the interface that overrides
+     * {@link #swim} method (subtype of {@link Swimable})
+     */
+    public interface Diveable extends Swimable {
+
+        /**
+         * Return string representation of the swim action for a creature that
+         * can dive
+         *
+         * @return string representation of the swim action for a creature
+         * that can dive
+         */
+        @Override
+        default String swim() {
+            return "I can swim on the surface of the water.";
+        }
+
+        /**
+         * Return string representation of the dive action for a creature that
+         * can dive
+         *
+         * @return string representation of the dive action for a creature
+         * that can dive
+         */
+        default String dive() {
+            return "I can dive.";
+        }
+    }
+
+    /**
+     * This class is used for the illustration of rule 2. See the source code
+     * of the {@link #main} method
+     * <pre>
+     *      //"I can swim on the surface of the water." output is suspected here
+     *      System.out.println(new Duck().swim());
+     * </pre>
+     */
+    public static class Duck implements Swimable, Diveable {
+    }
+
+    /**
+     * Illustrate behavior of the classes: {@link Tuna} and {@link Duck}
+     *
+     * @param args command line arguments
+     */
+    public static void main(final String[] args) {
+        // Illustrates rule 1. The Fish.swim() implementation wins
+        //"Tuna swims under water" is output
+        System.out.println(new Tuna().swim());
+
+        // Illustrates rule 2. The Diveable.swim() implementation wins
+        //"I can swim on the surface of the water." is output
+        System.out.println(new Duck().swim());
+    }
+}
diff --git a/linux-x86/sample/lambda/DefaultMethods/MixIn.java b/linux-x86/sample/lambda/DefaultMethods/MixIn.java
new file mode 100644
index 0000000..d9ed81d
--- /dev/null
+++ b/linux-x86/sample/lambda/DefaultMethods/MixIn.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+
+/**
+ * The example illustrates how to use the default method for mixin.
+ * @see BuildType
+ * @see Debuggable
+ */
+public class MixIn {
+
+    /**
+     * Implement this interface for a class that must be in debug print
+     */
+    public interface Debuggable {
+
+        /**
+         * Print the class name and all fields to a string. Uses reflection to
+         * obtain and access fields of this object.
+         *
+         * @return the string formatted like the following: <pre>
+         * State of the: &lt;Class Name&gt;
+         * &lt;member name&gt; : &lt;value&gt;
+         * ...
+         * </pre>
+         */
+        default String toDebugString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("State of the: ").append(
+                    this.getClass().getSimpleName()).append("\n");
+            for (Class cls = this.getClass();
+                    cls != null;
+                    cls = cls.getSuperclass()) {
+                for (Field f : cls.getDeclaredFields()) {
+                    try {
+                        f.setAccessible(true);
+                        sb.append(f.getName()).append(" : ").
+                                append(f.get(this)).append("\n");
+                    } catch (IllegalAccessException e) {
+                    }
+                }
+            }
+            return sb.toString();
+        }
+    }
+
+    /**
+     * Sample exception class to demonstrate mixin. This enum inherits the
+     * behavior of the {@link Debuggable}
+     */
+    public static enum BuildType implements Debuggable {
+
+        BUILD(0, "-build"),
+        PLAN(0, "-plan"),
+        EXCLUDE(1, "-exclude"),
+        TOTAL(2, "-total");
+
+        private final int compareOrder;
+        private final String pathSuffix;
+
+        private BuildType(int compareOrder, String pathSuffix) {
+            this.compareOrder = compareOrder;
+            this.pathSuffix = pathSuffix;
+        }
+
+        public int getCompareOrder() {
+            return compareOrder;
+        }
+
+        public String getPathSuffix() {
+            return pathSuffix;
+        }
+    }
+
+    /**
+     * Illustrate the behavior of the MixClass
+     *
+     * @param args command-line arguments
+     * @throws java.io.IOException internal demo error
+     */
+    public static void main(final String[] args) throws IOException {
+        System.out.println(BuildType.BUILD.toDebugString());
+    }
+}
diff --git a/linux-x86/sample/lambda/DefaultMethods/Reflection.java b/linux-x86/sample/lambda/DefaultMethods/Reflection.java
new file mode 100644
index 0000000..78424a2
--- /dev/null
+++ b/linux-x86/sample/lambda/DefaultMethods/Reflection.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/**
+ * The code sample illustrates changes in the reflection API linked
+ * <b>default methods</b>. Since Java SE 8, a new method is added into the class
+ * <b><code>java.lang.reflect.Method</code></b>, with which you can reflectively
+ * determine whether or not a default method provided by an interface
+ * (<b><code>Method.isDefault()</code></b>).
+ */
+public class Reflection {
+
+    /**
+     * Base interface to illustrate the new reflection API.
+     *
+     * @see Dog
+     */
+    public interface Animal {
+
+        /**
+         * Return string representation of the eat action for Animal
+         *
+         * @return string representation of the eat action for Animal
+         */
+        default String eat() {
+            return this.getClass().getSimpleName()
+                    + " eats like an ordinary animal";
+        }
+
+        /**
+         * Return string representation of the sleep action for Animal
+         *
+         * @return string representation of the sleep action for Animal
+         */
+        default String sleep() {
+            return this.getClass().getSimpleName()
+                    + " sleeps like an ordinary animal";
+        }
+
+        /**
+         * Return string representation of the go action for Animal
+         *
+         * @return string representation of the go action for Animal
+         */
+        String go();
+    }
+
+    /**
+     * Dog class to illustrate the new reflection API. You can see that:
+     * <ul>
+     * <li> the {@link #go} and {@link #sleep} methods are not default.
+     * {@link #go} is not the default implementation and the {@link #sleep}
+     * method implementation wins as subtype (according with {@link Inheritance}
+     * rule. 2) </li>
+     * <li> the {@link #eat} is a simple default method that is not overridden
+     * in this class.
+     * </li>
+     * </ul>
+     */
+    public static class Dog implements Animal {
+
+        /**
+         * Return string representation of the go action for Dog
+         *
+         * @return string representation of the go action for Dog
+         */
+        @Override
+        public String go() {
+            return "Dog walks on four legs";
+        }
+
+        /**
+         * Return string representation of the sleep action for Dog
+         *
+         * @return string representation of the sleep action for Dog
+         */
+        @Override
+        public String sleep() {
+            return "Dog sleeps";
+        }
+    }
+
+    /**
+     * Illustrate the usage of the method java.lang.reflect.Method.isDefault()
+     *
+     * @param args command-line arguments
+     * @throws NoSuchMethodException internal demo error
+     */
+    public static void main(final String[] args) throws NoSuchMethodException {
+        Dog dog = new Dog();
+        Stream.of(Dog.class.getMethod("eat"), Dog.class.getMethod("go"), Dog.class.getMethod("sleep"))
+                .forEach((m) -> {
+                    System.out.println("Method name:   " + m.getName());
+                    System.out.println("    isDefault: " + m.isDefault());
+                    System.out.print("    invoke:    ");
+                    try {
+                        m.invoke(dog);
+                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
+                    }
+                    System.out.println();
+                });
+    }
+}
diff --git a/linux-x86/sample/lambda/DefaultMethods/SimplestUsage.java b/linux-x86/sample/lambda/DefaultMethods/SimplestUsage.java
new file mode 100644
index 0000000..a971858
--- /dev/null
+++ b/linux-x86/sample/lambda/DefaultMethods/SimplestUsage.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The sample illustrates the simplest use case of the <b>default methods</b>.
+ */
+public class SimplestUsage {
+
+    /**
+     * The Animal interface provides the default implementation
+     * of the {@link #eat} method.
+     */
+    public interface Animal {
+
+        /**
+         * Return string representation of the eat action for Animal
+         *
+         * @return string representation of the eat action for Animal
+         */
+        default String eat() {
+            return this.getClass().getSimpleName()
+                    + " eats like an ordinary animal";
+        }
+    }
+
+    /**
+     * The Dog class doesn't have its own implementation of the {@link #eat}
+     * method and uses the default implementation.
+     */
+    public static class Dog implements Animal {
+    }
+
+    /**
+     * The Mosquito class implements {@link #eat} method, its own implementation
+     * overrides the default implementation.
+     *
+     */
+    public static class Mosquito implements Animal {
+
+        /**
+         * Return string representation of the eat action for Mosquito
+         *
+         * @return string representation of the eat action for Mosquito
+         */
+        @Override
+        public String eat() {
+            return "Mosquito consumes blood";
+        }
+    }
+
+    /**
+     * Illustrate behavior of the classes: {@link Dog} and {@link Mosquito}
+     *
+     * @param args command-line arguments
+     */
+    public static void main(String[] args) {
+        // "Dog eats like an ordinary animal" is output
+        System.out.println(new Dog().eat());
+
+        // "Mosquito consumes blood" is output
+        System.out.println(new Mosquito().eat());
+    }
+}
diff --git a/linux-x86/sample/nbproject/project.xml b/linux-x86/sample/nbproject/project.xml
new file mode 100644
index 0000000..8417326
--- /dev/null
+++ b/linux-x86/sample/nbproject/project.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>JDK Samples</name>
+            <view>
+                <items/>
+            </view>
+            <subprojects>
+                <project>jmx/jmx-scandir</project>
+                <project>scripting/scriptpad</project>
+                <project>webservices/EbayClient</project>
+                <project>webservices/EbayServer</project>
+            </subprojects>
+        </general-data>
+    </configuration>
+</project>
diff --git a/linux-x86/sample/nio/chatserver/ChatServer.java b/linux-x86/sample/nio/chatserver/ChatServer.java
new file mode 100644
index 0000000..f807aa1
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/ChatServer.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.StandardSocketOptions;
+import java.nio.channels.*;
+import java.util.*;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Implements a chat server, this class holds the list of {@code clients} connected to the server.
+ * It sets up a server socket using AsynchronousServerSocketChannel listening to a specified port.
+ */
+public class ChatServer implements Runnable {
+    private final List<Client> connections = Collections.synchronizedList(new ArrayList<Client>());
+    private int port;
+    private final AsynchronousServerSocketChannel listener;
+    private final AsynchronousChannelGroup channelGroup;
+
+    /**
+     *
+     * @param port to listen to
+     * @throws java.io.IOException when failing to start the server
+     */
+    public ChatServer(int port) throws IOException {
+        channelGroup = AsynchronousChannelGroup.withFixedThreadPool(Runtime.getRuntime().availableProcessors(),
+                Executors.defaultThreadFactory());
+        this.port = port;
+        listener = createListener(channelGroup);
+    }
+
+    /**
+     *
+     * @return The socket address that the server is bound to
+     * @throws java.io.IOException if an I/O error occurs
+     */
+    public SocketAddress getSocketAddress() throws IOException {
+        return listener.getLocalAddress();
+    }
+
+    /**
+     * Start accepting connections
+     */
+    public void run() {
+
+        // call accept to wait for connections, tell it to call our CompletionHandler when there
+        // is a new incoming connection
+        listener.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
+            @Override
+            public void completed(AsynchronousSocketChannel result, Void attachment) {
+                // request a new accept and handle the incoming connection
+                listener.accept(null, this);
+                handleNewConnection(result);
+            }
+
+            @Override
+            public void failed(Throwable exc, Void attachment) {
+            }
+        });
+    }
+
+    /**
+     * Shuts down the server
+     * @throws InterruptedException if terminated while waiting for shutdown
+     * @throws IOException if failing to shutdown the channel group
+     */
+    public void shutdown() throws InterruptedException, IOException {
+        channelGroup.shutdownNow();
+        channelGroup.awaitTermination(1, TimeUnit.SECONDS);
+    }
+
+    /*
+    * Creates a listener and starts accepting connections
+    */
+    private AsynchronousServerSocketChannel createListener(AsynchronousChannelGroup channelGroup) throws IOException {
+        final AsynchronousServerSocketChannel listener = openChannel(channelGroup);
+        listener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
+        listener.bind(new InetSocketAddress(port));
+        return listener;
+    }
+
+    private AsynchronousServerSocketChannel openChannel(AsynchronousChannelGroup channelGroup) throws IOException {
+        return AsynchronousServerSocketChannel.open(channelGroup);
+    }
+
+    /**
+     * Creates a new client and adds it to the list of connections.
+     * Sets the clients handler to the initial state of NameReader
+     *
+     * @param channel the newly accepted channel
+     */
+    private void handleNewConnection(AsynchronousSocketChannel channel) {
+        Client client = new Client(channel, new ClientReader(this, new NameReader(this)));
+        try {
+            channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
+        } catch (IOException e) {
+            // ignore
+        }
+        connections.add(client);
+        client.run();
+    }
+
+    /**
+     * Sends a message to all clients except the source.
+     * The method is synchronized as it is desired that messages are sent to
+     * all clients in the same order as received.
+     *
+     * @param client the message source
+     * @param message the message to be sent
+     */
+    public void writeMessageToClients(Client client, String message) {
+        synchronized (connections) {
+            for (Client clientConnection : connections) {
+                if (clientConnection != client) {
+                    clientConnection.writeMessageFrom(client, message);
+                }
+            }
+        }
+    }
+
+    public void removeClient(Client client) {
+        connections.remove(client);
+    }
+
+    private static void usage() {
+        System.err.println("ChatServer [-port <port number>]");
+        System.exit(1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        int port = 5000;
+        if (args.length != 0 && args.length != 2) {
+            usage();
+        } else if (args.length == 2) {
+            try {
+                if (args[0].equals("-port")) {
+                    port = Integer.parseInt(args[1]);
+                } else {
+                    usage();
+                }
+            } catch (NumberFormatException e) {
+                usage();
+            }
+        }
+        System.out.println("Running on port " + port);
+        new ChatServer(port).run();
+    }
+}
diff --git a/linux-x86/sample/nio/chatserver/Client.java b/linux-x86/sample/nio/chatserver/Client.java
new file mode 100644
index 0000000..31ee034
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/Client.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.CompletionHandler;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Client represents a remote connection to the chat server.
+ * It contains methods for reading and writing messages from the
+ * channel.
+ * Messages are considered to be separated by newline, so incomplete
+ * messages are buffered in the {@code Client}.
+ *
+ * All reads and writes are asynchronous and uses the nio2 asynchronous
+ * elements.
+ */
+class Client {
+    private final AsynchronousSocketChannel channel;
+    private AtomicReference<ClientReader> reader;
+    private String userName;
+    private final StringBuilder messageBuffer = new StringBuilder();
+
+    private final Queue<ByteBuffer> queue = new LinkedList<ByteBuffer>();
+    private boolean writing = false;
+
+    public Client(AsynchronousSocketChannel channel, ClientReader reader) {
+        this.channel = channel;
+        this.reader = new AtomicReference<ClientReader>(reader);
+    }
+
+    /**
+     * Enqueues a write of the buffer to the channel.
+     * The call is asynchronous so the buffer is not safe to modify after
+     * passing the buffer here.
+     *
+     * @param buffer the buffer to send to the channel
+     */
+    private void writeMessage(final ByteBuffer buffer) {
+        boolean threadShouldWrite = false;
+
+        synchronized(queue) {
+            queue.add(buffer);
+            // Currently no thread writing, make this thread dispatch a write
+            if (!writing) {
+                writing = true;
+                threadShouldWrite = true;
+            }
+        }
+
+        if (threadShouldWrite) {
+            writeFromQueue();
+        }
+    }
+
+    private void writeFromQueue() {
+        ByteBuffer buffer;
+
+        synchronized (queue) {
+            buffer = queue.poll();
+            if (buffer == null) {
+                writing = false;
+            }
+        }
+
+        // No new data in buffer to write
+        if (writing) {
+            writeBuffer(buffer);
+        }
+    }
+
+    private void writeBuffer(ByteBuffer buffer) {
+        channel.write(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
+            @Override
+            public void completed(Integer result, ByteBuffer buffer) {
+                if (buffer.hasRemaining()) {
+                    channel.write(buffer, buffer, this);
+                } else {
+                    // Go back and check if there is new data to write
+                    writeFromQueue();
+                }
+            }
+
+            @Override
+            public void failed(Throwable exc, ByteBuffer attachment) {
+            }
+        });
+    }
+
+    /**
+     * Sends a message
+     * @param string the message
+     */
+    public void writeStringMessage(String string) {
+        writeMessage(ByteBuffer.wrap(string.getBytes()));
+    }
+
+    /**
+     * Send a message from a specific client
+     * @param client the message is sent from
+     * @param message to send
+     */
+    public void writeMessageFrom(Client client, String message) {
+        if (reader.get().acceptsMessages()) {
+            writeStringMessage(client.getUserName() + ": " + message);
+        }
+    }
+
+    /**
+     * Enqueue a read
+     * @param completionHandler callback on completed read
+     */
+    public void read(CompletionHandler<Integer, ? super ByteBuffer> completionHandler) {
+        ByteBuffer input = ByteBuffer.allocate(256);
+        if (!channel.isOpen()) {
+            return;
+        }
+        channel.read(input, input, completionHandler);
+    }
+
+    /**
+     * Closes the channel
+     */
+    public void close() {
+        try {
+            channel.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Run the current states actions.
+     */
+    public void run() {
+        reader.get().run(this);
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public void setReader(ClientReader reader) {
+        this.reader.set(reader);
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void appendMessage(String message) {
+        synchronized (messageBuffer) {
+            messageBuffer.append(message);
+        }
+    }
+
+    /**
+     * @return the next newline separated message in the buffer. null is returned if the buffer
+     * doesn't contain any newline.
+     */
+    public String nextMessage() {
+        synchronized(messageBuffer) {
+            int nextNewline = messageBuffer.indexOf("\n");
+            if (nextNewline == -1) {
+                return null;
+            }
+            String message = messageBuffer.substring(0, nextNewline + 1);
+            messageBuffer.delete(0, nextNewline + 1);
+            return message;
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/chatserver/ClientReader.java b/linux-x86/sample/nio/chatserver/ClientReader.java
new file mode 100644
index 0000000..822125a
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/ClientReader.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+import java.nio.channels.CompletionHandler;
+
+/**
+ * Handles a cycle of reading / writing on the {@code Client}.
+ */
+class ClientReader {
+    private final DataReader callback;
+    private final ChatServer chatServer;
+
+    ClientReader(ChatServer chatServer, DataReader callback) {
+        this.chatServer = chatServer;
+        this.callback = callback;
+    }
+
+    public boolean acceptsMessages() {
+        return callback.acceptsMessages();
+    }
+
+    /**
+     * Runs a cycle of doing a beforeRead action and then enqueuing a new
+     * read on the client. Handles closed channels and errors while reading.
+     * If the client is still connected a new round of actions are called.
+     */
+    public void run(final Client client) {
+        callback.beforeRead(client);
+        client.read(new CompletionHandler<Integer, ByteBuffer>() {
+            @Override
+            public void completed(Integer result, ByteBuffer buffer) {
+                // if result is negative or zero the connection has been closed or something gone wrong
+                if (result < 1) {
+                    client.close();
+                    System.out.println("Closing connection to " + client);
+                    chatServer.removeClient(client);
+                } else {
+                    callback.onData(client, buffer, result);
+                    // enqueue next round of actions
+                    client.run();
+                }
+            }
+
+            @Override
+            public void failed(Throwable exc, ByteBuffer buffer) {
+                client.close();
+                chatServer.removeClient(client);
+            }
+        });
+    }
+}
diff --git a/linux-x86/sample/nio/chatserver/DataReader.java b/linux-x86/sample/nio/chatserver/DataReader.java
new file mode 100644
index 0000000..8858c9f
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/DataReader.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+
+public interface DataReader {
+    void beforeRead(Client client);
+    void onData(Client client, ByteBuffer buffer, int bytes);
+    boolean acceptsMessages();
+}
diff --git a/linux-x86/sample/nio/chatserver/MessageReader.java b/linux-x86/sample/nio/chatserver/MessageReader.java
new file mode 100644
index 0000000..81c370b
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/MessageReader.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+
+/**
+ * Writes all messages in our buffer to the other clients
+ * and appends new data read from the socket to our buffer
+ */
+class MessageReader implements DataReader {
+    private final ChatServer chatServer;
+
+    public MessageReader(ChatServer chatServer) {
+        this.chatServer = chatServer;
+    }
+
+    public boolean acceptsMessages() {
+        return true;
+    }
+
+    /**
+     * Write all full messages in our buffer to
+     * the other clients
+     *
+     * @param client the client to read messages from
+     */
+    @Override
+    public void beforeRead(Client client) {
+        // Check if we have any messages buffered and send them
+        String message = client.nextMessage();
+        while (message != null) {
+            chatServer.writeMessageToClients(client, message);
+            message = client.nextMessage();
+        }
+    }
+
+    /**
+     * Append the read buffer to the clients message buffer
+     * @param client the client to append messages to
+     * @param buffer the buffer we received from the socket
+     * @param bytes the number of bytes read into the buffer
+     */
+    @Override
+    public void onData(Client client, ByteBuffer buffer, int bytes) {
+        buffer.flip();
+        // Just append the message on the buffer
+        client.appendMessage(new String(buffer.array(), 0, bytes));
+    }
+}
diff --git a/linux-x86/sample/nio/chatserver/NameReader.java b/linux-x86/sample/nio/chatserver/NameReader.java
new file mode 100644
index 0000000..341d4da
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/NameReader.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2011 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+
+/**
+ * The first state a newly connected {@code Client} is in, this
+ * handles writing out the welcoming message and reads the response
+ * up to a newline. When a newline character have been received
+ * it changes the handler from NameReader to MessageReader on the
+ * client.
+ */
+class NameReader implements DataReader {
+    private final StringBuilder buffer = new StringBuilder();
+    private final ChatServer chatServer;
+    private boolean once = true;
+    private static final String NEWLINE = "\n";
+
+    public NameReader(ChatServer chatServer) {
+        this.chatServer = chatServer;
+    }
+
+    /**
+     * Writes the welcoming message to the client the first time this method
+     * is called.
+     *
+     * @param client the client to receive the message
+     */
+    @Override
+    public void beforeRead(Client client) {
+        // if it is a long name that takes more than one read we only want to display Name: once.
+        if (once) {
+            client.writeStringMessage("Name: ");
+            once = false;
+        }
+    }
+
+    public boolean acceptsMessages() {
+        return false;
+    }
+
+    /**
+     * Receives incoming data from the socket, searches for a newline
+     * and tries to set the username if one is found
+     */
+    @Override
+    public void onData(Client client, ByteBuffer buffer, int bytes) {
+        buffer.flip();
+        String name;
+        name = this.buffer.append(new String(buffer.array(), 0, bytes)).toString();
+        if (name.contains(NEWLINE)) {
+            onUserNameRead(client, name);
+        }
+    }
+
+    /**
+     * Splits the name on the newlines, takes the first as the username
+     * and appends everything else to the clients message buffer.
+     * Sets the clients handler to MessageReader.
+     *
+     * @param client the client to set the username for
+     * @param name the string containing the buffered input
+     */
+    private void onUserNameRead(Client client, String name) {
+        String[] strings = name.split(NEWLINE, 2);
+        client.setUserName(strings[0].trim());
+        sendRemainingParts(client, strings);
+        client.setReader(new ClientReader(chatServer, new MessageReader(chatServer)));
+        client.writeStringMessage("Welcome " + client.getUserName() + "\n");
+    }
+
+    /**
+     * Appends the remaining parts to the clients message buffer
+     *
+     * @param client the client
+     * @param strings the messages to append to the buffer
+     */
+    private void sendRemainingParts(Client client, String[] strings) {
+        for (int i = 1; i < strings.length; ++i) {
+            client.appendMessage(strings[i]);
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/chatserver/README.txt b/linux-x86/sample/nio/chatserver/README.txt
new file mode 100644
index 0000000..ec9b476
--- /dev/null
+++ b/linux-x86/sample/nio/chatserver/README.txt
@@ -0,0 +1,62 @@
+A Simple Chat Server Example
+
+INTRODUCTION
+============
+This directory contains a very simple chat server, the server takes input from a
+socket ("user") and sends it to all other connected sockets ("users") along with
+the provided name the user was asked for when first connecting.
+
+The server was written to demonstrate the asynchronous I/O API in JDK 7. 
+The sample assumes the reader has some familiarity with the subject matter.
+
+SETUP
+=====
+
+The server must be built with version 7 (or later) of the JDK.
+The server is built with:
+
+    % mkdir build
+    % javac -source 7 -target 7 -d build *.java
+
+EXECUTION
+=========
+
+    % java -classpath build ChatServer [-port <port number>]
+
+    Usage:  ChatServer [options]
+        options:
+            -port port      port number
+                default: 5000
+
+CLIENT EXECUTION
+================
+
+No client binary is included in the sample.
+Connections can be made using for example the telnet command or any program
+that supports a raw TCP connection to a port.
+
+SOURCE CODE OVERVIEW
+====================
+ChatServer is the main class, it handles the startup and handles incoming
+connections on the listening sockets. It keeps a list of connected client
+and provides methods for sending a message to them.
+
+Client represents a connected user, it provides methods for reading/writing
+from/to the underlying socket. It also contains a buffer of input read from
+the user.
+
+DataReader provides the interface of the two states a user can
+be in. Waiting for a name (and not receiving any messages while doing so, implemented
+by NameReader) and waiting for messages from the user (implemented by MessageReader).
+
+ClientReader contains the "main loop" for a connected client. 
+
+NameReader is the initial state for a new client, it sends the user a string and
+waits for a response before changing the state to MessageReader.
+
+MessageReader is the main state for a client, it checks for new messages to send to
+other clients and reads messages from the client.
+
+FINALLY
+=======
+This is a sample: it is not production quality and isn't optimized for performance.
diff --git a/linux-x86/sample/nio/file/AclEdit.java b/linux-x86/sample/nio/file/AclEdit.java
new file mode 100644
index 0000000..90af865
--- /dev/null
+++ b/linux-x86/sample/nio/file/AclEdit.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * Sample utility for editing a file's ACL.
+ */
+
+public class AclEdit {
+
+    // parse string as list of ACE permissions separated by /
+    static Set<AclEntryPermission> parsePermissions(String permsString) {
+        Set<AclEntryPermission> perms = new HashSet<AclEntryPermission>();
+        String[] result = permsString.split("/");
+        for (String s : result) {
+            if (s.equals(""))
+                continue;
+            try {
+                perms.add(AclEntryPermission.valueOf(s.toUpperCase()));
+            } catch (IllegalArgumentException x) {
+                System.err.format("Invalid permission '%s'\n", s);
+                System.exit(-1);
+            }
+        }
+        return perms;
+    }
+
+    // parse string as list of ACE flags separated by /
+    static Set<AclEntryFlag> parseFlags(String flagsString) {
+        Set<AclEntryFlag> flags = new HashSet<AclEntryFlag>();
+        String[] result = flagsString.split("/");
+        for (String s : result) {
+            if (s.equals(""))
+                continue;
+            try {
+                flags.add(AclEntryFlag.valueOf(s.toUpperCase()));
+            } catch (IllegalArgumentException x) {
+                System.err.format("Invalid flag '%s'\n", s);
+                System.exit(-1);
+            }
+        }
+        return flags;
+    }
+
+    // parse ACE type
+    static AclEntryType parseType(String typeString) {
+        // FIXME: support audit and alarm types in the future
+        if (typeString.equalsIgnoreCase("allow"))
+            return AclEntryType.ALLOW;
+        if (typeString.equalsIgnoreCase("deny"))
+            return AclEntryType.DENY;
+        System.err.format("Invalid type '%s'\n", typeString);
+        System.exit(-1);
+        return null;    // keep compiler happy
+    }
+
+    /**
+     * Parse string of the form:
+     *   [user|group:]<username|groupname>:<perms>[:flags]:<allow|deny>
+     */
+    static AclEntry parseAceString(String s,
+                                   UserPrincipalLookupService lookupService)
+    {
+        String[] result = s.split(":");
+
+        // must have at least 3 components (username:perms:type)
+        if (result.length < 3)
+            usage();
+
+        int index = 0;
+        int remaining = result.length;
+
+        // optional first component can indicate user or group type
+        boolean isGroup = false;
+        if (result[index].equalsIgnoreCase("user") ||
+            result[index].equalsIgnoreCase("group"))
+        {
+            if (--remaining < 3)
+                usage();
+            isGroup = result[index++].equalsIgnoreCase("group");
+        }
+
+        // user and permissions required
+        String userString = result[index++]; remaining--;
+        String permsString = result[index++]; remaining--;
+
+        // flags are optional
+        String flagsString = "";
+        String typeString = null;
+        if (remaining == 1) {
+            typeString = result[index++];
+        } else {
+            if (remaining == 2) {
+                flagsString = result[index++];
+                typeString = result[index++];
+            } else {
+                usage();
+            }
+        }
+
+        // lookup UserPrincipal
+        UserPrincipal user = null;
+        try {
+            user = (isGroup) ?
+                lookupService.lookupPrincipalByGroupName(userString) :
+                lookupService.lookupPrincipalByName(userString);
+        } catch (UserPrincipalNotFoundException x) {
+            System.err.format("Invalid %s '%s'\n",
+                ((isGroup) ? "group" : "user"),
+                userString);
+            System.exit(-1);
+        } catch (IOException x) {
+            System.err.format("Lookup of '%s' failed: %s\n", userString, x);
+            System.exit(-1);
+        }
+
+        // map string representation of permissions, flags, and type
+        Set<AclEntryPermission> perms = parsePermissions(permsString);
+        Set<AclEntryFlag> flags = parseFlags(flagsString);
+        AclEntryType type = parseType(typeString);
+
+        // build the ACL entry
+        return AclEntry.newBuilder()
+            .setType(type)
+            .setPrincipal(user)
+            .setPermissions(perms).setFlags(flags).build();
+    }
+
+    static void usage() {
+        System.err.println("usage: java AclEdit [ACL-operation] file");
+        System.err.println("");
+        System.err.println("Example 1: Prepends access control entry to the begining of the myfile's ACL");
+        System.err.println("       java AclEdit A+alice:read_data/read_attributes:allow myfile");
+        System.err.println("");
+        System.err.println("Example 2: Remove the entry at index 6 of myfile's ACL");
+        System.err.println("       java AclEdit A6- myfile");
+        System.err.println("");
+        System.err.println("Example 3: Replace the entry at index 2 of myfile's ACL");
+        System.err.println("       java AclEdit A2=bob:write_data/append_data:deny myfile");
+        System.exit(-1);
+    }
+
+    static enum Action {
+        PRINT,
+        ADD,
+        REMOVE,
+        REPLACE;
+    }
+
+    /**
+     * Main class: parses arguments and prints or edits ACL
+     */
+    public static void main(String[] args) throws IOException {
+        Action action = null;
+        int index = -1;
+        String entryString = null;
+
+        // parse arguments
+        if (args.length < 1 || args[0].equals("-help") || args[0].equals("-?"))
+            usage();
+
+        if (args.length == 1) {
+            action = Action.PRINT;
+        } else {
+            String s = args[0];
+
+            // A[index]+entry
+            if (Pattern.matches("^A[0-9]*\\+.*", s)) {
+                String[] result = s.split("\\+", 2);
+                if (result.length == 2) {
+                    if (result[0].length() < 2) {
+                        index = 0;
+                    } else {
+                        index = Integer.parseInt(result[0].substring(1));
+                    }
+                    entryString = result[1];
+                    action = Action.ADD;
+                }
+            }
+
+            // Aindex-
+            if (Pattern.matches("^A[0-9]+\\-", s)) {
+                String[] result = s.split("\\-", 2);
+                if (result.length == 2) {
+                    index = Integer.parseInt(result[0].substring(1));
+                    entryString = result[1];
+                    action = Action.REMOVE;
+                }
+            }
+
+            // Aindex=entry
+            if (Pattern.matches("^A[0-9]+=.*", s)) {
+                String[] result = s.split("=", 2);
+                if (result.length == 2) {
+                    index = Integer.parseInt(result[0].substring(1));
+                    entryString = result[1];
+                    action = Action.REPLACE;
+                }
+            }
+        }
+        if (action == null)
+            usage();
+
+        int fileArg = (action == Action.PRINT) ? 0 : 1;
+        Path file = Paths.get(args[fileArg]);
+
+        // read file's ACL
+        AclFileAttributeView view =
+            Files.getFileAttributeView(file, AclFileAttributeView.class);
+        if (view == null) {
+            System.err.println("ACLs not supported on this platform");
+            System.exit(-1);
+        }
+        List<AclEntry> acl = view.getAcl();
+
+        switch (action) {
+            // print ACL
+            case PRINT : {
+                for (int i=0; i<acl.size(); i++) {
+                    System.out.format("%5d: %s\n", i, acl.get(i));
+                }
+                break;
+            }
+
+            // add ACE to existing ACL
+            case ADD: {
+                AclEntry entry = parseAceString(entryString, file
+                    .getFileSystem().getUserPrincipalLookupService());
+                if (index >= acl.size()) {
+                    acl.add(entry);
+                } else {
+                    acl.add(index, entry);
+                }
+                view.setAcl(acl);
+                break;
+            }
+
+            // remove ACE
+            case REMOVE: {
+                if (index >= acl.size()) {
+                    System.err.format("Index '%d' is invalid", index);
+                    System.exit(-1);
+                }
+                acl.remove(index);
+                view.setAcl(acl);
+                break;
+            }
+
+            // replace ACE
+            case REPLACE: {
+                if (index >= acl.size()) {
+                    System.err.format("Index '%d' is invalid", index);
+                    System.exit(-1);
+                }
+                AclEntry entry = parseAceString(entryString, file
+                    .getFileSystem().getUserPrincipalLookupService());
+                acl.set(index, entry);
+                view.setAcl(acl);
+                break;
+            }
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/file/Chmod.java b/linux-x86/sample/nio/file/Chmod.java
new file mode 100644
index 0000000..05c16b9
--- /dev/null
+++ b/linux-x86/sample/nio/file/Chmod.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import static java.nio.file.attribute.PosixFilePermission.*;
+import static java.nio.file.FileVisitResult.*;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Sample code that changes the permissions of files in a similar manner to the
+ * chmod(1) program.
+ */
+
+public class Chmod {
+
+    /**
+     * Compiles a list of one or more <em>symbolic mode expressions</em> that
+     * may be used to change a set of file permissions. This method is
+     * intended for use where file permissions are required to be changed in
+     * a manner similar to the UNIX <i>chmod</i> program.
+     *
+     * <p> The {@code exprs} parameter is a comma separated list of expressions
+     * where each takes the form:
+     * <blockquote>
+     * <i>who operator</i> [<i>permissions</i>]
+     * </blockquote>
+     * where <i>who</i> is one or more of the characters {@code 'u'}, {@code 'g'},
+     * {@code 'o'}, or {@code 'a'} meaning the owner (user), group, others, or
+     * all (owner, group, and others) respectively.
+     *
+     * <p> <i>operator</i> is the character {@code '+'}, {@code '-'}, or {@code
+     * '='} signifying how permissions are to be changed. {@code '+'} means the
+     * permissions are added, {@code '-'} means the permissions are removed, and
+     * {@code '='} means the permissions are assigned absolutely.
+     *
+     * <p> <i>permissions</i> is a sequence of zero or more of the following:
+     * {@code 'r'} for read permission, {@code 'w'} for write permission, and
+     * {@code 'x'} for execute permission. If <i>permissions</i> is omitted
+     * when assigned absolutely, then the permissions are cleared for
+     * the owner, group, or others as identified by <i>who</i>. When omitted
+     * when adding or removing then the expression is ignored.
+     *
+     * <p> The following examples demonstrate possible values for the {@code
+     * exprs} parameter:
+     *
+     * <table border="0">
+     * <tr>
+     *   <td> {@code u=rw} </td>
+     *   <td> Sets the owner permissions to be read and write. </td>
+     * </tr>
+     * <tr>
+     *   <td> {@code ug+w} </td>
+     *   <td> Sets the owner write and group write permissions. </td>
+     * </tr>
+     * <tr>
+     *   <td> {@code u+w,o-rwx} </td>
+     *   <td> Sets the owner write, and removes the others read, others write
+     *     and others execute permissions. </td>
+     * </tr>
+     * <tr>
+     *   <td> {@code o=} </td>
+     *   <td> Sets the others permission to none (others read, others write and
+     *     others execute permissions are removed if set) </td>
+     * </tr>
+     * </table>
+     *
+     * @param   exprs
+     *          List of one or more <em>symbolic mode expressions</em>
+     *
+     * @return  A {@code Changer} that may be used to changer a set of
+     *          file permissions
+     *
+     * @throws  IllegalArgumentException
+     *          If the value of the {@code exprs} parameter is invalid
+     */
+    public static Changer compile(String exprs) {
+        // minimum is who and operator (u= for example)
+        if (exprs.length() < 2)
+            throw new IllegalArgumentException("Invalid mode");
+
+        // permissions that the changer will add or remove
+        final Set<PosixFilePermission> toAdd = new HashSet<PosixFilePermission>();
+        final Set<PosixFilePermission> toRemove = new HashSet<PosixFilePermission>();
+
+        // iterate over each of expression modes
+        for (String expr: exprs.split(",")) {
+            // minimum of who and operator
+            if (expr.length() < 2)
+                throw new IllegalArgumentException("Invalid mode");
+
+            int pos = 0;
+
+            // who
+            boolean u = false;
+            boolean g = false;
+            boolean o = false;
+            boolean done = false;
+            for (;;) {
+                switch (expr.charAt(pos)) {
+                    case 'u' : u = true; break;
+                    case 'g' : g = true; break;
+                    case 'o' : o = true; break;
+                    case 'a' : u = true; g = true; o = true; break;
+                    default : done = true;
+                }
+                if (done)
+                    break;
+                pos++;
+            }
+            if (!u && !g && !o)
+                throw new IllegalArgumentException("Invalid mode");
+
+            // get operator and permissions
+            char op = expr.charAt(pos++);
+            String mask = (expr.length() == pos) ? "" : expr.substring(pos);
+
+            // operator
+            boolean add = (op == '+');
+            boolean remove = (op == '-');
+            boolean assign = (op == '=');
+            if (!add && !remove && !assign)
+                throw new IllegalArgumentException("Invalid mode");
+
+            // who= means remove all
+            if (assign && mask.length() == 0) {
+                assign = false;
+                remove = true;
+                mask = "rwx";
+            }
+
+            // permissions
+            boolean r = false;
+            boolean w = false;
+            boolean x = false;
+            for (int i=0; i<mask.length(); i++) {
+                switch (mask.charAt(i)) {
+                    case 'r' : r = true; break;
+                    case 'w' : w = true; break;
+                    case 'x' : x = true; break;
+                    default:
+                        throw new IllegalArgumentException("Invalid mode");
+                }
+            }
+
+            // update permissions set
+            if (add) {
+                if (u) {
+                    if (r) toAdd.add(OWNER_READ);
+                    if (w) toAdd.add(OWNER_WRITE);
+                    if (x) toAdd.add(OWNER_EXECUTE);
+                }
+                if (g) {
+                    if (r) toAdd.add(GROUP_READ);
+                    if (w) toAdd.add(GROUP_WRITE);
+                    if (x) toAdd.add(GROUP_EXECUTE);
+                }
+                if (o) {
+                    if (r) toAdd.add(OTHERS_READ);
+                    if (w) toAdd.add(OTHERS_WRITE);
+                    if (x) toAdd.add(OTHERS_EXECUTE);
+                }
+            }
+            if (remove) {
+                if (u) {
+                    if (r) toRemove.add(OWNER_READ);
+                    if (w) toRemove.add(OWNER_WRITE);
+                    if (x) toRemove.add(OWNER_EXECUTE);
+                }
+                if (g) {
+                    if (r) toRemove.add(GROUP_READ);
+                    if (w) toRemove.add(GROUP_WRITE);
+                    if (x) toRemove.add(GROUP_EXECUTE);
+                }
+                if (o) {
+                    if (r) toRemove.add(OTHERS_READ);
+                    if (w) toRemove.add(OTHERS_WRITE);
+                    if (x) toRemove.add(OTHERS_EXECUTE);
+                }
+            }
+            if (assign) {
+                if (u) {
+                    if (r) toAdd.add(OWNER_READ);
+                      else toRemove.add(OWNER_READ);
+                    if (w) toAdd.add(OWNER_WRITE);
+                      else toRemove.add(OWNER_WRITE);
+                    if (x) toAdd.add(OWNER_EXECUTE);
+                      else toRemove.add(OWNER_EXECUTE);
+                }
+                if (g) {
+                    if (r) toAdd.add(GROUP_READ);
+                      else toRemove.add(GROUP_READ);
+                    if (w) toAdd.add(GROUP_WRITE);
+                      else toRemove.add(GROUP_WRITE);
+                    if (x) toAdd.add(GROUP_EXECUTE);
+                      else toRemove.add(GROUP_EXECUTE);
+                }
+                if (o) {
+                    if (r) toAdd.add(OTHERS_READ);
+                      else toRemove.add(OTHERS_READ);
+                    if (w) toAdd.add(OTHERS_WRITE);
+                      else toRemove.add(OTHERS_WRITE);
+                    if (x) toAdd.add(OTHERS_EXECUTE);
+                      else toRemove.add(OTHERS_EXECUTE);
+                }
+            }
+        }
+
+        // return changer
+        return new Changer() {
+            @Override
+            public Set<PosixFilePermission> change(Set<PosixFilePermission> perms) {
+                perms.addAll(toAdd);
+                perms.removeAll(toRemove);
+                return perms;
+            }
+        };
+    }
+
+    /**
+     * A task that <i>changes</i> a set of {@link PosixFilePermission} elements.
+     */
+    public interface Changer {
+        /**
+         * Applies the changes to the given set of permissions.
+         *
+         * @param   perms
+         *          The set of permissions to change
+         *
+         * @return  The {@code perms} parameter
+         */
+        Set<PosixFilePermission> change(Set<PosixFilePermission> perms);
+    }
+
+    /**
+     * Changes the permissions of the file using the given Changer.
+     */
+    static void chmod(Path file, Changer changer) {
+        try {
+            Set<PosixFilePermission> perms = Files.getPosixFilePermissions(file);
+            Files.setPosixFilePermissions(file, changer.change(perms));
+        } catch (IOException x) {
+            System.err.println(x);
+        }
+    }
+
+    /**
+     * Changes the permission of each file and directory visited
+     */
+    static class TreeVisitor implements FileVisitor<Path> {
+        private final Changer changer;
+
+        TreeVisitor(Changer changer) {
+            this.changer = changer;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+            chmod(dir, changer);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+            chmod(file, changer);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+            if (exc != null)
+                System.err.println("WARNING: " + exc);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFileFailed(Path file, IOException exc) {
+            System.err.println("WARNING: " + exc);
+            return CONTINUE;
+        }
+    }
+
+    static void usage() {
+        System.err.println("java Chmod [-R] symbolic-mode-list file...");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length < 2)
+            usage();
+        int argi = 0;
+        int maxDepth = 0;
+        if (args[argi].equals("-R")) {
+            if (args.length < 3)
+                usage();
+            argi++;
+            maxDepth = Integer.MAX_VALUE;
+        }
+
+        // compile the symbolic mode expressions
+        Changer changer = compile(args[argi++]);
+        TreeVisitor visitor = new TreeVisitor(changer);
+
+        Set<FileVisitOption> opts = Collections.emptySet();
+        while (argi < args.length) {
+            Path file = Paths.get(args[argi]);
+            Files.walkFileTree(file, opts, maxDepth, visitor);
+            argi++;
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/file/Copy.java b/linux-x86/sample/nio/file/Copy.java
new file mode 100644
index 0000000..0d61ef3
--- /dev/null
+++ b/linux-x86/sample/nio/file/Copy.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import static java.nio.file.StandardCopyOption.*;
+import java.nio.file.attribute.*;
+import static java.nio.file.FileVisitResult.*;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Sample code that copies files in a similar manner to the cp(1) program.
+ */
+
+public class Copy {
+
+    /**
+     * Returns {@code true} if okay to overwrite a  file ("cp -i")
+     */
+    static boolean okayToOverwrite(Path file) {
+        String answer = System.console().readLine("overwrite %s (yes/no)? ", file);
+        return (answer.equalsIgnoreCase("y") || answer.equalsIgnoreCase("yes"));
+    }
+
+    /**
+     * Copy source file to target location. If {@code prompt} is true then
+     * prompt user to overwrite target if it exists. The {@code preserve}
+     * parameter determines if file attributes should be copied/preserved.
+     */
+    static void copyFile(Path source, Path target, boolean prompt, boolean preserve) {
+        CopyOption[] options = (preserve) ?
+            new CopyOption[] { COPY_ATTRIBUTES, REPLACE_EXISTING } :
+            new CopyOption[] { REPLACE_EXISTING };
+        if (!prompt || Files.notExists(target) || okayToOverwrite(target)) {
+            try {
+                Files.copy(source, target, options);
+            } catch (IOException x) {
+                System.err.format("Unable to copy: %s: %s%n", source, x);
+            }
+        }
+    }
+
+    /**
+     * A {@code FileVisitor} that copies a file-tree ("cp -r")
+     */
+    static class TreeCopier implements FileVisitor<Path> {
+        private final Path source;
+        private final Path target;
+        private final boolean prompt;
+        private final boolean preserve;
+
+        TreeCopier(Path source, Path target, boolean prompt, boolean preserve) {
+            this.source = source;
+            this.target = target;
+            this.prompt = prompt;
+            this.preserve = preserve;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+            // before visiting entries in a directory we copy the directory
+            // (okay if directory already exists).
+            CopyOption[] options = (preserve) ?
+                new CopyOption[] { COPY_ATTRIBUTES } : new CopyOption[0];
+
+            Path newdir = target.resolve(source.relativize(dir));
+            try {
+                Files.copy(dir, newdir, options);
+            } catch (FileAlreadyExistsException x) {
+                // ignore
+            } catch (IOException x) {
+                System.err.format("Unable to create: %s: %s%n", newdir, x);
+                return SKIP_SUBTREE;
+            }
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+            copyFile(file, target.resolve(source.relativize(file)),
+                     prompt, preserve);
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+            // fix up modification time of directory when done
+            if (exc == null && preserve) {
+                Path newdir = target.resolve(source.relativize(dir));
+                try {
+                    FileTime time = Files.getLastModifiedTime(dir);
+                    Files.setLastModifiedTime(newdir, time);
+                } catch (IOException x) {
+                    System.err.format("Unable to copy all attributes to: %s: %s%n", newdir, x);
+                }
+            }
+            return CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFileFailed(Path file, IOException exc) {
+            if (exc instanceof FileSystemLoopException) {
+                System.err.println("cycle detected: " + file);
+            } else {
+                System.err.format("Unable to copy: %s: %s%n", file, exc);
+            }
+            return CONTINUE;
+        }
+    }
+
+    static void usage() {
+        System.err.println("java Copy [-ip] source... target");
+        System.err.println("java Copy -r [-ip] source-dir... target");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        boolean recursive = false;
+        boolean prompt = false;
+        boolean preserve = false;
+
+        // process options
+        int argi = 0;
+        while (argi < args.length) {
+            String arg = args[argi];
+            if (!arg.startsWith("-"))
+                break;
+            if (arg.length() < 2)
+                usage();
+            for (int i=1; i<arg.length(); i++) {
+                char c = arg.charAt(i);
+                switch (c) {
+                    case 'r' : recursive = true; break;
+                    case 'i' : prompt = true; break;
+                    case 'p' : preserve = true; break;
+                    default : usage();
+                }
+            }
+            argi++;
+        }
+
+        // remaining arguments are the source files(s) and the target location
+        int remaining = args.length - argi;
+        if (remaining < 2)
+            usage();
+        Path[] source = new Path[remaining-1];
+        int i=0;
+        while (remaining > 1) {
+            source[i++] = Paths.get(args[argi++]);
+            remaining--;
+        }
+        Path target = Paths.get(args[argi]);
+
+        // check if target is a directory
+        boolean isDir = Files.isDirectory(target);
+
+        // copy each source file/directory to target
+        for (i=0; i<source.length; i++) {
+            Path dest = (isDir) ? target.resolve(source[i].getFileName()) : target;
+
+            if (recursive) {
+                // follow links when copying files
+                EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
+                TreeCopier tc = new TreeCopier(source[i], dest, prompt, preserve);
+                Files.walkFileTree(source[i], opts, Integer.MAX_VALUE, tc);
+            } else {
+                // not recursive so source must not be a directory
+                if (Files.isDirectory(source[i])) {
+                    System.err.format("%s: is a directory%n", source[i]);
+                    continue;
+                }
+                copyFile(source[i], dest, prompt, preserve);
+            }
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/file/DiskUsage.java b/linux-x86/sample/nio/file/DiskUsage.java
new file mode 100644
index 0000000..7d30bdf
--- /dev/null
+++ b/linux-x86/sample/nio/file/DiskUsage.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+
+/**
+ * Example utility that works like the df(1M) program to print out disk space
+ * information
+ */
+
+public class DiskUsage {
+
+    static final long K = 1024;
+
+    static void printFileStore(FileStore store) throws IOException {
+        long total = store.getTotalSpace() / K;
+        long used = (store.getTotalSpace() - store.getUnallocatedSpace()) / K;
+        long avail = store.getUsableSpace() / K;
+
+        String s = store.toString();
+        if (s.length() > 20) {
+            System.out.println(s);
+            s = "";
+        }
+        System.out.format("%-20s %12d %12d %12d\n", s, total, used, avail);
+    }
+
+    public static void main(String[] args) throws IOException {
+        System.out.format("%-20s %12s %12s %12s\n", "Filesystem", "kbytes", "used", "avail");
+        if (args.length == 0) {
+            FileSystem fs = FileSystems.getDefault();
+            for (FileStore store: fs.getFileStores()) {
+                printFileStore(store);
+            }
+        } else {
+            for (String file: args) {
+                FileStore store = Files.getFileStore(Paths.get(file));
+                printFileStore(store);
+            }
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/file/FileType.java b/linux-x86/sample/nio/file/FileType.java
new file mode 100644
index 0000000..d001d60
--- /dev/null
+++ b/linux-x86/sample/nio/file/FileType.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import java.io.IOException;
+
+public class FileType {
+    public static void main(String[] args) throws IOException {
+        if (args.length == 0) {
+            System.err.println("usage: java FileType file...");
+            System.exit(-1);
+        }
+        for (String arg: args) {
+            Path file = Paths.get(arg);
+            String type;
+            if (Files.isDirectory(file)) {
+                type = "directory";
+            } else {
+                type = Files.probeContentType(file);
+                if (type == null)
+                    type = "<not recognized>";
+            }
+            System.out.format("%s\t%s%n", file, type);
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/file/WatchDir.java b/linux-x86/sample/nio/file/WatchDir.java
new file mode 100644
index 0000000..4c73820
--- /dev/null
+++ b/linux-x86/sample/nio/file/WatchDir.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.file.*;
+import static java.nio.file.StandardWatchEventKinds.*;
+import static java.nio.file.LinkOption.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+
+/**
+ * Example to watch a directory (or tree) for changes to files.
+ */
+
+public class WatchDir {
+
+    private final WatchService watcher;
+    private final boolean recursive;
+    private boolean trace = false;
+    private int count;
+
+    @SuppressWarnings("unchecked")
+    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
+        return (WatchEvent<T>)event;
+    }
+
+    /**
+     * Register the given directory with the WatchService
+     */
+    private void register(Path dir) throws IOException {
+        WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
+        count++;
+        if (trace)
+            System.out.format("register: %s\n", dir);
+    }
+
+    /**
+     * Register the given directory, and all its sub-directories, with the
+     * WatchService.
+     */
+    private void registerAll(final Path start) throws IOException {
+        // register directory and sub-directories
+        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
+                throws IOException
+            {
+                register(dir);
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    /**
+     * Creates a WatchService and registers the given directory
+     */
+    WatchDir(Path dir, boolean recursive) throws IOException {
+        this.watcher = FileSystems.getDefault().newWatchService();
+        this.recursive = recursive;
+
+        if (recursive) {
+            System.out.format("Scanning %s ...\n", dir);
+            registerAll(dir);
+            System.out.println("Done.");
+        } else {
+            register(dir);
+        }
+
+        // enable trace after initial registration
+        this.trace = true;
+    }
+
+    /**
+     * Process all events for keys queued to the watcher
+     */
+    void processEvents() {
+        for (;;) {
+
+            // wait for key to be signalled
+            WatchKey key;
+            try {
+                key = watcher.take();
+            } catch (InterruptedException x) {
+                return;
+            }
+
+            for (WatchEvent<?> event: key.pollEvents()) {
+                WatchEvent.Kind kind = event.kind();
+
+                // TBD - provide example of how OVERFLOW event is handled
+                if (kind == OVERFLOW) {
+                    continue;
+                }
+
+                // Context for directory entry event is the file name of entry
+                WatchEvent<Path> ev = cast(event);
+                Path name = ev.context();
+                Path child = ((Path)key.watchable()).resolve(name);
+
+                // print out event
+                System.out.format("%s: %s\n", event.kind().name(), child);
+
+                // if directory is created, and watching recursively, then
+                // register it and its sub-directories
+                if (recursive && (kind == ENTRY_CREATE)) {
+                    try {
+                        if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
+                            registerAll(child);
+                        }
+                    } catch (IOException x) {
+                        // ignore to keep sample readbale
+                    }
+                }
+            }
+
+            // reset key
+            boolean valid = key.reset();
+            if (!valid) {
+                // directory no longer accessible
+                count--;
+                if (count == 0)
+                    break;
+            }
+        }
+    }
+
+    static void usage() {
+        System.err.println("usage: java WatchDir [-r] dir");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        // parse arguments
+        if (args.length == 0 || args.length > 2)
+            usage();
+        boolean recursive = false;
+        int dirArg = 0;
+        if (args[0].equals("-r")) {
+            if (args.length < 2)
+                usage();
+            recursive = true;
+            dirArg++;
+        }
+
+        // register directory and process its events
+        Path dir = Paths.get(args[dirArg]);
+        new WatchDir(dir, recursive).processEvents();
+    }
+}
diff --git a/linux-x86/sample/nio/file/Xdd.java b/linux-x86/sample/nio/file/Xdd.java
new file mode 100644
index 0000000..c0c7f87
--- /dev/null
+++ b/linux-x86/sample/nio/file/Xdd.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.io.IOException;
+
+/**
+ * Example code to list/set/get/delete the user-defined attributes of a file.
+ */
+
+public class Xdd {
+
+    static void usage() {
+        System.out.println("Usage: java Xdd <file>");
+        System.out.println("       java Xdd -set <name>=<value> <file>");
+        System.out.println("       java Xdd -get <name> <file>");
+        System.out.println("       java Xdd -del <name> <file>");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        // one or three parameters
+        if (args.length != 1 && args.length != 3)
+            usage();
+
+        Path file = (args.length == 1) ?
+            Paths.get(args[0]) : Paths.get(args[2]);
+
+        // check that user defined attributes are supported by the file store
+        FileStore store = Files.getFileStore(file);
+        if (!store.supportsFileAttributeView(UserDefinedFileAttributeView.class)) {
+            System.err.format("UserDefinedFileAttributeView not supported on %s\n", store);
+            System.exit(-1);
+
+        }
+        UserDefinedFileAttributeView view =
+            Files.getFileAttributeView(file, UserDefinedFileAttributeView.class);
+
+        // list user defined attributes
+        if (args.length == 1) {
+            System.out.println("    Size  Name");
+            System.out.println("--------  --------------------------------------");
+            for (String name: view.list()) {
+                System.out.format("%8d  %s\n", view.size(name), name);
+            }
+            return;
+        }
+
+        // Add/replace a file's user defined attribute
+        if (args[0].equals("-set")) {
+            // name=value
+            String[] s = args[1].split("=");
+            if (s.length != 2)
+                usage();
+            String name = s[0];
+            String value = s[1];
+            view.write(name, Charset.defaultCharset().encode(value));
+            return;
+        }
+
+        // Print out the value of a file's user defined attribute
+        if (args[0].equals("-get")) {
+            String name = args[1];
+            int size = view.size(name);
+            ByteBuffer buf = ByteBuffer.allocateDirect(size);
+            view.read(name, buf);
+            buf.flip();
+            System.out.println(Charset.defaultCharset().decode(buf).toString());
+            return;
+        }
+
+        // Delete a file's user defined attribute
+        if (args[0].equals("-del")) {
+            view.delete(args[1]);
+            return;
+        }
+
+        // option not recognized
+        usage();
+    }
+ }
diff --git a/linux-x86/sample/nio/multicast/MulticastAddress.java b/linux-x86/sample/nio/multicast/MulticastAddress.java
new file mode 100644
index 0000000..05f5ca5
--- /dev/null
+++ b/linux-x86/sample/nio/multicast/MulticastAddress.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.UnknownHostException;
+import java.net.SocketException;
+
+/**
+ * Parses and represents a multicast address.
+ */
+
+class MulticastAddress {
+    private final InetAddress group;
+    private final int port;
+    private final NetworkInterface interf;
+
+    private MulticastAddress(InetAddress group, int port, NetworkInterface interf) {
+        this.group = group;
+        this.port = port;
+        this.interf = interf;
+    }
+
+    InetAddress group() {
+        return group;
+    }
+
+    int port() {
+        return port;
+    }
+
+    /**
+     * @return  The network interface, may be {@code null}
+     */
+    NetworkInterface interf() {
+        return interf;
+    }
+
+    /**
+     * Parses a string of the form "group:port[@interface]", returning
+     * a MulticastAddress representing the address
+     */
+    static MulticastAddress parse(String s) {
+        String[] components = s.split("@");
+        if (components.length > 2)
+            throw new IllegalArgumentException("At most one '@' expected");
+
+        // get group and port
+        String target = components[0];
+        int len = components[0].length();
+        int colon = components[0].lastIndexOf(':');
+        if ((colon < 1) || (colon > (len-2)))
+            throw new IllegalArgumentException("group:port expected");
+        String groupString = target.substring(0, colon);
+        int port = -1;
+        try {
+            port = Integer.parseInt(target.substring(colon+1, len));
+        } catch (NumberFormatException x) {
+             throw new IllegalArgumentException(x);
+        }
+
+        // handle IPv6 literal address
+        if (groupString.charAt(0) == '[') {
+            len = groupString.length();
+            if (groupString.charAt(len-1) != ']')
+                throw new IllegalArgumentException("missing ']'");
+            groupString = groupString.substring(1,len-1);
+            if (groupString.length() == 0)
+                throw new IllegalArgumentException("missing IPv6 address");
+        }
+
+        // get group address
+        InetAddress group = null;
+        try {
+            group = InetAddress.getByName(groupString);
+        } catch (UnknownHostException x) {
+            throw new IllegalArgumentException(x);
+        }
+        if (!group.isMulticastAddress()) {
+            throw new IllegalArgumentException("'" + group.getHostAddress() +
+                "' is not multicast address");
+        }
+
+        // optional interface
+        NetworkInterface interf = null;
+        if (components.length == 2) {
+            try {
+                interf = NetworkInterface.getByName(components[1]);
+            } catch (SocketException x) {
+                throw new IllegalArgumentException(x);
+            }
+            if (interf == null) {
+                throw new IllegalArgumentException("'" + components[1] +
+                   "' is not valid interface");
+            }
+        }
+        return new MulticastAddress(group, port, interf);
+    }
+}
diff --git a/linux-x86/sample/nio/multicast/Reader.java b/linux-x86/sample/nio/multicast/Reader.java
new file mode 100644
index 0000000..303c356
--- /dev/null
+++ b/linux-x86/sample/nio/multicast/Reader.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+import java.nio.charset.*;
+import java.nio.ByteBuffer;
+import java.net.*;
+import java.io.IOException;
+import java.util.*;
+
+public class Reader {
+
+    static void usage() {
+        System.err.println("usage: java Reader group:port@interf [-only source...] [-block source...]");
+        System.exit(-1);
+    }
+
+    static void printDatagram(SocketAddress sa, ByteBuffer buf) {
+        System.out.format("-- datagram from %s --\n",
+            ((InetSocketAddress)sa).getAddress().getHostAddress());
+        System.out.println(Charset.defaultCharset().decode(buf));
+    }
+
+    static void parseAddessList(String s, List<InetAddress> list)
+        throws UnknownHostException
+    {
+        String[] sources = s.split(",");
+        for (int i=0; i<sources.length; i++) {
+            list.add(InetAddress.getByName(sources[i]));
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length == 0)
+            usage();
+
+        // first parameter is the multicast address (interface required)
+        MulticastAddress target = MulticastAddress.parse(args[0]);
+        if (target.interf() == null)
+            usage();
+
+        // addition arguments are source addresses to include or exclude
+        List<InetAddress> includeList = new ArrayList<InetAddress>();
+        List<InetAddress> excludeList = new ArrayList<InetAddress>();
+        int argc = 1;
+        while (argc < args.length) {
+            String option = args[argc++];
+            if (argc >= args.length)
+                usage();
+            String value = args[argc++];
+            if (option.equals("-only")) {
+                 parseAddessList(value, includeList);
+                continue;
+            }
+            if (option.equals("-block")) {
+                parseAddessList(value, excludeList);
+                continue;
+            }
+            usage();
+        }
+        if (!includeList.isEmpty() && !excludeList.isEmpty()) {
+            usage();
+        }
+
+        // create and bind socket
+        ProtocolFamily family = StandardProtocolFamily.INET;
+        if (target.group() instanceof Inet6Address) {
+            family = StandardProtocolFamily.INET6;
+        }
+        DatagramChannel dc = DatagramChannel.open(family)
+            .setOption(StandardSocketOptions.SO_REUSEADDR, true)
+            .bind(new InetSocketAddress(target.port()));
+
+        if (includeList.isEmpty()) {
+            // join group and block addresses on the exclude list
+            MembershipKey key = dc.join(target.group(), target.interf());
+            for (InetAddress source: excludeList) {
+                key.block(source);
+            }
+        } else {
+            // join with source-specific membership for each source
+            for (InetAddress source: includeList) {
+                dc.join(target.group(), target.interf(), source);
+            }
+        }
+
+        // register socket with Selector
+        Selector sel = Selector.open();
+        dc.configureBlocking(false);
+        dc.register(sel, SelectionKey.OP_READ);
+
+        // print out each datagram that we receive
+        ByteBuffer buf = ByteBuffer.allocateDirect(4096);
+        for (;;) {
+            int updated = sel.select();
+            if (updated > 0) {
+                Iterator<SelectionKey> iter = sel.selectedKeys().iterator();
+                while (iter.hasNext()) {
+                    SelectionKey sk = iter.next();
+                    iter.remove();
+
+                    DatagramChannel ch = (DatagramChannel)sk.channel();
+                    SocketAddress sa = ch.receive(buf);
+                    if (sa != null) {
+                        buf.flip();
+                        printDatagram(sa, buf);
+                        buf.rewind();
+                        buf.limit(buf.capacity());
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/multicast/Sender.java b/linux-x86/sample/nio/multicast/Sender.java
new file mode 100644
index 0000000..f8685f6
--- /dev/null
+++ b/linux-x86/sample/nio/multicast/Sender.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+import java.nio.charset.Charset;
+import java.net.*;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Sample multicast sender to send a message in a multicast datagram
+ * to a given group.
+ */
+
+public class Sender {
+
+    private static void usage() {
+        System.err.println("usage: java Sender group:port[@interface] message");
+        System.exit(-1);
+    }
+
+    public static void main(String[] args) throws IOException {
+        if (args.length < 2)
+            usage();
+
+        MulticastAddress target = MulticastAddress.parse(args[0]);
+
+        // create socket
+        ProtocolFamily family = StandardProtocolFamily.INET;
+        if (target.group() instanceof Inet6Address)
+            family = StandardProtocolFamily.INET6;
+        DatagramChannel dc = DatagramChannel.open(family).bind(new InetSocketAddress(0));
+        if (target.interf() != null) {
+            dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, target.interf());
+        }
+
+        // send multicast packet
+        dc.send(Charset.defaultCharset().encode(args[1]),
+                new InetSocketAddress(target.group(), target.port()));
+        dc.close();
+    }
+
+}
diff --git a/linux-x86/sample/nio/server/AcceptHandler.java b/linux-x86/sample/nio/server/AcceptHandler.java
new file mode 100644
index 0000000..41c2570
--- /dev/null
+++ b/linux-x86/sample/nio/server/AcceptHandler.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import javax.net.ssl.*;
+
+/**
+ * A single threaded Handler that performs accepts SocketChannels and
+ * registers the Channels with the read/write Selector.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class AcceptHandler implements Handler {
+
+    private ServerSocketChannel channel;
+    private Dispatcher dsp;
+
+    private SSLContext sslContext;
+
+    AcceptHandler(ServerSocketChannel ssc, Dispatcher dsp,
+            SSLContext sslContext) {
+        channel = ssc;
+        this.dsp = dsp;
+        this.sslContext = sslContext;
+    }
+
+    public void handle(SelectionKey sk) throws IOException {
+
+        if (!sk.isAcceptable())
+            return;
+
+        SocketChannel sc = channel.accept();
+        if (sc == null) {
+            return;
+        }
+
+        ChannelIO cio = (sslContext != null ?
+            ChannelIOSecure.getInstance(
+                sc, false /* non-blocking */, sslContext) :
+            ChannelIO.getInstance(
+                sc, false /* non-blocking */));
+
+        RequestHandler rh = new RequestHandler(cio);
+        dsp.register(cio.getSocketChannel(), SelectionKey.OP_READ, rh);
+    }
+}
diff --git a/linux-x86/sample/nio/server/Acceptor.java b/linux-x86/sample/nio/server/Acceptor.java
new file mode 100644
index 0000000..cfdaf0e
--- /dev/null
+++ b/linux-x86/sample/nio/server/Acceptor.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import javax.net.ssl.*;
+
+/**
+ * A Runnable class which sits in a loop accepting SocketChannels,
+ * then registers the Channels with the read/write Selector.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Acceptor implements Runnable {
+
+    private ServerSocketChannel ssc;
+    private Dispatcher d;
+
+    private SSLContext sslContext;
+
+    Acceptor(ServerSocketChannel ssc, Dispatcher d, SSLContext sslContext) {
+        this.ssc = ssc;
+        this.d = d;
+        this.sslContext = sslContext;
+    }
+
+    public void run() {
+        for (;;) {
+            try {
+                SocketChannel sc = ssc.accept();
+
+                ChannelIO cio = (sslContext != null ?
+                    ChannelIOSecure.getInstance(
+                        sc, false /* non-blocking */, sslContext) :
+                    ChannelIO.getInstance(
+                        sc, false /* non-blocking */));
+
+                RequestHandler rh = new RequestHandler(cio);
+
+                d.register(cio.getSocketChannel(), SelectionKey.OP_READ, rh);
+
+            } catch (IOException x) {
+                x.printStackTrace();
+                break;
+            }
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/server/B1.java b/linux-x86/sample/nio/server/B1.java
new file mode 100644
index 0000000..c6d7e90
--- /dev/null
+++ b/linux-x86/sample/nio/server/B1.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+
+/**
+ * A blocking/single-threaded server which completely services
+ * each connection before moving to the next.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class B1 extends Server {
+
+    B1(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws Exception {
+        for (;;) {
+
+            SocketChannel sc = ssc.accept();
+
+            ChannelIO cio = (sslContext != null ?
+                ChannelIOSecure.getInstance(
+                    sc, true /* blocking */, sslContext) :
+                ChannelIO.getInstance(
+                    sc, true /* blocking */));
+
+            RequestServicer svc = new RequestServicer(cio);
+            svc.run();
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/server/BN.java b/linux-x86/sample/nio/server/BN.java
new file mode 100644
index 0000000..c765a8b
--- /dev/null
+++ b/linux-x86/sample/nio/server/BN.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+
+/**
+ * A Blocking/Multi-threaded Server which creates a new thread for each
+ * connection.  This is not efficient for large numbers of connections.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class BN extends Server {
+
+    BN(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws IOException {
+        for (;;) {
+
+            SocketChannel sc = ssc.accept();
+
+            ChannelIO cio = (sslContext != null ?
+                ChannelIOSecure.getInstance(
+                    sc, true /* blocking */, sslContext) :
+                ChannelIO.getInstance(
+                    sc, true /* blocking */));
+
+            RequestServicer svc = new RequestServicer(cio);
+            Thread th = new Thread(svc);
+            th.start();
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/server/BP.java b/linux-x86/sample/nio/server/BP.java
new file mode 100644
index 0000000..9540f1c
--- /dev/null
+++ b/linux-x86/sample/nio/server/BP.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+import java.util.concurrent.*;
+
+/**
+ * A multi-threaded server which creates a pool of threads for use
+ * by the server.  The Thread pool decides how to schedule those threads.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class BP extends Server {
+
+    private static final int POOL_MULTIPLE = 4;
+
+    BP(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws Exception {
+
+        ExecutorService xec = Executors.newFixedThreadPool(
+            Runtime.getRuntime().availableProcessors() * POOL_MULTIPLE);
+
+        for (;;) {
+
+            SocketChannel sc = ssc.accept();
+
+            ChannelIO cio = (sslContext != null ?
+                ChannelIOSecure.getInstance(
+                    sc, true /* blocking */, sslContext) :
+                ChannelIO.getInstance(
+                    sc, true /* blocking */));
+
+            RequestServicer svc = new RequestServicer(cio);
+            xec.execute(svc);
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/server/ChannelIO.java b/linux-x86/sample/nio/server/ChannelIO.java
new file mode 100644
index 0000000..7d1ca18
--- /dev/null
+++ b/linux-x86/sample/nio/server/ChannelIO.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+
+/**
+ * A helper class for properly sizing inbound byte buffers and
+ * redirecting I/O calls to the proper SocketChannel call.
+ * <P>
+ * Many of these calls may seem unnecessary until you consider
+ * that they are placeholders for the secure variant, which is much
+ * more involved.  See ChannelIOSecure for more information.
+ *
+ * @author Brad R. Wetmore
+ * @author Mark Reinhold
+ */
+class ChannelIO {
+
+    protected SocketChannel sc;
+
+    /*
+     * All of the inbound request data lives here until we determine
+     * that we've read everything, then we pass that data back to the
+     * caller.
+     */
+    protected ByteBuffer requestBB;
+    static private int requestBBSize = 4096;
+
+    protected ChannelIO(SocketChannel sc, boolean blocking)
+            throws IOException {
+        this.sc = sc;
+        sc.configureBlocking(blocking);
+    }
+
+    static ChannelIO getInstance(SocketChannel sc, boolean blocking)
+            throws IOException {
+        ChannelIO cio = new ChannelIO(sc, blocking);
+        cio.requestBB = ByteBuffer.allocate(requestBBSize);
+
+        return cio;
+    }
+
+    SocketChannel getSocketChannel() {
+        return sc;
+    }
+
+    /*
+     * Return a ByteBuffer with "remaining" space to work.  If you have to
+     * reallocate the ByteBuffer, copy the existing info into the new buffer.
+     */
+    protected void resizeRequestBB(int remaining) {
+        if (requestBB.remaining() < remaining) {
+            // Expand buffer for large request
+            ByteBuffer bb = ByteBuffer.allocate(requestBB.capacity() * 2);
+            requestBB.flip();
+            bb.put(requestBB);
+            requestBB = bb;
+        }
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * This variant is for Servers without SelectionKeys (e.g.
+     * blocking).
+     * <P>
+     * return true when we're done with handshaking.
+     */
+    boolean doHandshake() throws IOException {
+        return true;
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * This variant is for Servers with SelectionKeys, so that
+     * we can register for selectable operations (e.g. selectable
+     * non-blocking).
+     * <P>
+     * return true when we're done with handshaking.
+     */
+    boolean doHandshake(SelectionKey sk) throws IOException {
+        return true;
+    }
+
+    /*
+     * Resize (if necessary) the inbound data buffer, and then read more
+     * data into the read buffer.
+     */
+    int read() throws IOException {
+        /*
+         * Allocate more space if less than 5% remains
+         */
+        resizeRequestBB(requestBBSize/20);
+        return sc.read(requestBB);
+    }
+
+    /*
+     * All data has been read, pass back the request in one buffer.
+     */
+    ByteBuffer getReadBuf() {
+        return requestBB;
+    }
+
+    /*
+     * Write the src buffer into the socket channel.
+     */
+    int write(ByteBuffer src) throws IOException {
+        return sc.write(src);
+    }
+
+    /*
+     * Perform a FileChannel.TransferTo on the socket channel.
+     */
+    long transferTo(FileChannel fc, long pos, long len) throws IOException {
+        return fc.transferTo(pos, len, sc);
+    }
+
+    /*
+     * Flush any outstanding data to the network if possible.
+     * <P>
+     * This isn't really necessary for the insecure variant, but needed
+     * for the secure one where intermediate buffering must take place.
+     * <P>
+     * Return true if successful.
+     */
+    boolean dataFlush() throws IOException {
+        return true;
+    }
+
+    /*
+     * Start any connection shutdown processing.
+     * <P>
+     * This isn't really necessary for the insecure variant, but needed
+     * for the secure one where intermediate buffering must take place.
+     * <P>
+     * Return true if successful, and the data has been flushed.
+     */
+    boolean shutdown() throws IOException {
+        return true;
+    }
+
+    /*
+     * Close the underlying connection.
+     */
+    void close() throws IOException {
+        sc.close();
+    }
+
+}
diff --git a/linux-x86/sample/nio/server/ChannelIOSecure.java b/linux-x86/sample/nio/server/ChannelIOSecure.java
new file mode 100644
index 0000000..7508966
--- /dev/null
+++ b/linux-x86/sample/nio/server/ChannelIOSecure.java
@@ -0,0 +1,650 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.*;
+
+/**
+ * A helper class which performs I/O using the SSLEngine API.
+ * <P>
+ * Each connection has a SocketChannel and a SSLEngine that is
+ * used through the lifetime of the Channel.  We allocate byte buffers
+ * for use as the outbound and inbound network buffers.
+ *
+ * <PRE>
+ *               Application Data
+ *               src      requestBB
+ *                |           ^
+ *                |     |     |
+ *                v     |     |
+ *           +----+-----|-----+----+
+ *           |          |          |
+ *           |       SSL|Engine    |
+ *   wrap()  |          |          |  unwrap()
+ *           | OUTBOUND | INBOUND  |
+ *           |          |          |
+ *           +----+-----|-----+----+
+ *                |     |     ^
+ *                |     |     |
+ *                v           |
+ *            outNetBB     inNetBB
+ *                   Net data
+ * </PRE>
+ *
+ * These buffers handle all of the intermediary data for the SSL
+ * connection.  To make things easy, we'll require outNetBB be
+ * completely flushed before trying to wrap any more data, but we
+ * could certainly remove that restriction by using larger buffers.
+ * <P>
+ * There are many, many ways to handle compute and I/O strategies.
+ * What follows is a relatively simple one.  The reader is encouraged
+ * to develop the strategy that best fits the application.
+ * <P>
+ * In most of the non-blocking operations in this class, we let the
+ * Selector tell us when we're ready to attempt an I/O operation (by the
+ * application repeatedly calling our methods).  Another option would be
+ * to attempt the operation and return from the method when no forward
+ * progress can be made.
+ * <P>
+ * There's lots of room for enhancements and improvement in this example.
+ * <P>
+ * We're checking for SSL/TLS end-of-stream truncation attacks via
+ * sslEngine.closeInbound().  When you reach the end of a input stream
+ * via a read() returning -1 or an IOException, we call
+ * sslEngine.closeInbound() to signal to the sslEngine that no more
+ * input will be available.  If the peer's close_notify message has not
+ * yet been received, this could indicate a trucation attack, in which
+ * an attacker is trying to prematurely close the connection.   The
+ * closeInbound() will throw an exception if this condition were
+ * present.
+ *
+ * @author Brad R. Wetmore
+ * @author Mark Reinhold
+ */
+class ChannelIOSecure extends ChannelIO {
+
+    private SSLEngine sslEngine = null;
+
+    private int appBBSize;
+    private int netBBSize;
+
+    /*
+     * All I/O goes through these buffers.
+     * <P>
+     * It might be nice to use a cache of ByteBuffers so we're
+     * not alloc/dealloc'ing ByteBuffer's for each new SSLEngine.
+     * <P>
+     * We use our superclass' requestBB for our application input buffer.
+     * Outbound application data is supplied to us by our callers.
+     */
+    private ByteBuffer inNetBB;
+    private ByteBuffer outNetBB;
+
+    /*
+     * An empty ByteBuffer for use when one isn't available, say
+     * as a source buffer during initial handshake wraps or for close
+     * operations.
+     */
+    private static ByteBuffer hsBB = ByteBuffer.allocate(0);
+
+    /*
+     * The FileChannel we're currently transferTo'ing (reading).
+     */
+    private ByteBuffer fileChannelBB = null;
+
+    /*
+     * During our initial handshake, keep track of the next
+     * SSLEngine operation that needs to occur:
+     *
+     *     NEED_WRAP/NEED_UNWRAP
+     *
+     * Once the initial handshake has completed, we can short circuit
+     * handshake checks with initialHSComplete.
+     */
+    private HandshakeStatus initialHSStatus;
+    private boolean initialHSComplete;
+
+    /*
+     * We have received the shutdown request by our caller, and have
+     * closed our outbound side.
+     */
+    private boolean shutdown = false;
+
+    /*
+     * Constructor for a secure ChannelIO variant.
+     */
+    protected ChannelIOSecure(SocketChannel sc, boolean blocking,
+            SSLContext sslc) throws IOException {
+        super(sc, blocking);
+
+        /*
+         * We're a server, so no need to use host/port variant.
+         *
+         * The first call for a server is a NEED_UNWRAP.
+         */
+        sslEngine = sslc.createSSLEngine();
+        sslEngine.setUseClientMode(false);
+        initialHSStatus = HandshakeStatus.NEED_UNWRAP;
+        initialHSComplete = false;
+
+        // Create a buffer using the normal expected packet size we'll
+        // be getting.  This may change, depending on the peer's
+        // SSL implementation.
+        netBBSize = sslEngine.getSession().getPacketBufferSize();
+        inNetBB = ByteBuffer.allocate(netBBSize);
+        outNetBB = ByteBuffer.allocate(netBBSize);
+        outNetBB.position(0);
+        outNetBB.limit(0);
+    }
+
+    /*
+     * Static factory method for creating a secure ChannelIO object.
+     * <P>
+     * We need to allocate different sized application data buffers
+     * based on whether we're secure or not.  We can't determine
+     * this until our sslEngine is created.
+     */
+    static ChannelIOSecure getInstance(SocketChannel sc, boolean blocking,
+            SSLContext sslc) throws IOException {
+
+        ChannelIOSecure cio = new ChannelIOSecure(sc, blocking, sslc);
+
+        // Create a buffer using the normal expected application size we'll
+        // be getting.  This may change, depending on the peer's
+        // SSL implementation.
+        cio.appBBSize = cio.sslEngine.getSession().getApplicationBufferSize();
+        cio.requestBB = ByteBuffer.allocate(cio.appBBSize);
+
+        return cio;
+    }
+
+    /*
+     * Calls up to the superclass to adjust the buffer size
+     * by an appropriate increment.
+     */
+    protected void resizeRequestBB() {
+        resizeRequestBB(appBBSize);
+    }
+
+    /*
+     * Adjust the inbount network buffer to an appropriate size.
+     */
+    private void resizeResponseBB() {
+        ByteBuffer bb = ByteBuffer.allocate(netBBSize);
+        inNetBB.flip();
+        bb.put(inNetBB);
+        inNetBB = bb;
+    }
+
+    /*
+     * Writes bb to the SocketChannel.
+     * <P>
+     * Returns true when the ByteBuffer has no remaining data.
+     */
+    private boolean tryFlush(ByteBuffer bb) throws IOException {
+        super.write(bb);
+        return !bb.hasRemaining();
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * This variant is for Servers without SelectionKeys (e.g.
+     * blocking).
+     */
+    boolean doHandshake() throws IOException {
+        return doHandshake(null);
+    }
+
+    /*
+     * Perform any handshaking processing.
+     * <P>
+     * If a SelectionKey is passed, register for selectable
+     * operations.
+     * <P>
+     * In the blocking case, our caller will keep calling us until
+     * we finish the handshake.  Our reads/writes will block as expected.
+     * <P>
+     * In the non-blocking case, we just received the selection notification
+     * that this channel is ready for whatever the operation is, so give
+     * it a try.
+     * <P>
+     * return:
+     *          true when handshake is done.
+     *          false while handshake is in progress
+     */
+    boolean doHandshake(SelectionKey sk) throws IOException {
+
+        SSLEngineResult result;
+
+        if (initialHSComplete) {
+            return initialHSComplete;
+        }
+
+        /*
+         * Flush out the outgoing buffer, if there's anything left in
+         * it.
+         */
+        if (outNetBB.hasRemaining()) {
+
+            if (!tryFlush(outNetBB)) {
+                return false;
+            }
+
+            // See if we need to switch from write to read mode.
+
+            switch (initialHSStatus) {
+
+            /*
+             * Is this the last buffer?
+             */
+            case FINISHED:
+                initialHSComplete = true;
+                // Fall-through to reregister need for a Read.
+
+            case NEED_UNWRAP:
+                if (sk != null) {
+                    sk.interestOps(SelectionKey.OP_READ);
+                }
+                break;
+            }
+
+            return initialHSComplete;
+        }
+
+
+        switch (initialHSStatus) {
+
+        case NEED_UNWRAP:
+            if (sc.read(inNetBB) == -1) {
+                sslEngine.closeInbound();
+                return initialHSComplete;
+            }
+
+needIO:
+            while (initialHSStatus == HandshakeStatus.NEED_UNWRAP) {
+                resizeRequestBB();    // expected room for unwrap
+                inNetBB.flip();
+                result = sslEngine.unwrap(inNetBB, requestBB);
+                inNetBB.compact();
+
+                initialHSStatus = result.getHandshakeStatus();
+
+                switch (result.getStatus()) {
+
+                case OK:
+                    switch (initialHSStatus) {
+                    case NOT_HANDSHAKING:
+                        throw new IOException(
+                            "Not handshaking during initial handshake");
+
+                    case NEED_TASK:
+                        initialHSStatus = doTasks();
+                        break;
+
+                    case FINISHED:
+                        initialHSComplete = true;
+                        break needIO;
+                    }
+
+                    break;
+
+                case BUFFER_UNDERFLOW:
+                    // Resize buffer if needed.
+                    netBBSize = sslEngine.getSession().getPacketBufferSize();
+                    if (netBBSize > inNetBB.capacity()) {
+                        resizeResponseBB();
+                    }
+
+                    /*
+                     * Need to go reread the Channel for more data.
+                     */
+                    if (sk != null) {
+                        sk.interestOps(SelectionKey.OP_READ);
+                    }
+                    break needIO;
+
+                case BUFFER_OVERFLOW:
+                    // Reset the application buffer size.
+                    appBBSize =
+                        sslEngine.getSession().getApplicationBufferSize();
+                    break;
+
+                default: //CLOSED:
+                    throw new IOException("Received" + result.getStatus() +
+                        "during initial handshaking");
+                }
+            }  // "needIO" block.
+
+            /*
+             * Just transitioned from read to write.
+             */
+            if (initialHSStatus != HandshakeStatus.NEED_WRAP) {
+                break;
+            }
+
+            // Fall through and fill the write buffers.
+
+        case NEED_WRAP:
+            /*
+             * The flush above guarantees the out buffer to be empty
+             */
+            outNetBB.clear();
+            result = sslEngine.wrap(hsBB, outNetBB);
+            outNetBB.flip();
+
+            initialHSStatus = result.getHandshakeStatus();
+
+            switch (result.getStatus()) {
+            case OK:
+
+                if (initialHSStatus == HandshakeStatus.NEED_TASK) {
+                    initialHSStatus = doTasks();
+                }
+
+                if (sk != null) {
+                    sk.interestOps(SelectionKey.OP_WRITE);
+                }
+
+                break;
+
+            default: // BUFFER_OVERFLOW/BUFFER_UNDERFLOW/CLOSED:
+                throw new IOException("Received" + result.getStatus() +
+                        "during initial handshaking");
+            }
+            break;
+
+        default: // NOT_HANDSHAKING/NEED_TASK/FINISHED
+            throw new RuntimeException("Invalid Handshaking State" +
+                    initialHSStatus);
+        } // switch
+
+        return initialHSComplete;
+    }
+
+    /*
+     * Do all the outstanding handshake tasks in the current Thread.
+     */
+    private SSLEngineResult.HandshakeStatus doTasks() {
+
+        Runnable runnable;
+
+        /*
+         * We could run this in a separate thread, but
+         * do in the current for now.
+         */
+        while ((runnable = sslEngine.getDelegatedTask()) != null) {
+            runnable.run();
+        }
+        return sslEngine.getHandshakeStatus();
+    }
+
+    /*
+     * Read the channel for more information, then unwrap the
+     * (hopefully application) data we get.
+     * <P>
+     * If we run out of data, we'll return to our caller (possibly using
+     * a Selector) to get notification that more is available.
+     * <P>
+     * Each call to this method will perform at most one underlying read().
+     */
+    int read() throws IOException {
+        SSLEngineResult result;
+
+        if (!initialHSComplete) {
+            throw new IllegalStateException();
+        }
+
+        int pos = requestBB.position();
+
+        if (sc.read(inNetBB) == -1) {
+            sslEngine.closeInbound();  // probably throws exception
+            return -1;
+        }
+
+        do {
+            resizeRequestBB();    // expected room for unwrap
+            inNetBB.flip();
+            result = sslEngine.unwrap(inNetBB, requestBB);
+            inNetBB.compact();
+
+            /*
+             * Could check here for a renegotation, but we're only
+             * doing a simple read/write, and won't have enough state
+             * transitions to do a complete handshake, so ignore that
+             * possibility.
+             */
+            switch (result.getStatus()) {
+
+            case BUFFER_OVERFLOW:
+                // Reset the application buffer size.
+                appBBSize = sslEngine.getSession().getApplicationBufferSize();
+                break;
+
+            case BUFFER_UNDERFLOW:
+                // Resize buffer if needed.
+                netBBSize = sslEngine.getSession().getPacketBufferSize();
+                if (netBBSize > inNetBB.capacity()) {
+                    resizeResponseBB();
+
+                    break; // break, next read will support larger buffer.
+                }
+            case OK:
+                if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+                    doTasks();
+                }
+                break;
+
+            default:
+                throw new IOException("sslEngine error during data read: " +
+                    result.getStatus());
+            }
+        } while ((inNetBB.position() != 0) &&
+            result.getStatus() != Status.BUFFER_UNDERFLOW);
+
+        return (requestBB.position() - pos);
+    }
+
+    /*
+     * Try to write out as much as possible from the src buffer.
+     */
+    int write(ByteBuffer src) throws IOException {
+
+        if (!initialHSComplete) {
+            throw new IllegalStateException();
+        }
+
+        return doWrite(src);
+    }
+
+    /*
+     * Try to flush out any existing outbound data, then try to wrap
+     * anything new contained in the src buffer.
+     * <P>
+     * Return the number of bytes actually consumed from the buffer,
+     * but the data may actually be still sitting in the output buffer,
+     * waiting to be flushed.
+     */
+    private int doWrite(ByteBuffer src) throws IOException {
+        int retValue = 0;
+
+        if (outNetBB.hasRemaining() && !tryFlush(outNetBB)) {
+            return retValue;
+        }
+
+        /*
+         * The data buffer is empty, we can reuse the entire buffer.
+         */
+        outNetBB.clear();
+
+        SSLEngineResult result = sslEngine.wrap(src, outNetBB);
+        retValue = result.bytesConsumed();
+
+        outNetBB.flip();
+
+        switch (result.getStatus()) {
+
+        case OK:
+            if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+                doTasks();
+            }
+            break;
+
+        default:
+            throw new IOException("sslEngine error during data write: " +
+                result.getStatus());
+        }
+
+        /*
+         * Try to flush the data, regardless of whether or not
+         * it's been selected.  Odds of a write buffer being full
+         * is less than a read buffer being empty.
+         */
+        if (outNetBB.hasRemaining()) {
+            tryFlush(outNetBB);
+        }
+
+        return retValue;
+    }
+
+    /*
+     * Perform a FileChannel.TransferTo on the socket channel.
+     * <P>
+     * We have to copy the data into an intermediary app ByteBuffer
+     * first, then send it through the SSLEngine.
+     * <P>
+     * We return the number of bytes actually read out of the
+     * filechannel.  However, the data may actually be stuck
+     * in the fileChannelBB or the outNetBB.  The caller
+     * is responsible for making sure to call dataFlush()
+     * before shutting down.
+     */
+    long transferTo(FileChannel fc, long pos, long len) throws IOException {
+
+        if (!initialHSComplete) {
+            throw new IllegalStateException();
+        }
+
+        if (fileChannelBB == null) {
+            fileChannelBB = ByteBuffer.allocate(appBBSize);
+            fileChannelBB.limit(0);
+        }
+
+        fileChannelBB.compact();
+        int fileRead = fc.read(fileChannelBB);
+        fileChannelBB.flip();
+
+        /*
+         * We ignore the return value here, we return the
+         * number of bytes actually consumed from the the file.
+         * We'll flush the output buffer before we start shutting down.
+         */
+        doWrite(fileChannelBB);
+
+        return fileRead;
+    }
+
+    /*
+     * Flush any remaining data.
+     * <P>
+     * Return true when the fileChannelBB and outNetBB are empty.
+     */
+    boolean dataFlush() throws IOException {
+        boolean fileFlushed = true;
+
+        if ((fileChannelBB != null) && fileChannelBB.hasRemaining()) {
+            doWrite(fileChannelBB);
+            fileFlushed = !fileChannelBB.hasRemaining();
+        } else if (outNetBB.hasRemaining()) {
+            tryFlush(outNetBB);
+        }
+
+        return (fileFlushed && !outNetBB.hasRemaining());
+    }
+
+    /*
+     * Begin the shutdown process.
+     * <P>
+     * Close out the SSLEngine if not already done so, then
+     * wrap our outgoing close_notify message and try to send it on.
+     * <P>
+     * Return true when we're done passing the shutdown messsages.
+     */
+    boolean shutdown() throws IOException {
+
+        if (!shutdown) {
+            sslEngine.closeOutbound();
+            shutdown = true;
+        }
+
+        if (outNetBB.hasRemaining() && tryFlush(outNetBB)) {
+            return false;
+        }
+
+        /*
+         * By RFC 2616, we can "fire and forget" our close_notify
+         * message, so that's what we'll do here.
+         */
+        outNetBB.clear();
+        SSLEngineResult result = sslEngine.wrap(hsBB, outNetBB);
+        if (result.getStatus() != Status.CLOSED) {
+            throw new SSLException("Improper close state");
+        }
+        outNetBB.flip();
+
+        /*
+         * We won't wait for a select here, but if this doesn't work,
+         * we'll cycle back through on the next select.
+         */
+        if (outNetBB.hasRemaining()) {
+            tryFlush(outNetBB);
+        }
+
+        return (!outNetBB.hasRemaining() &&
+                (result.getHandshakeStatus() != HandshakeStatus.NEED_WRAP));
+    }
+
+    /*
+     * close() is not overridden
+     */
+}
diff --git a/linux-x86/sample/nio/server/Content.java b/linux-x86/sample/nio/server/Content.java
new file mode 100644
index 0000000..52e06fa
--- /dev/null
+++ b/linux-x86/sample/nio/server/Content.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * An Sendable interface extension that adds additional
+ * methods for additional information, such as Files
+ * or Strings.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Content extends Sendable {
+
+    String type();
+
+    // Returns -1 until prepare() invoked
+    long length();
+
+}
diff --git a/linux-x86/sample/nio/server/Dispatcher.java b/linux-x86/sample/nio/server/Dispatcher.java
new file mode 100644
index 0000000..9474c12
--- /dev/null
+++ b/linux-x86/sample/nio/server/Dispatcher.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+
+/**
+ * Base class for the Dispatchers.
+ * <P>
+ * Servers use these to obtain ready status, and then to dispatch jobs.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Dispatcher extends Runnable {
+
+    void register(SelectableChannel ch, int ops, Handler h)
+        throws IOException;
+
+}
diff --git a/linux-x86/sample/nio/server/Dispatcher1.java b/linux-x86/sample/nio/server/Dispatcher1.java
new file mode 100644
index 0000000..533e4b8
--- /dev/null
+++ b/linux-x86/sample/nio/server/Dispatcher1.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import java.util.*;
+
+/**
+ * A single-threaded dispatcher.
+ * <P>
+ * When a SelectionKey is ready, it dispatches the job in this
+ * thread.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Dispatcher1 implements Dispatcher {
+
+    private Selector sel;
+
+    Dispatcher1() throws IOException {
+        sel = Selector.open();
+    }
+
+    // Doesn't really need to be runnable
+    public void run() {
+        for (;;) {
+            try {
+                dispatch();
+            } catch (IOException x) {
+                x.printStackTrace();
+            }
+        }
+    }
+
+    private void dispatch() throws IOException {
+        sel.select();
+        for (Iterator i = sel.selectedKeys().iterator(); i.hasNext(); ) {
+            SelectionKey sk = (SelectionKey)i.next();
+            i.remove();
+            Handler h = (Handler)sk.attachment();
+            h.handle(sk);
+        }
+    }
+
+    public void register(SelectableChannel ch, int ops, Handler h)
+            throws IOException {
+        ch.register(sel, ops, h);
+    }
+}
diff --git a/linux-x86/sample/nio/server/DispatcherN.java b/linux-x86/sample/nio/server/DispatcherN.java
new file mode 100644
index 0000000..7b601b0
--- /dev/null
+++ b/linux-x86/sample/nio/server/DispatcherN.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+import java.util.*;
+
+/**
+ * A Multi-threaded dispatcher.
+ * <P>
+ * In this example, one thread does accepts, and the second
+ * does read/writes.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class DispatcherN implements Dispatcher {
+
+    private Selector sel;
+
+    DispatcherN() throws IOException {
+        sel = Selector.open();
+    }
+
+    public void run() {
+        for (;;) {
+            try {
+                dispatch();
+            } catch (IOException x) {
+                x.printStackTrace();
+            }
+        }
+    }
+
+    private Object gate = new Object();
+
+    private void dispatch() throws IOException {
+        sel.select();
+        for (Iterator i = sel.selectedKeys().iterator(); i.hasNext(); ) {
+            SelectionKey sk = (SelectionKey)i.next();
+            i.remove();
+            Handler h = (Handler)sk.attachment();
+            h.handle(sk);
+        }
+        synchronized (gate) { }
+    }
+
+    public void register(SelectableChannel ch, int ops, Handler h)
+            throws IOException {
+        synchronized (gate) {
+            sel.wakeup();
+            ch.register(sel, ops, h);
+        }
+    }
+
+}
diff --git a/linux-x86/sample/nio/server/FileContent.java b/linux-x86/sample/nio/server/FileContent.java
new file mode 100644
index 0000000..82c44a9
--- /dev/null
+++ b/linux-x86/sample/nio/server/FileContent.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.net.*;
+import java.nio.channels.*;
+import java.nio.charset.*;
+
+/**
+ * A Content type that provides for transferring files.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class FileContent implements Content {
+
+    private static File ROOT = new File("root");
+
+    private File fn;
+
+    FileContent(URI uri) {
+        fn = new File(ROOT,
+                      uri.getPath()
+                      .replace('/',
+                               File.separatorChar));
+    }
+
+    private String type = null;
+
+    public String type() {
+        if (type != null)
+            return type;
+        String nm = fn.getName();
+        if (nm.endsWith(".html"))
+            type = "text/html; charset=iso-8859-1";
+        else if ((nm.indexOf('.') < 0) || nm.endsWith(".txt"))
+            type = "text/plain; charset=iso-8859-1";
+        else
+            type = "application/octet-stream";
+        return type;
+    }
+
+    private FileChannel fc = null;
+    private long length = -1;
+    private long position = -1;         // NB only; >= 0 if transferring
+
+    public long length() {
+        return length;
+    }
+
+    public void prepare() throws IOException {
+        if (fc == null)
+            fc = new RandomAccessFile(fn, "r").getChannel();
+        length = fc.size();
+        position = 0;                   // NB only
+    }
+
+    public boolean send(ChannelIO cio) throws IOException {
+        if (fc == null)
+            throw new IllegalStateException();
+        if (position < 0)               // NB only
+            throw new IllegalStateException();
+
+        /*
+         * Short-circuit if we're already done.
+         */
+        if (position >= length) {
+            return false;
+        }
+
+        position += cio.transferTo(fc, position, length - position);
+        return (position < length);
+    }
+
+    public void release() throws IOException {
+        if (fc != null) {
+            fc.close();
+            fc = null;
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/server/Handler.java b/linux-x86/sample/nio/server/Handler.java
new file mode 100644
index 0000000..110feb7
--- /dev/null
+++ b/linux-x86/sample/nio/server/Handler.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.channels.*;
+
+/**
+ * Base class for the Handlers.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Handler {
+
+    void handle(SelectionKey sk) throws IOException;
+
+}
diff --git a/linux-x86/sample/nio/server/MalformedRequestException.java b/linux-x86/sample/nio/server/MalformedRequestException.java
new file mode 100644
index 0000000..89b0db6
--- /dev/null
+++ b/linux-x86/sample/nio/server/MalformedRequestException.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * Exception class used when a request can't be properly parsed.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class MalformedRequestException extends Exception {
+
+    MalformedRequestException() { }
+
+    MalformedRequestException(String msg) {
+        super(msg);
+    }
+
+    MalformedRequestException(Exception x) {
+        super(x);
+    }
+}
diff --git a/linux-x86/sample/nio/server/N1.java b/linux-x86/sample/nio/server/N1.java
new file mode 100644
index 0000000..d02bc93
--- /dev/null
+++ b/linux-x86/sample/nio/server/N1.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.nio.channels.*;
+
+/**
+ * A non-blocking/single-threaded server.  All accept() and
+ * read()/write() operations are performed by a single thread, but only
+ * after being selected for those operations by a Selector.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class N1 extends Server {
+
+    N1(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+        ssc.configureBlocking(false);
+    }
+
+    void runServer() throws Exception {
+        Dispatcher d = new Dispatcher1();
+        d.register(ssc, SelectionKey.OP_ACCEPT,
+                   new AcceptHandler(ssc, d, sslContext));
+        d.run();
+    }
+}
diff --git a/linux-x86/sample/nio/server/N2.java b/linux-x86/sample/nio/server/N2.java
new file mode 100644
index 0000000..2a21612
--- /dev/null
+++ b/linux-x86/sample/nio/server/N2.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/**
+ * A non-blocking/dual-threaded which performs accept()s in one thread,
+ * and services requests in a second.  Both threads use select().
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public class N2 extends Server {
+
+    N2(int port, int backlog, boolean secure) throws Exception {
+        super(port, backlog, secure);
+    }
+
+    void runServer() throws Exception {
+        Dispatcher d = new DispatcherN();
+        Acceptor a = new Acceptor(ssc, d, sslContext);
+        new Thread(a).start();
+        d.run();
+    }
+}
diff --git a/linux-x86/sample/nio/server/README.txt b/linux-x86/sample/nio/server/README.txt
new file mode 100644
index 0000000..aa803e8
--- /dev/null
+++ b/linux-x86/sample/nio/server/README.txt
@@ -0,0 +1,279 @@
+        A Simple NIO-based HTTP/HTTPS Server Example
+
+
+INTRODUCTION
+============
+This directory contains a simple HTTP/HTTPS server.  HTTP/HTTPS are two
+common network protocols that provide for data transfer, and are more
+fully described in RFC 2616 and RFC 2818 (Available at
+http://www.ietf.org ). HTTPS is essentially HTTP after the connection
+has been secured with SSL/TLS.  TLS is the successor to SSL, and is
+described in RFC 2246.
+
+This server was written to demonstrate some of the functionality new to
+the Java 2 platform.  The demo is not meant to be a full tutorial, and
+assumes the reader has some familiarity with the subject matter.
+
+In particular, it shows:
+
+    New I/O (java.nio, java.nio.channels, java.util.regex, java.nio.charset)
+
+        Introduced in version 1.4 of the platform, NIO was designed to
+        overcome some of the scalability limitations found in the
+        existing blocking java.net.* API's, and to address other
+        concepts such as Regular Expression parsing and Character
+        Sets.
+
+        This server demonstrates:
+
+            ByteBuffer
+            Blocking and Non-Blocking I/O
+            SocketChannel
+            ServerSocketChannel
+            Selector
+            CharacterSet
+            Pattern matching using Regular Expressions
+
+    JSSE (javax.net.ssl)
+
+	Introduced in version 1.4 of the platform, JSSE provides
+	network security using SSL/TLS for java.net.Socket-based
+	traffic.  In version 1.5, the SSLEngine API was introduced
+	which separates the SSL/TLS functionality from the underlying
+	I/O model.  By making this separation, applications can adapt
+	I/O and compute strategies to best fit their circumstances.
+
+        This server demonstrates:
+
+            Using SSLEngine to create a HTTPS server
+	    Creating simple key material for use with HTTPS
+
+    Concurrency Library (java.util.concurrent)
+
+        Introduced in version 1.5 of the platform, the concurrency
+        library provides a mechanism which decouples task submission
+        from the mechanics of how each task will be run.
+
+        This server demonstrates:
+
+            A ThreadPool with a fixed number of threads, which is
+            based on the number of available processors.
+
+
+SETUP
+=====
+
+The server must be built on version 1.5 (or later) of the platform.
+Invoking the following should be sufficient:
+
+    % mkdir build
+    % javac -source 1.5 -target 1.5 -d build *.java
+
+The following creates the document root:
+
+    % mkdir root
+
+All documents should be placed in this directory.
+
+For HTTPS, the server authenticates itself to clients by using simple
+Public Key Infrastructure (PKI) credentials in the form of
+X509Certificates.  You must create the server's credentials before
+attempting to run the server in "-secure" mode.  The server is
+currently hardcoded to look for its credentials in a file called
+"testkeys".
+
+In this example, we'll create credentials for a fictional widget web
+site owned by the ubiquitous "Xyzzy, Inc.".  When you run this in your
+own environment, replace "widgets.xyzzy.com" with the hostname of your
+server.
+
+The easiest way to create the SSL/TLS credentials is to use the
+java keytool, by doing the following:
+
+        (<CR> represents your end-of-line key)
+
+    % keytool -genkey -keyalg rsa -keystore testkeys -alias widgets
+    Enter keystore password:  passphrase
+    What is your first and last name?
+    [Unknown]:  widgets.xyzzy.com<CR>
+    What is the name of your organizational unit?
+    [Unknown]:  Consumer Widgets Group<CR>
+    What is the name of your organization?
+    [Unknown]:  Xyzzy, Inc.<CR>
+    What is the name of your City or Locality?
+    [Unknown]:  Arcata<CR>
+    What is the name of your State or Province?
+    [Unknown]:  CA<CR>
+    What is the two-letter country code for this unit?
+    [Unknown]:  US<CR>
+    Is CN=widgets.xyzzy.com, OU=Consumer Widgets Group, O="Xyzzy, Inc.",
+    L=Arcata, ST=CA, C=US correct?
+    [no]:  yes<CR>
+
+    Enter key password for <mykey>
+    (RETURN if same as keystore password):  <CR>
+
+This directory also contain a very simple URL reader (URLDumper), which
+connects to a specified URL and places all output into a specified file.
+
+
+SERVER EXECUTION
+================
+
+    % java -classpath build Server N1
+
+    Usage:  Server <type> [options]
+        type:
+                B1      Blocking/Single-threaded Server
+                BN      Blocking/Multi-threaded Server
+                BP      Blocking/Pooled-thread Server
+                N1      Nonblocking/Single-threaded Server
+                N2      Nonblocking/Dual-threaded Server
+
+        options:
+                -port port                port number
+                    default:  8000
+                -backlog backlog          backlog
+                    default:  1024
+                -secure                   encrypt with SSL/TLS
+		    default is insecure
+
+"http://" URLs should be used with insecure mode, and
+"https://" for secure mode.
+
+The "B*" servers use classic blocking I/O:  in other words, calls to
+read()/write() will not return until the I/O operation has completed.  The
+"N*" servers use non-blocking mode and Selectors to determine which
+Channels are ready to perform I/O.
+
+B1:	A single-threaded server which completely services each
+	connection before moving to the next.
+
+B2:	A multi-threaded server which creates a new thread for each
+	connection.  This is not efficient for large numbers of
+	connections.
+
+BP:	A multi-threaded server which creates a pool of threads for use
+	by the server.  The Thread pool decides how to schedule those
+	threads.
+
+N1:	A single-threaded server.  All accept() and read()/write()
+	operations are performed by a single thread, but only after
+	being selected for those operations by a Selector.
+
+N2:	A dual-threaded server which performs accept()s in one thread, and
+	services requests in a second.  Both threads use select().
+
+
+CLIENT EXECUTION
+================
+You can test the server using any standard browser such as Internet
+Explorer or Mozilla, but since the browser will not trust the
+credentials you just created, you may need to accept the credentials
+via the browser's pop-up dialog box.
+
+Alternatively, to use the certificates using the simple included JSSE
+client URLDumper, export the server certificate into a new truststore,
+and then run the application using the new truststore.
+
+    % keytool -export -keystore testkeys -alias widgets -file widgets.cer
+    Enter keystore password:  passphrase<CR>
+    Certificate stored in file <widgets.cer>
+
+    % keytool -import -keystore trustCerts -alias widgetServer \
+            -file widgets.cer
+    Enter keystore password:  passphrase<CR>
+    Owner: CN=widgets.xyzzy.com, OU=Consumer, O="xyzzy, inc.", L=Arcata,
+    ST=CA, C=US
+    Issuer: CN=widgets.xyzzy.com, OU=Consumer, O="xyzzy, inc.",
+    L=Arcata, ST=CA, C=US
+    Serial number: 4086cc7a
+    Valid from: Wed Apr 21 12:33:14 PDT 2004 until: Tue Jul 20 12:33:14
+    PDT 2004
+    Certificate fingerprints:
+        MD5:  39:71:42:CD:BF:0D:A9:8C:FB:8B:4A:CD:F8:6D:19:1F
+        SHA1: 69:5D:38:E9:F4:6C:E5:A7:4C:EA:45:8E:FB:3E:F3:9A:84:01:6F:22
+    Trust this certificate? [no]:  yes<CR>
+    Certificate was added to keystore
+
+    % java -classpath build -Djavax.net.ssl.trustStore=trustCerts \
+        -Djavax.net.ssl.TrustStorePassword=passphrase \
+        URLDumper https://widgets.xyzzy.com:8000/ outputFile
+
+NOTE:  The server must be run with "-secure" in order to receive
+"https://" URLs.
+
+WARNING:  This is just a simple example for code exposition, you should
+spend more time understanding PKI security concerns.
+
+
+SOURCE CODE OVERVIEW
+====================
+
+The main class is Server, which handles program startup, and is
+subclassed by the "B*" and "N*" server classes.
+
+Following a successful accept(), the "B*" variants each create a
+RequestServicer object to perform the actual request/reply operations.  The
+primary differences between the different "B*" servers is how the
+RequestServicer is actually run:
+
+    B1:	RequestServicer.run() is directly called.
+    BN:	A new thread is started, and the thread calls RequestServicer.run().
+    BP:	A ThreadPool is created, and the pool framework is given Runnable
+	tasks to complete.
+
+In the "N*" variations, a Dispatcher object is created, which is
+responsible for performing the select, and then issuing the
+corresponding handler:
+
+    N1:	A single thread is used for all accept()/read()/write() operations
+    N2:	Similar to N1, but a separate thread is used for the accept()
+	operations.
+
+In all cases, once the connection has been accepted, a ChannelIO object
+is created to handle all I/O.  In the insecure case, the corresponding
+SocketChannel methods are directly called.  However in the secure case,
+more manipulations are needed to first secure the channel, then
+encrypt/decrypt the data, and finally properly send any shutdown
+messages.  ChannelIOSecure extends ChannelIO, and provides the secure
+variants of the corresponding ChannelIO calls.
+
+RequestServicer and RequestHandler are the main drivers for the
+blocking and non-blocking variants, respectively.  They are responsible
+for:
+
+    Performing any initial handshaking
+
+    Reading the request data
+        All data is stored in a local buffer in the ChannelIO
+        structure.
+
+    Parsing the request
+        The request data is obtained from the ChannelIO object, and
+        is processed by Request class, which represents the
+        parsed URI address.
+
+    Locating/preparing/sending the data or reporting error conditions.
+        A Reply object is created which represents the entire object to send,
+        including the HTTP/HTTPS headers.
+
+    Shutdown/closing the channel.
+
+
+CLOSING THOUGHTS
+================
+This example represents a simple server: it is not production quality.
+It was primarily meant to demonstrate the new APIs in versions 1.4 and
+1.5 of the platform.
+
+This example could certainly be expanded to address other areas of
+concern: for example, assigning multiple threads to handle the selected
+Channels, or delegating SSLEngine tasks to multiple threads.  There are
+so many ways to implement compute and I/O strategies, we encourage you
+to experiment and find what works best for your situation.
+
+To steal a phrase from many textbooks:
+
+    "It is left as an exercise for the reader..."
+
diff --git a/linux-x86/sample/nio/server/Reply.java b/linux-x86/sample/nio/server/Reply.java
new file mode 100644
index 0000000..c128ee8
--- /dev/null
+++ b/linux-x86/sample/nio/server/Reply.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+/**
+ * An object used for sending Content to the requestor.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Reply implements Sendable {
+
+    /**
+     * A helper class which define the HTTP response codes
+     */
+    static class Code {
+
+        private int number;
+        private String reason;
+        private Code(int i, String r) { number = i; reason = r; }
+        public String toString() { return number + " " + reason; }
+
+        static Code OK = new Code(200, "OK");
+        static Code BAD_REQUEST = new Code(400, "Bad Request");
+        static Code NOT_FOUND = new Code(404, "Not Found");
+        static Code METHOD_NOT_ALLOWED = new Code(405, "Method Not Allowed");
+
+    }
+
+    private Code code;
+    private Content content;
+    private boolean headersOnly;
+
+    Reply(Code rc, Content c) {
+        this(rc, c, null);
+    }
+
+    Reply(Code rc, Content c, Request.Action head) {
+        code = rc;
+        content = c;
+        headersOnly = (head == Request.Action.HEAD);
+    }
+
+    private static String CRLF = "\r\n";
+    private static Charset ascii = Charset.forName("US-ASCII");
+
+    private ByteBuffer hbb = null;
+
+    private ByteBuffer headers() {
+        CharBuffer cb = CharBuffer.allocate(1024);
+        for (;;) {
+            try {
+                cb.put("HTTP/1.0 ").put(code.toString()).put(CRLF);
+                cb.put("Server: niossl/0.1").put(CRLF);
+                cb.put("Content-type: ").put(content.type()).put(CRLF);
+                cb.put("Content-length: ")
+                    .put(Long.toString(content.length())).put(CRLF);
+                cb.put(CRLF);
+                break;
+            } catch (BufferOverflowException x) {
+                assert(cb.capacity() < (1 << 16));
+                cb = CharBuffer.allocate(cb.capacity() * 2);
+                continue;
+            }
+        }
+        cb.flip();
+        return ascii.encode(cb);
+    }
+
+    public void prepare() throws IOException {
+        content.prepare();
+        hbb = headers();
+    }
+
+    public boolean send(ChannelIO cio) throws IOException {
+
+        if (hbb == null)
+            throw new IllegalStateException();
+
+        if (hbb.hasRemaining()) {
+            if (cio.write(hbb) <= 0)
+                return true;
+        }
+
+        if (!headersOnly) {
+            if (content.send(cio))
+                return true;
+        }
+
+        if (!cio.dataFlush())
+            return true;
+
+        return false;
+    }
+
+    public void release() throws IOException {
+        content.release();
+    }
+}
diff --git a/linux-x86/sample/nio/server/Request.java b/linux-x86/sample/nio/server/Request.java
new file mode 100644
index 0000000..fa36d1e
--- /dev/null
+++ b/linux-x86/sample/nio/server/Request.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.net.*;
+import java.nio.*;
+import java.nio.charset.*;
+import java.util.regex.*;
+
+/**
+ * An encapsulation of the request received.
+ * <P>
+ * The static method parse() is responsible for creating this
+ * object.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class Request {
+
+    /**
+     * A helper class for parsing HTTP command actions.
+     */
+    static class Action {
+
+        private String name;
+        private Action(String name) { this.name = name; }
+        public String toString() { return name; }
+
+        static Action GET = new Action("GET");
+        static Action PUT = new Action("PUT");
+        static Action POST = new Action("POST");
+        static Action HEAD = new Action("HEAD");
+
+        static Action parse(String s) {
+            if (s.equals("GET"))
+                return GET;
+            if (s.equals("PUT"))
+                return PUT;
+            if (s.equals("POST"))
+                return POST;
+            if (s.equals("HEAD"))
+                return HEAD;
+            throw new IllegalArgumentException(s);
+        }
+    }
+
+    private Action action;
+    private String version;
+    private URI uri;
+
+    Action action() { return action; }
+    String version() { return version; }
+    URI uri() { return uri; }
+
+    private Request(Action a, String v, URI u) {
+        action = a;
+        version = v;
+        uri = u;
+    }
+
+    public String toString() {
+        return (action + " " + version + " " + uri);
+    }
+
+    static boolean isComplete(ByteBuffer bb) {
+        int p = bb.position() - 4;
+        if (p < 0)
+            return false;
+        return (((bb.get(p + 0) == '\r') &&
+                 (bb.get(p + 1) == '\n') &&
+                 (bb.get(p + 2) == '\r') &&
+                 (bb.get(p + 3) == '\n')));
+    }
+
+    private static Charset ascii = Charset.forName("US-ASCII");
+
+    /*
+     * The expected message format is first compiled into a pattern,
+     * and is then compared against the inbound character buffer to
+     * determine if there is a match.  This convienently tokenizes
+     * our request into usable pieces.
+     *
+     * This uses Matcher "expression capture groups" to tokenize
+     * requests like:
+     *
+     *     GET /dir/file HTTP/1.1
+     *     Host: hostname
+     *
+     * into:
+     *
+     *     group[1] = "GET"
+     *     group[2] = "/dir/file"
+     *     group[3] = "1.1"
+     *     group[4] = "hostname"
+     *
+     * The text in between the parens are used to captured the regexp text.
+     */
+    private static Pattern requestPattern
+        = Pattern.compile("\\A([A-Z]+) +([^ ]+) +HTTP/([0-9\\.]+)$"
+                          + ".*^Host: ([^ ]+)$.*\r\n\r\n\\z",
+                          Pattern.MULTILINE | Pattern.DOTALL);
+
+    static Request parse(ByteBuffer bb) throws MalformedRequestException {
+
+        CharBuffer cb = ascii.decode(bb);
+        Matcher m = requestPattern.matcher(cb);
+        if (!m.matches())
+            throw new MalformedRequestException();
+        Action a;
+        try {
+            a = Action.parse(m.group(1));
+        } catch (IllegalArgumentException x) {
+            throw new MalformedRequestException();
+        }
+        URI u;
+        try {
+            u = new URI("http://"
+                        + m.group(4)
+                        + m.group(2));
+        } catch (URISyntaxException x) {
+            throw new MalformedRequestException();
+        }
+        return new Request(a, m.group(3), u);
+    }
+}
diff --git a/linux-x86/sample/nio/server/RequestHandler.java b/linux-x86/sample/nio/server/RequestHandler.java
new file mode 100644
index 0000000..91d2bda
--- /dev/null
+++ b/linux-x86/sample/nio/server/RequestHandler.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.channels.*;
+
+/**
+ * Primary driver class used by non-blocking Servers to receive,
+ * prepare, send, and shutdown requests.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class RequestHandler implements Handler {
+
+    private ChannelIO cio;
+    private ByteBuffer rbb = null;
+
+    private boolean requestReceived = false;
+    private Request request = null;
+    private Reply reply = null;
+
+    private static int created = 0;
+
+    RequestHandler(ChannelIO cio) {
+        this.cio = cio;
+
+        // Simple heartbeat to let user know we're alive.
+        synchronized (RequestHandler.class) {
+            created++;
+            if ((created % 50) == 0) {
+                System.out.println(".");
+                created = 0;
+            } else {
+                System.out.print(".");
+            }
+        }
+    }
+
+    // Returns true when request is complete
+    // May expand rbb if more room required
+    //
+    private boolean receive(SelectionKey sk) throws IOException {
+        ByteBuffer tmp = null;
+
+        if (requestReceived) {
+            return true;
+        }
+
+        if (!cio.doHandshake(sk)) {
+            return false;
+        }
+
+        if ((cio.read() < 0) || Request.isComplete(cio.getReadBuf())) {
+            rbb = cio.getReadBuf();
+            return (requestReceived = true);
+        }
+        return false;
+    }
+
+    // When parse is successfull, saves request and returns true
+    //
+    private boolean parse() throws IOException {
+        try {
+            request = Request.parse(rbb);
+            return true;
+        } catch (MalformedRequestException x) {
+            reply = new Reply(Reply.Code.BAD_REQUEST,
+                              new StringContent(x));
+        }
+        return false;
+    }
+
+    // Ensures that reply field is non-null
+    //
+    private void build() throws IOException {
+        Request.Action action = request.action();
+        if ((action != Request.Action.GET) &&
+                (action != Request.Action.HEAD)) {
+            reply = new Reply(Reply.Code.METHOD_NOT_ALLOWED,
+                              new StringContent(request.toString()));
+        }
+        reply = new Reply(Reply.Code.OK,
+                          new FileContent(request.uri()), action);
+    }
+
+    public void handle(SelectionKey sk) throws IOException {
+        try {
+
+            if (request == null) {
+                if (!receive(sk))
+                    return;
+                rbb.flip();
+                if (parse())
+                    build();
+                try {
+                    reply.prepare();
+                } catch (IOException x) {
+                    reply.release();
+                    reply = new Reply(Reply.Code.NOT_FOUND,
+                                      new StringContent(x));
+                    reply.prepare();
+                }
+                if (send()) {
+                    // More bytes remain to be written
+                    sk.interestOps(SelectionKey.OP_WRITE);
+                } else {
+                    // Reply completely written; we're done
+                    if (cio.shutdown()) {
+                        cio.close();
+                        reply.release();
+                    }
+                }
+            } else {
+                if (!send()) {  // Should be rp.send()
+                    if (cio.shutdown()) {
+                        cio.close();
+                        reply.release();
+                    }
+                }
+            }
+        } catch (IOException x) {
+            String m = x.getMessage();
+            if (!m.equals("Broken pipe") &&
+                    !m.equals("Connection reset by peer")) {
+                System.err.println("RequestHandler: " + x.toString());
+            }
+
+            try {
+                /*
+                 * We had a failure here, so we'll try to be nice
+                 * before closing down and send off a close_notify,
+                 * but if we can't get the message off with one try,
+                 * we'll just shutdown.
+                 */
+                cio.shutdown();
+            } catch (IOException e) {
+                // ignore
+            }
+
+            cio.close();
+            if (reply !=  null) {
+                reply.release();
+            }
+        }
+
+    }
+
+    private boolean send() throws IOException {
+        try {
+            return reply.send(cio);
+        } catch (IOException x) {
+            if (x.getMessage().startsWith("Resource temporarily")) {
+                System.err.println("## RTA");
+                return true;
+            }
+            throw x;
+        }
+    }
+}
diff --git a/linux-x86/sample/nio/server/RequestServicer.java b/linux-x86/sample/nio/server/RequestServicer.java
new file mode 100644
index 0000000..88d40b5
--- /dev/null
+++ b/linux-x86/sample/nio/server/RequestServicer.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+
+/**
+ * Primary driver class used by blocking Servers to receive,
+ * prepare, send, and shutdown requests.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class RequestServicer implements Runnable {
+
+    private ChannelIO cio;
+
+    private static int created = 0;
+
+    RequestServicer(ChannelIO cio) {
+        this.cio = cio;
+
+        // Simple heartbeat to let user know we're alive.
+        synchronized (RequestServicer.class) {
+            created++;
+            if ((created % 50) == 0) {
+                System.out.println(".");
+                created = 0;
+            } else {
+                System.out.print(".");
+            }
+        }
+    }
+
+    private void service() throws IOException {
+        Reply rp = null;
+        try {
+            ByteBuffer rbb = receive();         // Receive
+            Request rq = null;
+            try {                               // Parse
+                rq = Request.parse(rbb);
+            } catch (MalformedRequestException x) {
+                rp = new Reply(Reply.Code.BAD_REQUEST,
+                               new StringContent(x));
+            }
+            if (rp == null) rp = build(rq);     // Build
+            do {} while (rp.send(cio));         // Send
+            do {} while (!cio.shutdown());
+            cio.close();
+            rp.release();
+        } catch (IOException x) {
+            String m = x.getMessage();
+            if (!m.equals("Broken pipe") &&
+                    !m.equals("Connection reset by peer")) {
+                System.err.println("RequestHandler: " + x.toString());
+            }
+
+            try {
+                /*
+                 * We had a failure here, so we'll try to be nice
+                 * before closing down and send off a close_notify,
+                 * but if we can't get the message off with one try,
+                 * we'll just shutdown.
+                 */
+                cio.shutdown();
+            } catch (IOException e) {
+                // ignore
+            }
+
+            cio.close();
+            if (rp != null) {
+                rp.release();
+            }
+        }
+    }
+
+    public void run() {
+        try {
+            service();
+        } catch (IOException x) {
+            x.printStackTrace();
+        }
+    }
+
+    ByteBuffer receive() throws IOException {
+
+        do {} while (!cio.doHandshake());
+
+        for (;;) {
+            int read = cio.read();
+            ByteBuffer bb = cio.getReadBuf();
+            if ((read < 0) || (Request.isComplete(bb))) {
+                bb.flip();
+                return bb;
+            }
+        }
+    }
+
+    Reply build(Request rq) throws IOException {
+
+        Reply rp = null;
+        Request.Action action = rq.action();
+        if ((action != Request.Action.GET) &&
+                (action != Request.Action.HEAD))
+            rp = new Reply(Reply.Code.METHOD_NOT_ALLOWED,
+                           new StringContent(rq.toString()));
+        else
+            rp = new Reply(Reply.Code.OK,
+                           new FileContent(rq.uri()), action);
+        try {
+            rp.prepare();
+        } catch (IOException x) {
+            rp.release();
+            rp = new Reply(Reply.Code.NOT_FOUND,
+                           new StringContent(x));
+            rp.prepare();
+        }
+        return rp;
+    }
+}
diff --git a/linux-x86/sample/nio/server/Sendable.java b/linux-x86/sample/nio/server/Sendable.java
new file mode 100644
index 0000000..44ac848
--- /dev/null
+++ b/linux-x86/sample/nio/server/Sendable.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+
+/**
+ * Method definitions used for preparing, sending, and release
+ * content.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+interface Sendable {
+
+    void prepare() throws IOException;
+
+    // Sends (some) content to the given channel.
+    // Returns true if more bytes remain to be written.
+    // Throws IllegalStateException if not prepared.
+    //
+    boolean send(ChannelIO cio) throws IOException;
+
+    void release() throws IOException;
+}
diff --git a/linux-x86/sample/nio/server/Server.java b/linux-x86/sample/nio/server/Server.java
new file mode 100644
index 0000000..1ac6421
--- /dev/null
+++ b/linux-x86/sample/nio/server/Server.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.net.*;
+import java.nio.channels.*;
+import java.security.*;
+import javax.net.ssl.*;
+
+/**
+ * The main server base class.
+ * <P>
+ * This class is responsible for setting up most of the server state
+ * before the actual server subclasses take over.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+public abstract class Server {
+
+    ServerSocketChannel ssc;
+    SSLContext sslContext = null;
+
+    static private int PORT = 8000;
+    static private int BACKLOG = 1024;
+    static private boolean SECURE = false;
+
+    Server(int port, int backlog,
+            boolean secure) throws Exception {
+
+        if (secure) {
+            createSSLContext();
+        }
+
+        ssc = ServerSocketChannel.open();
+        ssc.socket().setReuseAddress(true);
+        ssc.socket().bind(new InetSocketAddress(port), backlog);
+    }
+
+    /*
+     * If this is a secure server, we now setup the SSLContext we'll
+     * use for creating the SSLEngines throughout the lifetime of
+     * this process.
+     */
+    private void createSSLContext() throws Exception {
+
+        char[] passphrase = "passphrase".toCharArray();
+
+        KeyStore ks = KeyStore.getInstance("JKS");
+        ks.load(new FileInputStream("testkeys"), passphrase);
+
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+        kmf.init(ks, passphrase);
+
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+        tmf.init(ks);
+
+        sslContext = SSLContext.getInstance("TLS");
+        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+    }
+
+    abstract void runServer() throws Exception;
+
+    static private void usage() {
+        System.out.println(
+            "Usage:  Server <type> [options]\n"
+                + "     type:\n"
+                + "             B1      Blocking/Single-threaded Server\n"
+                + "             BN      Blocking/Multi-threaded Server\n"
+                + "             BP      Blocking/Pooled-Thread Server\n"
+                + "             N1      Nonblocking/Single-threaded Server\n"
+                + "             N2      Nonblocking/Dual-threaded Server\n"
+                + "\n"
+                + "     options:\n"
+                + "             -port port              port number\n"
+                + "                 default:  " + PORT + "\n"
+                + "             -backlog backlog        backlog\n"
+                + "                 default:  " + BACKLOG + "\n"
+                + "             -secure                 encrypt with SSL/TLS");
+        System.exit(1);
+    }
+
+    /*
+     * Parse the arguments, decide what type of server to run,
+     * see if there are any defaults to change.
+     */
+    static private Server createServer(String args[]) throws Exception {
+        if (args.length < 1) {
+            usage();
+        }
+
+        int port = PORT;
+        int backlog = BACKLOG;
+        boolean secure = SECURE;
+
+        for (int i = 1; i < args.length; i++) {
+            if (args[i].equals("-port")) {
+                checkArgs(i, args.length);
+                port = Integer.valueOf(args[++i]);
+            } else if (args[i].equals("-backlog")) {
+                checkArgs(i, args.length);
+                backlog = Integer.valueOf(args[++i]);
+            } else if (args[i].equals("-secure")) {
+                secure = true;
+            } else {
+                usage();
+            }
+        }
+
+        Server server = null;
+
+        if (args[0].equals("B1")) {
+            server = new B1(port, backlog, secure);
+        } else if (args[0].equals("BN")) {
+            server = new BN(port, backlog, secure);
+        } else if (args[0].equals("BP")) {
+            server = new BP(port, backlog, secure);
+        } else if (args[0].equals("N1")) {
+            server = new N1(port, backlog, secure);
+        } else if (args[0].equals("N2")) {
+            server = new N2(port, backlog, secure);
+        }
+
+        return server;
+    }
+
+    static private void checkArgs(int i, int len) {
+        if ((i + 1) >= len) {
+           usage();
+        }
+    }
+
+    static public void main(String args[]) throws Exception {
+        Server server = createServer(args);
+
+        if (server == null) {
+            usage();
+        }
+
+        System.out.println("Server started.");
+        server.runServer();
+    }
+}
diff --git a/linux-x86/sample/nio/server/StringContent.java b/linux-x86/sample/nio/server/StringContent.java
new file mode 100644
index 0000000..267b338
--- /dev/null
+++ b/linux-x86/sample/nio/server/StringContent.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+/**
+ * A Content type that provides for transferring Strings.
+ *
+ * @author Mark Reinhold
+ * @author Brad R. Wetmore
+ */
+class StringContent implements Content {
+
+    private static Charset ascii = Charset.forName("US-ASCII");
+
+    private String type;                // MIME type
+    private String content;
+
+    StringContent(CharSequence c, String t) {
+        content = c.toString();
+        if (!content.endsWith("\n"))
+            content += "\n";
+        type = t + "; charset=iso-8859-1";
+    }
+
+    StringContent(CharSequence c) {
+        this(c, "text/plain");
+    }
+
+    StringContent(Exception x) {
+        StringWriter sw = new StringWriter();
+        x.printStackTrace(new PrintWriter(sw));
+        type = "text/plain; charset=iso-8859-1";
+        content = sw.toString();
+    }
+
+    public String type() {
+        return type;
+    }
+
+    private ByteBuffer bb = null;
+
+    private void encode() {
+        if (bb == null)
+            bb = ascii.encode(CharBuffer.wrap(content));
+    }
+
+    public long length() {
+        encode();
+        return bb.remaining();
+    }
+
+    public void prepare() {
+        encode();
+        bb.rewind();
+    }
+
+    public boolean send(ChannelIO cio) throws IOException {
+        if (bb == null)
+            throw new IllegalStateException();
+        cio.write(bb);
+
+        return bb.hasRemaining();
+    }
+
+    public void release() throws IOException {
+    }
+}
diff --git a/linux-x86/sample/nio/server/URLDumper.java b/linux-x86/sample/nio/server/URLDumper.java
new file mode 100644
index 0000000..30166e7
--- /dev/null
+++ b/linux-x86/sample/nio/server/URLDumper.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+import java.io.*;
+import java.net.*;
+
+/**
+ * A simple example to illustrate using a URL to access a resource
+ * and then store the result to a File.
+ * <P>
+ * Any type of URL can be used:  http, https, ftp, etc.
+ *
+ * @author Brad R. Wetmore
+ * @author Mark Reinhold
+ */
+public class URLDumper {
+    public static void main(String[] args) throws Exception {
+
+        if (args.length != 2) {
+            System.out.println("Usage:  URLDumper <URL> <file>");
+            System.exit(1);
+        }
+
+        String location = args[0];
+        String file = args[1];
+
+        URL url = new URL(location);
+        FileOutputStream fos = new FileOutputStream(file);
+
+        byte [] bytes = new byte [4096];
+
+        InputStream is = url.openStream();
+
+        int read;
+
+        while ((read = is.read(bytes)) != -1) {
+            fos.write(bytes, 0, read);
+        }
+
+        is.close();
+        fos.close();
+    }
+}
diff --git a/linux-x86/sample/scripting/scriptpad/README.txt b/linux-x86/sample/scripting/scriptpad/README.txt
new file mode 100644
index 0000000..ab4bd5f
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/README.txt
@@ -0,0 +1,122 @@
+Scriptpad Sample
+
+* Introduction
+
+Scriptpad is a notepad like editor to open/edit/save and run 
+script (JavaScript) files. This sample demonstrates the use of 
+javax.script (JSR-223) API and JavaScript engine that is bundled 
+with JDK 6.
+
+Scriptpad sample demonstrates how to use Javascript to use Java 
+classes and objects to perform various tasks such as to modify,
+customize Swing GUI or to connect to a running application and 
+monitor it using JMX (Java Management Extensions) API.
+
+* How to run Scriptpad?
+
+Scriptpad can be run with the following command:
+    
+    java -jar ./build/scriptpad.jar
+
+(be sure to use the correct version of java).  You can
+open/edit/save scripts using menu items under "File" menu.
+To run currently edited script, you can use "Tools->Run" menu.
+
+For example, you may enter
+
+    alert("hello, world");
+
+in the editor and run the same with "Tools->Run" menu. 
+You will see an alert box with the message "hello, world".
+
+In addition to being a simple script editor/runner, scriptpad 
+can be used to connect to a JMX MBean server ("Tools->JMX Connect" 
+menu). User can specify JMX hostname and port. After connecting, 
+user can use "monitoring and management" script functions defined 
+in "mm.js" (see below).
+
+* Scriptpad Sources
+
+com.sun.demo.scriptpad.Main class is the entry point of this
+sample. This class creates ScriptEngine and evaluates few
+JavaScript "files" -- which are stored as resources (please
+refer to src/resources/*.js). Actual code for the scriptpad's
+main functionality lives in these JavaScript files.
+
+1. conc.js
+ -- simple concurrency utilities for JavaScript
+
+2. gui.js
+ -- simple GUI utilities for JavaScript
+
+3. mm.js
+ -- Monitoring and Management utilities for JavaScript
+
+4. scriptpad.js
+ -- This creates main "notepad"-like GUI for open/edit/save
+    and run script files
+
+5. Main.js
+ -- This script file can be used under "jrunscript" tool.
+    jrunscript is an experimental tool shipped with JDK (under
+    $JDK_HOME/bin directory). The scriptpad application can be
+    run by the following commands:
+
+    cd ./src/resources
+    $JDK_HOME/bin/jrunscript -f Main.js -f -
+
+
+* Extending Scriptpad:
+
+It is possible to extend scriptpad using scripts. There is a global
+object called "application". This object has 2 fields and a method.
+
+    Fields of the application object:
+
+        frame  -> JFrame of the scriptpad
+        editor -> editor pane of the scriptpad
+ 
+    Method of the application object:
+
+        addTool -> adds a menu item under "Tools" menu
+
+    Example script to add "Tools->Hello" menu item:
+
+        application.addTool("Hello", 
+            function() { alert("hello, world"); });
+
+After running the above script, you can click Tools->Hello menu item
+and you'll see an alert box.
+
+Scriptpad customization may also be done by defining a file named 
+"scriptpad.js" under your home directory,. If this file is found, 
+scriptpad loads this file just after initializating everything. 
+In your initialization file, you can additional script functions 
+by "load" function.
+
+* Script Samples:
+
+On clicking the menu items under "Examples" menu, scriptpad shows 
+built-in examples in the editor. Also, there are few script samples
+under the ./src/scripts directory.
+
+* Monitoring and Management with Scriptpad:
+
+(1) Start the application with the JMX agent - here's an example of 
+    how the Java2D demo is started
+   
+      java -Dcom.sun.management.jmxremote.port=1090          \
+           -Dcom.sun.management.jmxremote.ssl=false          \
+           -Dcom.sun.management.jmxremote.authenticate=false \
+           -jar $JDK_HOME/demo/jfc/Font2DTest/Font2DTest.jar
+
+(2) Start scriptpad and click on "Tools->JMX Connect" menu.
+    In the prompt, enter "localhost:1090" to connect to the above
+    program.
+
+After connecting to a MBeanServer (using "Tools->JMX Connect"),
+you can run any script that uses functions defined in "mm.js". 
+For example, it is possible to load and run management scripts that
+are part of JConsole script shell plugin under the directory:
+
+    $JDK_HOME/demo/scripting/jconsole-plugin/src/scripts
diff --git a/linux-x86/sample/scripting/scriptpad/build.properties b/linux-x86/sample/scripting/scriptpad/build.properties
new file mode 100644
index 0000000..efcd591
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/build.properties
@@ -0,0 +1,22 @@
+main.dir=.
+
+src.dir=${main.dir}/src
+
+build.dir=build
+classes.dir=${build.dir}/classes
+jar=${build.dir}/scriptpad.jar
+javadoc.dir=${build.dir}/javadoc
+
+build.sysclasspath=ignore
+# E.g.: cp=lib/x.jar:lib/y.jar
+cp=
+extra.run.cp=
+
+main.class=com.sun.sample.scriptpad.Main
+
+run.cp=${cp}:${classes.dir}:${extra.run.cp}
+
+debug=true
+deprecation=false
+
+nbjdk.home=${basedir}/../../..
diff --git a/linux-x86/sample/scripting/scriptpad/build.xml b/linux-x86/sample/scripting/scriptpad/build.xml
new file mode 100644
index 0000000..5f203d5
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/build.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+
+<!-- 
+  This is ant (http://ant.apache.org) build script to build the
+  "Scriptpad" sample. Either this build.xml can be used standalone 
+  with "ant" tool or can be opened as a project with NetBeans IDE
+  (http://www.netbeans.org).
+-->
+
+<project name="Scriptpad" default="jar" basedir=".">
+
+    <import file="nbproject/jdk.xml"/>
+
+    <target name="-prop-init">
+        <property file="user.build.properties"/>
+        <property file="build.properties"/>
+    </target>
+
+    <target name="-init" depends="-prop-init,-jdk-init"/>
+
+    <target name="compile" depends="-init" description="Compile main sources.">
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+        </javac>
+        <copy todir="${classes.dir}">
+            <fileset dir="${src.dir}"/>
+        </copy>
+    </target>
+
+    <target name="jar" depends="compile" description="Build JAR file for main sources.">
+        <jar jarfile="${jar}" compress="true">
+            <manifest>
+                <attribute name="Main-Class" value="${main.class}"/>
+            </manifest>
+            <fileset dir="${classes.dir}"/>
+        </jar>
+    </target>
+
+    <target name="run" depends="compile" description="Run application.">
+        <fail unless="main.class">Must set property 'main.class' (e.g. in build.properties)</fail>
+        <java classname="${main.class}" fork="true" failonerror="true">
+            <classpath path="${run.cp}"/>
+        </java>
+    </target>
+
+    <target name="javadoc" depends="-init" description="Build Javadoc.">
+        <mkdir dir="${javadoc.dir}"/>
+        <javadoc destdir="${javadoc.dir}">
+            <classpath path="${cp}"/>
+            <sourcepath>
+                <pathelement location="${src.dir}"/>
+            </sourcepath>
+            <fileset dir="${src.dir}"/>
+        </javadoc>
+    </target>
+
+    <target name="clean" depends="-init" description="Clean build products.">
+        <delete dir="${build.dir}"/>
+        <delete file="${jar}"/>
+    </target>
+
+    <target name="profile">
+        <ant antfile="nbproject/netbeans-targets.xml" target="profile"/>
+    </target>
+</project>
diff --git a/linux-x86/sample/scripting/scriptpad/nbproject/file-targets.xml b/linux-x86/sample/scripting/scriptpad/nbproject/file-targets.xml
new file mode 100644
index 0000000..0904977
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/nbproject/file-targets.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="scriptpad/file">
+    
+    <import file="../build.xml"/>
+    
+    <target name="compile-selected" depends="-init">
+        <fail unless="includes">Must set property 'includes'</fail>
+        <mkdir dir="${classes.dir}"/>
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="${debug}" deprecation="${deprecation}" includes="${includes}">
+            <classpath path="${cp}"/>
+        </javac>
+    </target>
+    
+</project>
diff --git a/linux-x86/sample/scripting/scriptpad/nbproject/jdk.xml b/linux-x86/sample/scripting/scriptpad/nbproject/jdk.xml
new file mode 100644
index 0000000..2b85b77
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/nbproject/jdk.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project name="jdk" basedir=".">
+
+    <target name="-jdk-preinit">
+        <condition property=".exe" value=".exe">
+            <os family="windows"/>
+        </condition>
+        <property name=".exe" value=""/>
+        <property name="nbjdk.javac" value="${nbjdk.home}/bin/javac${.exe}"/>
+        <property name="nbjdk.java" value="${nbjdk.home}/bin/java${.exe}"/>
+        <property name="nbjdk.javadoc" value="${nbjdk.home}/bin/javadoc${.exe}"/>
+        <property name="nbjdk.appletviewer" value="${nbjdk.home}/bin/appletviewer${.exe}"/>
+        <property name="nbjdk.bootclasspath" value="${nbjdk.home}/jre/lib/rt.jar"/>
+    </target>
+
+    <target name="-jdk-presetdef-basic" depends="-jdk-preinit" unless="nbjdk.presetdef.basic.done">
+        <macrodef name="javac-presetdef">
+            <attribute name="javacval"/>
+            <sequential>
+                <presetdef name="javac">
+                    <javac fork="yes" executable="@{javacval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javac-presetdef javacval="${nbjdk.javac}"/>
+        <macrodef name="java-presetdef">
+            <attribute name="javaval"/>
+            <sequential>
+                <presetdef name="java">
+                    <java fork="yes" jvm="@{javaval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <java-presetdef javaval="${nbjdk.java}"/>
+        <macrodef name="javadoc-presetdef">
+            <attribute name="javadocval"/>
+            <sequential>
+                <presetdef name="javadoc">
+                    <javadoc executable="@{javadocval}"/>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <javadoc-presetdef javadocval="${nbjdk.javadoc}"/>
+        <property name="nbjdk.presetdef.basic.done" value="true"/>
+    </target>
+
+    <target name="-jdk-presetdef-nbjpdastart" depends="-jdk-preinit" unless="nbjdk.presetdef.nbjpdastart.done">
+        <macrodef name="nbjpdastart-presetdef">
+            <attribute name="bootcpval"/>
+            <sequential>
+                <presetdef name="nbjpdastart">
+                    <nbjpdastart>
+                        <bootclasspath>
+                            <path path="@{bootcpval}"/>
+                        </bootclasspath>
+                    </nbjpdastart>
+                </presetdef>
+            </sequential>
+        </macrodef>
+        <nbjpdastart-presetdef bootcpval="${nbjdk.bootclasspath}"/>
+        <property name="nbjdk.presetdef.nbjpdastart.done" value="true"/>
+    </target>
+
+    <target name="-jdk-init" depends="-jdk-preinit,-jdk-presetdef-basic"/>
+
+</project>
diff --git a/linux-x86/sample/scripting/scriptpad/nbproject/netbeans-targets.xml b/linux-x86/sample/scripting/scriptpad/nbproject/netbeans-targets.xml
new file mode 100644
index 0000000..b53c34d
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/nbproject/netbeans-targets.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project basedir=".." name="scriptpad/NB">
+
+    <import file="../build.xml"/>
+    
+    <target name="debug" depends="compile,-jdk-presetdef-nbjpdastart">
+        <nbjpdastart addressproperty="jpda.address" name="scriptpad" transport="dt_socket">
+            <classpath path="${run.cp}"/>
+        </nbjpdastart>
+        <java classname="${main.class}" failonerror="true" fork="true">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="-Xdebug"/>
+            <jvmarg value="-Xnoagent"/>
+            <jvmarg value="-Djava.compiler=none"/>
+            <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
+        </java>
+    </target>
+    
+    <target name="debug-fix" depends="-init">
+        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" deprecation="${deprecation}">
+            <classpath path="${cp}"/>
+            <include name="${class}.java"/>
+        </javac>
+        <nbjpdareload>
+            <fileset dir="${classes.dir}">
+                <include name="${class}.class"/>
+            </fileset>
+        </nbjpdareload>
+    </target>
+    
+    <target name="show-javadoc" depends="javadoc">
+        <nbbrowse file="${javadoc.dir}/index.html"/>
+    </target>
+    
+    <target name="profile" depends="compile">
+        <nbprofiledirect>
+            <classpath path="${run.cp}"/>
+        </nbprofiledirect>
+        <property environment="env"/>
+        <java classname="${main.class}" fork="true" failonerror="true" dir="${profiler.session.working.dir}" jvm="${profiler.info.jvm}">
+            <classpath path="${run.cp}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <env key="LD_LIBRARY_PATH" path="${profiler.info.agentpath}:${env.LD_LIBRARY_PATH}"/>
+            <env key="Path" path="${profiler.info.agentpath}:${env.Path}"/>
+        </java>
+    </target>
+    
+</project>
diff --git a/linux-x86/sample/scripting/scriptpad/nbproject/project.xml b/linux-x86/sample/scripting/scriptpad/nbproject/project.xml
new file mode 100644
index 0000000..32135c7
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/nbproject/project.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>Scriptpad</name>
+            <properties>
+                <property-file>user.build.properties</property-file>
+                <property-file>build.properties</property-file>
+                <property name="nbjdk.bootclasspath">${nbjdk.home}/jre/lib/rt.jar</property>
+            </properties>
+            <folders>
+                <source-folder>
+                    <label>JDK Demo</label>
+                    <location>${main.dir}</location>
+                </source-folder>
+                <source-folder>
+                    <label>Sources</label>
+                    <type>java</type>
+                    <location>${src.dir}</location>
+                </source-folder>
+                <build-folder>
+                    <location>${build.dir}</location>
+                </build-folder>
+            </folders>
+            <ide-actions>
+                <action name="build">
+                    <target>jar</target>
+                </action>
+                <action name="clean">
+                    <target>clean</target>
+                </action>
+                <action name="rebuild">
+                    <target>clean</target>
+                    <target>jar</target>
+                </action>
+                <action name="run">
+                    <target>run</target>
+                </action>
+                <action name="javadoc">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>show-javadoc</target>
+                </action>
+                <action name="debug">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                </action>
+                <action name="compile.single">
+                    <script>nbproject/file-targets.xml</script>
+                    <target>compile-selected</target>
+                    <context>
+                        <property>includes</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug</target>
+                    <context>
+                        <property>main.class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <script>nbproject/netbeans-targets.xml</script>
+                    <target>debug-fix</target>
+                    <context>
+                        <property>class</property>
+                        <folder>${src.dir}</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+            </ide-actions>
+            <export>
+                <type>jar</type>
+                <location>${jar}</location>
+                <build-target>jar</build-target>
+                <clean-target>clean</clean-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="packages">
+                        <label>Sources</label>
+                        <location>${src.dir}</location>
+                    </source-folder>
+                    <source-file>
+                        <location>${main.dir}/README.txt</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <ide-action name="build"/>
+                    <ide-action name="rebuild"/>
+                    <ide-action name="clean"/>
+                    <ide-action name="javadoc"/>
+                    <separator/>
+                    <ide-action name="run"/>
+                    <ide-action name="debug"/>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/2">
+            <compilation-unit>
+                <package-root>${src.dir}</package-root>
+                <classpath mode="compile">${cp}</classpath>
+                <classpath mode="execute">${run.cp}</classpath>
+                <classpath mode="boot">${nbjdk.bootclasspath}</classpath>
+                <built-to>${classes.dir}</built-to>
+                <built-to>${jar}</built-to>
+                <javadoc-built-to>${javadoc.dir}</javadoc-built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+        </java-data>
+    </configuration>
+</project>
diff --git a/linux-x86/sample/scripting/scriptpad/src/META-INF/manifest.mf b/linux-x86/sample/scripting/scriptpad/src/META-INF/manifest.mf
new file mode 100644
index 0000000..76eda30
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/META-INF/manifest.mf
@@ -0,0 +1,2 @@
+Main-Class: com.sun.sample.scriptpad.Main
+
diff --git a/linux-x86/sample/scripting/scriptpad/src/com/sun/sample/scriptpad/Main.java b/linux-x86/sample/scripting/scriptpad/src/com/sun/sample/scriptpad/Main.java
new file mode 100644
index 0000000..aaeb58d
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/com/sun/sample/scriptpad/Main.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+package com.sun.sample.scriptpad;
+
+import javax.script.*;
+import java.io.*;
+
+/**
+ * This is the entry point of "Scriptpad" sample. This class creates
+ * ScriptEngine and evaluates few JavaScript "files" -- which are stored
+ * as resources (please refer to src/resources/*.js). Actual code for the
+ * scriptpad's main functionality lives in these JavaScript files.
+ */
+public class Main {
+    public static void main(String[] args) throws Exception {
+
+        // create a ScriptEngineManager
+        ScriptEngineManager m = new ScriptEngineManager();
+        // get an instance of JavaScript script engine
+        ScriptEngine engine = m.getEngineByName("js");
+
+        // expose the current script engine as a global variable
+        engine.put("engine", engine);
+
+        // evaluate few scripts that are bundled in "resources"
+        eval(engine, "conc.js");
+        eval(engine, "gui.js");
+        eval(engine, "scriptpad.js");
+        eval(engine, "mm.js");
+    }
+
+    private static void eval(ScriptEngine engine, String name)
+                            throws Exception {
+        /*
+         * This class is compiled into a jar file. The jar file
+         * contains few scripts under /resources URL.
+         */
+        InputStream is = Main.class.getResourceAsStream("/resources/" + name);
+        // current script file name for better error messages
+        engine.put(ScriptEngine.FILENAME, name);
+        // evaluate the script in the InputStream
+        engine.eval(new InputStreamReader(is));
+    }
+}
diff --git a/linux-x86/sample/scripting/scriptpad/src/resources/Main.js b/linux-x86/sample/scripting/scriptpad/src/resources/Main.js
new file mode 100644
index 0000000..a1c332d
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/resources/Main.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script can be loaded in jrunscript to start scriptpad.
+ *
+ *    jrunscript -f Main.js -f -
+ */
+
+load("conc.js");
+load("gui.js");
+load("scriptpad.js");
+load("mm.js");
diff --git a/linux-x86/sample/scripting/scriptpad/src/resources/conc.js b/linux-x86/sample/scripting/scriptpad/src/resources/conc.js
new file mode 100644
index 0000000..aaca49a
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/resources/conc.js
@@ -0,0 +1,329 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * Concurrency utilities for JavaScript. These are based on
+ * java.lang and java.util.concurrent API. The following functions
+ * provide a simpler API for scripts. Instead of directly using java.lang
+ * and java.util.concurrent classes, scripts can use functions and
+ * objects exported from here.
+ */
+
+// shortcut for j.u.c lock classes
+var Lock = java.util.concurrent.locks.ReentrantLock;
+var RWLock = java.util.concurrent.locks.ReentrantReadWriteLock;
+
+// check if there is a build in sync function, define one if missing
+if (typeof sync === "undefined") {
+    var sync = function(func, obj) {
+        if (arguments.length < 1 || arguments.length > 2 ) {
+            throw "sync(function [,object]) parameter count mismatch";
+        }
+
+        var syncobj = (arguments.length == 2 ? obj : this);
+
+        if (!syncobj._syncLock) {
+            syncobj._syncLock = new Lock();
+        }
+
+        return function() {
+            syncobj._syncLock.lock();
+            try {
+                func.apply(null, arguments);
+            } finally {
+                syncobj._syncLock.unlock();
+            }
+        };
+    };
+    sync.docString = "synchronize a function, optionally on an object";
+}
+
+/**
+ * Wrapper for java.lang.Object.wait
+ *
+ * can be called only within a sync method
+ */
+function wait(object) {
+    var objClazz = java.lang.Class.forName('java.lang.Object');
+    var waitMethod = objClazz.getMethod('wait', null);
+    waitMethod.invoke(object, null);
+}
+wait.docString = "convenient wrapper for java.lang.Object.wait method";
+
+/**
+ * Wrapper for java.lang.Object.notify
+ *
+ * can be called only within a sync method
+ */
+function notify(object) {
+    var objClazz = java.lang.Class.forName('java.lang.Object');
+    var notifyMethod = objClazz.getMethod('notify', null);
+    notifyMethod.invoke(object, null);
+}
+notify.docString = "convenient wrapper for java.lang.Object.notify method";
+
+/**
+ * Wrapper for java.lang.Object.notifyAll
+ *
+ * can be called only within a sync method
+ */
+function notifyAll(object)  {
+    var objClazz = java.lang.Class.forName('java.lang.Object');
+    var notifyAllMethod = objClazz.getMethod('notifyAll', null);
+    notifyAllMethod.invoke(object, null);
+}
+notifyAll.docString = "convenient wrapper for java.lang.Object.notifyAll method";
+
+/**
+ * Creates a java.lang.Runnable from a given script
+ * function.
+ */
+Function.prototype.runnable = function() {
+    var args = arguments;
+    var func = this;
+    return new java.lang.Runnable() {
+        run: function() {
+            func.apply(null, args);
+        }
+    }
+};
+
+/**
+ * Executes the function on a new Java Thread.
+ */
+Function.prototype.thread = function() {
+    var t = new java.lang.Thread(this.runnable.apply(this, arguments));
+    t.start();
+    return t;
+};
+
+/**
+ * Executes the function on a new Java daemon Thread.
+ */
+Function.prototype.daemon = function() {
+    var t = new java.lang.Thread(this.runnable.apply(this, arguments));
+    t.setDaemon(true);
+    t.start();
+    return t;
+};
+
+/**
+ * Creates a java.util.concurrent.Callable from a given script
+ * function.
+ */
+Function.prototype.callable = function() {
+    var args = arguments;
+    var func = this;
+    return new java.util.concurrent.Callable() {
+          call: function() { return func.apply(null, args); }
+    }
+};
+
+/**
+ * Registers the script function so that it will be called exit.
+ */
+Function.prototype.atexit = function () {
+    var args = arguments;
+    java.lang.Runtime.getRuntime().addShutdownHook(
+         new java.lang.Thread(this.runnable.apply(this, args)));
+};
+
+/**
+ * Executes the function asynchronously.
+ *
+ * @return a java.util.concurrent.FutureTask
+ */
+Function.prototype.future = (function() {
+    // default executor for future
+    var juc = java.util.concurrent;
+    var theExecutor = juc.Executors.newSingleThreadExecutor();
+    // clean-up the default executor at exit
+    (function() { theExecutor.shutdown(); }).atexit();
+    return function() {
+        return theExecutor.submit(this.callable.apply(this, arguments));
+    };
+})();
+
+/**
+ * Executes a function after acquiring given lock. On return,
+ * (normal or exceptional), lock is released.
+ *
+ * @param lock lock that is locked and unlocked
+ */
+Function.prototype.sync = function (lock) {
+    if (arguments.length == 0) {
+        throw "lock is missing";
+    }
+    var res = new Array(arguments.length - 1);
+    for (var i = 0; i < res.length; i++) {
+        res[i] = arguments[i + 1];
+    }
+    lock.lock();
+    try {
+        this.apply(null, res);
+    } finally {
+        lock.unlock();
+    }
+};
+
+/**
+ * Causes current thread to sleep for specified
+ * number of milliseconds
+ *
+ * @param interval in milliseconds
+ */
+function sleep(interval) {
+    java.lang.Thread.sleep(interval);
+}
+sleep.docString = "wrapper for java.lang.Thread.sleep method";
+
+/**
+ * Schedules a task to be executed once in N milliseconds specified.
+ *
+ * @param callback function or expression to evaluate
+ * @param interval in milliseconds to sleep
+ * @return timeout ID (which is nothing but Thread instance)
+ */
+function setTimeout(callback, interval) {
+    if (! (callback instanceof Function)) {
+        callback = new Function(callback);
+    }
+
+    // start a new thread that sleeps given time
+    // and calls callback in an infinite loop
+    return (function() {
+         try {
+             sleep(interval);
+         } catch (x) { }
+         callback();
+    }).daemon();
+}
+setTimeout.docString = "calls given callback once after specified interval";
+
+/**
+ * Cancels a timeout set earlier.
+ * @param tid timeout ID returned from setTimeout
+ */
+function clearTimeout(tid) {
+    // we just interrupt the timer thread
+    tid.interrupt();
+}
+clearTimeout.docString = "interrupt a setTimeout timer";
+
+/**
+ * Schedules a task to be executed once in
+ * every N milliseconds specified.
+ *
+ * @param callback function or expression to evaluate
+ * @param interval in milliseconds to sleep
+ * @return timeout ID (which is nothing but Thread instance)
+ */
+function setInterval(callback, interval) {
+    if (! (callback instanceof Function)) {
+        callback = new Function(callback);
+    }
+
+    // start a new thread that sleeps given time
+    // and calls callback in an infinite loop
+    return (function() {
+         while (true) {
+             try {
+                 sleep(interval);
+             } catch (x) {
+                 break;
+             }
+             callback();
+         }
+    }).daemon();
+}
+setInterval.docString = "calls given callback every specified interval";
+
+/**
+ * Cancels a timeout set earlier.
+ * @param tid timeout ID returned from setTimeout
+ */
+function clearInterval(tid) {
+    // we just interrupt the timer thread
+    tid.interrupt();
+}
+clearInterval.docString = "interrupt a setInterval timer";
+
+/**
+ * Simple access to thread local storage.
+ *
+ * Script sample:
+ *
+ *  __thread.x = 44;
+ *  function f() {
+ *      __thread.x = 'hello';
+ *      print(__thread.x);
+ *  }
+ *  f.thread();       // prints 'hello'
+ * print(__thread.x); // prints 44 in main thread
+ */
+var __thread = (function () {
+    var map = new Object();
+    return new JSAdapter({
+        __has__: function(name) {
+            return map[name] != undefined;
+        },
+        __get__: function(name) {
+            if (map[name] != undefined) {
+                return map[name].get();
+            } else {
+                return undefined;
+            }
+        },
+        __put__: sync(function(name, value) {
+            if (map[name] == undefined) {
+                var tmp = new java.lang.ThreadLocal();
+                tmp.set(value);
+                map[name] = tmp;
+            } else {
+                map[name].set(value);
+            }
+        }),
+        __delete__: function(name) {
+            if (map[name] != undefined) {
+                map[name].set(null);
+            }
+        }
+    });
+})();
+
diff --git a/linux-x86/sample/scripting/scriptpad/src/resources/gui.js b/linux-x86/sample/scripting/scriptpad/src/resources/gui.js
new file mode 100644
index 0000000..d62b92f
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/resources/gui.js
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * Few user interface utilities.
+ */
+
+if (this.window === undefined) {
+    this.window = null;
+}
+
+/**
+ * Swing invokeLater - invokes given function in AWT event thread
+ */
+Function.prototype.invokeLater = function() {
+    var SwingUtilities = javax.swing.SwingUtilities;
+    var func = this;
+    var args = arguments;
+    SwingUtilities.invokeLater(new java.lang.Runnable() {
+                       run: function() {
+                           func.apply(func, args);
+                       }
+                  });
+};
+
+/**
+ * Swing invokeAndWait - invokes given function in AWT event thread
+ * and waits for it's completion
+ */
+Function.prototype.invokeAndWait = function() {
+    var SwingUtilities = javax.swing.SwingUtilities;
+    var func = this;
+    var args = arguments;
+    SwingUtilities.invokeAndWait(new java.lang.Runnable() {
+                       run: function() {
+                           func.apply(func, args);
+                       }
+                  });
+};
+
+/**
+ * Am I running in AWT event dispatcher thread?
+ */
+function isEventThread() {
+    var SwingUtilities = javax.swing.SwingUtilities;
+    return SwingUtilities.isEventDispatchThread();
+}
+isEventThread.docString = "returns whether the current thread is GUI thread";
+
+/**
+ * Opens a file dialog box
+ *
+ * @param curDir current directory [optional]
+ * @param save flag tells whether this is a save dialog or not
+ * @return selected file or else null
+ */
+function fileDialog(curDir, save) {
+    var result;
+    function _fileDialog() {
+        if (curDir == undefined) {
+            curDir = new java.io.File(".");
+        }
+
+        var JFileChooser = javax.swing.JFileChooser;
+        var dialog = new JFileChooser(curDir);
+        var res = save ? dialog.showSaveDialog(window):
+            dialog.showOpenDialog(window);
+
+        if (res == JFileChooser.APPROVE_OPTION) {
+           result = dialog.getSelectedFile();
+        } else {
+           result = null;
+        }
+    }
+
+    if (isEventThread()) {
+        _fileDialog();
+    } else {
+        _fileDialog.invokeAndWait();
+    }
+
+    return result;
+}
+fileDialog.docString = "show a file dialog box";
+
+/**
+ * Opens a color chooser dialog box
+ *
+ * @param title of the dialog box [optional]
+ * @param color default color [optional]
+ * @return chosen color or default color
+ */
+function colorDialog(title, color) {
+    var result;
+
+    function _colorDialog() {
+        if (title == undefined) {
+            title = "Choose Color";
+        }
+
+        if (color == undefined) {
+            color = java.awt.Color.BLACK;
+        }
+
+        var chooser = new javax.swing.JColorChooser();
+        var res = chooser.showDialog(window, title, color);
+        result = res ? res : color;
+    }
+
+    if (isEventThread()) {
+        _colorDialog();
+    } else {
+        _colorDialog.invokeAndWait();
+    }
+
+    return result;
+}
+colorDialog.docString = "shows a color chooser dialog box";
+
+/**
+ * Shows a message box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ * @param msgType type of message box [constants in JOptionPane]
+ */
+function msgBox(msg, title, msgType) {
+    function _msgBox() {
+        var JOptionPane = javax.swing.JOptionPane;
+        if (msg === undefined) msg = "undefined";
+        if (msg === null) msg = "null";
+        if (title == undefined) title = msg;
+        if (msgType == undefined) msgType = JOptionPane.INFORMATION_MESSAGE;
+        JOptionPane.showMessageDialog(window, msg, title, msgType);
+    }
+
+    if (isEventThread()) {
+        _msgBox();
+    } else {
+        _msgBox.invokeAndWait();
+    }
+}
+msgBox.docString = "shows MessageBox to the user";
+
+/**
+ * Shows an information alert box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ */
+function alert(msg, title) {
+    var JOptionPane = javax.swing.JOptionPane;
+    msgBox(msg, title, JOptionPane.INFORMATION_MESSAGE);
+}
+alert.docString = "shows an alert message box to the user";
+
+/**
+ * Shows an error alert box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ */
+function error(msg, title) {
+    var JOptionPane = javax.swing.JOptionPane;
+    msgBox(msg, title, JOptionPane.ERROR_MESSAGE);
+}
+error.docString = "shows an error message box to the user";
+
+/**
+ * Shows a warning alert box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ */
+function warn(msg, title) {
+    var JOptionPane = javax.swing.JOptionPane;
+    msgBox(msg, title, JOptionPane.WARNING_MESSAGE);
+}
+warn.docString = "shows a warning message box to the user";
+
+/**
+ * Shows a prompt dialog box
+ *
+ * @param question question to be asked
+ * @param answer default answer suggested [optional]
+ * @return answer given by user
+ */
+function prompt(question, answer) {
+    var result;
+    function _prompt() {
+        var JOptionPane = javax.swing.JOptionPane;
+        if (answer == undefined) answer = "";
+        result = JOptionPane.showInputDialog(window, question, answer);
+    }
+
+    if (isEventThread()) {
+        _prompt();
+    } else {
+        _prompt.invokeAndWait();
+    }
+
+    return result;
+}
+prompt.docString = "shows a prompt box to the user and returns the answer";
+
+/**
+ * Shows a confirmation dialog box
+ *
+ * @param msg message to be shown
+ * @param title title of message box [optional]
+ * @return boolean (yes->true, no->false)
+ */
+function confirm(msg, title) {
+    var result;
+    var JOptionPane = javax.swing.JOptionPane;
+
+    function _confirm() {
+        if (title == undefined) title = msg;
+        var optionType = JOptionPane.YES_NO_OPTION;
+        result = JOptionPane.showConfirmDialog(window, msg, title, optionType);
+    }
+
+    if (isEventThread()) {
+        _confirm();
+    } else {
+        _confirm.invokeAndWait();
+    }
+
+    return result == JOptionPane.YES_OPTION;
+}
+confirm.docString = "shows a confirmation message box to the user";
+
+/**
+ * Exit the process after confirmation from user
+ *
+ * @param exitCode return code to OS [optional]
+ */
+function exit(exitCode) {
+    if (exitCode == undefined) exitCode = 0;
+    if (confirm("Do you really want to exit?")) {
+        java.lang.System.exit(exitCode);
+    }
+}
+exit.docString = "exits jconsole";
+
+// synonym to exit
+var quit = exit;
+
+// if echo function is not defined, define it as synonym
+// for println function
+if (this.echo == undefined) {
+    function echo(str) {
+        println(str);
+    }
+}
+
diff --git a/linux-x86/sample/scripting/scriptpad/src/resources/mm.js b/linux-x86/sample/scripting/scriptpad/src/resources/mm.js
new file mode 100644
index 0000000..07efad2
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/resources/mm.js
@@ -0,0 +1,339 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This is a collection of utilities for Monitoring
+ * and management API.
+ *
+ * File dependency:
+ *    conc.js -> for concurrency utilities
+ */
+
+// At any time, we maintain atmost one MBeanServer
+// connection. And so, we store the same as a global
+// variable.
+var mmConnection = null;
+
+function jmxConnect(hostport) {
+    if (mmConnection != null) {
+        // close the existing connection
+        try {
+            mmConnection.close();
+        } catch (e) {
+        }
+    }
+
+    var JMXServiceURL = javax.management.remote.JMXServiceURL;
+    var JMXConnectorFactory = javax.management.remote.JMXConnectorFactory;
+
+    var urlPath = "/jndi/rmi://" + hostport + "/jmxrmi";
+    var url = new JMXServiceURL("rmi", "", 0, urlPath);
+    var jmxc = JMXConnectorFactory.connect(url);
+    // note that the "mmConnection" is a global variable!
+    mmConnection = jmxc.getMBeanServerConnection();
+}
+jmxConnect.docString = "connects to the given host, port (specified as name:port)";
+
+function mbeanConnection() {
+    if (mmConnection == null) {
+        throw "Not connected to MBeanServer yet!";
+    }
+
+    return mmConnection;
+}
+mbeanConnection.docString = "returns the current MBeanServer connection";
+
+/**
+ * Returns a platform MXBean proxy for given MXBean name and interface class
+ */
+function newPlatformMXBeanProxy(name, intf) {
+    var factory = java.lang.management.ManagementFactory;
+    return factory.newPlatformMXBeanProxy(mbeanConnection(), name, intf);
+}
+newPlatformMXBeanProxy.docString = "returns a proxy for a platform MXBean";
+
+/**
+ * Wraps a string to ObjectName if needed.
+ */
+function objectName(objName) {
+    var ObjectName = Packages.javax.management.ObjectName;
+    if (objName instanceof ObjectName) {
+        return objName;
+    } else {
+        return new ObjectName(objName);
+    }
+}
+objectName.docString = "creates JMX ObjectName for a given String";
+
+/**
+ * Creates a new (M&M) Attribute object
+ *
+ * @param name name of the attribute
+ * @param value value of the attribute
+ */
+function attribute(name, value) {
+    var Attribute = Packages.javax.management.Attribute;
+    return new Attribute(name, value);
+}
+attribute.docString = "returns a new JMX Attribute using name and value given";
+
+/**
+ * Returns MBeanInfo for given ObjectName. Strings are accepted.
+ */
+function mbeanInfo(objName) {
+    objName = objectName(objName);
+    return mbeanConnection().getMBeanInfo(objName);
+}
+mbeanInfo.docString = "returns MBeanInfo of a given ObjectName";
+
+/**
+ * Returns ObjectInstance for a given ObjectName.
+ */
+function objectInstance(objName) {
+    objName = objectName(objName);
+    return mbeanConnection().objectInstance(objectName);
+}
+objectInstance.docString = "returns ObjectInstance for a given ObjectName";
+
+/**
+ * Queries with given ObjectName and QueryExp.
+ * QueryExp may be null.
+ *
+ * @return set of ObjectNames.
+ */
+function queryNames(objName, query) {
+    objName = objectName(objName);
+    if (query == undefined) query = null;
+    return mbeanConnection().queryNames(objName, query);
+}
+queryNames.docString = "returns QueryNames using given ObjectName and optional query";
+
+/**
+ * Queries with given ObjectName and QueryExp.
+ * QueryExp may be null.
+ *
+ * @return set of ObjectInstances.
+ */
+function queryMBeans(objName, query) {
+    objName = objectName(objName);
+    if (query == undefined) query = null;
+    return mbeanConnection().queryMBeans(objName, query);
+}
+queryMBeans.docString = "return MBeans using given ObjectName and optional query";
+
+// wraps a script array as java.lang.Object[]
+function objectArray(array) {
+    return Java.to(array, "java.lang.Object[]");
+}
+
+// wraps a script (string) array as java.lang.String[]
+function stringArray(array) {
+    return Java.to(array, "java.lang.String[]");
+}
+
+// script array to Java List
+function toAttrList(array) {
+    var AttributeList = Packages.javax.management.AttributeList;
+    if (array instanceof AttributeList) {
+        return array;
+    }
+    var list = new AttributeList(array.length);
+    for (var index = 0; index < array.length; index++) {
+        list.add(array[index]);
+    }
+    return list;
+}
+
+// Java Collection (Iterable) to script array
+function toArray(collection) {
+    if (collection instanceof Array) {
+        return collection;
+    }
+    var itr = collection.iterator();
+    var array = new Array();
+    while (itr.hasNext()) {
+        array[array.length] = itr.next();
+    }
+    return array;
+}
+
+// gets MBean attributes
+function getMBeanAttributes(objName, attributeNames) {
+    objName = objectName(objName);
+    return mbeanConnection().getAttributes(objName,stringArray(attributeNames));
+}
+getMBeanAttributes.docString = "returns specified Attributes of given ObjectName";
+
+// gets MBean attribute
+function getMBeanAttribute(objName, attrName) {
+    objName = objectName(objName);
+    return mbeanConnection().getAttribute(objName, attrName);
+}
+getMBeanAttribute.docString = "returns a single Attribute of given ObjectName";
+
+// sets MBean attributes
+function setMBeanAttributes(objName, attrList) {
+    objName = objectName(objName);
+    attrList = toAttrList(attrList);
+    return mbeanConnection().setAttributes(objName, attrList);
+}
+setMBeanAttributes.docString = "sets specified Attributes of given ObjectName";
+
+// sets MBean attribute
+function setMBeanAttribute(objName, attrName, attrValue) {
+    var Attribute = Packages.javax.management.Attribute;
+    objName = objectName(objName);
+    mbeanConnection().setAttribute(objName, new Attribute(attrName, attrValue));
+}
+setMBeanAttribute.docString = "sets a single Attribute of given ObjectName";
+
+// invokes an operation on given MBean
+function invokeMBean(objName, operation, params, signature) {
+    objName = objectName(objName);
+    params = objectArray(params);
+    signature = stringArray(signature);
+    return mbeanConnection().invoke(objName, operation, params, signature);
+}
+invokeMBean.docString = "invokes MBean operation on given ObjectName";
+
+/**
+ * Wraps a MBean specified by ObjectName as a convenient
+ * script object -- so that setting/getting MBean attributes
+ * and invoking MBean method can be done with natural syntax.
+ *
+ * @param objName ObjectName of the MBean
+ * @param async asynchornous mode [optional, default is false]
+ * @return script wrapper for MBean
+ *
+ * With async mode, all field, operation access is async. Results
+ * will be of type FutureTask. When you need value, call 'get' on it.
+ */
+function mbean(objName, async) {
+    var index;
+    objName = objectName(objName);
+    var info = mbeanInfo(objName);
+    var attrs = info.attributes;
+    var attrMap = new Object;
+    for (index in attrs) {
+        attrMap[attrs[index].name] = attrs[index];
+    }
+    var opers = info.operations;
+    var operMap = new Object;
+    for (index in opers) {
+        operMap[opers[index].name] = opers[index];
+    }
+
+    function isAttribute(name) {
+        return name in attrMap;
+    }
+
+    function isOperation(name) {
+        return name in operMap;
+    }
+
+    return new JSAdapter() {
+        __has__: function (name) {
+            return isAttribute(name) || isOperation(name);
+        },
+        __get__: function (name) {
+            if (isAttribute(name)) {
+                if (async) {
+                    return getMBeanAttribute.future(objName, name); 
+                } else {
+                    return getMBeanAttribute(objName, name); 
+                }
+            } else {
+                return undefined;
+            }
+        },
+        __call__: function(name) {
+            if (isOperation(name)) {
+                var oper = operMap[name];
+
+                var params = [];
+                for (var j = 1; j < arguments.length; j++) {
+                    params[j-1]= arguments[j];
+                }
+
+                var sigs = oper.signature;
+
+                var sigNames = new Array(sigs.length);
+                for (var index in sigs) {
+                    sigNames[index] = sigs[index].getType();
+                }
+
+                if (async) {
+                    return invokeMBean.future(objName, name, params, sigNames);
+                } else {
+                    return invokeMBean(objName, name, params, sigNames);
+                }
+            } else {
+                return undefined;
+            }
+        },
+        __put__: function (name, value) {
+            if (isAttribute(name)) {
+                if (async) {
+                    setMBeanAttribute.future(objName, name, value);
+                } else {
+                    setMBeanAttribute(objName, name, value);
+                }
+            } else {
+                return undefined;
+            }
+        }
+    };
+}
+mbean.docString = "returns a conveninent script wrapper for a MBean of given ObjectName";
+
+if (this.application != undefined) {
+    this.application.addTool("JMX Connect",
+        // connect to a JMX MBean Server
+        function () {
+            var url = prompt("Connect to JMX server (host:port)");
+            if (url != null) {
+                try {
+                    jmxConnect(url);
+                    alert("connected!");
+                } catch (e) {
+                    error(e, "Can not connect to " + url);
+                }
+            }
+        });
+}
diff --git a/linux-x86/sample/scripting/scriptpad/src/resources/scriptpad.js b/linux-x86/sample/scripting/scriptpad/src/resources/scriptpad.js
new file mode 100644
index 0000000..807d05e
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/resources/scriptpad.js
@@ -0,0 +1,662 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script creates a simple Notepad-like interface, which
+ * serves as a simple script editor, runner.
+ *
+ * File dependency:
+ *
+ *    gui.js -> for basic GUI functions
+ */
+
+/*
+ * globalThis is used for actionHelpGlobals() and showFrame().
+ */
+var globalThis = this;
+
+/*
+ * JavaImporter helps in avoiding pollution of JavaScript
+ * global namespace. We can import multiple Java packages
+ * with this and use the JavaImporter object with "with"
+ * statement.
+ */
+var guiPkgs = new JavaImporter(java.awt, java.awt.event,
+                               javax.swing, javax.swing.undo,
+                               javax.swing.event, javax.swing.text);
+
+// main entry point of the scriptpad application
+var main = function() {
+    function createEditor() {
+        var c = new guiPkgs.JTextArea();
+        c.setDragEnabled(true);
+        c.setFont(new guiPkgs.Font("monospaced", guiPkgs.Font.PLAIN, 12));
+        return c;
+    }
+
+    /*const*/ var titleSuffix = "- Scriptpad";
+    /*const*/ var defaultTitle = "Untitled" + titleSuffix;
+
+    // Scriptpad's main frame
+    var frame;
+    // Scriptpad's main editor
+    var editor;
+
+    // To track the current file name
+    var curFileName = null;
+
+    // To track whether the current document
+    // has been modified or not
+    var docChanged = false;
+
+    // check and alert user for unsaved
+    // but modified document
+    function checkDocChanged() {
+        if (docChanged) {
+            // ignore zero-content untitled document
+            if (curFileName == null &&
+                editor.document.length == 0) {
+                return;
+            }
+
+            if (confirm("Do you want to save the changes?",
+                        "The document has changed")) {
+                actionSave();
+            }
+        }
+    }
+
+    // set a document listener to track
+    // whether that is modified or not
+    function setDocListener() {
+        var doc = editor.getDocument();
+        docChanged = false;
+        doc.addDocumentListener( new guiPkgs.DocumentListener() {
+                                     equals: function(o) {
+                                         return this === o; },
+                                     toString: function() {
+                                         return "doc listener"; },
+                                     changeUpdate: function() {
+                                         docChanged = true; },
+                                     insertUpdate: function() {
+                                         docChanged = true; },
+                                     removeUpdate: function() {
+                                         docChanged = true; }
+                                 });
+    }
+
+    // menu action functions
+
+    // "File" menu
+
+    // create a "new" document
+    function actionNew() {
+        checkDocChanged();
+        curFileName = null;
+        editor.setDocument(new guiPkgs.PlainDocument());
+        setDocListener();
+        frame.setTitle(defaultTitle);
+        editor.revalidate();
+    }
+
+    // open an existing file
+    function actionOpen() {
+        checkDocChanged();
+        var f = fileDialog();
+        if (f == null) {
+            return;
+        }
+
+        if (f.isFile() && f.canRead()) {
+            frame.setTitle(f.getName() + titleSuffix);
+            editor.setDocument(new guiPkgs.PlainDocument());
+            var progress = new guiPkgs.JProgressBar();
+            progress.setMinimum(0);
+            progress.setMaximum(f.length());
+            var doc = editor.getDocument();
+            var inp = new java.io.FileReader(f);
+            var buff = java.lang.reflect.Array.newInstance(
+                java.lang.Character.TYPE, 4096);
+            var nch;
+            while ((nch = inp.read(buff, 0, buff.length)) != -1) {
+                doc.insertString(doc.getLength(),
+                                 new java.lang.String(buff, 0, nch), null);
+                progress.setValue(progress.getValue() + nch);
+            }
+            inp.close();
+            curFileName = f.getAbsolutePath();
+            setDocListener();
+        } else {
+            error("Can not open file: " + f,
+                  "Error opening file: " + f);
+        }
+    }
+
+    // open script from a URL
+    function actionOpenURL() {
+        checkDocChanged();
+        var url = prompt("Address:");
+        if (url == null) {
+            return;
+        }
+
+        try {
+            var u = new java.net.URL(url);
+            editor.setDocument(new guiPkgs.PlainDocument());
+            frame.setTitle(url + titleSuffix);
+            var progress = new guiPkgs.JProgressBar();
+            progress.setMinimum(0);
+            progress.setIndeterminate(true);
+            var doc = editor.getDocument();
+            var inp = new java.io.InputStreamReader(u.openStream());
+            var buff = java.lang.reflect.Array.newInstance(
+                java.lang.Character.TYPE, 4096);
+            var nch;
+            while ((nch = inp.read(buff, 0, buff.length)) != -1) {
+                doc.insertString(doc.getLength(),
+                                 new java.lang.String(buff, 0, nch), null);
+                progress.setValue(progress.getValue() + nch);
+            }
+            curFileName = null;
+            setDocListener();
+        } catch (e) {
+            error("Error opening URL: " + e,
+                  "Can not open URL: " + url);
+        }
+    }
+
+    // factored out "save" function used by
+    // save, save as menu actions
+    function save(file) {
+        var doc = editor.getDocument();
+        frame.setTitle(file.getName() + titleSuffix);
+        curFileName = file;
+        var progress = new guiPkgs.JProgressBar();
+        progress.setMinimum(0);
+        progress.setMaximum(file.length());
+        var out = new java.io.FileWriter(file);
+        var text = new guiPkgs.Segment();
+        text.setPartialReturn(true);
+        var charsLeft = doc.getLength();
+        var offset = 0;
+        var min;
+
+        while (charsLeft > 0) {
+            doc.getText(offset, Math.min(4096, charsLeft), text);
+            out.write(text.array, text.offset, text.count);
+            charsLeft -= text.count;
+            offset += text.count;
+            progress.setValue(offset);
+            java.lang.Thread.sleep(10);
+        }
+
+        out.flush();
+        out.close();
+        docChanged = false;
+    }
+
+    // file-save as menu
+    function actionSaveAs() {
+        var ret = fileDialog(null, true);
+        if (ret == null) {
+            return;
+        }
+        save(ret);
+    }
+
+    // file-save menu
+    function actionSave() {
+        if (curFileName) {
+            save(new java.io.File(curFileName));
+        } else {
+            actionSaveAs();
+        }
+    }
+
+    // exit from scriptpad
+    function actionExit() {
+        checkDocChanged();
+        java.lang.System.exit(0);
+    }
+
+    // "Edit" menu
+
+    // cut the currently selected text
+    function actionCut() {
+        editor.cut();
+    }
+
+    // copy the currently selected text to clipboard
+    function actionCopy() {
+        editor.copy();
+    }
+
+    // paste clipboard content to document
+    function actionPaste() {
+        editor.paste();
+    }
+
+    // select all the text in editor
+    function actionSelectAll() {
+        editor.selectAll();
+    }
+
+    // "Tools" menu
+
+    // run the current document as JavaScript
+    function actionRun() {
+        var doc = editor.getDocument();
+        var script = doc.getText(0, doc.getLength());
+        var oldFile = engine.get(javax.script.ScriptEngine.FILENAME);
+        try {
+            if (engine == undefined) {
+                var m = new javax.script.ScriptEngineManager();
+                engine = m.getEngineByName("nashorn");
+            }
+            engine.put(javax.script.ScriptEngine.FILENAME, frame.title);
+            engine.eval(script, context);
+        } catch (e) {
+            error(e, "Script Error");
+            e.printStackTrace();
+        } finally {
+            engine.put(javax.script.ScriptEngine.FILENAME, oldFile);
+        }
+    }
+
+    // "Examples" menu
+
+    // show given script as new document
+    function showScript(title, str) {
+        actionNew();
+        frame.setTitle("Example - " + title + titleSuffix);
+        var doc = editor.document;
+        doc.insertString(0, str, null);
+    }
+
+    // "hello world"
+    function actionHello() {
+        showScript(actionEval.title,
+                   "alert('Hello, world');");
+    }
+    actionHello.title = "Hello, World";
+
+    // eval the "hello world"!
+    function actionEval() {
+        showScript(actionEval.title,
+                   "eval(\"alert('Hello, world')\");");
+    }
+    actionEval.title = "Eval";
+
+    // show how to access Java static methods
+    function actionJavaStatic() {
+        showScript(arguments.callee.title,
+                   "// Just use Java syntax\n" +
+                   "var props = java.lang.System.getProperties();\n" +
+                   "alert(props.get('os.name'));");
+    }
+    actionJavaStatic.title = "Java Static Calls";
+
+    // show how to access Java classes, methods
+    function actionJavaAccess() {
+        showScript(arguments.callee.title,
+                   "// just use new JavaClass();\n" +
+                   "var fr = new javax.swing.JFrame();\n" +
+                   "// call all public methods as in Java\n" +
+                   "fr.setTitle('hello');\n" +
+                   "fr.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);\n" +
+                   "fr.setSize(200, 200);\n" +
+                   "fr.setVisible(true);");
+    }
+    actionJavaAccess.title = "Java Object Access";
+
+    // show how to use Java bean conventions
+    function actionJavaBean() {
+        showScript(arguments.callee.title,
+                   "var fr = new javax.swing.JFrame();\n" +
+                   "fr.setSize(200, 200);\n" +
+                   "// access public get/set methods as fields\n" +
+                   "fr.defaultCloseOperation = javax.swing.WindowConstants.DISPOSE_ON_CLOSE;\n" +
+                   "fr.title = 'hello';\n" +
+                   "fr.visible = true;");
+    }
+    actionJavaBean.title = "Java Beans";
+
+    // show how to implement Java interface
+    function actionJavaInterface() {
+        showScript(arguments.callee.title,
+                   "// use Java anonymizer class-like syntax!\n" +
+                   "var r = new java.lang.Runnable() {\n" +
+                   "            run: function() {\n" +
+                   "                    alert('hello');\n" +
+                   "            }\n" +
+                   "    };\n" +
+                   "// use the above Runnable to create a Thread\n" +
+                   "new java.lang.Thread(r).start();\n" +
+                   "// For simple one method interfaces, just pass script function\n" +
+                   "new java.lang.Thread(function() { alert('world'); }).start();");
+    }
+    actionJavaInterface.title = "Java Interfaces";
+
+    // show how to import Java classes, packages
+    function actionJavaImport() {
+        showScript(arguments.callee.title,
+                   "// use Java-like import *...\n" +
+                   "//    importPackage(java.io);\n" +
+                   "// or import a specific class\n" +
+                   "//    importClass(java.io.File);\n" +
+                   "// or better - import just within a scope!\n" +
+                   "var ioPkgs = JavaImporter(java.io);\n" +
+                   "with (ioPkgs) { alert(new File('.').absolutePath); }");
+    }
+    actionJavaImport.title = "Java Import";
+
+    // "Help" menu
+
+    /*
+     * Shows a one liner help message for each
+     * global function. Note that this function
+     * depends on docString meta-data for each
+     * function.
+     */
+    function actionHelpGlobals() {
+        var names = new java.util.ArrayList();
+        for (var i in globalThis) {
+            var func = globalThis[i];
+            if (typeof(func) == "function" &&
+                ("docString" in func)) {
+                names.add(i);
+            }
+        }
+        java.util.Collections.sort(names);
+        var helpDoc = new java.lang.StringBuffer();
+        helpDoc.append("<table border='1'>");
+        var itr = names.iterator();
+        while (itr.hasNext()) {
+            var name = itr.next();
+            helpDoc.append("<tr><td>");
+            helpDoc.append(name);
+            helpDoc.append("</td><td>");
+            helpDoc.append(globalThis[name].docString);
+            helpDoc.append("</td></tr>");
+        }
+        helpDoc.append("</table>");
+
+        var helpEditor = new guiPkgs.JEditorPane();
+        helpEditor.setContentType("text/html");
+        helpEditor.setEditable(false);
+        helpEditor.setText(helpDoc.toString());
+
+        var scroller = new guiPkgs.JScrollPane();
+        var port = scroller.getViewport();
+        port.add(helpEditor);
+
+        var helpFrame = new guiPkgs.JFrame("Help - Global Functions");
+        helpFrame.getContentPane().add("Center", scroller);
+        helpFrame.setDefaultCloseOperation(guiPkgs.WindowConstants.DISPOSE_ON_CLOSE);
+        helpFrame.pack();
+        helpFrame.setSize(500, 600);
+        helpFrame.setVisible(true);
+    }
+
+    // show a simple about message for scriptpad
+    function actionAbout() {
+        alert("Scriptpad\nVersion 1.1", "Scriptpad");
+    }
+
+    /*
+     * This data is used to construct menu bar.
+     * This way adding a menu is easier. Just add
+     * top level menu or add an item to an existing
+     * menu. "action" should be a function that is
+     * called back on clicking the correponding menu.
+     */
+    var menuData = [
+        {
+            menu: "File",
+            items: [
+                { name: "New",  action: actionNew , accel: guiPkgs.KeyEvent.VK_N },
+                { name: "Open...", action: actionOpen, accel: guiPkgs.KeyEvent.VK_O },
+                { name: "Open URL...", action: actionOpenURL, accel: guiPkgs.KeyEvent.VK_U },
+                { name: "Save", action: actionSave, accel: guiPkgs.KeyEvent.VK_S },
+                { name: "Save As...", action: actionSaveAs },
+                { name: "-" },
+                { name: "Exit", action: actionExit, accel: guiPkgs.KeyEvent.VK_Q }
+            ]
+        },
+
+        {
+            menu: "Edit",
+            items: [
+                { name: "Cut", action: actionCut, accel: guiPkgs.KeyEvent.VK_X },
+                { name: "Copy", action: actionCopy, accel: guiPkgs.KeyEvent.VK_C },
+                { name: "Paste", action: actionPaste, accel: guiPkgs.KeyEvent.VK_V },
+                { name: "-" },
+                { name: "Select All", action: actionSelectAll, accel: guiPkgs.KeyEvent.VK_A }
+            ]
+        },
+
+        {
+            menu: "Tools",
+            items: [
+                { name: "Run", action: actionRun, accel: guiPkgs.KeyEvent.VK_R }
+            ]
+        },
+
+        {
+            menu: "Examples",
+            items: [
+                { name: actionHello.title, action: actionHello },
+                { name: actionEval.title, action: actionEval },
+                { name: actionJavaStatic.title, action: actionJavaStatic },
+                { name: actionJavaAccess.title, action: actionJavaAccess },
+                { name: actionJavaBean.title, action: actionJavaBean },
+                { name: actionJavaInterface.title, action: actionJavaInterface },
+                { name: actionJavaImport.title, action: actionJavaImport }
+            ]
+        },
+
+        {
+            menu: "Help",
+            items: [
+                { name: "Global Functions", action: actionHelpGlobals },
+                { name: "-" },
+                { name: "About Scriptpad", action: actionAbout }
+            ]
+        }
+    ];
+
+    function setMenuAccelerator(mi, accel) {
+        var keyStroke = guiPkgs.KeyStroke.getKeyStroke(accel,
+                                                       guiPkgs.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+        mi.setAccelerator(keyStroke);
+    }
+
+    // create a menubar using the above menu data
+    function createMenubar() {
+        var mb = new guiPkgs.JMenuBar();
+        for (var m in menuData) {
+            var items = menuData[m].items;
+            var menu = new guiPkgs.JMenu(menuData[m].menu);
+
+            for (var i in items) {
+                if (items[i].name.equals("-")) {
+                    menu.addSeparator();
+                } else {
+                    var mi = new guiPkgs.JMenuItem(items[i].name);
+                    var action = items[i].action;
+                    mi.addActionListener(action);
+                    var accel = items[i].accel;
+                    if (accel) {
+                        setMenuAccelerator(mi, accel);
+                    }
+                    menu.add(mi);
+                }
+	        }
+
+	        mb.add(menu);
+        }
+
+        return mb;
+    }
+
+    // function to add a new menu item under "Tools" menu
+    function addTool(menuItem, action, accel) {
+        if (typeof(action) != "function") {
+            return;
+        }
+
+        var toolsIndex = -1;
+        // find the index of the "Tools" menu
+        for (var i in menuData) {
+            if (menuData[i].menu.equals("Tools")) {
+                toolsIndex = i;
+                break;
+            }
+        }
+        if (toolsIndex == -1) {
+            return;
+        }
+        var toolsMenu = frame.getJMenuBar().getMenu(toolsIndex);
+        var mi = new guiPkgs.JMenuItem(menuItem);
+        mi.addActionListener(action);
+        if (accel) {
+            setMenuAccelerator(mi, accel);
+        }
+        toolsMenu.add(mi);
+    }
+
+    // create Scriptpad frame
+    function createFrame() {
+        frame = new guiPkgs.JFrame();
+        frame.setTitle(defaultTitle);
+        frame.setBackground(guiPkgs.Color.lightGray);
+        frame.getContentPane().setLayout(new guiPkgs.BorderLayout());
+
+        // create notepad panel
+        var notepad = new guiPkgs.JPanel();
+        notepad.setBorder(guiPkgs.BorderFactory.createEtchedBorder());
+        notepad.setLayout(new guiPkgs.BorderLayout());
+
+        // create editor
+        editor = createEditor();
+        var scroller = new guiPkgs.JScrollPane();
+        var port = scroller.getViewport();
+        port.add(editor);
+
+        // add editor to notepad panel
+        var panel = new guiPkgs.JPanel();
+        panel.setLayout(new guiPkgs.BorderLayout());
+        panel.add("Center", scroller);
+        notepad.add("Center", panel);
+
+        // add notepad panel to frame
+        frame.getContentPane().add("Center", notepad);
+
+        // set menu bar to frame and show the frame
+        frame.setJMenuBar(createMenubar());
+        frame.setDefaultCloseOperation(guiPkgs.JFrame.EXIT_ON_CLOSE);
+        frame.pack();
+        frame.setSize(500, 600);
+    }
+
+    // show Scriptpad frame
+    function showFrame() {
+        // set global variable by the name "window"
+        globalThis.window = frame;
+
+        // open new document
+        actionNew();
+
+        frame.setVisible(true);
+    }
+
+    // create and show Scriptpad frame
+    createFrame();
+    showFrame();
+
+    /*
+     * Application object has two fields "frame", "editor"
+     * which are current JFrame and editor and a method
+     * called "addTool" to add new menu item to "Tools" menu.
+     */
+    return {
+        frame: frame,
+        editor: editor,
+        addTool: addTool
+    };
+};
+
+/*
+ * Call the main and store Application object
+ * in a global variable named "application".
+ */
+var application = main();
+
+if (this.load == undefined) {
+    function load(file) {
+        var ioPkgs = new JavaImporter(java.io);
+        with (ioPkgs) {
+            var stream = new FileInputStream(file);
+            var bstream = new BufferedInputStream(stream);
+            var reader = new BufferedReader(new InputStreamReader(bstream));
+            var oldFilename = engine.get(engine.FILENAME);
+            engine.put(engine.FILENAME, file);
+            try {
+                engine.eval(reader, context);
+            } finally {
+                engine.put(engine.FILENAME, oldFilename);
+            }
+            stream.close();
+        }
+    }
+    load.docString = "loads the given script file";
+}
+
+/*
+ * Load user specific init file under home dir, if found.
+ */
+function loadUserInit() {
+    var home = java.lang.System.getProperty("user.home");
+    var f = new java.io.File(home, "scriptpad.js");
+    if (f.exists()) {
+        engine.eval(new java.io.FileReader(f));
+    }
+}
+
+loadUserInit();
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/README.txt b/linux-x86/sample/scripting/scriptpad/src/scripts/README.txt
new file mode 100644
index 0000000..72e162d
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/README.txt
@@ -0,0 +1,52 @@
+Sample scripts:
+
+(1) browse.js 
+
+ -- Open and run this script in scriptpad. You will see 
+    Tools->Browse menu. Using this you can start your
+    desktop default browser with the given URL.
+
+(2) insertfile.js
+
+ -- Open and run this script in scriptpad. You will see 
+    "Tools->Insert File..." menu. Using this you can start 
+    insert content of a selected file into currently
+    edited document
+
+(3) linewrap.js
+
+ -- Open and run this script in scriptpad. You will see 
+    "Tools->Line Wrap" menu. Using this you can toggle
+    the line wrapping mode of the editor
+
+(4) mail.js
+
+ -- Open and run this script in scriptpad. You will see 
+    Tools->Mail menu. Using this you can start your
+    desktop default mail client with the given "To" mail id.
+
+(5) memmonitor.js
+
+ -- This is a simple Monitoring & Management script. To use this,
+    you need an application to monitor. You can use memory.bat
+    or memory.sh in the current directory to start an application
+    that will be monitored. After that please follow these steps:
+
+   1. Start the target application using memory.sh or memory.bat
+   2. Start scriptpad 
+   3. Use "Tools->JMX Connect" menu and specify "localhost:1090"
+      to connect
+   4. Open "memmonitor.js" and run it (using "Tools->Run")       
+      in scriptpad
+   5. A new "Tools-Memory Monitor" menu appears. Use this menu
+      and specify 4 and 500 as threshold and interval values.
+   6. In the target application shell (where memory.bat/.sh was
+      started), enter an integer value and press "enter".
+   7. You'll see an alert box from scriptpad -- alerting you for
+      memory threshold exceeded!
+
+(6) textcolor.js
+
+ -- Open and run this script in scriptpad. You will see 
+    "Tools->Selected Text Color..." menu. Using this you
+    change the color of "selected text" in the editor.
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/browse.js b/linux-x86/sample/scripting/scriptpad/src/scripts/browse.js
new file mode 100644
index 0000000..fbe50e1
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/browse.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This function uses new Swing Desktop API in JDK 6.
+ * To use this with scriptpad, open this in scriptpad
+ * and use "Tools->Run Script" menu.
+ */
+function browse() {
+    var desktop = null;
+    // Before more Desktop API is used, first check
+    // whether the API is supported by this particular
+    // virtual machine (VM) on this particular host.
+    if (java.awt.Desktop.isDesktopSupported()) {
+        desktop = java.awt.Desktop.getDesktop();
+    } else {
+        alert("no desktop support");
+        return;
+    }
+
+    if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {
+        var url = prompt("Address:");
+        if (url != null) {
+            desktop.browse(new java.net.URI(url));
+        }
+    } else {
+        alert("no browser support");
+    }
+}
+
+if (this.application != undefined) {
+    // add "Browse" menu item under "Tools" menu
+    this.application.addTool("Browse", browse);
+}
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/insertfile.js b/linux-x86/sample/scripting/scriptpad/src/scripts/insertfile.js
new file mode 100644
index 0000000..07a7ac2
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/insertfile.js
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script adds "Insert File" mode menu item to "Tools" menu.
+ * When selected, this menu shows a file dialog box and inserts
+ * contents of the selected file into current document (at the
+ * current caret position).
+ */
+if (this.application) {
+    application.addTool("Insert File...",
+        function() {
+            var file = fileDialog();
+
+            if (file) {
+                var reader = new java.io.FileReader(file);
+                var arr = java.lang.reflect.Array.newInstance(
+                      java.lang.Character.TYPE, 8*1024); // 8K at a time
+                var buf = new java.lang.StringBuffer();
+                var numChars;
+
+                while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
+                    buf.append(arr, 0, numChars);
+                }
+
+                var pos = application.editor.caretPosition;
+                var doc = application.editor.document;
+
+                doc.insertString(pos, buf.toString(), null);
+           }
+        });
+}
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/linewrap.js b/linux-x86/sample/scripting/scriptpad/src/scripts/linewrap.js
new file mode 100644
index 0000000..989473a
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/linewrap.js
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script adds "Line Wrap" mode menu item to "Tools" menu.
+ * When selected, this menu toggles the current word wrap mode
+ * of the editor.
+ */
+
+function toggleLineWrap() {
+    var wrap = application.editor.lineWrap;
+    application.editor.lineWrap = !wrap;
+}
+
+application.addTool("Line Wrap",  toggleLineWrap);
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/mail.js b/linux-x86/sample/scripting/scriptpad/src/scripts/mail.js
new file mode 100644
index 0000000..cabe5c4
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/mail.js
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This function uses new Swing Desktop API in JDK 6.
+ * To use this with scriptpad, open this in scriptpad
+ * and use "Tools->Run Script" menu.
+ */
+function mail() {
+    var desktop = null;
+    // Before more Desktop API is used, first check
+    // whether the API is supported by this particular
+    // virtual machine (VM) on this particular host.
+    if (java.awt.Desktop.isDesktopSupported()) {
+        desktop = java.awt.Desktop.getDesktop();
+    } else {
+        alert("no desktop support");
+        return;
+    }
+
+    if (desktop.isSupported(java.awt.Desktop.Action.MAIL)) {
+        var mailTo = prompt("Mail To:");
+        if (mailTo != null) {
+            desktop.mail(new java.net.URI("mailto", mailTo, null));
+        }
+    }
+}
+
+if (this.application != undefined) {
+    // add "Mail" menu item under "Tools" menu
+    this.application.addTool("Mail", mail);
+}
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/memmonitor.js b/linux-x86/sample/scripting/scriptpad/src/scripts/memmonitor.js
new file mode 100644
index 0000000..0744e30
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/memmonitor.js
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+// this checker function runs asynchronously
+function memoryChecker(memoryBean, threshold, interval) {
+    while (true) {
+        var memUsage = memoryBean.HeapMemoryUsage;
+        var usage = memUsage.get("used") / (1024 * 1024);
+
+        println("usage: " + usage);
+
+        if (usage > threshold) {
+            alert("Hey! heap usage threshold exceeded!");
+            // after first alert just return.
+            return;
+        }
+
+        java.lang.Thread.sleep(interval);
+    }
+}
+
+// add "Tools->Memory Monitor" menu item
+if (this.application != undefined) {
+    this.application.addTool("Memory Monitor",
+        function () {
+            // show threshold box with default of 50 MB
+            var threshold = prompt("Threshold (mb)", 50);
+
+            // show interval box with default of 1000 millisec.
+            var interval = prompt("Sample Interval (ms):", 1000);
+            var memoryBean = mbean("java.lang:type=Memory");
+
+            // ".future" makes the function to be called
+            // asynchronously in a separate thread.
+            memoryChecker.future(memoryBean, threshold, interval);
+        });
+}
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/memory.bat b/linux-x86/sample/scripting/scriptpad/src/scripts/memory.bat
new file mode 100644
index 0000000..9478c09
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/memory.bat
@@ -0,0 +1,35 @@
+@echo off
+REM
+REM Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+REM
+REM Redistribution and use in source and binary forms, with or without
+REM modification, are permitted provided that the following conditions
+REM are met:
+REM
+REM   - Redistributions of source code must retain the above copyright
+REM     notice, this list of conditions and the following disclaimer.
+REM
+REM   - Redistributions in binary form must reproduce the above copyright
+REM     notice, this list of conditions and the following disclaimer in the
+REM     documentation and/or other materials provided with the distribution.
+REM
+REM   - Neither the name of Oracle nor the names of its
+REM     contributors may be used to endorse or promote products derived
+REM     from this software without specific prior written permission.
+REM
+REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+REM IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+REM THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+REM PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+REM CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+REM EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+REM PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+REM PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+REM LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+REM NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+REM SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+REM
+
+
+jrunscript -J-Dcom.sun.management.jmxremote.port=1090 -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false memory.js
+
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/memory.js b/linux-x86/sample/scripting/scriptpad/src/scripts/memory.js
new file mode 100644
index 0000000..b8252fb
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/memory.js
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script serves as a simple "monitored application".
+ * Start this script using memory.bat or memory.sh in the
+ * current directory.
+ */
+
+java.lang.System.out.print("Enter a number and press enter:");
+var input = java.lang.System["in"].read();
+
+// allocate an integer array of "big enough" size!
+var a = java.lang.reflect.Array.newInstance(
+    java.lang.Integer.TYPE, input * 1024 * 1024);
+
+// sleep some time...
+java.lang.Thread.sleep(10*60*1000);
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/memory.sh b/linux-x86/sample/scripting/scriptpad/src/scripts/memory.sh
new file mode 100644
index 0000000..8da155b
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/memory.sh
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   - Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   - Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+#   - Neither the name of Oracle nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+jrunscript -J-Dcom.sun.management.jmxremote.port=1090 -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false memory.js
diff --git a/linux-x86/sample/scripting/scriptpad/src/scripts/textcolor.js b/linux-x86/sample/scripting/scriptpad/src/scripts/textcolor.js
new file mode 100644
index 0000000..b9d86cc
--- /dev/null
+++ b/linux-x86/sample/scripting/scriptpad/src/scripts/textcolor.js
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+/*
+ * This script adds "Selected Text Color" menu item to "Tools" menu.
+ * When selected, this menu changes the "selected text" color.
+ */
+if (this.application) {
+    application.addTool("Selected Text Color...",
+        function() {
+            var color = application.editor.selectedTextColor;
+            color = colorDialog("Selected Text Color", color);
+            application.editor.selectedTextColor = color;
+        });
+}
diff --git a/linux-x86/sample/try-with-resources/index.html b/linux-x86/sample/try-with-resources/index.html
new file mode 100644
index 0000000..ff237d8
--- /dev/null
+++ b/linux-x86/sample/try-with-resources/index.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+    <title>Try-with-Resources Feature Demo</title>
+</head>
+<body>
+<h2>Try-with-Resources Feature Demo</h2>
+
+<p>
+    This demo shows how to use the try-with-resources feature introduced in JDK7.
+</p>
+
+<ul>
+    <li><h3>Custom AutoCloseable.</h3>
+
+        <p>
+            Shows how to use a custom resource with the try-with-resources construct.
+            For more information, see the source file.
+        </p>
+        Source: <a href="src/CustomAutoCloseableSample.java">src/CustomAutoCloseableSample.java</a>
+
+    <li><h3>Unzip</h3>
+
+        <p>
+            Extracts archived files. For more information, see the source file.
+        </p>
+        Source: <a href="src/Unzip.java">src/Unzip.java</a>
+    <li><h3>ZipCat</h3>
+
+        <p>Prints data about a specified file from an archive. For more information, see the source file.</p>
+        Source: <a href="src/ZipCat.java">src/ZipCat.java</a>
+
+</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/linux-x86/sample/try-with-resources/src/CustomAutoCloseableSample.java b/linux-x86/sample/try-with-resources/src/CustomAutoCloseableSample.java
new file mode 100644
index 0000000..9bbe09a
--- /dev/null
+++ b/linux-x86/sample/try-with-resources/src/CustomAutoCloseableSample.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/**
+ * This sample demonstrates the ability to create custom resource that
+ * implements the {@code AutoCloseable} interface. This resource can be used in
+ * the try-with-resources construct.
+ */
+public class CustomAutoCloseableSample {
+
+    /**
+     * The main method for the CustomAutoCloseableSample program.
+     *
+     * @param args is not used.
+     */
+    public static void main(String[] args) {
+        /*
+         * TeeStream will be closed automatically after the try block.
+         */
+        try (TeeStream teeStream = new TeeStream(System.out, Paths.get("out.txt"));
+             PrintStream out = new PrintStream(teeStream)) {
+            out.print("Hello, world");
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    /**
+     * Passes the output through to the specified output stream while copying it into a file.
+     * The TeeStream functionality is similar to the Unix tee utility.
+     * TeeStream implements AutoCloseable interface. See OutputStream for details.
+     */
+    public static class TeeStream extends OutputStream {
+
+        private final OutputStream fileStream;
+        private final OutputStream outputStream;
+
+        /**
+         * Creates a TeeStream.
+         *
+         * @param outputStream an output stream.
+         * @param outputFile   an path to file.
+         * @throws IOException If an I/O error occurs.
+         */
+        public TeeStream(OutputStream outputStream, Path outputFile) throws IOException {
+            this.fileStream = new BufferedOutputStream(Files.newOutputStream(outputFile));
+            this.outputStream = outputStream;
+        }
+
+        /**
+         * Writes the specified byte to the specified output stream
+         * and copies it to the file.
+         *
+         * @param b the byte to be written.
+         * @throws IOException If an I/O error occurs.
+         */
+        @Override
+        public void write(int b) throws IOException {
+            fileStream.write(b);
+            outputStream.write(b);
+        }
+
+        /**
+         * Flushes this output stream and forces any buffered output bytes
+         * to be written out.
+         * The <code>flush</code> method of <code>TeeStream</code> flushes
+         * the specified output stream and the file output stream.
+         *
+         * @throws IOException if an I/O error occurs.
+         */
+        @Override
+        public void flush() throws IOException {
+            outputStream.flush();
+            fileStream.flush();
+        }
+
+        /**
+         * Closes underlying streams and resources.
+         * The external output stream won't be closed.
+         * This method is the member of AutoCloseable interface and
+         * it will be invoked automatically after the try-with-resources block.
+         *
+         * @throws IOException If an I/O error occurs.
+         */
+        @Override
+        public void close() throws IOException {
+            try (OutputStream file = fileStream) {
+                flush();
+            }
+        }
+    }
+}
diff --git a/linux-x86/sample/try-with-resources/src/Unzip.java b/linux-x86/sample/try-with-resources/src/Unzip.java
new file mode 100644
index 0000000..d75eba5
--- /dev/null
+++ b/linux-x86/sample/try-with-resources/src/Unzip.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.*;
+
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+
+/**
+ * Extract (unzip) a file to the current directory.
+ */
+public class Unzip {
+
+    /**
+     * The main method for the Unzip program. Run the program with an empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for {@code Unzip}.
+     */
+    public static void main(String[] args) {
+        if (args.length != 1) {
+            System.out.println("Usage: Unzip zipfile");
+        }
+        final Path destDir = Paths.get(".");
+        /*
+         * Create AutoCloseable FileSystem. It will be closed automatically
+         * after the try block.
+         */
+        try (FileSystem zipFileSystem = FileSystems.newFileSystem(Paths.get(args[0]), null)) {
+
+            Path top = zipFileSystem.getPath("/");
+            Files.walk(top).skip(1).forEach(file -> {
+                Path target = destDir.resolve(top.relativize(file).toString());
+                System.out.println("Extracting " + target);
+                try {
+                    Files.copy(file, target, REPLACE_EXISTING);
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
+            });
+        } catch (UncheckedIOException | IOException e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+}
diff --git a/linux-x86/sample/try-with-resources/src/ZipCat.java b/linux-x86/sample/try-with-resources/src/ZipCat.java
new file mode 100644
index 0000000..4bbf513
--- /dev/null
+++ b/linux-x86/sample/try-with-resources/src/ZipCat.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation, and proper error handling, might not be present in
+ * this sample code.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * Prints data of the specified file to standard output from a zip archive.
+ */
+public class ZipCat {
+
+    /**
+     * The main method for the ZipCat program. Run the program with an empty
+     * argument list to see possible arguments.
+     *
+     * @param args the argument list for ZipCat
+     */
+    public static void main(String[] args) {
+        if (args.length != 2) {
+            System.out.println("Usage: ZipCat zipfile fileToPrint");
+        }
+        /*
+         * Creates AutoCloseable FileSystem and BufferedReader.
+         * They will be closed automatically after the try block.
+         * If reader initialization fails, then zipFileSystem will be closed
+         * automatically.
+         */
+        try (FileSystem zipFileSystem
+                = FileSystems.newFileSystem(Paths.get(args[0]),null);
+                InputStream input
+                = Files.newInputStream(zipFileSystem.getPath(args[1]))) {
+                    byte[] buffer = new byte[1024];
+                    int len;
+                    while ((len = input.read(buffer)) != -1) {
+                        System.out.write(buffer, 0, len);
+                    }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+}
diff --git a/linux-x86/src.zip b/linux-x86/src.zip
index 27b4758..62b8b88 100644
--- a/linux-x86/src.zip
+++ b/linux-x86/src.zip
Binary files differ
diff --git a/manifest.xml b/manifest.xml
index 016af43..3565635 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -2,21 +2,29 @@
 <manifest>
   <remote fetch=".." name="goog" review="sso://googleplex-android/" />
   <default remote="goog" revision="mirror-aosp-studio-master-dev" sync-j="4" />
-  <project name="platform/external/jetbrains/jdk8u" path="external/jetbrains/jdk8u" revision="f626a6b4854cea8b260ee443c43f6d1bdad2e4f0" upstream="mirror-aosp-studio-master-dev" />
+  <project name="platform/external/jetbrains/jdk8u" path="external/jetbrains/jdk8u" revision="8528ffc9e8499d0178ee982c3280493c0e2d7525" upstream="mirror-aosp-studio-master-dev" />
   <project name="platform/external/jetbrains/jdk8u_corba" path="external/jetbrains/jdk8u_corba" revision="c55762da91519a85fb2fd0b4f415735a12cc4888" upstream="mirror-aosp-studio-master-dev" />
-  <project name="platform/external/jetbrains/jdk8u_hotspot" path="external/jetbrains/jdk8u_hotspot" revision="b3d0f5fb7c25aab20ca070e17486c8a54a0088dd" upstream="mirror-aosp-studio-master-dev" />
+  <project name="platform/external/jetbrains/jdk8u_hotspot" path="external/jetbrains/jdk8u_hotspot" revision="38469b8c8e872685dc7fbd57b8a1986f89d0552a" upstream="mirror-aosp-studio-master-dev" />
   <project name="platform/external/jetbrains/jdk8u_jaxp" path="external/jetbrains/jdk8u_jaxp" revision="ad06f386190d159fe7bc8202b3abae2f1b218ecd" upstream="mirror-aosp-studio-master-dev" />
   <project name="platform/external/jetbrains/jdk8u_jaxws" path="external/jetbrains/jdk8u_jaxws" revision="1608370faaf8ca1655f5442d66d2cfd6282747c7" upstream="mirror-aosp-studio-master-dev" />
-  <project name="platform/external/jetbrains/jdk8u_jdk" path="external/jetbrains/jdk8u_jdk" revision="51c32a2934e2199ca81517a789af34f2d7994b16" upstream="mirror-aosp-studio-master-dev" />
+  <project name="platform/external/jetbrains/jdk8u_jdk" path="external/jetbrains/jdk8u_jdk" revision="142f30c6c0cd6d9daf35ae3248b2e3b753fb3344" upstream="mirror-aosp-studio-master-dev" />
   <project name="platform/external/jetbrains/jdk8u_langtools" path="external/jetbrains/jdk8u_langtools" revision="fe8ba49ea8854950d9d756b7b2ac937c4a3f9577" upstream="mirror-aosp-studio-master-dev" />
   <project name="platform/external/jetbrains/jdk8u_nashorn" path="external/jetbrains/jdk8u_nashorn" revision="45faba88ae10e979db10142c68d02d986018010a" upstream="mirror-aosp-studio-master-dev" />
+  <project name="toolchain/jdk/jdk9" path="toolchain/jdk/jdk9" revision="4c1e9bbe664e532f83b258e6c8a214b0241530d8" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_corba" path="toolchain/jdk/jdk9_corba" revision="b4ed46425f74345716ac4532e50a543226c1a1fe" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_hotspot" path="toolchain/jdk/jdk9_hotspot" revision="17fac2f462332e5590370849ec37fea9f014af97" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_jaxp" path="toolchain/jdk/jdk9_jaxp" revision="9d0d323a61a1cd4930ebca527673992ece7ab1d3" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_jaxws" path="toolchain/jdk/jdk9_jaxws" revision="cc2e16b7e6d0b1f6a4dbc28ffaf3a22b19991dd7" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_jdk" path="toolchain/jdk/jdk9_jdk" revision="d9bced18549d518442af72ecfa84506b26566283" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_langtools" path="toolchain/jdk/jdk9_langtools" revision="21d5ec9f070a5709fd8183c106840c13c0182a29" upstream="mirror-aosp-master" />
+  <project name="toolchain/jdk/jdk9_nashorn" path="toolchain/jdk/jdk9_nashorn" revision="fbaa32dd52163c8f4f939001dfd8a9f46a08eff2" upstream="mirror-aosp-master" />
   <!-- prebuilts projects -->
-  <project clone-depth="1" name="platform/prebuilts/build-tools" path="prebuilts/build-tools" revision="afe22c74f958ae77d130dd87e7d01fd9f180c345" upstream="mirror-aosp-master" />
-  <project clone-depth="1" name="platform/prebuilts/clang/host/darwin-x86" path="prebuilts/clang/host/darwin-x86" revision="ce827a504ccce0f032943202fbb5c1ee8fba8857" upstream="mirror-aosp-master" />
-  <project clone-depth="1" name="platform/prebuilts/clang/host/linux-x86" path="prebuilts/clang/host/linux-x86" revision="231f01c6b1aa64fd2c30fd48eca7aeeb80b2c346" upstream="mirror-aosp-master" />
-  <project clone-depth="1" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8" revision="6e91bb7b816df8543cffe14287acbf0412f65550" upstream="mirror-aosp-master" />
-  <project clone-depth="1" name="platform/prebuilts/studio/jdk" path="prebuilts/studio/jdk" revision="922965e0591f079a626711a74017cd950b0f5ca0" upstream="mirror-aosp-studio-master-dev" />
+  <project clone-depth="1" name="platform/prebuilts/build-tools" path="prebuilts/build-tools" revision="13db9fd267baf97807d1271121837bd6a882670f" upstream="mirror-aosp-master" />
+  <project clone-depth="1" name="platform/prebuilts/clang/host/darwin-x86" path="prebuilts/clang/host/darwin-x86" revision="a342c52d2e5220273cbf1d3316b8fe1e4c7194ed" upstream="mirror-aosp-master" />
+  <project clone-depth="1" name="platform/prebuilts/clang/host/linux-x86" path="prebuilts/clang/host/linux-x86" revision="13c8d4e296fa2badce7d0dcabeafd63ff58774ba" upstream="mirror-aosp-master" />
+  <project clone-depth="1" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8" revision="2ccb38af8c940f1feef62ff5986f4bbc5d899e66" upstream="mirror-aosp-master" />
+  <project clone-depth="1" name="platform/prebuilts/studio/jdk" path="prebuilts/studio/jdk" revision="4d8d242a60231f0bf8e8622a64c368f0e2187d2d" upstream="mirror-aosp-studio-master-dev" />
   <!-- build projects -->
-  <project clone-depth="1" name="toolchain/jdk/build" path="toolchain/jdk/build" revision="c6e54ff41d58d8a5430c35f7fdadde67f3b2616f" upstream="mirror-aosp-master" />
+  <project clone-depth="1" name="toolchain/jdk/build" path="toolchain/jdk/build" revision="075263c362888278345e3c875bfbf23713cd0838" upstream="mirror-aosp-master" />
   <project clone-depth="1" name="toolchain/jdk/deps" path="toolchain/jdk/deps" revision="76d7e49d62136f36810507a366504379174cc6b2" upstream="master" />
 </manifest>
