changeset 13977:1993af50385d

8153141: Develop initial set of tests for SwingSet Reviewed-by: prr
author mrkam
date Wed, 30 Mar 2016 19:05:58 -0700
parents 679f9542362b
children 391525879ab0
files .hgignore make/netbeans/client_sanity/README make/netbeans/client_sanity/build.xml make/netbeans/client_sanity/manifest.mf make/netbeans/client_sanity/nbproject/build-impl.xml make/netbeans/client_sanity/nbproject/genfiles.properties make/netbeans/client_sanity/nbproject/project.properties make/netbeans/client_sanity/nbproject/project.xml test/TEST.groups test/sanity/client/README test/sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java test/sanity/client/SwingSet/src/ButtonDemoTest.java test/sanity/client/SwingSet/src/ComboBoxDemoTest.java test/sanity/client/SwingSet/src/ListDemoTest.java test/sanity/client/SwingSet/src/OptionPaneDemoTest.java test/sanity/client/SwingSet/src/ProgressBarDemoTest.java test/sanity/client/SwingSet/src/ScrollPaneDemoTest.java test/sanity/client/SwingSet/src/SpinnerDemoTest.java test/sanity/client/SwingSet/src/SplitPaneDemoTest.java test/sanity/client/SwingSet/src/TabbedPaneDemoTest.java test/sanity/client/SwingSet/src/TextFieldDemoTest.java test/sanity/client/SwingSet/src/ToggleButtonDemoTest.java test/sanity/client/SwingSet/src/TreeDemoTest.java test/sanity/client/SwingSet/src/WindowDemoTest.java test/sanity/client/TEST.ROOT.template test/sanity/client/TEST.properties test/sanity/client/lib/Jemmy2Ext/src/org/jemmy2ext/JemmyExt.java test/sanity/client/lib/SwingSet3/README test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/DemoProperties.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/DemoUtilities.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/JGridPanel.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/JHyperlink.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/ResourceManager.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/ButtonDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/ButtonDemo.html test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/ButtonDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/blogs.png test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/document-print.png test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/earth_day.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/earth_night.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/edit-find.png test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/redbutton.png test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/redbutton_dark.png test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/redbutton_glow.png test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/ComboBoxDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/ComboBoxDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/ComboBoxDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/brenteyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/brenthair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/brentmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/georgeseyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/georgeshair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/georgesmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/hanseyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/hanshair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/hansmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/howardeyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/howardhair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/howardmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jameseyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jameshair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jamesmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jeffeyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jeffhair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jeffmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/joneyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jonhair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jonmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/laraeyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larahair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/laramouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larryeyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larryhair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larrymouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/lisaeyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/lisahair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/lisamouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/michaeleyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/michaelhair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/michaelmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/philipeyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/philiphair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/philipmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/scotteyes.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/scotthair.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/scottmouth.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/ListDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/Permuter.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/ListDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/ListDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/blue.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/cyan.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/gray.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/green.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/magenta.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/red.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/yellow.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/OptionPaneDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/resources/OptionPaneDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/resources/images/OptionPaneDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/resources/images/bottle.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/progressbar/ProgressBarDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/progressbar/resources/ProgressBarDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/progressbar/resources/images/ProgressBarDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/ScrollPaneDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/ScrollPaneDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/COPYRIGHT test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/ScrollPaneDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/colheader.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/crayons.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/lowerleft.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/rowheader.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/upperleft.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/scrollpane/resources/images/upperright.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/JMandelbrot.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/JPaletteShower.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/JSpinnerPanel.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/MandelbrotControl.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/Palette.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/PaletteChooser.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/SpinnerDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/resources/SpinnerDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/resources/images/SpinnerDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/splitpane/SplitPaneDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/splitpane/resources/SplitPaneDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/splitpane/resources/images/SplitPaneDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/splitpane/resources/images/day.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/splitpane/resources/images/night.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/TabbedPaneDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/TabbedPaneDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/TabbedPaneDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/blake.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/brooke.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/camille.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/david.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/ewan.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/ewan.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/matthew.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/miranda.jpg test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/resources/images/stephen.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/textfield/JHistoryTextField.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/textfield/TextFieldDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/textfield/resources/TextFieldDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/textfield/resources/images/TextFieldDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/DirectionPanel.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/LayoutControlPanel.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/ToggleButtonDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/ToggleButtonDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/ToggleButtonDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b1.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b1d.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b1p.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b1r.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b2.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b2d.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b2p.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b2r.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b3.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b3d.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b3p.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/b3r.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/bl.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/bldn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/bm.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/bmdn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/br.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/brdn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/c.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/cb.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/cbr.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/cbrs.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/cbs.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/cdn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/ml.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/mldn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/mr.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/mrdn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/rb.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/rbp.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/rbr.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/rbrs.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/rbs.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/tl.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/tldn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/tm.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/tmdn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/tr.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/togglebutton/resources/images/trdn.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tree/TreeDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tree/resources/TreeDemo.properties test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tree/resources/images/TreeDemo.gif test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tree/resources/tree.txt test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/window/WindowDemo.java test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/window/resources/WindowDemo.html test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/window/resources/images/WindowDemo.gif test/sanity/client/lib/jemmy/README test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Action.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ActionProducer.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Bundle.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/BundleManager.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/CharBindingMap.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ClassReference.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ComponentChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ComponentIsNotFocusedException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ComponentIsNotVisibleException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ComponentSearcher.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/DefaultCharBindingMap.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/DialogWaiter.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/EventDispatcher.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/EventTool.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/FrameWaiter.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/JemmyException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/JemmyInputException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/JemmyProperties.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/NoComponentUnderMouseException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/ObjectBrowser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Outputable.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/QueueTool.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Scenario.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Test.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/TestCompletedException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/TestOut.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Timeout.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/TimeoutExpiredException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Timeoutable.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Timeouts.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Waitable.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/Waiter.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/WindowWaiter.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/accessibility/AccessibilityChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/accessibility/AccessibleDescriptionChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/accessibility/AccessibleNameChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/debug.timeouts test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/APIDriverInstaller.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/ArrayDriverInstaller.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/ButtonDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DefaultDriverInstaller.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DescriptablePathChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/Driver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DriverInstaller.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DriverManager.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/EditorDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/FocusDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/FrameDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/InputDriverInstaller.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/InternalFrameDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/KeyDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/LightDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/LightSupportiveDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/ListDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/MenuDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/MouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/MultiSelListDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/OrderedListDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/PathChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/ScrollDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/SupportiveDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/TableDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/TextDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/TreeDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/UnsupportedOperatorException.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/WindowDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/buttons/ButtonMouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/buttons/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/focus/APIFocusDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/focus/MouseFocusDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/focus/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/EventDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/KeyEventDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/KeyRobotDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/MouseEventDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/MouseRobotDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/RobotDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/input/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/ChoiceDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/JComboMouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/JListMouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/JTabAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/JTabMouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/JTableHeaderDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/ListAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/ListKeyboardDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/lists/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/menus/APIJMenuDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/menus/AppleMenuDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/menus/DefaultJMenuDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/menus/QueueJMenuDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/menus/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/AWTScrollDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/AbstractScrollDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/JScrollBarAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/JScrollBarDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/JSliderAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/JSliderDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/JSpinnerDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/JSplitPaneDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/KeyboardJSliderScrollDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/ScrollAdjuster.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/ScrollPaneDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/ScrollbarDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/scrolling/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/tables/JTableMouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/tables/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/AWTTextAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/AWTTextKeyboardDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/DownKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/EndKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/GoAndBackKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/HomeKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/NavigationKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/OffsetKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/SwingTextAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/SwingTextKeyboardDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/TextAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/TextKeyboardDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/UpKey.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/text/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/trees/JTreeAPIDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/trees/JTreeMouseDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/trees/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/windows/DefaultFrameDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/windows/DefaultInternalFrameDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/windows/DefaultWindowDriver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/windows/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/explorer/GUIBrowser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/explorer/TrialListenerManager.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/explorer/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/ColorImageComparator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/FileImageComparator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/ImageComparator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/ImageFinder.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/ImageLoader.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/ImageSaver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/ImageTool.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/PNGImageLoader.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/PNGImageSaver.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/RoughImageComparator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/RoughImageFinder.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/StrictImageComparator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/StrictImageFinder.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/image/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/AbstractButtonOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ButtonOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/CheckboxOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ChoiceOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ComponentOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ContainerOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/DialogOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/FrameOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JButtonOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JCheckBoxMenuItemOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JCheckBoxOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JColorChooserOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JComboBoxOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JComponentOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JDialogOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JEditorPaneOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JFileChooserOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JFrameOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JInternalFrameOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JLabelOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JListOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JMenuBarOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JMenuItemOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JMenuOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JPasswordFieldOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JPopupMenuOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JProgressBarOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JRadioButtonMenuItemOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JRadioButtonOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JScrollBarOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JScrollPaneOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JSliderOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JSpinnerOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JSplitPaneOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTabbedPaneOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTableHeaderOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTableOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTextAreaOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTextComponentOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTextFieldOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTextPaneOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JToggleButtonOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JTreeOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/LabelOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ListOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/Operator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ScrollPaneOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/ScrollbarOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/TextAreaOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/TextComponentOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/TextFieldOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/WindowOperator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/AbstractTextStyleChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/DefaultVisualizer.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/DumpController.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/Dumper.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/EmptyVisualizer.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/MouseVisualizer.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/NameComponentChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/PNGDecoder.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/PNGEncoder.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/PropChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/RegExComparator.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/StringPropChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/TextStyleChooser.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/WindowJob.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/WindowManager.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/util/package-info.java test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/version_info
diffstat 413 files changed, 83163 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Wed Mar 30 18:12:08 2016 -0700
+++ b/.hgignore	Wed Mar 30 19:05:58 2016 -0700
@@ -7,3 +7,5 @@
 ^make/netbeans/.*/dist/
 ^.hgtip
 .DS_Store
+.*/JTreport/.*
+.*/JTwork/.*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/README	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,15 @@
+This NetBeans project corresponds to client sanity test suite in jdk/test/sanity/client.
+
+It simplifies working on the suite in NetBeans.
+
+It also includes the following custom tasks:
+
+prepare-bundle      creates dist/sanity.zip containing standalone bundle of the suite
+
+run-jemmy-browser   runs Jemmy browser for the ButtonDemo (hardcoded in build.xml file)
+                    The tool allows to explore the UI hierarchy.
+                    
+There is no task to run tests using JTReg. Please refer to corresponding README file 
+in the client sanity test suite folder on how to run the tests.
+
+Contact alexander.kouznetsov@oracle.com in case of issues.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/build.xml	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See commented blocks below for -->
+<!-- some examples of how to customize the build. -->
+<!-- (If you delete it and reopen the project it will be recreated.) -->
+<!-- By default, only the Clean and Build commands use this build script. -->
+<!-- Commands such as Run, Debug, and Test only use this build script if -->
+<!-- the Compile on Save feature is turned off for the project. -->
+<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
+<!-- in the project's Project Properties dialog box.-->
+<project name="SanityTests" default="default" basedir=".">
+    <description>Builds, tests, and runs the project SanityTests.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. They are: 
+
+      -pre-init:                 called before initialization of project properties
+      -post-init:                called after initialization of project properties
+      -pre-compile:              called before javac compilation
+      -post-compile:             called after javac compilation
+      -pre-compile-single:       called before javac compilation of single file
+      -post-compile-single:      called after javac compilation of single file
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-compile-test-single:  called before javac compilation of single JUnit test
+      -post-compile-test-single: called after javac compilation of single JUunit test
+      -pre-jar:                  called before JAR building
+      -post-jar:                 called after JAR building
+      -post-clean:               called after cleaning build products
+
+    (Targets beginning with '-' are not intended to be called on their own.)
+
+    Example of inserting an obfuscator after compilation could look like this:
+
+        <target name="-post-compile">
+            <obfuscate>
+                <fileset dir="${build.classes.dir}"/>
+            </obfuscate>
+        </target>
+
+    For list of available properties check the imported 
+    nbproject/build-impl.xml file. 
+
+
+    Another way to customize the build is by overriding existing main targets.
+    The targets of interest are: 
+
+      -init-macrodef-javac:     defines macro for javac compilation
+      -init-macrodef-junit:     defines macro for junit execution
+      -init-macrodef-debug:     defines macro for class debugging
+      -init-macrodef-java:      defines macro for class execution
+      -do-jar:                  JAR building
+      run:                      execution of project 
+      -javadoc-build:           Javadoc generation
+      test-report:              JUnit report generation
+
+    An example of overriding the target for project execution could look like this:
+
+        <target name="run" depends="SanityTests-impl.jar">
+            <exec dir="bin" executable="launcher.exe">
+                <arg file="${dist.jar}"/>
+            </exec>
+        </target>
+
+    Notice that the overridden target depends on the jar target and not only on 
+    the compile target as the regular run target does. Again, for a list of available 
+    properties which you can use, check the target you are overriding in the
+    nbproject/build-impl.xml file. 
+
+    -->
+    
+    <target name="prepare-bundle" depends="init">
+        <zip zipfile="${dist.dir}/sanity.zip">
+            <fileset dir="../../../test" includes="sanity/client/SwingSet/**"/>
+            <fileset dir="../../../test" includes="sanity/client/lib/**"/>
+            <fileset dir="../../../test" includes="sanity/client/ReadMe.txt"/>
+            <fileset dir="../../../test" includes="sanity/client/TEST.properties"/>            
+            <mappedresources>
+                <fileset dir="../../../test/sanity/client" includes="TEST.ROOT.template"/>
+                <globmapper from="TEST.ROOT.template" to="TEST.ROOT" />
+            </mappedresources>            
+        </zip>
+    </target>
+    
+    <target name="run-jemmy-browser" depends="init">
+        <java 
+            classpath="${run.classpath}"
+            classname="org.netbeans.jemmy.explorer.GUIBrowser" 
+            args="com.sun.swingset3.demos.button.ButtonDemo"/>
+    </target>
+    
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/manifest.mf	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/nbproject/build-impl.xml	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,1429 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - test compilation
+  - test execution
+  - test debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="SanityTests-impl">
+    <fail message="Please build using Ant 1.8.0 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.8.0"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <property name="platform.java" value="${java.home}/bin/java"/>
+        <available file="${manifest.file}" property="manifest.available"/>
+        <condition property="splashscreen.available">
+            <and>
+                <not>
+                    <equals arg1="${application.splash}" arg2="" trim="true"/>
+                </not>
+                <available file="${application.splash}"/>
+            </and>
+        </condition>
+        <condition property="main.class.available">
+            <and>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="profile.available">
+            <and>
+                <isset property="javac.profile"/>
+                <length length="0" string="${javac.profile}" when="greater"/>
+                <matches pattern="1\.[89](\..*)?" string="${javac.source}"/>
+            </and>
+        </condition>
+        <condition property="do.archive">
+            <or>
+                <not>
+                    <istrue value="${jar.archive.disabled}"/>
+                </not>
+                <istrue value="${not.archive.disabled}"/>
+            </or>
+        </condition>
+        <condition property="do.mkdist">
+            <and>
+                <isset property="do.archive"/>
+                <isset property="libs.CopyLibs.classpath"/>
+                <not>
+                    <istrue value="${mkdist.disabled}"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available">
+            <and>
+                <isset property="manifest.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+main.class.available">
+            <and>
+                <isset property="main.class.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+splashscreen.available">
+            <and>
+                <isset property="splashscreen.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+profile.available">
+            <and>
+                <isset property="profile.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="have.tests">
+            <or/>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.src3.dir}"/>
+                <available file="${src.src4.dir}"/>
+                <available file="${src.src2.dir}"/>
+                <available file="${src.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="run.jvmargs.ide" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <property name="runtime.encoding" value="${source.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <and>
+                <isset property="endorsed.classpath"/>
+                <not>
+                    <equals arg1="${endorsed.classpath}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}">
+            <isset property="profile.available"/>
+        </condition>
+        <condition else="false" property="jdkBug6558476">
+            <and>
+                <matches pattern="1\.[56]" string="${java.specification.version}"/>
+                <not>
+                    <os family="unix"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="false" property="javac.fork">
+            <or>
+                <istrue value="${jdkBug6558476}"/>
+                <istrue value="${javac.external.vm}"/>
+            </or>
+        </condition>
+        <property name="jar.index" value="false"/>
+        <property name="jar.index.metainf" value="${jar.index}"/>
+        <property name="copylibs.rebase" value="true"/>
+        <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+        <condition property="junit.available">
+            <or>
+                <available classname="org.junit.Test" classpath="${run.test.classpath}"/>
+                <available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
+            </or>
+        </condition>
+        <condition property="testng.available">
+            <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
+        </condition>
+        <condition property="junit+testng.available">
+            <and>
+                <istrue value="${junit.available}"/>
+                <istrue value="${testng.available}"/>
+            </and>
+        </condition>
+        <condition else="testng" property="testng.mode" value="mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+        <condition else="" property="testng.debug.mode" value="-mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+        <property name="java.failonerror" value="true"/>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
+        <fail unless="src.src3.dir">Must set src.src3.dir</fail>
+        <fail unless="src.src4.dir">Must set src.src4.dir</fail>
+        <fail unless="src.src2.dir">Must set src.src2.dir</fail>
+        <fail unless="src.src.dir">Must set src.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.src3.dir}:${src.src4.dir}:${src.src2.dir}:${src.src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.profile.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg line="${annotation.processing.processor.options}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.src3.dir}:${src.src4.dir}:${src.src2.dir}:${src.src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.profile.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.src3.dir}:${src.src4.dir}:${src.src2.dir}:${src.src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+                <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+                <delete>
+                    <files includesfile="${javac.includesfile.binary}"/>
+                </delete>
+                <delete>
+                    <fileset file="${javac.includesfile.binary}"/>
+                </delete>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-init">
+        <condition else="false" property="nb.junit.batch" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <not>
+                    <isset property="test.method"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="false" property="nb.junit.single" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <isset property="test.method"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-init-test-properties">
+        <property name="test.binaryincludes" value="&lt;nothing&gt;"/>
+        <property name="test.binarytestincludes" value=""/>
+        <property name="test.binaryexcludes" value=""/>
+    </target>
+    <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                            <filename name="${test.binarytestincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
+    <target if="${testng.available}" name="-init-macrodef-testng">
+        <macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
+                    <isset property="test.method"/>
+                </condition>
+                <union id="test.set"/>
+                <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
+                <testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="SanityTests" testname="TestNG tests" workingDir="${work.dir}">
+                    <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
+                    <propertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </propertyset>
+                    <customize/>
+                </testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-test-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <echo>No tests executed.</echo>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
+        <macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <sequential>
+                <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                        <jvmarg line="${run.jvmargs}"/>
+                        <jvmarg line="${run.jvmargs.ide}"/>
+                    </customize>
+                </j2seproject3:test-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+                            <filename name="${test.binarytestincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
+        <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:junit-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${testng.available}" name="-init-macrodef-testng-debug">
+        <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element name="customize2" optional="true"/>
+            <sequential>
+                <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
+                    <isset property="test.method"/>
+                </condition>
+                <condition else="-suitename SanityTests -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
+                    <matches pattern=".*\.xml" string="@{testClass}"/>
+                </condition>
+                <delete dir="${build.test.results.dir}" quiet="true"/>
+                <mkdir dir="${build.test.results.dir}"/>
+                <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
+                    <customize>
+                        <customize2/>
+                        <jvmarg value="-ea"/>
+                        <arg line="${testng.debug.mode}"/>
+                        <arg line="-d ${build.test.results.dir}"/>
+                        <arg line="-listener org.testng.reporters.VerboseReporter"/>
+                        <arg line="${testng.cmd.args}"/>
+                    </customize>
+                </j2seproject3:debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
+        <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element implicit="true" name="customize2" optional="true"/>
+            <sequential>
+                <j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2/>
+                </j2seproject3:testng-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                        <jvmarg line="${run.jvmargs}"/>
+                        <jvmarg line="${run.jvmargs.ide}"/>
+                    </customize>
+                </j2seproject3:test-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2>
+                        <syspropertyset>
+                            <propertyref prefix="test-sys-prop."/>
+                            <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                        </syspropertyset>
+                    </customize2>
+                </j2seproject3:testng-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
+    <!--
+                pre NB7.2 profiling section; consider it deprecated
+            -->
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
+    <target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
+        <macrodef name="resolve">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${env.@{value}}"/>
+            </sequential>
+        </macrodef>
+        <macrodef name="profile">
+            <attribute default="${main.class}" name="classname"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property environment="env"/>
+                <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+                <java classname="@{classname}" dir="${profiler.info.dir}" failonerror="${java.failonerror}" fork="true" jvm="${profiler.info.jvm}">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="${profiler.info.jvmargs.agent}"/>
+                    <jvmarg line="${profiler.info.jvmargs}"/>
+                    <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+                    <arg line="${application.args}"/>
+                    <classpath>
+                        <path path="${run.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
+        <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+        <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+    </target>
+    <!--
+                end of pre NB7.2 profiling section
+            -->
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <attribute default="jvm" name="jvm"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-copylibs">
+        <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${manifest.file}" name="manifest"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+                <pathconvert property="run.classpath.without.build.classes.dir">
+                    <path path="${run.classpath}"/>
+                    <map from="${build.classes.dir.resolved}" to=""/>
+                </pathconvert>
+                <pathconvert pathsep=" " property="jar.classpath">
+                    <path path="${run.classpath.without.build.classes.dir}"/>
+                    <chainedmapper>
+                        <flattenmapper/>
+                        <filtermapper>
+                            <replacestring from=" " to="%20"/>
+                        </filtermapper>
+                        <globmapper from="*" to="lib/*"/>
+                    </chainedmapper>
+                </pathconvert>
+                <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+                <copylibs compress="${jar.compress}" excludeFromCopy="${copylibs.excludes}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+                    <fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
+                    <manifest>
+                        <attribute name="Class-Path" value="${jar.classpath}"/>
+                        <customize/>
+                    </manifest>
+                </copylibs>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target name="-init-ap-cmdline-properties">
+        <property name="annotation.processing.enabled" value="true"/>
+        <property name="annotation.processing.processors.list" value=""/>
+        <property name="annotation.processing.processor.options" value=""/>
+        <property name="annotation.processing.run.all.processors" value="true"/>
+        <property name="javac.processorpath" value="${javac.classpath}"/>
+        <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+        <condition property="ap.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+        <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+            <isfalse value="${annotation.processing.run.all.processors}"/>
+        </condition>
+        <condition else="" property="ap.proc.none.internal" value="-proc:none">
+            <isfalse value="${annotation.processing.enabled}"/>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+        <property name="ap.cmd.line.internal" value=""/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target name="-deps-jar-init" unless="built-jar.properties">
+        <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+        <delete file="${built-jar.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+        <echo level="warn" message="Cycle detected: SanityTests was already built"/>
+    </target>
+    <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-jar.properties}" verbose="false"/>
+        <property file="${built-jar.properties}" prefix="already.built.jar."/>
+        <antcall target="-warn-already-built-jar"/>
+        <propertyfile file="${built-jar.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.src3.dir}:${src.src4.dir}:${src.src2.dir}:${src.src.dir}:${build.generated.subdirs}"/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.src3.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+            <fileset dir="${src.src4.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+            <fileset dir="${src.src2.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+            <fileset dir="${src.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target if="has.persistence.xml" name="-copy-persistence-xml">
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy todir="${build.classes.dir}/META-INF">
+            <fileset dir="${meta.inf.dir}" includes="persistence.xml orm.xml"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.src3.dir}:${src.src4.dir}:${src.src2.dir}:${src.src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init" if="do.archive" name="-do-jar-create-manifest" unless="manifest.available">
+        <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+        <touch file="${tmp.manifest.file}" verbose="false"/>
+    </target>
+    <target depends="init" if="do.archive+manifest.available" name="-do-jar-copy-manifest">
+        <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+        <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+    </target>
+    <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+main.class.available" name="-do-jar-set-mainclass">
+        <manifest file="${tmp.manifest.file}" mode="update">
+            <attribute name="Main-Class" value="${main.class}"/>
+        </manifest>
+    </target>
+    <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+profile.available" name="-do-jar-set-profile">
+        <manifest file="${tmp.manifest.file}" mode="update">
+            <attribute name="Profile" value="${javac.profile}"/>
+        </manifest>
+    </target>
+    <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-set-splashscreen">
+        <basename file="${application.splash}" property="splashscreen.basename"/>
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+        <manifest file="${tmp.manifest.file}" mode="update">
+            <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+        </manifest>
+    </target>
+    <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.mkdist" name="-do-jar-copylibs">
+        <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+        <echo level="info">To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo level="info">java -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
+        <j2seproject1:jar manifest="${tmp.manifest.file}"/>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java} -cp ${run.classpath.with.dist.jar} ${main.class}">
+            <isset property="main.class.available"/>
+        </condition>
+        <condition else="debug" property="jar.usage.level" value="info">
+            <isset property="main.class.available"/>
+        </condition>
+        <echo level="${jar.usage.level}" message="${jar.usage.message}"/>
+    </target>
+    <target depends="-do-jar-copylibs" if="do.archive" name="-do-jar-delete-manifest">
+        <delete>
+            <fileset file="${tmp.manifest.file}"/>
+        </delete>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-jar,-do-jar-delete-manifest" name="-do-jar-without-libraries"/>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-copylibs,-do-jar-delete-manifest" name="-do-jar-with-libraries"/>
+    <target name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
+    <target depends="init,compile,-pre-jar,-do-jar,-post-jar" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                =================
+                PROFILING SECTION
+                =================
+            -->
+    <!--
+                pre NB7.2 profiler integration
+            -->
+    <target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile/>
+    </target>
+    <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
+        <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile classname="${profile.class}"/>
+    </target>
+    <target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </profile>
+    </target>
+    <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+            <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <test name="${profile.class}"/>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper from="test-sys-prop.*" to="*" type="glob"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+        </junit>
+    </target>
+    <!--
+                end of pre NB72 profiling section
+            -->
+    <target if="netbeans.home" name="-profile-check">
+        <condition property="profiler.configured">
+            <or>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
+            </or>
+        </condition>
+    </target>
+    <target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
+        <startprofiler/>
+        <antcall target="run"/>
+    </target>
+    <target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <startprofiler/>
+        <antcall target="run-single"/>
+    </target>
+    <target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
+    <target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <startprofiler/>
+        <antcall target="test-single"/>
+    </target>
+    <target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <startprofiler/>
+        <antcal target="run-test-with-main"/>
+    </target>
+    <target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <startprofiler/>
+        <antcall target="run-applet"/>
+    </target>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" if="have.sources" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <condition else="" property="javadoc.endorsed.classpath.cmd.line.arg" value="-J${endorsed.classpath.cmd.line.arg}">
+            <and>
+                <isset property="endorsed.classpath.cmd.line.arg"/>
+                <not>
+                    <equals arg1="${endorsed.classpath.cmd.line.arg}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <condition else="" property="bug5101868workaround" value="*.java">
+            <matches pattern="1\.[56](\..*)?" string="${java.version}"/>
+        </condition>
+        <javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.src3.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${src.src4.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${src.src2.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${src.src.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+                <exclude name="*.java"/>
+            </fileset>
+            <arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
+        </javadoc>
+        <copy todir="${dist.javadoc.dir}">
+            <fileset dir="${src.src3.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${src.src4.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${src.src2.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${src.src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/doc-files/**"/>
+            </fileset>
+        </copy>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                TEST COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir=""/>
+    </target>
+    <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir=""/>
+        <copy todir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="" srcdir=""/>
+        <copy todir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                TEST EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:test includes="${includes}" testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
+        <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
+    <!--
+                =======================
+                TEST DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target name="-deps-clean-init" unless="built-clean.properties">
+        <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+        <delete file="${built-clean.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+        <echo level="warn" message="Cycle detected: SanityTests was already built"/>
+    </target>
+    <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-clean.properties}" verbose="false"/>
+        <property file="${built-clean.properties}" prefix="already.built.clean."/>
+        <antcall target="-warn-already-built-clean"/>
+        <propertyfile file="${built-clean.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target name="-check-call-dep">
+        <property file="${call.built.properties}" prefix="already.built."/>
+        <condition property="should.call.dep">
+            <and>
+                <not>
+                    <isset property="already.built.${call.subproject}"/>
+                </not>
+                <available file="${call.script}"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+        <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+            <propertyset>
+                <propertyref prefix="transfer."/>
+                <mapper from="transfer.*" to="*" type="glob"/>
+            </propertyset>
+        </ant>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/nbproject/genfiles.properties	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=0f9d9977
+build.xml.script.CRC32=f902e8b8
+build.xml.stylesheet.CRC32=8064a381@1.75.2.48
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=55414227
+nbproject/build-impl.xml.script.CRC32=c12f9d04
+nbproject/build-impl.xml.stylesheet.CRC32=05530350@1.79.1.48
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/nbproject/project.properties	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,79 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+application.title=SanityTests
+application.vendor=akouznet
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# Files in build.classes.dir which should be excluded from distribution jar
+dist.archive.excludes=
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/SanityTests.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=*.cfg
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${libs.testng.classpath}
+# Space-separated list of extra javac options
+javac.compilerargs=-Xmaxwarns 9999 -Xlint:all -Xlint:-serial
+javac.deprecation=false
+javac.external.vm=false
+javac.processorpath=\
+    ${javac.classpath}
+javac.source=1.8
+javac.target=1.8
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+javac.test.processorpath=\
+    ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+main.class=
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+platform.active=default_platform
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project.
+# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
+# To set system properties for unit tests define test-sys-prop.name=value:
+run.jvmargs=-ea
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.src.dir=..\\..\\..\\test\\sanity\\client\\SwingSet\\src
+src.src2.dir=..\\..\\..\\test\\sanity\\client\\lib\\SwingSet3\\src
+src.src3.dir=..\\..\\..\\test\\sanity\\client\\lib\\jemmy\\src
+src.src4.dir=..\\..\\..\\test\\sanity\\client\\lib\\Jemmy2Ext\\src
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/netbeans/client_sanity/nbproject/project.xml	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>SanityTests</name>
+            <source-roots>
+                <root id="src.src3.dir" name="lib\jemmy\src"/>
+                <root id="src.src4.dir" name="lib\Jemmy2Ext\src"/>
+                <root id="src.src2.dir" name="lib\SwingSet3\src"/>
+                <root id="src.src.dir" name="SwingSet\src"/>
+            </source-roots>
+            <test-roots/>
+        </data>
+        <references xmlns="http://www.netbeans.org/ns/ant-project-references/2"/>
+    </configuration>
+</project>
--- a/test/TEST.groups	Wed Mar 30 18:12:08 2016 -0700
+++ b/test/TEST.groups	Wed Mar 30 19:05:58 2016 -0700
@@ -60,7 +60,8 @@
     :jdk_rmi \
     :jdk_beans \
     :jdk_imageio \
-    :jdk_sound
+    :jdk_sound \
+    :jdk_client_sanity
 
 ###############################################################################
 #
@@ -351,6 +352,10 @@
     :jdk_sound \
     :jdk_imageio
 
+# SwingSet3 tests.
+jdk_client_sanity = \
+    sanity/client/SwingSet
+    
 ###############################################################################
 #
 # Serviceability sanity groups
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/README	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,45 @@
+This suite contains automated client sanity tests which can be run using JTReg.
+
+Contact alexander.kouznetsov@oracle.com in case of issues.
+
+-------------------------------------------------------------------------------
+How to run:
+
+1) Download/Install the JDK to be tested in the system.
+   (For example C:/java/jdk1.9.0 in windows or 
+    /export/jdk/jdk1.9.0 in linux/mac/solaris)
+2) Download/Install JTReg harness, minimum required version is 4.1 b13.    
+3) Open terminal(cmd in windows, *not* cygwin) and go to the this directory.
+4) To run
+    - see the notes below on how to prepare for the test run
+    - set JT_HOME to <path/to/jtreg>, for example
+        set JT_HOME=C:\Java\client\jtreg        (Windows)
+    - run the command
+        'sh <path/to/jtreg/bin/jtreg> -ea -k:\!screenshots -jdk:<Path/to/JDK> SwingSet'
+ 
+       For example: 'sh C:/jtreg/bin/jtreg -ea -k:\!screenshots -jdk:C:/java/jdk1.9.0 SwingSet'             (Windows)
+         'sh /export/jtreg/bin/jtreg -ea -k:\!screenshots -jdk:/export/jdk/jdk1.9.0 SwingSet'               (Linux/Solaris)
+         'sh /export/jtreg/bin/jtreg -ea -k:\!screenshots -jdk:/export/jdk/jdk1.9.0/Contents/Home SwingSet' (Mac)
+
+Try to minimize all the other windows for no interference and test stability.
+Do not touch keyboard or mouse, open any window, nor lock the screen while the tests are running.
+The tests will be executed, and the results will be displayed in the terminal. 
+
+A report will be generated under 
+            a) JTReg: "JTReport/index.html".
+The failure logs could be found under:
+            a) JTReg: "JTWork/<testname>/<testname>.jtr"
+            
+The following additional options might be useful:
+-retain:all         to keep work files for passed tests
+-k:\!screenshots    removal of this option will run tests that require full environment with Robot and screenshots
+-g                  to run JavaTest GUI
+            
+-------------------------------------------------------------------------------
+
+The tests in the suite are based on SwingSet3 demo application. They use Jemmy to
+operate on controls of the demo and verify that it is behaving as expected. Both
+Jemmy and SwingSet3 sources are available as copies in lib folder.
+
+Original Jemmy repository is https://jemmy.java.net
+Original SwingSet3 repository is https://java.net/projects/swingset3
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import java.awt.image.BufferedImage;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.image.StrictImageComparator;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import static org.jemmy2ext.JemmyExt.*;
+import org.testng.annotations.Test;
+import static com.sun.swingset3.demos.button.ButtonDemo.*;
+
+/*
+ * @test
+ * @key headful screenshots
+ * @summary Verifies buttons on SwingSet3 ButtonDemo page by clicking each
+ *          button, taking its screenshots and checking that pressed button
+ *          image is different from initial button image.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.button.ButtonDemo
+ * @run testng ButtonDemoScreenshotTest
+ */
+public class ButtonDemoScreenshotTest {
+
+    private static final int BUTTON_COUNT = 6; // TODO: Decide about "open browser" buttons (value was 8 originally)
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            Robot rob = new Robot();
+
+            new ClassReference(com.sun.swingset3.demos.button.ButtonDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE);
+            waitImageIsStill(rob, mainFrame);
+
+            // Check all the buttons
+            for (int i = 0; i < BUTTON_COUNT; i++) {
+                checkButton(mainFrame, i, rob);
+            }
+        });
+    }
+
+    public void checkButton(JFrameOperator jfo, int i, Robot rob) {
+        JButtonOperator button = new JButtonOperator(jfo, i);
+
+        Point loc = button.getLocationOnScreen();
+        rob.mouseMove(loc.x, loc.y);
+
+        BufferedImage initialButtonImage = capture(rob, button);
+        assertNotBlack(initialButtonImage);
+        save(initialButtonImage, "button" + i + "_0initial.png");
+        rob.mousePress(InputEvent.BUTTON1_MASK);
+        try {
+            waitPressed(button);
+            BufferedImage pressedButtonImage = capture(rob, button);
+            assertNotBlack(pressedButtonImage);
+            save(pressedButtonImage, "button" + i + "_1pressed.png");
+
+            StrictImageComparator sComparator = new StrictImageComparator();
+            assertNotEquals("Button " + i + " Test", sComparator, initialButtonImage, pressedButtonImage);
+        } finally {
+            rob.mouseRelease(InputEvent.BUTTON1_MASK);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ButtonDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.JHyperlink;
+import com.sun.swingset3.demos.button.ButtonDemo;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import javax.swing.ButtonModel;
+import javax.swing.JButton;
+import javax.swing.event.ChangeEvent;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.jemmy2ext.JemmyExt.ByToolTipChooser;
+import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import static com.sun.swingset3.demos.button.ButtonDemo.*;
+import org.jemmy2ext.JemmyExt;
+import org.jemmy2ext.JemmyExt.MultiThreadedTryCatch;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies buttons on SwingSet3 ButtonDemo page by clicking each button
+ *          and checking model change events. It also verifies tooltips and text
+ *          on buttons before and after click.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.button.ButtonDemo
+ * @run testng ButtonDemoTest
+ */
+public class ButtonDemoTest {
+
+    private static final String[] BUTTON_TEXT_AFTER = {
+        DO_IT_AGAIN,};
+
+    private static final String[] BUTTON_TEXT_BEFORE = {
+        DO_IT,
+        "",
+        FIND,
+        GO,
+        CONNECT,
+        "",
+        GET_MORE_INFO,
+        null
+    };
+
+    private static final String[] BUTTON_TOOLTIP = {
+        SIMPLE_BUTTON,
+        IMAGE_BUTTON,
+        BUTTON_WITH_TEXT_AND_IMAGE,
+        BUTTON_WITH_BACKGROUND_COLOR,
+        BUTTON_WITH_NO_BORDER,
+        BUTTON_WITH_ROLLOVER_IMAGE,
+        JAVA_SE_URL,
+        JAVA_BLOGS_URL
+    };
+
+    private static final String[] GOLDEN = {
+        "isArmed = false, isEnabled = true, isPressed = false, isSelected = false",
+        "isArmed = true, isEnabled = true, isPressed = false, isSelected = false",
+        "isArmed = true, isEnabled = true, isPressed = true, isSelected = false",
+        "isArmed = true, isEnabled = true, isPressed = false, isSelected = false",
+        "isArmed = false, isEnabled = true, isPressed = false, isSelected = false"
+    };
+
+    @Test
+    public void test() throws Exception {
+
+        captureDebugInfoOnFail(() -> {
+
+            new ClassReference(ButtonDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE);
+            mainFrame.setComparator(EXACT_STRING_COMPARATOR);
+
+            // Check all the buttons
+            for (int i = 0; i < BUTTON_TOOLTIP.length; i++) {
+                String tooltip = BUTTON_TOOLTIP[i];
+
+                JButtonOperator button = new JButtonOperator(mainFrame, new ByToolTipChooser(tooltip));
+
+                assertEquals(BUTTON_TEXT_BEFORE[i], button.getText());
+
+                // Two buttons are hyperlinks, we don't want to click them
+                if (!button.getSource().getClass().equals(JHyperlink.class)) {
+                    checkButton(button);
+                }
+
+                if (BUTTON_TEXT_AFTER.length > i) {
+                    assertEquals(BUTTON_TEXT_AFTER[i], button.getText());
+                } else {
+                    assertEquals(BUTTON_TEXT_BEFORE[i], button.getText());
+                }
+            }
+
+        });
+    }
+
+    private void checkButton(JButtonOperator button) throws Exception {
+        MultiThreadedTryCatch tryCatch = new JemmyExt.MultiThreadedTryCatch();
+        try {
+            BlockingQueue<String> modelStateChanges = new ArrayBlockingQueue<>(GOLDEN.length);
+            button.getQueueTool().invokeAndWait(() -> {
+                try {
+                    JButton jButton = (JButton) button.getSource();
+                    ButtonModel model = jButton.getModel();
+                    String line = toString(model);
+                    System.out.println("Inital: " + line);
+                    modelStateChanges.add(line);
+                    model.addChangeListener((ChangeEvent e) -> {
+                        try {
+                            String line2 = toString(model);
+                            System.out.println("ChangeEvent: " + line2);
+
+                            // We are only interested in the first GOLDEN.length events
+                            if (modelStateChanges.remainingCapacity() > 0) {
+                                modelStateChanges.add(line2);
+                            }
+                        } catch (RuntimeException | Error t) {
+                            tryCatch.register(t);
+                        }
+                    });
+                } catch (Error error) {
+                    // All exceptions are already handled by Jemmy but Errors are not
+                    tryCatch.register(error);
+                    throw error;
+                }
+            });
+
+            assertEquals("Initial state check", GOLDEN[0], modelStateChanges.take());
+
+            button.clickMouse();
+
+            for (int state = 1; state < GOLDEN.length; state++) {
+                assertEquals(GOLDEN[state], modelStateChanges.take());
+            }
+        } catch (RuntimeException | Error | InterruptedException t) {
+            tryCatch.registerRoot(t);
+        } finally {
+            tryCatch.throwRegistered();
+        }
+    }
+
+    private static String toString(ButtonModel model) {
+        return "isArmed = " + model.isArmed()
+                + ", isEnabled = " + model.isEnabled()
+                + ", isPressed = " + model.isPressed()
+                + ", isSelected = " + model.isSelected();
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ComboBoxDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.combobox.ComboBoxDemo;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JComboBoxOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import static com.sun.swingset3.demos.combobox.ComboBoxDemo.*;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies ComboBoxes on SwingSet2 ComboBoxDemo page by selecting
+ *          each value of each ComboBox.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.combobox.ComboBoxDemo
+ * @run testng ComboBoxDemoTest
+ */
+public class ComboBoxDemoTest {
+
+    private static enum ComboBoxInfo {
+        PRESETS("Presets:"),
+        HAIR("Hair:"),
+        EYES_N_NOSE("Eyes & Nose:"),
+        MOUTH("Mouth:");
+
+        private final String comboBoxName;
+
+        private ComboBoxInfo(String comboBoxName) {
+            this.comboBoxName = comboBoxName;
+        }
+
+    }
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(ComboBoxDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+            for (ComboBoxInfo comboBoxInfo : ComboBoxInfo.values()) {
+                comboBoxChecker(frame, comboBoxInfo);
+            }
+        });
+    }
+
+    private void comboBoxChecker(JFrameOperator jfo, ComboBoxInfo comboBoxInfo) {
+        JComboBoxOperator jcbo = new JComboBoxOperator(jfo, comboBoxInfo.ordinal());
+        for (int i = 0; i < jcbo.getItemCount(); i++) {
+            jcbo.selectItem(i);
+            assertEquals(comboBoxInfo.comboBoxName + " ComboBox SelectedIndex is correct", i, jcbo.getSelectedIndex());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ListDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.list.ListDemo;
+import static com.sun.swingset3.demos.list.ListDemo.DEMO_TITLE;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import static org.jemmy2ext.JemmyExt.getLabeledContainerOperator;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JCheckBoxOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JListOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 ListDemo page by checking and unchecking all
+ *          the checkboxes on the page and verifying the number of items in the
+ *          list.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.list.ListDemo
+ * @run testng ListDemoTest
+ */
+public class ListDemoTest {
+
+    private static final int CHECKBOX_COUNT = 50;
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(ListDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+            JListOperator listOp = new JListOperator(frame);
+
+            // Check *NO* Prefix and Suffixes Marked
+            for (int i = 0; i < CHECKBOX_COUNT; i++) {
+                JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i);
+                checkBox.changeSelection(false);
+            }
+            System.out.println("######## Number of Items = " + listOp.getModel().getSize());
+            assertEquals("Select None number of items is correct", 0, listOp.getModel().getSize());
+
+            // Check *ALL* Prefix and Suffixes Marked
+            for (int i = 0; i < CHECKBOX_COUNT; i++) {
+                JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i);
+                checkBox.changeSelection(true);
+            }
+            System.out.println("######## Number of Items = " + listOp.getModel().getSize());
+            assertEquals("Select All number of items is correct", CHECKBOX_COUNT / 2 * CHECKBOX_COUNT / 2, listOp.getModel().getSize());
+
+            // Check *ALL* Prefix and *NO* Suffixes Marked
+            for (int i = 0; i < CHECKBOX_COUNT; i++) {
+                JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i);
+                if (i < CHECKBOX_COUNT / 2) {
+                    checkBox.changeSelection(true);
+                } else {
+                    checkBox.changeSelection(false);
+                }
+            }
+            System.out.println("######## Number of Items = " + listOp.getModel().getSize());
+            assertEquals("Select All Prefixes and NO Suffixes number of items is correct", 0, listOp.getModel().getSize());
+
+            // Check *NO* Prefix and *ALL* Suffixes Marked
+            for (int i = 0; i < CHECKBOX_COUNT; i++) {
+                JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i);
+                if (i < CHECKBOX_COUNT / 2) {
+                    checkBox.changeSelection(false);
+                } else {
+                    checkBox.changeSelection(true);
+                }
+            }
+            System.out.println("######## Number of Items = " + listOp.getModel().getSize());
+            assertEquals("Select NO Prefixes and All Suffixes number of items is correct", 0, listOp.getModel().getSize());
+        });
+    }
+
+    private JCheckBoxOperator getJCheckBoxOperator(JFrameOperator frame, int index) {
+
+        // We map first half of indexes to the Prefixes panel and the second half
+        // to the Suffixes panel
+        String labelText;
+        int subindex;
+        if (index < CHECKBOX_COUNT / 2) {
+            labelText = "Prefixes";
+            subindex = index;
+        } else {
+            labelText = "Suffixes";
+            subindex = index - CHECKBOX_COUNT / 2;
+        }
+
+        return new JCheckBoxOperator(getLabeledContainerOperator(frame, labelText), subindex);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/OptionPaneDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,339 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.optionpane.OptionPaneDemo;
+import static com.sun.swingset3.demos.optionpane.OptionPaneDemo.*;
+import javax.swing.UIManager;
+import static org.jemmy2ext.JemmyExt.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JComboBoxOperator;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JLabelOperator;
+import org.netbeans.jemmy.operators.JTextFieldOperator;
+
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 OptionPaneDemo page by opening all the dialogs
+ *          and choosing different options in them.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.optionpane.OptionPaneDemo
+ * @run testng OptionPaneDemoTest
+ */
+public class OptionPaneDemoTest {
+
+    public static final String SOME_TEXT_TO_TYPE = "I am some text";
+    public static final String MESSAGE = UIManager.getString("OptionPane.messageDialogTitle");
+    public static final String OK = "OK";
+    public static final String CANCEL = "Cancel";
+    public static final String INPUT = UIManager.getString("OptionPane.inputDialogTitle");
+    public static final String TEXT_TO_TYPE = "Hooray! I'm a textField";
+    public static final String NO = "No";
+    public static final String YES = "Yes";
+    public static final String SELECT_AN__OPTION = UIManager.getString("OptionPane.titleText");
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(OptionPaneDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+
+            showInputDialog(frame);
+            showWarningDialog(frame);
+            showMessageDialog(frame);
+            showComponentDialog(frame);
+            showConfirmationDialog(frame);
+        });
+    }
+
+    public void showInputDialog(JFrameOperator jfo) throws Exception {
+        // Cancel with text case
+        {
+            new JButtonOperator(jfo, INPUT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(INPUT);
+            JTextFieldOperator jto = new JTextFieldOperator(jdo);
+            jto.setText(SOME_TEXT_TO_TYPE);
+
+            assertTrue("Show Input Dialog cancel w/ Text", jdo.isShowing());
+
+            new JButtonOperator(jdo, CANCEL).push();
+
+            assertFalse("Show Input Dialog cancel w/ Text", jdo.isShowing());
+        }
+
+        // Cancel with *NO* text case
+        {
+            new JButtonOperator(jfo, INPUT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(INPUT);
+
+            assertTrue("Show Input Dialog cancel w/o Text", jdo.isShowing());
+
+            new JButtonOperator(jdo, CANCEL).push();
+
+            assertFalse("Show Input Dialog cancel w/o Text", jdo.isShowing());
+        }
+
+        // Text field has *NO* input
+        {
+            new JButtonOperator(jfo, INPUT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(INPUT);
+
+            assertTrue("Show Input Dialog w/o Input", jdo.isShowing());
+
+            new JButtonOperator(jdo, OK).push();
+
+            assertFalse("Show Input Dialog w/o Input", jdo.isShowing());
+        }
+
+        // Text field has input
+        {
+            final String enteredText = "Rambo";
+
+            new JButtonOperator(jfo, INPUT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(INPUT);
+            JTextFieldOperator jto = new JTextFieldOperator(jdo);
+            jto.setText(enteredText);
+            new JButtonOperator(jdo, OK).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Show Input Dialog w/ Input", jdo1.isShowing());
+
+            final String labelText = enteredText + INPUT_RESPONSE;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Text from the field made it into the dialog", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Show Input Dialog w/ Input", jdo1.isShowing());
+        }
+    }
+
+    public void showWarningDialog(JFrameOperator jfo) throws Exception {
+        new JButtonOperator(jfo, WARNING_BUTTON).pushNoBlock();
+
+        JDialogOperator jdo = new JDialogOperator(WARNING_TITLE);
+
+        assertTrue("Show Warning Dialog", jdo.isShowing());
+
+        new JButtonOperator(jdo, OK).push();
+
+        assertFalse("Show Warning Dialog", jdo.isShowing());
+    }
+
+    public void showMessageDialog(JFrameOperator jfo) throws Exception {
+        new JButtonOperator(jfo, MESSAGE_BUTTON).pushNoBlock();
+
+        JDialogOperator jdo = new JDialogOperator(MESSAGE);
+
+        assertTrue("Show Message Dialog", jdo.isShowing());
+
+        new JButtonOperator(jdo, OK).push();
+
+        assertFalse("Show Message Dialog", jdo.isShowing());
+    }
+
+    public void showComponentDialog(JFrameOperator jfo) throws Exception {
+        // Case: Cancel
+        {
+            new JButtonOperator(jfo, COMPONENT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(COMPONENT_TITLE);
+
+            assertTrue("Show Component Dialog Cancel Option", jdo.isShowing());
+
+            new JButtonOperator(jdo, COMPONENT_OP5).push();
+
+            assertFalse("Show Component Dialog Cancel Option", jdo.isShowing());
+        }
+
+        // Case: Yes option selected
+        {
+            new JButtonOperator(jfo, COMPONENT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(COMPONENT_TITLE);
+            new JButtonOperator(jdo, COMPONENT_OP1).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Component Dialog Example Yes Option", jdo1.isShowing());
+
+            final String labelText = COMPONENT_R1;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Dialog contains appropriate text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Component Dialog Example Yes Option", jdo1.isShowing());
+        }
+
+        // Case: No option selected
+        {
+            new JButtonOperator(jfo, COMPONENT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(COMPONENT_TITLE);
+            new JButtonOperator(jdo, COMPONENT_OP2).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Component Dialog Example No Option", jdo1.isShowing());
+
+            final String labelText = COMPONENT_R2;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Dialog contains appropriate text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Component Dialog Example No Option", jdo1.isShowing());
+        }
+
+        // Case: Maybe option selected
+        {
+            new JButtonOperator(jfo, COMPONENT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(COMPONENT_TITLE);
+            new JButtonOperator(jdo, COMPONENT_OP3).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Component Dialog Maybe Yes Option", jdo1.isShowing());
+
+            final String labelText = COMPONENT_R3;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Dialog contains appropriate text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Component Dialog Maybe Yes Option", jdo1.isShowing());
+        }
+
+        // Case: Probably option selected
+        {
+            new JButtonOperator(jfo, COMPONENT_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(COMPONENT_TITLE);
+            new JButtonOperator(jdo, COMPONENT_OP4).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Component Dialog Example Probably Option", jdo1.isShowing());
+
+            final String labelText = COMPONENT_R4;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Dialog contains appropriate text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Component Dialog Example Probably Option", jdo1.isShowing());
+        }
+
+        // Case TextField and ComboBox functional
+        {
+            new JButtonOperator(jfo, COMPONENT_BUTTON).push();
+
+            JDialogOperator jdo = new JDialogOperator(COMPONENT_TITLE);
+
+            JTextFieldOperator jto = new JTextFieldOperator(jdo);
+            jto.clearText();
+            jto.typeText(TEXT_TO_TYPE);
+
+            JComboBoxOperator jcbo = new JComboBoxOperator(jdo);
+            jcbo.selectItem(2);
+
+            assertEquals("Show Component Dialog TextField", TEXT_TO_TYPE, jto.getText());
+            assertEquals("Show Component Dialog ComboBox", 2, jcbo.getSelectedIndex());
+
+            new JButtonOperator(jdo, "cancel").push();
+        }
+    }
+
+    public void showConfirmationDialog(JFrameOperator jfo) throws Exception {
+        // Case: Yes option selected
+        {
+            new JButtonOperator(jfo, CONFIRM_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(SELECT_AN__OPTION);
+            new JButtonOperator(jdo, YES).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Show Confirmation Dialog Yes Option", jdo1.isShowing());
+
+            final String labelText = CONFIRM_YES;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Dialog contains appropriate text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Show Confirmation Dialog Yes Option", jdo1.isShowing());
+        }
+
+        // Case: No option selected
+        {
+            new JButtonOperator(jfo, CONFIRM_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(SELECT_AN__OPTION);
+            new JButtonOperator(jdo, NO).pushNoBlock();
+
+            JDialogOperator jdo1 = new JDialogOperator(MESSAGE);
+
+            assertTrue("Show Confirmation Dialog No Option", jdo1.isShowing());
+
+            final String labelText = CONFIRM_NO;
+            JLabelOperator jLabelOperator = new JLabelOperator(jdo1, labelText);
+            assertEquals("Dialog contains appropriate text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(jdo1, OK).push();
+
+            assertFalse("Show Confirmation Dialog No Option", jdo1.isShowing());
+        }
+
+        // Case: Cancel option selected
+        {
+            new JButtonOperator(jfo, CONFIRM_BUTTON).pushNoBlock();
+
+            JDialogOperator jdo = new JDialogOperator(SELECT_AN__OPTION);
+
+            assertTrue("Show Confirmation Dialog Cancel Option", jdo.isShowing());
+
+            new JButtonOperator(jdo, CANCEL).push();
+
+            assertFalse("Show Confirmation Dialog Cancel Option", jdo.isShowing());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ProgressBarDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.progressbar.ProgressBarDemo;
+import static com.sun.swingset3.demos.progressbar.ProgressBarDemo.*;
+import java.awt.Component;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.ComponentChooser;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JProgressBarOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 ProgressBarDemo page by pressing start and stop
+ *          buttons and checking the progress bar and the buttons state.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.progressbar.ProgressBarDemo
+ * @run testng ProgressBarDemoTest
+ */
+public class ProgressBarDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(ProgressBarDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+
+            JButtonOperator startButton = new JButtonOperator(frame, START_BUTTON);
+            JButtonOperator stopButton = new JButtonOperator(frame, STOP_BUTTON);
+            JProgressBarOperator jpbo = new JProgressBarOperator(frame);
+
+            // Check that progress completes and corect enable/disable of start/stop buttons
+            checkCompleteProgress(frame, startButton, stopButton, jpbo);
+
+            // Check progess bar progression and start/stop button disabled/enabled states
+            checkStartStop(frame, startButton, stopButton, jpbo);
+        });
+    }
+
+    // Check that progress completes and corect enable/disable of start/stop buttons
+    public void checkStartStop(JFrameOperator frame, JButtonOperator startButton, JButtonOperator stopButton, JProgressBarOperator progressBar) throws Exception {
+        int initialProgress = progressBar.getValue();
+        System.out.println("initialProgress = " + initialProgress);
+        int maximum = progressBar.getMaximum();
+
+        startButton.pushNoBlock();
+
+        progressBar.waitState(new ComponentChooser() {
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                int value = progressBar.getValue();
+                System.out.println("checkComponent1 value = " + value);
+                return value < maximum;
+            }
+
+            @Override
+            public String getDescription() {
+                return "Progress < maximum (" + maximum + ")";
+            }
+        });
+
+        stopButton.waitComponentEnabled();
+
+        progressBar.waitState(new ComponentChooser() {
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                int value = progressBar.getValue();
+                System.out.println("checkComponent2 value = " + value);
+                return value > 0;
+            }
+
+            @Override
+            public String getDescription() {
+                return "Progress > 0";
+            }
+        });
+
+        int progress = progressBar.getValue();
+        System.out.println("progress = " + progress);
+
+        //Check that progress par has progressed and Start Button Disabled
+        assertTrue("Progress Bar Progressing (progress > 0, actual value: " + progress + ")", progress > 0);
+        assertFalse("Start Button Disabled", startButton.isEnabled());
+        assertTrue("Stop Button Enabled", stopButton.isEnabled());
+
+        //Wait a liitle bit longer then Press stop get progress
+        progressBar.waitState(new ComponentChooser() {
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                return progressBar.getValue() > progress;
+            }
+
+            @Override
+            public String getDescription() {
+                return "Progress > " + progress;
+            }
+        });
+
+        stopButton.pushNoBlock();
+
+        startButton.waitComponentEnabled();
+
+        int interimProgress = progressBar.getValue();
+
+        // Check that progress par has Stopped and Start Button Disabled
+        assertTrue("Progress Bar Stopped "
+                + "(interimProgress, actual value: " + interimProgress + " "
+                + "> progress, actual value: " + progress + ")",
+                interimProgress > progress);
+        assertTrue("Start Button Enabled", startButton.isEnabled());
+        assertFalse("Stop Button Disabled", stopButton.isEnabled());
+    }
+
+    // Check progess bar progression and start/stop button disabled/enabled states
+    public void checkCompleteProgress(JFrameOperator frame, JButtonOperator startButton, JButtonOperator stopButton, JProgressBarOperator progressBar) throws Exception {
+        startButton.pushNoBlock();
+
+        progressBar.waitValue(progressBar.getMaximum());
+
+        startButton.waitComponentEnabled();
+
+        assertEquals("Complete Progress", progressBar.getMaximum(), progressBar.getValue());
+        assertTrue("Start Button Enabled", startButton.isEnabled());
+        assertFalse("Stop Button Disabled", stopButton.isEnabled());
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ScrollPaneDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.scrollpane.ScrollPaneDemo;
+import static com.sun.swingset3.demos.scrollpane.ScrollPaneDemo.DEMO_TITLE;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JScrollPaneOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 ScrollPaneDemo by scrolling to bottom, to top,
+ *          to left and to right and checking scroll bar values.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.scrollpane.ScrollPaneDemo
+ * @run testng ScrollPaneDemoTest
+ */
+public class ScrollPaneDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(ScrollPaneDemo.class.getName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+            JScrollPaneOperator jspo = new JScrollPaneOperator(frame);
+
+            // Set initial scrollbar positions
+            int initialVerticalValue = jspo.getVerticalScrollBar().getValue();
+            int initialHorizontalValue = jspo.getHorizontalScrollBar().getValue();
+
+            System.out.println("Initial Vertical Value = " + jspo.getVerticalScrollBar().getValue());
+            System.out.println("Initial HoriZontal Value = " + jspo.getHorizontalScrollBar().getValue());
+
+            // Check scroll to Bottom
+            {
+                jspo.scrollToBottom();
+                int currentValue = jspo.getVerticalScrollBar().getValue();
+                System.out.println("Final Value = " + currentValue);
+                assertTrue("Scroll to Bottom of Pane "
+                        + "(initialVerticalValue, actual value: " + initialVerticalValue + " "
+                        + "< currentValue, actual value = " + currentValue + ")",
+                        initialVerticalValue < currentValue);
+            }
+
+            // Check scroll to Top
+            {
+                jspo.scrollToTop();
+                int currentValue = jspo.getVerticalScrollBar().getValue();
+                System.out.println("Top Scroll Final Value = " + currentValue);
+                assertTrue("Scroll to Top of Pane "
+                        + "(initialVerticalValue, actual value: " + initialVerticalValue + " "
+                        + "> currentValue, actual value = " + currentValue + ")",
+                        initialVerticalValue > currentValue);
+            }
+
+            // Check scroll to Left
+            {
+                jspo.scrollToLeft();
+                int currentValue = jspo.getHorizontalScrollBar().getValue();
+                System.out.println("Scroll to Left Final Value = " + currentValue);
+                assertTrue("Scroll to Left of Pane "
+                        + "(initialHorizontalValue, actual value: " + initialHorizontalValue + " "
+                        + "> currentValue, actual value = " + currentValue + ")",
+                        initialHorizontalValue > currentValue);
+            }
+
+            // Check scroll to Right
+            {
+                jspo.scrollToRight();
+                int currentValue = jspo.getHorizontalScrollBar().getValue();
+                System.out.println("Scroll to Right Final Value = " + currentValue);
+                assertTrue("Scroll to Right of Pane "
+                        + "(initialHorizontalValue, actual value: " + initialHorizontalValue + " "
+                        + "< currentValue, actual value = " + currentValue + ")",
+                        initialHorizontalValue < currentValue);
+            }
+        });
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/SpinnerDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.spinner.SpinnerDemo;
+import static com.sun.swingset3.demos.spinner.SpinnerDemo.DEMO_TITLE;
+import java.text.DecimalFormat;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JSpinnerOperator;
+import org.netbeans.jemmy.operators.JTextFieldOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 SpinnerDemo by adjusting each spinner value via
+ *          the spinner button and checking text field value.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.spinner.SpinnerDemo
+ * @run testng SpinnerDemoTest
+ */
+public class SpinnerDemoTest {
+
+    private static final int SPINNERS_COUNT = 9;
+    private static final DecimalFormat decimalFormat = new DecimalFormat();
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(SpinnerDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+
+            // Check changing different spinners
+            for (int i = 0; i < SPINNERS_COUNT; i++) {
+                changeValues(frame, i);
+            }
+        });
+    }
+
+    private void changeValues(JFrameOperator jfo, int spinnerIndex) throws Exception {
+        JSpinnerOperator spinner = new JSpinnerOperator(jfo, spinnerIndex);
+        JTextFieldOperator jtfo = new JTextFieldOperator(spinner);
+        float originalFieldValue = decimalFormat.parse(jtfo.getText()).floatValue();
+        float finalFieldValue;
+
+        // increment by one the value via spinner
+        spinner.getIncreaseOperator().push();
+        finalFieldValue = decimalFormat.parse(jtfo.getText()).floatValue();
+
+        // check that the value was increased
+        assertTrue("Increment Spinner " + spinner
+                + " (originalFieldValue, actual value: " + originalFieldValue + " "
+                + "< finalFieldValue, actual value = " + finalFieldValue + ")",
+                originalFieldValue < finalFieldValue);
+
+        // decrease value via spinner
+        spinner.getDecreaseOperator().push();
+        finalFieldValue = decimalFormat.parse(jtfo.getText()).floatValue();
+
+        // check that the value was decrimented
+        assertTrue("Decrement Spinner " + spinner
+                + " (originalFieldValue, actual value: " + originalFieldValue + " "
+                + ">= finalFieldValue, actual value = " + finalFieldValue + ")",
+                originalFieldValue >= finalFieldValue);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/SplitPaneDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.splitpane.SplitPaneDemo;
+import static com.sun.swingset3.demos.splitpane.SplitPaneDemo.*;
+import java.awt.event.KeyEvent;
+import javax.swing.JSplitPane;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JCheckBoxOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JRadioButtonOperator;
+import org.netbeans.jemmy.operators.JSplitPaneOperator;
+import org.netbeans.jemmy.operators.JTextFieldOperator;
+import static org.jemmy2ext.JemmyExt.*;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 SplitPaneDemo by performing OneClick expansion,
+ *          changing size of the divier, moving the divider to different positions
+ *          and changing the divider orientation.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.splitpane.SplitPaneDemo
+ * @run testng SplitPaneDemoTest
+ */
+public class SplitPaneDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(SplitPaneDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+
+            JSplitPaneOperator splitPane = new JSplitPaneOperator(frame);
+
+            // Toggle OneTouch Expandable
+            checkOneTouch(frame, splitPane, true);
+            checkOneTouch(frame, splitPane, false);
+
+            // Check changing divider size to minimum and maximum values
+            changeDividerSize(frame, splitPane, 50);
+            changeDividerSize(frame, splitPane, 6);
+
+            // Check moving the divider
+            checkDividerMoves(frame, splitPane, false);
+            checkDividerMoves(frame, splitPane, true);
+
+            // Check different minumum Day/Night sizes
+            changeMinimumSizes(frame, splitPane, 100);
+            changeMinimumSizes(frame, splitPane, 0);
+        });
+    }
+
+    // Check for different day and night minimum size
+    public void changeMinimumSizes(JFrameOperator frame, JSplitPaneOperator splitPane, int amount) throws Exception {
+        for (String label : new String[]{FIRST_COMPONENT_MIN_SIZE, SECOND_COMPONENT_MIN_SIZE}) {
+            JTextFieldOperator size = new JTextFieldOperator(getLabeledContainerOperator(frame, label));
+            size.enterText(Integer.toString(amount));
+            size.pressKey(KeyEvent.VK_ENTER);
+        }
+        checkDividerMoves(frame, splitPane, false);
+        checkDividerMoves(frame, splitPane, true);
+    }
+
+    // Check moving of divider
+    public void checkDividerMoves(JFrameOperator frame, JSplitPaneOperator splitPane, boolean isVertical) throws Exception {
+        if (isVertical) {
+            new JRadioButtonOperator(frame, VERTICAL_SPLIT).doClick();
+        } else {
+            new JRadioButtonOperator(frame, HORIZONTAL_SPLIT).doClick();
+        }
+
+        splitPane.moveDivider(0.0);
+        assertEquals("Move Minimum, dividerLocation is at minimumDividerLocation",
+                splitPane.getMinimumDividerLocation(), splitPane.getDividerLocation());
+
+        // use getMaximumDividerLocation() to move divider to here because using proportion 1.0 does not work
+        splitPane.moveDivider(1.0);
+
+        assertEquals("Move Maximum, dividerLocation is at maximumDividerLocation",
+                splitPane.getMaximumDividerLocation(), splitPane.getDividerLocation());
+
+        splitPane.moveDivider(0.5);
+        assertEquals("Move Middle, dividerLocation is at the artithmetic average of minimum and maximum DividerLocations",
+                (splitPane.getMaximumDividerLocation() + splitPane.getMinimumDividerLocation()) / 2, splitPane.getDividerLocation());
+    }
+
+    // Check changing the size of the divider
+    public void changeDividerSize(JFrameOperator frame, JSplitPaneOperator splitPane, int amount) throws Exception {
+        JTextFieldOperator size = new JTextFieldOperator(getLabeledContainerOperator(frame, DIVIDER_SIZE));
+        size.clearText();
+        size.typeText(Integer.toString(amount));
+        size.pressKey(KeyEvent.VK_ENTER);
+
+        assertEquals("Change Divider Size", amount, splitPane.getDividerSize());
+    }
+
+    public void checkOneTouch(JFrameOperator frame, JSplitPaneOperator splitPane, boolean oneTouch) throws Exception {
+        JCheckBoxOperator checkBox = new JCheckBoxOperator(frame, ONE_TOUCH_EXPANDABLE);
+        JButtonOperator buttonLeft = new JButtonOperator(splitPane.getDivider(), 0);
+        JButtonOperator buttonRight = new JButtonOperator(splitPane.getDivider(), 1);
+        int initDividerLocation = splitPane.getDividerLocation();
+
+        if (oneTouch) {
+            if (!checkBox.isSelected()) {
+                // uncheck
+                checkBox.doClick();
+            }
+
+            int left = getUIValue(splitPane, (JSplitPane sp) -> sp.getInsets().left);
+            System.out.println("left = " + left);
+            int right = getUIValue(splitPane, (JSplitPane sp) -> sp.getInsets().right);
+            System.out.println("right = " + right);
+
+            // expand full left
+            buttonLeft.push();
+            assertEquals("Expandable Left", left, splitPane.getDividerLocation());
+
+            // expand back from full left
+            buttonRight.push();
+            assertEquals("Expandable Back to Original from Left",
+                    initDividerLocation, splitPane.getDividerLocation());
+
+            // expand all the way right
+            buttonRight.push();
+            assertEquals("Expandable Right",
+                    splitPane.getWidth() - splitPane.getDividerSize() - right,
+                    splitPane.getDividerLocation());
+
+            // Click to move back from right expansion
+            buttonLeft.push();
+            assertEquals("Expandable Back to Original from Right",
+                    initDividerLocation, splitPane.getDividerLocation());
+        }
+
+        // Test for case where one touch expandable is disabled
+        if (!oneTouch) {
+            if (checkBox.isSelected()) {
+                // uncheck
+                checkBox.doClick();
+            }
+            assertFalse("One Touch Expandable Off", splitPane.isOneTouchExpandable());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/TabbedPaneDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.tabbedpane.TabbedPaneDemo;
+import static com.sun.swingset3.demos.tabbedpane.TabbedPaneDemo.*;
+import static org.jemmy2ext.JemmyExt.getLabeledContainerOperator;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.ContainerOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JRadioButtonOperator;
+import org.netbeans.jemmy.operators.JTabbedPaneOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 TabbedPaneDemo by iterating through tab placement
+ *          positions, opening each tab and verifying the the tab gets selected.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.tabbedpane.TabbedPaneDemo
+ * @run testng TabbedPaneDemoTest
+ */
+public class TabbedPaneDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(TabbedPaneDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE);
+
+            for (String tp : new String[]{TOP, LEFT, BOTTOM, RIGHT}) {
+                testTabs(mainFrame, tp);
+            }
+        });
+    }
+
+    public void testTabs(JFrameOperator mainFrame, String tabPlacement) throws Exception {
+        ContainerOperator<?> rbCont = getLabeledContainerOperator(mainFrame, TAB_PLACEMENT);
+        new JRadioButtonOperator(rbCont, tabPlacement).doClick();
+
+        final String[] tabTitles = new String[]{CAMILLE, MIRANDA, EWAN, BOUNCE};
+        for (int i = 0; i < tabTitles.length; i++) {
+            String pageTitle = tabTitles[i];
+            JTabbedPaneOperator tabOperator = new JTabbedPaneOperator(mainFrame);
+            tabOperator.selectPage(pageTitle);
+
+            assertEquals("Selected tab is selected", i, tabOperator.getSelectedIndex());
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/TextFieldDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.textfield.JHistoryTextField;
+import com.sun.swingset3.demos.textfield.TextFieldDemo;
+import static com.sun.swingset3.demos.textfield.TextFieldDemo.*;
+import java.awt.Color;
+import java.awt.event.KeyEvent;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import javax.swing.JFormattedTextField;
+import static org.jemmy2ext.JemmyExt.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.QueueTool;
+import org.netbeans.jemmy.operators.ContainerOperator;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JLabelOperator;
+import org.netbeans.jemmy.operators.JPasswordFieldOperator;
+import org.netbeans.jemmy.operators.JTextFieldOperator;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 TextFieldDemo by entering text in each field and
+ *          checking that app reacts accordingly.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.textfield.TextFieldDemo
+ * @run testng TextFieldDemoTest
+ */
+public class TextFieldDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(TextFieldDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+
+            historyTextField(frame);
+            dateTextField(frame);
+            passwordField(frame);
+        });
+    }
+
+    private void historyTextField(JFrameOperator jfo) throws Exception {
+        JTextFieldOperator jtfo = new JTextFieldOperator(jfo, new ByClassChooser(JHistoryTextField.class));
+        jtfo.typeText("cat");
+
+        jtfo.pressKey(KeyEvent.VK_DOWN);
+        jtfo.pressKey(KeyEvent.VK_DOWN);
+        jtfo.pressKey(KeyEvent.VK_ENTER);
+
+        final String expectedValue = "category";
+        jtfo.waitText(expectedValue);
+        assertEquals("Select History Item", expectedValue, jtfo.getText());
+    }
+
+    public void dateTextField(JFrameOperator jfo) throws Exception {
+        JTextFieldOperator jtfo = new JTextFieldOperator(jfo,
+                new ByClassChooser(JFormattedTextField.class));
+        ContainerOperator<?> containerOperator = new ContainerOperator<>(jtfo.getParent());
+        JButtonOperator jbo = new JButtonOperator(containerOperator, GO);
+        JLabelOperator dowLabel = new JLabelOperator(containerOperator);
+        Calendar calendar = Calendar.getInstance(Locale.ENGLISH);
+
+        // Check default date Day of the Week
+        jbo.push();
+        assertEquals("Default DOW",
+                calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.ENGLISH),
+                dowLabel.getText());
+
+        // Check Custom Day of the Week
+        calendar.set(2012, 9, 11); // Represents "Oct 11, 2012"
+        Date date = calendar.getTime();
+        String dateString = jtfo.getQueueTool().invokeAndWait(
+                new QueueTool.QueueAction<String>("Formatting the value using JFormattedTextField formatter") {
+
+            @Override
+            public String launch() throws Exception {
+                return ((JFormattedTextField) jtfo.getSource()).getFormatter().valueToString(date);
+            }
+        });
+        System.out.println("dateString = " + dateString);
+        jtfo.enterText(dateString);
+
+        jbo.push();
+        assertEquals("Custom DOW", "Thursday", dowLabel.getText());
+    }
+
+    public void passwordField(JFrameOperator jfo) throws Exception {
+        JPasswordFieldOperator password1 = new JPasswordFieldOperator(jfo, 0);
+        JPasswordFieldOperator password2 = new JPasswordFieldOperator(jfo, 1);
+
+        password1.typeText("password");
+        password2.typeText("password");
+
+        // Check Matching Passwords
+        assertEquals("Matching Passwords", Color.green, password1.getBackground());
+        assertEquals("Matching Passwords", Color.green, password2.getBackground());
+
+        // Check non-matching passwords
+        password2.typeText("passwereertegrs");
+        assertEquals("Non-Matching Passwords", Color.white, password1.getBackground());
+        assertEquals("Non-Matching Passwords", Color.white, password2.getBackground());
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/ToggleButtonDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.DemoProperties;
+import com.sun.swingset3.demos.togglebutton.DirectionPanel;
+import com.sun.swingset3.demos.togglebutton.LayoutControlPanel;
+import com.sun.swingset3.demos.togglebutton.ToggleButtonDemo;
+import static com.sun.swingset3.demos.togglebutton.ToggleButtonDemo.*;
+import java.util.function.BiFunction;
+import org.jemmy2ext.JemmyExt.ByClassChooser;
+import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR;
+import static org.jemmy2ext.JemmyExt.getBorderTitledJPanelOperator;
+import static org.jemmy2ext.JemmyExt.getLabeledContainerOperator;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.ComponentChooser;
+import org.netbeans.jemmy.operators.ContainerOperator;
+import org.netbeans.jemmy.operators.JCheckBoxOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JRadioButtonOperator;
+import org.netbeans.jemmy.operators.JTabbedPaneOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 ToggleButtonDemo by toggling each radio button,
+ *          each checkbox and each location of the direction dial toggle.
+ *          It verifies initial selected values for all the elements and checks
+ *          that those change upon clicking. When toggling radio buttons it
+ *          verifies that other radio buttons in the same group are not longer
+ *          selected.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.togglebutton.ToggleButtonDemo
+ * @run testng ToggleButtonDemoTest
+ */
+public class ToggleButtonDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(ToggleButtonDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator mainFrame = new JFrameOperator(ToggleButtonDemo.class.getAnnotation(DemoProperties.class).value());
+            JTabbedPaneOperator tabPane = new JTabbedPaneOperator(mainFrame);
+
+            // Radio Button Toggles
+            testRadioButtons(getBorderTitledJPanelOperator(mainFrame, TEXT_RADIO_BUTTONS), 3, null);
+            testRadioButtons(getBorderTitledJPanelOperator(mainFrame, IMAGE_RADIO_BUTTONS), 3, null);
+            testRadioButtons(getLabeledContainerOperator(mainFrame, PAD_AMOUNT), 3, (t, i) -> DEFAULT.equals(t));
+
+            // switch to the Check Boxes Tab
+            tabPane.selectPage(CHECK_BOXES);
+
+            // Check Box Toggles
+            ContainerOperator<?> textCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, TEXT_CHECKBOXES);
+            testCheckBox(textCheckBoxesJPanel, CHECK1, false);
+            testCheckBox(textCheckBoxesJPanel, CHECK2, false);
+            testCheckBox(textCheckBoxesJPanel, CHECK3, false);
+
+            ContainerOperator<?> imageCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, IMAGE_CHECKBOXES);
+            testCheckBox(imageCheckBoxesJPanel, CHECK1, false);
+            testCheckBox(imageCheckBoxesJPanel, CHECK2, false);
+            testCheckBox(imageCheckBoxesJPanel, CHECK3, false);
+
+            ContainerOperator<?> displayOptionsContainer = getLabeledContainerOperator(mainFrame, DISPLAY_OPTIONS);
+            testCheckBox(displayOptionsContainer, PAINT_BORDER, false);
+            testCheckBox(displayOptionsContainer, PAINT_FOCUS, true);
+            testCheckBox(displayOptionsContainer, ENABLED, true);
+            testCheckBox(displayOptionsContainer, CONTENT_FILLED, true);
+
+            // Direction Button Toggles
+            testToggleButtons(mainFrame);
+        });
+    }
+
+    /**
+     * The interface is invoked for each radio button providing its name and
+     * index and it should return whether the radio button has to be selected.
+     */
+    private static interface SelectedRadioButton extends BiFunction<String, Integer, Boolean> {
+    }
+
+    /**
+     * Tests a group of radio buttons
+     *
+     * @param parent container containing the buttons
+     * @param radioButtonCount number of radio buttons
+     * @param selectedRadioButton initial selected radio button
+     */
+    private void testRadioButtons(ContainerOperator<?> parent, int radioButtonCount, SelectedRadioButton selectedRadioButton) {
+        JRadioButtonOperator[] jrbo = new JRadioButtonOperator[radioButtonCount];
+        for (int i = 0; i < radioButtonCount; i++) {
+            jrbo[i] = new JRadioButtonOperator(parent, i);
+            if (selectedRadioButton != null && selectedRadioButton.apply(jrbo[i].getText(), i)) {
+                assertTrue("Radio Button " + i + " is initially selected", jrbo[i].isSelected());
+            } else {
+                assertFalse("Radio Button " + i + " is initially not selected", jrbo[i].isSelected());
+            }
+        }
+
+        for (int i = 0; i < radioButtonCount; i++) {
+            jrbo[i].doClick();
+            assertTrue("Radio Button " + i + " is selected", jrbo[i].isSelected());
+
+            for (int j = 0; j < radioButtonCount; j++) {
+                if (i != j) {
+                    assertFalse("Radio Button " + j + " is not selected", jrbo[j].isSelected());
+                }
+            }
+        }
+    }
+
+    /**
+     * Will change the state of the CheckBox then change back to initial state.
+     *
+     * @param parent
+     * @param text
+     * @param expectedValue
+     * @throws Exception
+     */
+    private void testCheckBox(ContainerOperator<?> parent, String text, boolean expectedValue) {
+
+        parent.setComparator(EXACT_STRING_COMPARATOR);
+        JCheckBoxOperator jcbo = new JCheckBoxOperator(parent, text);
+        assertEquals("Initial selection state of the checkbox '" + text + "'", expectedValue, jcbo.isSelected());
+
+        // click check box (toggle the state)
+        jcbo.doClick();
+        assertEquals("Selection state of the checkbox '" + text + "' after click", !expectedValue, jcbo.isSelected());
+        if (jcbo.isSelected()) {
+            // toggle back to not-selected state
+            jcbo.doClick();
+            assertFalse("Check Box '" + text + "' is not selected", jcbo.isSelected());
+        } else {
+            // toggle back to selected state
+            jcbo.doClick();
+
+            assertTrue("Check Box '" + text + "' is selected", jcbo.isSelected());
+        }
+    }
+
+
+    /*
+     * testDirectionRadioButtons(JFrameOperator) will toggle each position of
+     * the direction radio button panels
+     */
+    private void testToggleButtons(JFrameOperator jfo) {
+        ComponentChooser directionPanelChooser = new ByClassChooser(DirectionPanel.class);
+
+        String text_Position = LayoutControlPanel.TEXT_POSITION;
+        ContainerOperator<?> textPositionContainer = getLabeledContainerOperator(jfo, text_Position);
+        ContainerOperator<?> directionPanelOperator = new ContainerOperator<>(textPositionContainer, directionPanelChooser);
+        testRadioButtons(directionPanelOperator, 9, (t, i) -> i == 5);
+
+        // Unfortunately, both directionPanels are in the same parent container
+        // so we have to use indexes here.
+        // There is no guarantee that if the UI changes, the code would be still
+        // valid in terms of which directionPanel is checked first. However, it
+        // does guarantee that two different directionPanels are checked.
+        String content_Alignment = LayoutControlPanel.CONTENT_ALIGNMENT;
+        ContainerOperator<?> contentAlignmentContainer = getLabeledContainerOperator(jfo, content_Alignment);
+        ContainerOperator<?> directionPanelOperator2 = new ContainerOperator<>(contentAlignmentContainer, directionPanelChooser,
+                contentAlignmentContainer.getSource() == textPositionContainer.getSource() ? 1 : 0);
+        testRadioButtons(directionPanelOperator2, 9, (t, i) -> i == 4);
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/TreeDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.tree.TreeDemo;
+import static com.sun.swingset3.demos.tree.TreeDemo.DEMO_TITLE;
+import javax.swing.tree.TreePath;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JTreeOperator;
+import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 TreeDemo by expanding all collapsed nodes in the
+ *          tree and then collapsing all the expanded nodes in the tree. It
+ *          verifies the number of nodes expanded, number of nodes collapsed and
+ *          number of rows in the tree in the begininng, after expanding and
+ *          after collapsing the nodes. It also checks that the tree grows
+ *          vertically (as ScrollPane allows it).
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.tree.TreeDemo
+ * @run testng TreeDemoTest
+ */
+public class TreeDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(TreeDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator(DEMO_TITLE);
+
+            JTreeOperator tree = new JTreeOperator(frame);
+
+            assertEquals("Initial number of rows in the tree", 4, tree.getRowCount());
+
+            int initialTreeHeight = tree.getHeight();
+
+            // expand all nodes
+            int expandsCount = 0;
+            for (int i = 0; i < tree.getRowCount(); i++) {
+                TreePath tp = tree.getPathForRow(i);
+                if (tree.getChildCount(tp) > 0 && !tree.isExpanded(tp)) {
+                    tree.expandRow(i);
+                    expandsCount++;
+                }
+            }
+
+            assertEquals("Number of rows expanded", 75, expandsCount);
+            assertEquals("Number of rows in the tree after expanding all of them",
+                    616, tree.getRowCount());
+
+            int expandedTreeHeight = tree.getHeight();
+            assertTrue("Expanded tree height has increased, current "
+                    + expandedTreeHeight + " > initial " + initialTreeHeight,
+                    expandedTreeHeight > initialTreeHeight);
+
+            // collapse all nodes
+            int collapsesCount = 0;
+            for (int i = tree.getRowCount() - 1; i >= 0; i--) {
+                TreePath tp = tree.getPathForRow(i);
+                if (tree.getChildCount(tp) > 0 && tree.isExpanded(tp)) {
+                    tree.collapseRow(i);
+                    collapsesCount++;
+                }
+            }
+
+            assertEquals("Number of rows collapsed", 76, collapsesCount);
+            assertEquals("Number of rows in the tree after collapsing all of them",
+                    1, tree.getRowCount());
+
+            int collapsedTreeHeight = tree.getHeight();
+            assertTrue("Collpased tree height is not longer than initial, "
+                    + "current " + collapsedTreeHeight + " <= initial "
+                    + initialTreeHeight,
+                    collapsedTreeHeight <= initialTreeHeight);
+
+        });
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/SwingSet/src/WindowDemoTest.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.swingset3.demos.window.WindowDemo;
+import static com.sun.swingset3.demos.window.WindowDemo.*;
+import static org.jemmy2ext.JemmyExt.*;
+import static org.testng.AssertJUnit.*;
+import org.testng.annotations.Test;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JLabelOperator;
+import org.netbeans.jemmy.operators.WindowOperator;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 WindowDemo by checking that separate JWindow is
+ *          shown, it contains predefined label and no new windows are opened
+ *          when the "Show JWindow..." button is clicked.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Jemmy2Ext/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.window.WindowDemo
+ * @run testng WindowDemoTest
+ */
+public class WindowDemoTest {
+
+    @Test
+    public void test() throws Exception {
+        captureDebugInfoOnFail(() -> {
+            new ClassReference(WindowDemo.class.getCanonicalName()).startApplication();
+
+            JFrameOperator frame = new JFrameOperator();
+
+            assertEquals("Only one JWindow is shown", 1, getJWindowCount());
+
+            WindowOperator window = new WindowOperator(getJWindow());
+
+            assertTrue("JFrame is showing", frame.isShowing());
+            assertFalse("JFrame is not iconified", isIconified(frame));
+            assertTrue("JWindow is showing", window.isShowing());
+
+            final String labelText = I_HAVE_NO_SYSTEM_BORDER;
+            JLabelOperator jLabelOperator = new JLabelOperator(window, labelText);
+            assertEquals("JWindow contains the label with corresponding text", labelText, jLabelOperator.getText());
+
+            new JButtonOperator(frame, SHOW_J_WINDOW).push();
+
+            assertEquals("Only one JWindow is shown", 1, getJWindowCount());
+        });
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/TEST.ROOT.template	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,24 @@
+# This file identifies the root of the test-suite hierarchy.
+# It also contains test-suite configuration information.
+
+# The list of keywords supported in the entire test suite.  The
+# "intermittent" keyword marks tests known to fail intermittently.
+# The "randomness" keyword marks tests using randomness with test
+# cases differing from run to run. (A test using a fixed random seed
+# would not count as "randomness" by this definition.) Extra care
+# should be taken to handle test failures of intermittent or
+# randomness tests.
+#
+# A "headful" test requires a graphical environment to meaningfully
+# run. Tests that are not headful are "headless." 
+
+keys=screenshots
+
+# Tests that must run in othervm mode
+othervm.dirs=sanity/client/SwingSet
+
+# Tests that cannot run concurrently
+exclusiveAccess.dirs=sanity/client/SwingSet
+
+# Tests using jtreg 4.1 b13 features
+requiredVersion=4.1 b13
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/TEST.properties	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,14 @@
+# This file contains test-suite configuration information related to this portion
+# of the test suite.
+#
+# A "screenshots" test requires a 100% headful graphical environment 
+# as they rely on Robot to take screenshots and move mouse.
+
+# The list of keywords supported in this part of the test suite
+keys=screenshots
+
+# Tests that cannot run concurrently
+exclusiveAccess.dirs=SwingSet
+
+# Tests require jtreg 4.1 b13 features
+#requiredVersion=4.1 b13
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/Jemmy2Ext/src/org/jemmy2ext/JemmyExt.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,614 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.jemmy2ext;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Window;
+import java.awt.image.BufferedImage;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Function;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.IntStream;
+import javax.imageio.ImageIO;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JWindow;
+import javax.swing.border.Border;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.TitledBorder;
+import org.netbeans.jemmy.ComponentChooser;
+import org.netbeans.jemmy.DefaultCharBindingMap;
+import org.netbeans.jemmy.QueueTool;
+import org.netbeans.jemmy.TimeoutExpiredException;
+import org.netbeans.jemmy.Waitable;
+import org.netbeans.jemmy.Waiter;
+import org.netbeans.jemmy.drivers.scrolling.JSpinnerDriver;
+import org.netbeans.jemmy.image.StrictImageComparator;
+import org.netbeans.jemmy.operators.ComponentOperator;
+import org.netbeans.jemmy.operators.ContainerOperator;
+import org.netbeans.jemmy.operators.FrameOperator;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JLabelOperator;
+import org.netbeans.jemmy.operators.Operator;
+import org.netbeans.jemmy.util.Dumper;
+import org.netbeans.jemmy.util.PNGEncoder;
+import static org.testng.AssertJUnit.*;
+
+/**
+ * This class solves two tasks: 1. It adds functionality that is missing in
+ * Jemmy 2. It references all the Jemmy API that is needed by tests so that they
+ * can just @build JemmyExt class and do not worry about Jemmy
+ *
+ * @author akouznet
+ */
+public class JemmyExt {
+
+    /**
+     * Statically referencing all the classes that are needed by tests so that
+     * they're compiled by jtreg
+     */
+    static final Class<?>[] DEPENDENCIES = {
+        JSpinnerDriver.class,
+        DefaultCharBindingMap.class
+    };
+
+    public static void assertNotBlack(BufferedImage image) {
+        int w = image.getWidth();
+        int h = image.getHeight();
+        try {
+            assertFalse("All pixels are not black", IntStream.range(0, w).parallel().allMatch(x
+                    -> IntStream.range(0, h).allMatch(y -> (image.getRGB(x, y) & 0xffffff) == 0)
+            ));
+        } catch (Throwable t) {
+            save(image, "allPixelsAreBlack.png");
+            throw t;
+        }
+    }
+
+    public static void waitArmed(JButtonOperator button) {
+        button.waitState(new ComponentChooser() {
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                return isArmed(button);
+            }
+
+            @Override
+            public String getDescription() {
+                return "Button is armed";
+            }
+        });
+    }
+
+    public static boolean isArmed(JButtonOperator button) {
+        return button.getQueueTool().invokeSmoothly(new QueueTool.QueueAction<Boolean>("getModel().isArmed()") {
+
+            @Override
+            public Boolean launch() throws Exception {
+                return ((JButton) button.getSource()).getModel().isArmed();
+            }
+        });
+    }
+
+    public static void waitPressed(JButtonOperator button) {
+        button.waitState(new ComponentChooser() {
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                return isPressed(button);
+            }
+
+            @Override
+            public String getDescription() {
+                return "Button is pressed";
+            }
+        });
+    }
+
+    public static boolean isPressed(JButtonOperator button) {
+        return button.getQueueTool().invokeSmoothly(new QueueTool.QueueAction<Boolean>("getModel().isPressed()") {
+
+            @Override
+            public Boolean launch() throws Exception {
+                return ((JButton) button.getSource()).getModel().isPressed();
+            }
+        });
+    }
+
+    public static void assertEquals(String string, StrictImageComparator comparator, BufferedImage expected, BufferedImage actual) {
+        try {
+            assertTrue(string, comparator.compare(expected, actual));
+        } catch (Error err) {
+            save(expected, "expected.png");
+            save(actual, "actual.png");
+            throw err;
+        }
+    }
+
+    public static void assertNotEquals(String string, StrictImageComparator comparator, BufferedImage notExpected, BufferedImage actual) {
+        try {
+            assertFalse(string, comparator.compare(notExpected, actual));
+        } catch (Error err) {
+            save(notExpected, "notExpected.png");
+            save(actual, "actual.png");
+            throw err;
+        }
+    }
+
+    public static void save(BufferedImage image, String filename) {
+        String filepath = filename;
+        try {
+            filepath = new File(filename).getCanonicalPath();
+            System.out.println("Saving screenshot to " + filepath);
+            BufferedOutputStream file = new BufferedOutputStream(new FileOutputStream(filepath));
+            new PNGEncoder(file, PNGEncoder.COLOR_MODE).encode(image);
+        } catch (IOException ioe) {
+            throw new RuntimeException("Failed to save image to " + filepath, ioe);
+        }
+    }
+
+    public static void waitImageIsStill(Robot rob, ComponentOperator operator) {
+        operator.waitState(new ComponentChooser() {
+
+            private BufferedImage previousImage = null;
+            private int index = 0;
+            private final StrictImageComparator sComparator = new StrictImageComparator();
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                BufferedImage currentImage = capture(rob, operator);
+                save(currentImage, "waitImageIsStill" + index + ".png");
+                index++;
+                boolean compareResult = previousImage == null ? false : sComparator.compare(currentImage, previousImage);
+                previousImage = currentImage;
+                return compareResult;
+            }
+
+            @Override
+            public String getDescription() {
+                return "Image of " + operator + " is still";
+            }
+        });
+    }
+
+    private static class ThrowableHolder {
+
+        volatile Throwable t;
+    }
+
+    public static void waitFor(String description, RunnableWithException r) throws Exception {
+        Waiter<Boolean, ThrowableHolder> waiter = new Waiter<>(new Waitable<Boolean, ThrowableHolder>() {
+
+            @Override
+            public Boolean actionProduced(ThrowableHolder obj) {
+                try {
+                    r.run();
+                    return true;
+                } catch (Throwable t) {
+                    obj.t = t;
+                    return null;
+                }
+            }
+
+            @Override
+            public String getDescription() {
+                return description;
+            }
+        });
+        ThrowableHolder th = new ThrowableHolder();
+        try {
+            waiter.waitAction(th);
+        } catch (TimeoutExpiredException tee) {
+            Throwable t = th.t;
+            if (t != null) {
+                t.addSuppressed(tee);
+                if (t instanceof Exception) {
+                    throw (Exception) t;
+                } else if (t instanceof Error) {
+                    throw (Error) t;
+                } else if (t instanceof RuntimeException) {
+                    throw (RuntimeException) t;
+                } else {
+                    throw new IllegalStateException("Unexpected exception type", t);
+                }
+            }
+        }
+    }
+
+    public static BufferedImage capture(Robot rob, ComponentOperator operator) {
+        Rectangle boundary = new Rectangle(operator.getLocationOnScreen(),
+                operator.getSize());
+        return rob.createScreenCapture(boundary);
+    }
+
+    /**
+     * Wraps the test code so that in case of any failure as much information as
+     * possible is captured
+     *
+     * @param r test code Runnable
+     * @throws Exception whatever exception the test may throw
+     */
+    public static void captureDebugInfoOnFail(RunnableWithException r) throws Exception {
+        // TODO: Remove this once https://bugs.openjdk.java.net/browse/JDK-8151671 is fixed
+        try {
+            r.run();
+            System.out.println("TEST PASSED");
+        } catch (Throwable t) {
+            captureAll();
+            throw t;
+        }
+    }
+
+    /**
+     * This is a helper class which allows to catch throwables thrown in other
+     * threads and throw them in the main test thread
+     */
+    public static class MultiThreadedTryCatch {
+
+        private final List<Throwable> throwables
+                = Collections.synchronizedList(new ArrayList<>());
+
+        /**
+         * Throws registered throwables. If the list of the registered
+         * throwables is not empty, it re-throws the first throwable in the list
+         * adding all others into its suppressed list. Can be used in any
+         * thread.
+         *
+         * @throws Exception
+         */
+        public void throwRegistered() throws Exception {
+            Throwable root = null;
+            synchronized (throwables) {
+                if (!throwables.isEmpty()) {
+                    root = throwables.remove(0);
+                    while (!throwables.isEmpty()) {
+                        root.addSuppressed(throwables.remove(0));
+                    }
+                }
+            }
+            if (root != null) {
+                if (root instanceof Error) {
+                    throw (Error) root;
+                } else if (root instanceof Exception) {
+                    throw (Exception) root;
+                } else {
+                    throw new AssertionError("Unexpected exception type: " + root.getClass() + " (" + root + ")");
+                }
+            }
+        }
+
+        /**
+         * Registers a throwable and adds it to the list of throwables. Can be
+         * used in any thread.
+         *
+         * @param t
+         */
+        public void register(Throwable t) {
+            t.printStackTrace();
+            throwables.add(t);
+        }
+
+        /**
+         * Registers a throwable and adds it as the first item of the list of
+         * catched throwables.
+         *
+         * @param t
+         */
+        public void registerRoot(Throwable t) {
+            t.printStackTrace();
+            throwables.add(0, t);
+        }
+    }
+
+    /**
+     * Trying to capture as much information as possible. Currently it includes
+     * full dump and a screenshot of the whole screen.
+     */
+    public static void captureAll() {
+        PNGEncoder.captureScreen("failure.png", PNGEncoder.COLOR_MODE);
+        try {
+            Dumper.dumpAll("dumpAll.xml");
+        } catch (FileNotFoundException ex) {
+            Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        captureWindows();
+    }
+
+    /**
+     * Captures each showing window image using Window.paint() method.
+     */
+    private static void captureWindows() {
+        try {
+            EventQueue.invokeAndWait(() -> {
+                Window[] windows = Window.getWindows();
+                int index = 0;
+                for (Window w : windows) {
+                    if (!w.isShowing()) {
+                        continue;
+                    }
+                    BufferedImage img = new BufferedImage(w.getWidth(), w.getHeight(), BufferedImage.TYPE_INT_ARGB);
+                    Graphics g = img.getGraphics();
+                    w.paint(g);
+                    g.dispose();
+
+                    try {
+                        ImageIO.write(img, "png", new File("window" + index++ + ".png"));
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        } catch (InterruptedException | InvocationTargetException ex) {
+            Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    public static interface RunnableWithException {
+
+        public void run() throws Exception;
+    }
+
+    public static void waitIsFocused(JFrameOperator jfo) {
+        jfo.waitState(new ComponentChooser() {
+
+            @Override
+            public boolean checkComponent(Component comp) {
+                return jfo.isFocused();
+            }
+
+            @Override
+            public String getDescription() {
+                return "JFrame is focused";
+            }
+        });
+    }
+
+    public static int getJWindowCount() {
+        return new QueueTool().invokeAndWait(new QueueTool.QueueAction<Integer>(null) {
+
+            @Override
+            public Integer launch() throws Exception {
+                Window[] windows = Window.getWindows();
+                int windowCount = 0;
+                for (Window w : windows) {
+                    if (w.getClass().equals(JWindow.class)) {
+                        windowCount++;
+                    }
+                }
+                return windowCount;
+            }
+        });
+    }
+
+    public static JWindow getJWindow() {
+        return getJWindow(0);
+    }
+
+    public static JWindow getJWindow(int index) {
+        return new QueueTool().invokeAndWait(new QueueTool.QueueAction<JWindow>(null) {
+
+            @Override
+            public JWindow launch() throws Exception {
+                Window[] windows = Window.getWindows();
+                int windowIndex = 0;
+                for (Window w : windows) {
+                    if (w.getClass().equals(JWindow.class)) {
+                        if (windowIndex == index) {
+                            return (JWindow) w;
+                        }
+                        windowIndex++;
+                    }
+                }
+                return null;
+            }
+        });
+    }
+
+    public static boolean isIconified(FrameOperator frameOperator) {
+        return frameOperator.getQueueTool().invokeAndWait(new QueueTool.QueueAction<Boolean>("Frame is iconified") {
+
+            @Override
+            public Boolean launch() throws Exception {
+                return (((Frame) frameOperator.getSource()).getState() & Frame.ICONIFIED) != 0;
+            }
+        });
+    }
+
+    public static final Operator.DefaultStringComparator EXACT_STRING_COMPARATOR
+            = new Operator.DefaultStringComparator(true, true);
+
+    /**
+     * Finds a label with the exact labelText and returns the operator for its
+     * parent container.
+     *
+     * @param container
+     * @param labelText
+     * @return
+     */
+    public static ContainerOperator<?> getLabeledContainerOperator(ContainerOperator<?> container, String labelText) {
+
+        container.setComparator(EXACT_STRING_COMPARATOR);
+
+        JLabelOperator jLabelOperator = new JLabelOperator(container, labelText);
+
+        assert labelText.equals(jLabelOperator.getText());
+
+        return new ContainerOperator<>(jLabelOperator.getParent());
+    }
+
+    /**
+     * Finds a JPanel with exact title text.
+     *
+     * @param container
+     * @param titleText
+     * @return
+     */
+    public static ContainerOperator<?> getBorderTitledJPanelOperator(ContainerOperator<?> container, String titleText) {
+        return new ContainerOperator<>(container, new JPanelByBorderTitleFinder(titleText, EXACT_STRING_COMPARATOR));
+    }
+
+    public static final QueueTool QUEUE_TOOL = new QueueTool();
+
+    /**
+     * Allows to find JPanel by the title text in its border.
+     */
+    public static class JPanelByBorderTitleFinder implements ComponentChooser {
+
+        String titleText;
+        Operator.StringComparator comparator;
+
+        /**
+         * @param titleText title text pattern
+         * @param comparator specifies string comparison algorithm.
+         */
+        public JPanelByBorderTitleFinder(String titleText, Operator.StringComparator comparator) {
+            this.titleText = titleText;
+            this.comparator = comparator;
+        }
+
+        /**
+         * @param titleText title text pattern
+         */
+        public JPanelByBorderTitleFinder(String titleText) {
+            this(titleText, Operator.getDefaultStringComparator());
+        }
+
+        @Override
+        public boolean checkComponent(Component comp) {
+            assert EventQueue.isDispatchThread();
+            if (comp instanceof JPanel) {
+                return checkBorder(((JPanel) comp).getBorder());
+            }
+            return false;
+        }
+
+        public boolean checkBorder(Border border) {
+            if (border instanceof TitledBorder) {
+                String title = ((TitledBorder) border).getTitle();
+                return comparator.equals(title, titleText);
+            } else if (border instanceof CompoundBorder) {
+                CompoundBorder compoundBorder = (CompoundBorder) border;
+                return checkBorder(compoundBorder.getInsideBorder()) || checkBorder(compoundBorder.getOutsideBorder());
+            } else {
+                return false;
+            }
+        }
+
+        @Override
+        public String getDescription() {
+            return ("JPanel with border title text \"" + titleText + "\" with comparator " + comparator);
+        }
+    }
+
+    public static class ByClassSimpleNameChooser implements ComponentChooser {
+
+        private final String className;
+
+        public ByClassSimpleNameChooser(String className) {
+            this.className = className;
+        }
+
+        @Override
+        public boolean checkComponent(Component comp) {
+            return comp.getClass().getSimpleName().equals(className);
+        }
+
+        @Override
+        public String getDescription() {
+            return "Component with the simple class name of " + className;
+        }
+
+    }
+
+    public static class ByClassChooser implements ComponentChooser {
+
+        private final Class<?> clazz;
+
+        public ByClassChooser(Class<?> clazz) {
+            this.clazz = clazz;
+        }
+
+        @Override
+        public boolean checkComponent(Component comp) {
+            return comp.getClass().equals(clazz);
+        }
+
+        @Override
+        public String getDescription() {
+            return "Component with the class of " + clazz;
+        }
+
+    }
+
+    public static class ByToolTipChooser implements ComponentChooser {
+
+        private final String tooltip;
+
+        public ByToolTipChooser(String tooltip) {
+            if (tooltip == null) {
+                throw new NullPointerException("Tooltip cannot be null");
+            }
+            this.tooltip = tooltip;
+        }
+
+        @Override
+        public boolean checkComponent(Component comp) {
+            return (comp instanceof JComponent)
+                    ? tooltip.equals(((JComponent) comp).getToolTipText())
+                    : false;
+        }
+
+        @Override
+        public String getDescription() {
+            return "JComponent with the tooltip '" + tooltip + "'";
+        }
+
+    }
+
+    @SuppressWarnings(value = "unchecked")
+    public static <R, O extends Operator, S extends Component> R getUIValue(O operator, Function<S, R> getter) {
+        return operator.getQueueTool().invokeSmoothly(new QueueTool.QueueAction<R>("getting UI value through the queue using " + getter) {
+
+            @Override
+            public R launch() throws Exception {
+                return getter.apply((S) operator.getSource());
+            }
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/README	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,4 @@
+This content of this src folder was originally taken from SwingSet3 demo project: https://java.net/projects/swingset3/.
+Then it was modified to increase testability and remove extra content and extra dependencies.
+
+Do NOT modify files in it.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/DemoProperties.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Annotation type for specifying meta-data about Demo
+ *
+ * @author aim
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DemoProperties {
+
+    String value(); // Name
+
+    String category();
+
+    String description();
+
+    String iconFile() default "";
+
+    String[] sourceFiles() default "";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/DemoUtilities.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos;
+
+import java.awt.*;
+import java.net.URI;
+import java.io.IOException;
+import javax.swing.*;
+
+/**
+ * @author Pavel Porvatov
+ */
+public class DemoUtilities {
+
+    private DemoUtilities() {
+        // Hide constructor
+    }
+
+    public static void setToplevelLocation(Window toplevel, Component component,
+            int relativePosition) {
+
+        Rectangle compBounds = component.getBounds();
+
+        // Convert component location to screen coordinates
+        Point p = new Point();
+        SwingUtilities.convertPointToScreen(p, component);
+
+        int x;
+        int y;
+
+        // Set frame location to be centered on panel
+        switch (relativePosition) {
+            case SwingConstants.NORTH: {
+                x = (p.x + (compBounds.width / 2)) - (toplevel.getWidth() / 2);
+                y = p.y - toplevel.getHeight();
+                break;
+            }
+            case SwingConstants.EAST: {
+                x = p.x + compBounds.width;
+                y = (p.y + (compBounds.height / 2)) - (toplevel.getHeight() / 2);
+                break;
+            }
+            case SwingConstants.SOUTH: {
+                x = (p.x + (compBounds.width / 2)) - (toplevel.getWidth() / 2);
+                y = p.y + compBounds.height;
+                break;
+            }
+            case SwingConstants.WEST: {
+                x = p.x - toplevel.getWidth();
+                y = (p.y + (compBounds.height / 2)) - (toplevel.getHeight() / 2);
+                break;
+            }
+            case SwingConstants.NORTH_EAST: {
+                x = p.x + compBounds.width;
+                y = p.y - toplevel.getHeight();
+                break;
+            }
+            case SwingConstants.NORTH_WEST: {
+                x = p.x - toplevel.getWidth();
+                y = p.y - toplevel.getHeight();
+                break;
+            }
+            case SwingConstants.SOUTH_EAST: {
+                x = p.x + compBounds.width;
+                y = p.y + compBounds.height;
+                break;
+            }
+            case SwingConstants.SOUTH_WEST: {
+                x = p.x - toplevel.getWidth();
+                y = p.y + compBounds.height;
+                break;
+            }
+            default:
+            case SwingConstants.CENTER: {
+                x = (p.x + (compBounds.width / 2)) - (toplevel.getWidth() / 2);
+                y = (p.y + (compBounds.height / 2)) - (toplevel.getHeight() / 2);
+            }
+        }
+        toplevel.setLocation(x, y);
+    }
+
+    public static boolean browse(URI uri) throws IOException {
+        // Try using the Desktop api first
+        try {
+            Desktop desktop = Desktop.getDesktop();
+            desktop.browse(uri);
+
+            return true;
+        } catch (SecurityException e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/JGridPanel.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos;
+
+import java.awt.*;
+import javax.swing.*;
+
+/**
+ * JGridPanel
+ *
+ * @author Pavel Porvatov
+ */
+public class JGridPanel extends JPanel {
+
+    public static final int DEFAULT_GAP = 5;
+
+    public enum Layout {
+        FIRST,
+        CENTER,
+        LAST,
+        FILL
+    }
+
+    private enum ComponentType {
+        NO_RESIZABLE,
+        HORIZONTAL_FILL,
+        FULL
+    }
+
+    private final int cols;
+
+    private int bigCol = -1;
+
+    private int bigRow = -1;
+
+    private int vGap = -1;
+
+    private int hGap = -1;
+
+    public JGridPanel(int cols) {
+        this(cols, -1, -1);
+    }
+
+    public JGridPanel(int cols, int bigCol) {
+        this(cols, bigCol, -1);
+    }
+
+    public JGridPanel(int cols, int bigCol, int bigRow) {
+        super(new GridBagLayout());
+
+        assert cols > 0;
+        assert bigCol >= -1 && bigCol < cols;
+        assert bigRow >= -1;
+
+        this.cols = cols;
+        this.bigCol = bigCol;
+        this.bigRow = bigRow;
+    }
+
+    public void setVGap(int vGap) {
+        this.vGap = vGap;
+    }
+
+    public void setHGap(int hGap) {
+        this.hGap = hGap;
+    }
+
+    public JGridPanel cell() {
+        return cell(null, getHLayout(null), getVLayout(null), null);
+    }
+
+    public JGridPanel cell(Component component) {
+        return cell(component, getHLayout(component), getVLayout(component), null);
+    }
+
+    public JGridPanel cell(Component component, Layout hLayout) {
+        return cell(component, hLayout, getVLayout(component), null);
+    }
+
+    public JGridPanel cell(Component component, Layout hLayout, Layout vLayout) {
+        return cell(component, hLayout, vLayout, null);
+    }
+
+    public JGridPanel cell(Component component, Insets insets) {
+        assert insets != null;
+
+        return cell(component, getHLayout(component), getVLayout(component), insets);
+    }
+
+    private JGridPanel cell(Component component, Layout hLayout, Layout vLayout, Insets insets) {
+        int componentCount = getComponentCount();
+        int x = componentCount % cols;
+        int y = componentCount / cols;
+
+        int weightx = x == bigCol || (bigCol < 0 && hLayout == Layout.FILL) ? 1 : 0;
+        int weighty = y == bigRow || (bigRow < 0 && vLayout == Layout.FILL) ? 1 : 0;
+
+        if (insets == null) {
+            int topGap = y == 0 ? 0 : vGap;
+            int leftGap = x == 0 ? 0 : hGap;
+
+            insets = new Insets(topGap < 0 ? DEFAULT_GAP : topGap,
+                    leftGap < 0 ? DEFAULT_GAP : leftGap, 0, 0);
+        }
+
+        add(component == null ? createSeparator() : component,
+                new GridBagConstraints(x, y,
+                        1, 1,
+                        weightx, weighty,
+                        getAnchor(hLayout, vLayout), getFill(hLayout, vLayout),
+                        insets, 0, 0));
+
+        return this;
+    }
+
+    public void setComponent(Component component, int col, int row) {
+        assert col >= 0 && col < cols;
+        assert row >= 0;
+
+        GridBagLayout layout = (GridBagLayout) getLayout();
+
+        for (int i = 0; i < getComponentCount(); i++) {
+            Component oldComponent = getComponent(i);
+
+            GridBagConstraints constraints = layout.getConstraints(oldComponent);
+
+            if (constraints.gridx == col && constraints.gridy == row) {
+                remove(i);
+
+                add(component == null ? createSeparator() : component, constraints);
+
+                validate();
+                repaint();
+
+                return;
+            }
+        }
+
+        // Cell not found
+        assert false;
+    }
+
+    private static JComponent createSeparator() {
+        return new JLabel();
+    }
+
+    private static int getFill(Layout hLayout, Layout vLayout) {
+        if (hLayout == Layout.FILL) {
+            return vLayout == Layout.FILL ? GridBagConstraints.BOTH : GridBagConstraints.HORIZONTAL;
+        }
+
+        return vLayout == Layout.FILL ? GridBagConstraints.VERTICAL : GridBagConstraints.NONE;
+    }
+
+    private static ComponentType getComponentType(Component component) {
+        if (component == null
+                || component instanceof JLabel
+                || component instanceof JRadioButton
+                || component instanceof JCheckBox
+                || component instanceof JButton) {
+            return ComponentType.NO_RESIZABLE;
+        }
+
+        if (component instanceof JComboBox
+                || component instanceof JTextField) {
+            return ComponentType.HORIZONTAL_FILL;
+        }
+
+        return ComponentType.FULL;
+    }
+
+    private static Layout getHLayout(Component component) {
+        if (getComponentType(component) == ComponentType.NO_RESIZABLE) {
+            return Layout.FIRST;
+        } else {
+            return Layout.FILL;
+        }
+    }
+
+    private static Layout getVLayout(Component component) {
+        if (getComponentType(component) == ComponentType.FULL) {
+            return Layout.FILL;
+        } else {
+            return Layout.CENTER;
+        }
+    }
+
+    private static final int[][] ANCHORS = new int[][]{
+        {GridBagConstraints.NORTHWEST, GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST},
+        {GridBagConstraints.WEST, GridBagConstraints.CENTER, GridBagConstraints.EAST},
+        {GridBagConstraints.SOUTHWEST, GridBagConstraints.SOUTH, GridBagConstraints.SOUTHEAST}
+    };
+
+    private static int getAnchorIndex(Layout layout) {
+        if (layout == Layout.CENTER) {
+            return 1;
+        } else if (layout == Layout.LAST) {
+            return 2;
+        } else {
+            return 0;
+        }
+    }
+
+    private static int getAnchor(Layout hLayout, Layout vLayout) {
+        return ANCHORS[getAnchorIndex(vLayout)][getAnchorIndex(hLayout)];
+    }
+
+    public void setBorderEqual(int border) {
+        setBorder(BorderFactory.createEmptyBorder(border, border, border, border));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/JHyperlink.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos;
+
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ButtonModel;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+
+/**
+ *
+ * @author aim
+ */
+//<snip>Create HTML hyperlink
+//<snip>Create HTML image hyperlink
+public class JHyperlink extends JButton {
+
+    private static final BrowseAction defaultBrowseAction = new BrowseAction();
+
+    private URI targetURI;
+    private boolean visited;
+
+    private final transient Rectangle viewRect = new Rectangle();
+    private final transient Rectangle iconRect = new Rectangle();
+    private final transient Rectangle textRect = new Rectangle();
+
+    //remind(aim): lookup colors instead of hardcoding them
+    private Color normalForeground;
+    private Color activeForeground;
+    private Color visitedForeground;
+    private boolean drawUnderline = true;
+
+    static {
+        UIManager.put("Hyperlink.foreground", Color.blue);
+        UIManager.put("Hyperlink.activeForeground", Color.red);
+        UIManager.put("Hyperlink.visitedForeground", new Color(85, 145, 90));
+    }
+
+    /**
+     * Creates a new instance of JHyperlink
+     */
+    public JHyperlink() {
+        super();
+        normalForeground = UIManager.getColor("Hyperlink.foreground");
+        activeForeground = UIManager.getColor("Hyperlink.activeForeground");
+        visitedForeground = UIManager.getColor("Hyperlink.visitedForeground");
+        setBorderPainted(false);
+        setContentAreaFilled(false);
+        setForeground(normalForeground);
+        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        setMargin(new Insets(0, 0, 0, 0));
+        setAction(defaultBrowseAction);
+    }
+
+    /**
+     * Creates a new instance of JHyperlink
+     */
+    public JHyperlink(String text) {
+        this();
+        setText(text); // override the inheritence of the action's name
+    }
+
+    public JHyperlink(String text, String targetURI) throws URISyntaxException {
+        this(text, new URI(targetURI));
+    }
+
+    public JHyperlink(String text, URI target) {
+        this(text);
+        setTarget(target);
+    }
+
+    public JHyperlink(String text, Action action) {
+        this(text);
+        setAction(action); // replaces default browse action
+        setText(text); // override the inheritence of the action's name
+    }
+
+    public JHyperlink(String text, Icon icon) {
+        this(text);
+        setIcon(icon);
+    }
+
+    public JHyperlink(Icon icon, String targetURI) throws URISyntaxException {
+        this(null, icon, targetURI);
+    }
+
+    public JHyperlink(String text, Icon icon, String targetURI) throws URISyntaxException {
+        this(text, new URI(targetURI));
+        setIcon(icon);
+    }
+
+    public JHyperlink(String text, Icon icon, URI target) {
+        this(text);
+        setIcon(icon);
+        setTarget(target);
+    }
+
+    public void setTarget(URI target) {
+        this.targetURI = target;
+        setToolTipText(target.toASCIIString());
+    }
+
+    public URI getTarget() {
+        return targetURI;
+    }
+
+    public void setVisited(boolean visited) {
+        this.visited = visited;
+    }
+
+    public boolean isVisited() {
+        return visited;
+    }
+
+    @Override
+    public void setForeground(Color foreground) {
+        normalForeground = foreground;
+        super.setForeground(foreground);
+    }
+
+    public void setVisitedForeground(Color visited) {
+        visitedForeground = visited;
+    }
+
+    public void setDrawUnderline(boolean drawUnderline) {
+        this.drawUnderline = drawUnderline;
+    }
+
+    public boolean getDrawUnderline() {
+        return drawUnderline;
+    }
+
+    @Override
+    protected void paintComponent(Graphics g) {
+        // Set the foreground on the fly to ensure the text is painted
+        // with the proper color in super.paintComponent
+        ButtonModel model = getModel();
+        if (model.isArmed()) {
+            super.setForeground(activeForeground);
+        } else if (visited) {
+            super.setForeground(visitedForeground);
+        } else {
+            super.setForeground(normalForeground);
+        }
+        super.paintComponent(g);
+
+        if (drawUnderline) {
+            Insets insets = getInsets();
+            viewRect.x = insets.left;
+            viewRect.y = insets.top;
+            viewRect.width = getWidth() - insets.left - insets.right;
+            viewRect.height = getHeight() - insets.top - insets.bottom;
+            int baseline = getBaseline(viewRect.width, viewRect.height);
+
+            iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0;
+            textRect.x = textRect.y = textRect.width = textRect.height = 0;
+            SwingUtilities.layoutCompoundLabel(g.getFontMetrics(), getText(),
+                    getIcon(), getVerticalAlignment(), getHorizontalAlignment(),
+                    getVerticalTextPosition(), getHorizontalTextPosition(),
+                    viewRect, iconRect, textRect, getIconTextGap());
+
+            // getBaseline not returning correct results, so workaround for now
+            if (UIManager.getLookAndFeel().getName().equals("Nimbus")) {
+                baseline += 7;
+            } else {
+                baseline += 3;
+            }
+
+            g.setColor(getForeground());
+            g.drawLine(textRect.x,
+                    baseline,
+                    textRect.x + textRect.width,
+                    baseline);
+        }
+
+    }
+
+    // This action is stateless and hence can be shared across hyperlinks
+    private static class BrowseAction extends AbstractAction {
+
+        public BrowseAction() {
+            super();
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            JHyperlink hyperlink = (JHyperlink) e.getSource();
+
+            URI targetURI = hyperlink.getTarget();
+            if (targetURI != null) {
+                try {
+                    DemoUtilities.browse(targetURI);
+                    hyperlink.setVisited(true);
+                } catch (Exception ex) {
+                    ex.printStackTrace();
+                    System.err.println(ex);
+                }
+
+            }
+        }
+
+    }
+//</snip>
+//</snip>
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/ResourceManager.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos;
+
+import java.net.URL;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.*;
+
+/**
+ * @author Pavel Porvatov
+ */
+public class ResourceManager {
+
+    private static final Logger logger = Logger.getLogger(ResourceManager.class.getName());
+
+    private final Class<?> demoClass;
+
+    // Resource bundle for internationalized and accessible text
+    private ResourceBundle bundle = null;
+
+    public ResourceManager(Class<?> demoClass) {
+        this.demoClass = demoClass;
+
+        String bundleName = demoClass.getPackage().getName() + ".resources." + demoClass.getSimpleName();
+
+        try {
+            bundle = ResourceBundle.getBundle(bundleName);
+        } catch (MissingResourceException e) {
+            logger.log(Level.SEVERE, "Couldn't load bundle: " + bundleName);
+        }
+    }
+
+    public String getString(String key) {
+        return bundle != null ? bundle.getString(key) : key;
+    }
+
+    public char getMnemonic(String key) {
+        return (getString(key)).charAt(0);
+    }
+
+    public ImageIcon createImageIcon(String filename, String description) {
+        String path = "resources/images/" + filename;
+
+        URL imageURL = demoClass.getResource(path);
+
+        if (imageURL == null) {
+            logger.log(Level.SEVERE, "unable to access image file: " + path);
+
+            return null;
+        } else {
+            return new ImageIcon(imageURL, description);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/ButtonDemo.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos.button;
+
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.net.URISyntaxException;
+import javax.swing.BorderFactory;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+
+import com.sun.swingset3.DemoProperties;
+import com.sun.swingset3.demos.JHyperlink;
+
+/**
+ *
+ * @author aim
+ */
+@DemoProperties(
+        value = "JButton Demo",
+        category = "Controls",
+        description = "Demonstrates the many uses of JButton, Swing's push button component.",
+        sourceFiles = {
+            "com/sun/swingset3/demos/button/ButtonDemo.java",
+            "com/sun/swingset3/demos/JHyperlink.java",
+            "com/sun/swingset3/demos/button/resources/ButtonDemo.html",
+            "com/sun/swingset3/demos/button/resources/images/blogs.png",
+            "com/sun/swingset3/demos/button/resources/images/ButtonDemo.gif",
+            "com/sun/swingset3/demos/button/resources/images/document-print.png",
+            "com/sun/swingset3/demos/button/resources/images/earth_day.gif",
+            "com/sun/swingset3/demos/button/resources/images/earth_night.gif",
+            "com/sun/swingset3/demos/button/resources/images/edit-find.png",
+            "com/sun/swingset3/demos/button/resources/images/redbutton.png",
+            "com/sun/swingset3/demos/button/resources/images/redbutton_dark.png",
+            "com/sun/swingset3/demos/button/resources/images/redbutton_glow.png"
+        }
+)
+public final class ButtonDemo extends JPanel {
+
+    public static final String DEMO_TITLE = ButtonDemo.class.getAnnotation(DemoProperties.class).value();
+    public static final String DO_IT_AGAIN = "Do it again";
+    public static final String DO_IT = "Do it";
+    public static final String BUTTON_WITH_TEXT_AND_IMAGE = "button with text and image";
+    public static final String BUTTON_WITH_BACKGROUND_COLOR = "button with background color";
+    public static final String GO = "Go";
+    public static final String FIND = "Find";
+    public static final String IMAGE_BUTTON = "image button";
+    public static final String SIMPLE_BUTTON = "simple button";
+    public static final String GET_MORE_INFO = "Get More Info";
+    public static final String JAVA_BLOGS_URL = "https://blogs.oracle.com/java/";
+    public static final String JAVA_SE_URL = "http://www.oracle.com/technetwork/java/javase/overview/index.html";
+    public static final String BUTTON_WITH_ROLLOVER_IMAGE = "button with rollover image";
+    public static final String BUTTON_WITH_NO_BORDER = "button with no border";
+    public static final String CONNECT = "Connect";
+
+    public ButtonDemo() {
+        setToolTipText("Demonstrates JButton, Swing's push button component.");
+        initComponents();
+        setOpaque(false);
+    }
+
+    protected void initComponents() {
+        setLayout(new GridLayout(0, 1));
+
+        add(createSimpleButtonPanel());
+        add(createCreativeButtonPanel());
+    }
+
+    protected JPanel createSimpleButtonPanel() {
+        JPanel panel = new JPanel();
+        panel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 8));
+        panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
+                "Simple Buttons"));
+
+        //<snip>Create simple button
+        final JButton simpleButton = new JButton(DO_IT);
+        simpleButton.setToolTipText(SIMPLE_BUTTON);
+        //</snip>
+        //<snip>Add action listener using anonymous inner class
+        // This style is useful when the action code is tied to a
+        // single button instance and it's useful for simplicity
+        // sake to keep the action code located near the button.
+        // More global application actions should be implemented
+        // using Action classes instead.
+        simpleButton.addActionListener((ActionEvent event) -> {
+            simpleButton.setText(DO_IT_AGAIN);
+            // Need to force toplevel to relayout to accommodate new button size
+            SwingUtilities.getWindowAncestor(simpleButton).validate();
+        });
+        //</snip>
+        simpleButton.putClientProperty("snippetKey", "Create simple button");
+        panel.add(simpleButton);
+
+        //<snip>Create image button
+        // Image is from the Java Look and Feel Graphics Repository
+        JButton button = new JButton(new ImageIcon(getClass().
+                getResource("resources/images/document-print.png")));
+        button.setToolTipText(IMAGE_BUTTON);
+        //</snip>
+        button.putClientProperty("snippetKey", "Create image button");
+        panel.add(button);
+
+        //<snip>Create button with text and image
+        // Image is from the Java Look and Feel Graphics Repository
+        button = new JButton(FIND,
+                new ImageIcon(getClass().
+                        getResource("resources/images/edit-find.png")));
+        button.setToolTipText(BUTTON_WITH_TEXT_AND_IMAGE);
+        button.setHorizontalTextPosition(JButton.LEADING);
+        button.setIconTextGap(6);
+        //</snip>
+        button.putClientProperty("snippetKey", "Create button with text and image");
+        panel.add(button);
+
+        //<snip>Create button with background color
+        button = new JButton(GO);
+        button.setBackground(Color.green);
+        button.setContentAreaFilled(true);
+        button.setOpaque(false);
+        button.setToolTipText(BUTTON_WITH_BACKGROUND_COLOR);
+        //</snip>
+        button.putClientProperty("snippetKey", "Create button with background color");
+        panel.add(button);
+
+        return panel;
+    }
+
+    protected JPanel createCreativeButtonPanel() {
+        JPanel panel = new JPanel();
+        panel.setLayout(new FlowLayout(FlowLayout.CENTER, 16, 8));
+        panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
+                "More Interesting Buttons"));
+
+        //<snip>Create button with no border
+        JButton button = new JButton();
+        button.setText(CONNECT);
+        button.setIcon(new ImageIcon(getClass().getResource("resources/images/earth_day.gif")));
+        button.setPressedIcon(new ImageIcon(getClass().getResource("resources/images/earth_night.gif")));
+        button.setBorderPainted(false);
+        button.setContentAreaFilled(false);
+        button.setVerticalTextPosition(JButton.BOTTOM);
+        button.setHorizontalTextPosition(JButton.CENTER);
+        button.setIconTextGap(0);
+        button.setToolTipText(BUTTON_WITH_NO_BORDER);
+        //</snip>
+        button.putClientProperty("snippetKey", "Create button with no border");
+        panel.add(button);
+
+        //<snip>Create image button with rollover image
+        button = new JButton();
+        button.setBorderPainted(false);
+        button.setContentAreaFilled(false);
+        button.setIcon(new ImageIcon(getClass().getResource("resources/images/redbutton.png")));
+        button.setRolloverEnabled(true);
+        button.setRolloverIcon(new ImageIcon(getClass().getResource("resources/images/redbutton_glow.png")));
+        button.setPressedIcon(new ImageIcon(getClass().getResource("resources/images/redbutton_dark.png")));
+        button.setToolTipText(BUTTON_WITH_ROLLOVER_IMAGE);
+        //</snip>
+        button.putClientProperty("snippetKey", "Create image button with rollover image");
+        panel.add(button);
+
+        //<snip>Create HTML hyperlink
+        JHyperlink hyperlink;
+        try {
+            hyperlink = new JHyperlink(GET_MORE_INFO, JAVA_SE_URL);
+        } catch (URISyntaxException use) {
+            use.printStackTrace();
+            hyperlink = new JHyperlink(GET_MORE_INFO);
+        }
+        //</snip>
+        hyperlink.putClientProperty("snippetKey", "Create HTML hyperlink");
+        panel.add(hyperlink);
+
+        //<snip>Create HTML image hyperlink
+        try {
+            hyperlink = new JHyperlink(
+                    new ImageIcon(getClass().getResource("resources/images/blogs.png")), JAVA_BLOGS_URL);
+        } catch (URISyntaxException use) {
+            use.printStackTrace();
+        }
+        //</snip>
+        button.putClientProperty("snippetKey", "Create HTML image hyperlink");
+        panel.add(hyperlink);
+
+        return panel;
+    }
+
+    public static void main(String args[]) {
+        final ButtonDemo buttonDemo = new ButtonDemo();
+
+        javax.swing.SwingUtilities.invokeLater(() -> {
+            JFrame frame = new JFrame(DEMO_TITLE);
+            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+            frame.add(buttonDemo);
+            frame.pack();
+            frame.setVisible(true);
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/ButtonDemo.html	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- 
+ Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ 
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+ 
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+ 
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+        <body>
+            <p> Today's modern GUIs often use buttons which don't look like the traditional &quot;push&quot; button. Swing's button component, <a href="http://docs.oracle.com/javase/8/docs/api/javax/swing/JButton.html">javax.swing.JButton</a>, 
+                can be used to create both ordinary and more creative button visuals. In the end, they all perform an action when clicked.
+            </p>
+            <p>
+                To highlight the source code used to create a particular button, popup the context menu over that button.
+            </p>
+        </body>
+</html>
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/ButtonDemo.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/blogs.png has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/document-print.png has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/earth_day.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/earth_night.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/edit-find.png has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/redbutton.png has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/redbutton_dark.png has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/resources/images/redbutton_glow.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/ComboBoxDemo.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,445 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos.combobox;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashMap;
+import java.util.Map;
+import javax.accessibility.AccessibleRelation;
+import javax.swing.*;
+import javax.swing.border.BevelBorder;
+
+import com.sun.swingset3.demos.ResourceManager;
+import com.sun.swingset3.DemoProperties;
+
+/**
+ * JComboBox Demo
+ *
+ * @author Jeff Dinkins
+ * @version 1.13 11/17/05
+ */
+@DemoProperties(
+        value = "JComboBox Demo",
+        category = "Controls",
+        description = "Demonstrates JComboBox, a control which allows the user to make a selection from a popup list",
+        sourceFiles = {
+            "com/sun/swingset3/demos/combobox/ComboBoxDemo.java",
+            "com/sun/swingset3/demos/ResourceManager.java",
+            "com/sun/swingset3/demos/combobox/resources/ComboBoxDemo.properties",
+            "com/sun/swingset3/demos/combobox/resources/images/brenteyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/brenthair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/brentmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/ComboBoxDemo.gif",
+            "com/sun/swingset3/demos/combobox/resources/images/georgeseyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/georgeshair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/georgesmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/hanseyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/hanshair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/hansmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/howardeyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/howardhair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/howardmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jameseyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jameshair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jamesmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jeffeyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jeffhair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jeffmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/joneyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jonhair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/jonmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/laraeyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/larahair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/laramouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/larryeyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/larryhair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/larrymouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/lisaeyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/lisahair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/lisamouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/michaeleyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/michaelhair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/michaelmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/philipeyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/philiphair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/philipmouth.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/scotteyes.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/scotthair.jpg",
+            "com/sun/swingset3/demos/combobox/resources/images/scottmouth.jpg"
+        }
+)
+public class ComboBoxDemo extends JPanel implements ActionListener {
+
+    private static final Dimension VGAP15 = new Dimension(1, 15);
+    private static final Dimension HGAP20 = new Dimension(20, 1);
+    private static final Dimension VGAP20 = new Dimension(1, 20);
+    private static final Dimension HGAP30 = new Dimension(30, 1);
+    private static final Dimension VGAP30 = new Dimension(1, 30);
+
+    private final ResourceManager resourceManager = new ResourceManager(this.getClass());
+    public static final String DEMO_TITLE = ComboBoxDemo.class.getAnnotation(DemoProperties.class).value();
+
+    private Face face;
+    private JLabel faceLabel;
+
+    private JComboBox<String> hairCB;
+    private JComboBox<String> eyesCB;
+    private JComboBox<String> mouthCB;
+
+    private JComboBox<String> presetCB;
+
+    private final Map<String, Object> parts = new HashMap<>();
+
+    /**
+     * main method allows us to run as a standalone demo.
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        JFrame frame = new JFrame(DEMO_TITLE);
+
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.getContentPane().add(new ComboBoxDemo());
+        frame.setPreferredSize(new Dimension(800, 600));
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+    }
+
+    /**
+     * ComboBoxDemo Constructor
+     */
+    public ComboBoxDemo() {
+        createComboBoxDemo();
+    }
+
+    private void createComboBoxDemo() {
+        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+        JPanel innerPanel = new JPanel();
+        innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
+
+        add(Box.createRigidArea(VGAP20));
+        add(innerPanel);
+        add(Box.createRigidArea(VGAP20));
+
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // Create a panel to hold buttons
+        JPanel comboBoxPanel = new JPanel() {
+            @Override
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        comboBoxPanel.setLayout(new BoxLayout(comboBoxPanel, BoxLayout.Y_AXIS));
+
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        JLabel l = (JLabel) comboBoxPanel.add(new JLabel(resourceManager.getString("ComboBoxDemo.presets")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        comboBoxPanel.add(presetCB = createPresetComboBox());
+        presetCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(presetCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP30));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(resourceManager.getString("ComboBoxDemo.hair_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        comboBoxPanel.add(hairCB = createHairComboBox());
+        hairCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(hairCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(resourceManager.getString("ComboBoxDemo.eyes_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        comboBoxPanel.add(eyesCB = createEyesComboBox());
+        eyesCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(eyesCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        l = (JLabel) comboBoxPanel.add(new JLabel(resourceManager.getString("ComboBoxDemo.mouth_description")));
+        l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+        comboBoxPanel.add(mouthCB = createMouthComboBox());
+
+        mouthCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
+        l.setLabelFor(mouthCB);
+        comboBoxPanel.add(Box.createRigidArea(VGAP15));
+
+        // Fill up the remaining space
+        comboBoxPanel.add(new JPanel(new BorderLayout()));
+
+        // Create and place the Face.
+        face = new Face();
+        JPanel facePanel = new JPanel();
+        facePanel.setLayout(new BorderLayout());
+        facePanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
+
+        faceLabel = new JLabel(face);
+        facePanel.add(faceLabel, BorderLayout.CENTER);
+        // Indicate that the face panel is controlled by the hair, eyes and
+        // mouth combo boxes.
+        Object[] controlledByObjects = new Object[3];
+        controlledByObjects[0] = hairCB;
+        controlledByObjects[1] = eyesCB;
+        controlledByObjects[2] = mouthCB;
+        AccessibleRelation controlledByRelation
+                = new AccessibleRelation(AccessibleRelation.CONTROLLED_BY_PROPERTY,
+                        controlledByObjects);
+        facePanel.getAccessibleContext().getAccessibleRelationSet().add(controlledByRelation);
+
+        // Indicate that the hair, eyes and mouth combo boxes are controllers
+        // for the face panel.
+        AccessibleRelation controllerForRelation
+                = new AccessibleRelation(AccessibleRelation.CONTROLLER_FOR_PROPERTY,
+                        facePanel);
+        hairCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+        eyesCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+        mouthCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
+
+        // add buttons and image panels to inner panel
+        innerPanel.add(comboBoxPanel);
+        innerPanel.add(Box.createRigidArea(HGAP30));
+        innerPanel.add(facePanel);
+        innerPanel.add(Box.createRigidArea(HGAP20));
+
+        // load up the face parts
+        addFace("brent", resourceManager.getString("ComboBoxDemo.brent"));
+        addFace("georges", resourceManager.getString("ComboBoxDemo.georges"));
+        addFace("hans", resourceManager.getString("ComboBoxDemo.hans"));
+        addFace("howard", resourceManager.getString("ComboBoxDemo.howard"));
+        addFace("james", resourceManager.getString("ComboBoxDemo.james"));
+        addFace("jeff", resourceManager.getString("ComboBoxDemo.jeff"));
+        addFace("jon", resourceManager.getString("ComboBoxDemo.jon"));
+        addFace("lara", resourceManager.getString("ComboBoxDemo.lara"));
+        addFace("larry", resourceManager.getString("ComboBoxDemo.larry"));
+        addFace("lisa", resourceManager.getString("ComboBoxDemo.lisa"));
+        addFace("michael", resourceManager.getString("ComboBoxDemo.michael"));
+        addFace("philip", resourceManager.getString("ComboBoxDemo.philip"));
+        addFace("scott", resourceManager.getString("ComboBoxDemo.scott"));
+
+        // set the default face
+        presetCB.setSelectedIndex(0);
+    }
+
+    private void addFace(String name, String i18n_name) {
+        ImageIcon i;
+        String i18n_hair = resourceManager.getString("ComboBoxDemo.hair");
+        String i18n_eyes = resourceManager.getString("ComboBoxDemo.eyes");
+        String i18n_mouth = resourceManager.getString("ComboBoxDemo.mouth");
+
+        parts.put(i18n_name, name); // i18n name lookup
+        parts.put(name, i18n_name); // reverse name lookup
+
+        i = resourceManager.createImageIcon(name + "hair.jpg", i18n_name + i18n_hair);
+        parts.put(name + "hair", i);
+
+        i = resourceManager.createImageIcon(name + "eyes.jpg", i18n_name + i18n_eyes);
+        parts.put(name + "eyes", i);
+
+        i = resourceManager.createImageIcon(name + "mouth.jpg", i18n_name + i18n_mouth);
+        parts.put(name + "mouth", i);
+    }
+
+    private JComboBox<String> createHairComboBox() {
+        JComboBox<String> cb = new JComboBox<>();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    private JComboBox<String> createEyesComboBox() {
+        JComboBox<String> cb = new JComboBox<>();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    private JComboBox<String> createMouthComboBox() {
+        JComboBox<String> cb = new JComboBox<>();
+        fillComboBox(cb);
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    private JComboBox<String> createPresetComboBox() {
+        JComboBox<String> cb = new JComboBox<>();
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset1"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset2"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset3"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset4"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset5"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset6"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset7"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset8"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset9"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.preset10"));
+        cb.addActionListener(this);
+        return cb;
+    }
+
+    private void fillComboBox(JComboBox<String> cb) {
+        cb.addItem(resourceManager.getString("ComboBoxDemo.brent"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.georges"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.hans"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.howard"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.james"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.jeff"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.jon"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.lara"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.larry"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.lisa"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.michael"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.philip"));
+        cb.addItem(resourceManager.getString("ComboBoxDemo.scott"));
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (e.getSource() == hairCB) {
+            String name = (String) parts.get(hairCB.getSelectedItem());
+            face.setHair((ImageIcon) parts.get(name + "hair"));
+            faceLabel.repaint();
+        } else if (e.getSource() == eyesCB) {
+            String name = (String) parts.get(eyesCB.getSelectedItem());
+            face.setEyes((ImageIcon) parts.get(name + "eyes"));
+            faceLabel.repaint();
+        } else if (e.getSource() == mouthCB) {
+            String name = (String) parts.get(mouthCB.getSelectedItem());
+            face.setMouth((ImageIcon) parts.get(name + "mouth"));
+            faceLabel.repaint();
+        } else if (e.getSource() == presetCB) {
+            String hair = null;
+            String eyes = null;
+            String mouth = null;
+            switch (presetCB.getSelectedIndex()) {
+                case 0:
+                    hair = (String) parts.get("philip");
+                    eyes = (String) parts.get("howard");
+                    mouth = (String) parts.get("jeff");
+                    break;
+                case 1:
+                    hair = (String) parts.get("jeff");
+                    eyes = (String) parts.get("larry");
+                    mouth = (String) parts.get("philip");
+                    break;
+                case 2:
+                    hair = (String) parts.get("howard");
+                    eyes = (String) parts.get("scott");
+                    mouth = (String) parts.get("hans");
+                    break;
+                case 3:
+                    hair = (String) parts.get("philip");
+                    eyes = (String) parts.get("jeff");
+                    mouth = (String) parts.get("hans");
+                    break;
+                case 4:
+                    hair = (String) parts.get("brent");
+                    eyes = (String) parts.get("jon");
+                    mouth = (String) parts.get("scott");
+                    break;
+                case 5:
+                    hair = (String) parts.get("lara");
+                    eyes = (String) parts.get("larry");
+                    mouth = (String) parts.get("lisa");
+                    break;
+                case 6:
+                    hair = (String) parts.get("james");
+                    eyes = (String) parts.get("philip");
+                    mouth = (String) parts.get("michael");
+                    break;
+                case 7:
+                    hair = (String) parts.get("philip");
+                    eyes = (String) parts.get("lisa");
+                    mouth = (String) parts.get("brent");
+                    break;
+                case 8:
+                    hair = (String) parts.get("james");
+                    eyes = (String) parts.get("philip");
+                    mouth = (String) parts.get("jon");
+                    break;
+                case 9:
+                    hair = (String) parts.get("lara");
+                    eyes = (String) parts.get("jon");
+                    mouth = (String) parts.get("scott");
+                    break;
+            }
+            if (hair != null) {
+                hairCB.setSelectedItem(hair);
+                eyesCB.setSelectedItem(eyes);
+                mouthCB.setSelectedItem(mouth);
+                faceLabel.repaint();
+            }
+        }
+    }
+
+    private static class Face implements Icon {
+
+        private ImageIcon hair;
+        private ImageIcon eyes;
+        private ImageIcon mouth;
+
+        void setHair(ImageIcon i) {
+            hair = i;
+        }
+
+        void setEyes(ImageIcon i) {
+            eyes = i;
+        }
+
+        void setMouth(ImageIcon i) {
+            mouth = i;
+        }
+
+        @Override
+        public void paintIcon(Component c, Graphics g, int x, int y) {
+            int height = y;
+            x = c.getWidth() / 2 - getIconWidth() / 2;
+
+            if (hair != null) {
+                hair.paintIcon(c, g, x, height);
+                height += hair.getIconHeight();
+            }
+
+            if (eyes != null) {
+                eyes.paintIcon(c, g, x, height);
+                height += eyes.getIconHeight();
+            }
+
+            if (mouth != null) {
+                mouth.paintIcon(c, g, x, height);
+            }
+        }
+
+        @Override
+        public int getIconWidth() {
+            return 344;
+        }
+
+        @Override
+        public int getIconHeight() {
+            return 455;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/ComboBoxDemo.properties	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,42 @@
+### ComboBox Demo ###
+
+ComboBoxDemo.accessible_description=This demo shows an example of using the JComboBox component.
+ComboBoxDemo.tooltip=JComboBox demo
+ComboBoxDemo.name=ComboBox Demo
+
+ComboBoxDemo.hair=hair
+ComboBoxDemo.eyes=eyes
+ComboBoxDemo.mouth=mouth
+ComboBoxDemo.presets=Presets:
+
+ComboBoxDemo.preset1=Philip, Howard, Jeff
+ComboBoxDemo.preset2=Jeff, Larry, Philip
+ComboBoxDemo.preset3=Howard, Scott, Hans
+ComboBoxDemo.preset4=Philip, Jeff, Hans
+ComboBoxDemo.preset5=Brent, Jon, Scott
+ComboBoxDemo.preset6=Lara, Larry, Lisa
+ComboBoxDemo.preset7=James, Philip, Michael
+ComboBoxDemo.preset8=Philip, Lisa, Brent
+ComboBoxDemo.preset9=James, Philip, Jon
+ComboBoxDemo.preset10=Lara, Jon, Scott
+
+
+ComboBoxDemo.hair_description=Hair:
+ComboBoxDemo.eyes_description=Eyes & Nose:
+ComboBoxDemo.mouth_description=Mouth:
+
+ComboBoxDemo.amy=Amy
+ComboBoxDemo.brent=Brent
+ComboBoxDemo.georges=Georges
+ComboBoxDemo.hans=Hans
+ComboBoxDemo.howard=Howard
+ComboBoxDemo.james=James
+ComboBoxDemo.jeff=Jeff
+ComboBoxDemo.jon=Jon
+ComboBoxDemo.lara=Lara
+ComboBoxDemo.larry=Larry
+ComboBoxDemo.lisa=Lisa
+ComboBoxDemo.michael=Michael
+ComboBoxDemo.philip=Philip
+ComboBoxDemo.scott=Scott
+
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/ComboBoxDemo.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/brenteyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/brenthair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/brentmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/georgeseyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/georgeshair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/georgesmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/hanseyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/hanshair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/hansmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/howardeyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/howardhair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/howardmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jameseyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jameshair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jamesmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jeffeyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jeffhair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jeffmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/joneyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jonhair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/jonmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/laraeyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larahair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/laramouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larryeyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larryhair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/larrymouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/lisaeyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/lisahair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/lisamouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/michaeleyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/michaelhair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/michaelmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/philipeyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/philiphair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/philipmouth.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/scotteyes.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/scotthair.jpg has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/combobox/resources/images/scottmouth.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/ListDemo.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,404 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos.list;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.util.Vector;
+import javax.swing.*;
+
+import com.sun.swingset3.DemoProperties;
+import com.sun.swingset3.demos.ResourceManager;
+
+/**
+ * List Demo. This demo shows that it is not always necessary to have an array
+ * of objects as big as the size of the list stored.
+ *
+ * Indeed, in this example, there is no array kept for the list data, rather it
+ * is generated on the fly as only those elements are needed.
+ *
+ * @version 1.17 11/17/05
+ * @author Jeff Dinkins
+ */
+@DemoProperties(
+        value = "JList Demo",
+        category = "Data",
+        description = "Demonstrates JList, a component which supports display/editing of a data list",
+        sourceFiles = {
+            "com/sun/swingset3/demos/list/ListDemo.java",
+            "com/sun/swingset3/demos/list/Permuter.java",
+            "com/sun/swingset3/demos/ResourceManager.java",
+            "com/sun/swingset3/demos/list/resources/ListDemo.properties",
+            "com/sun/swingset3/demos/list/resources/images/blue.gif",
+            "com/sun/swingset3/demos/list/resources/images/cyan.gif",
+            "com/sun/swingset3/demos/list/resources/images/gray.gif",
+            "com/sun/swingset3/demos/list/resources/images/green.gif",
+            "com/sun/swingset3/demos/list/resources/images/ListDemo.gif",
+            "com/sun/swingset3/demos/list/resources/images/magenta.gif",
+            "com/sun/swingset3/demos/list/resources/images/red.gif",
+            "com/sun/swingset3/demos/list/resources/images/yellow.gif"
+        }
+)
+public final class ListDemo extends JPanel {
+
+    private static final Dimension HGAP10 = new Dimension(10, 1);
+    private static final Dimension VGAP10 = new Dimension(1, 10);
+    private static final Dimension HGAP15 = new Dimension(15, 1);
+    private static final Dimension HGAP30 = new Dimension(30, 1);
+
+    private final ResourceManager resourceManager = new ResourceManager(this.getClass());
+    public static final String DEMO_TITLE = ListDemo.class.getAnnotation(DemoProperties.class).value();
+
+    private final JList<String> list;
+
+    private JPanel prefixList;
+    private JPanel suffixList;
+
+    private Action prefixAction;
+    private Action suffixAction;
+
+    private final GeneratedListModel listModel;
+
+    /**
+     * main method allows us to run as a standalone demo.
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        JFrame frame = new JFrame(DEMO_TITLE);
+
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.getContentPane().add(new ListDemo());
+        frame.setPreferredSize(new Dimension(800, 600));
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+    }
+
+    /**
+     * ListDemo Constructor
+     */
+    public ListDemo() {
+        setLayout(new BorderLayout());
+
+        loadImages();
+
+        JLabel description = new JLabel(resourceManager.getString("ListDemo.description"));
+        add(description, BorderLayout.NORTH);
+
+        JPanel centerPanel = new JPanel();
+        centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS));
+        centerPanel.add(Box.createRigidArea(HGAP10));
+        add(centerPanel, BorderLayout.CENTER);
+
+        JPanel listPanel = new JPanel();
+        listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.Y_AXIS));
+        listPanel.add(Box.createRigidArea(VGAP10));
+
+        centerPanel.add(listPanel);
+        centerPanel.add(Box.createRigidArea(HGAP30));
+
+        // Create the list
+        list = new JList<>();
+        list.setCellRenderer(new CompanyLogoListCellRenderer());
+        listModel = new GeneratedListModel();
+        list.setModel(listModel);
+
+        // Set the preferred row count. This affects the preferredSize
+        // of the JList when it's in a scrollpane.
+        list.setVisibleRowCount(22);
+
+        // Add list to a scrollpane
+        JScrollPane scrollPane = new JScrollPane(list);
+        listPanel.add(scrollPane);
+        listPanel.add(Box.createRigidArea(VGAP10));
+
+        // Add the control panel (holds the prefix/suffix list and prefix/suffix checkboxes)
+        centerPanel.add(createControlPanel());
+
+        // create prefixes and suffixes
+        addPrefix("Tera", true);
+        addPrefix("Micro", false);
+        addPrefix("Southern", false);
+        addPrefix("Net", true);
+        addPrefix("YoYo", true);
+        addPrefix("Northern", false);
+        addPrefix("Tele", false);
+        addPrefix("Eastern", false);
+        addPrefix("Neo", false);
+        addPrefix("Digi", false);
+        addPrefix("National", false);
+        addPrefix("Compu", true);
+        addPrefix("Meta", true);
+        addPrefix("Info", false);
+        addPrefix("Western", false);
+        addPrefix("Data", false);
+        addPrefix("Atlantic", false);
+        addPrefix("Advanced", false);
+        addPrefix("Euro", false);
+        addPrefix("Pacific", false);
+        addPrefix("Mobile", false);
+        addPrefix("In", false);
+        addPrefix("Computa", false);
+        addPrefix("Digital", false);
+        addPrefix("Analog", false);
+
+        addSuffix("Tech", true);
+        addSuffix("Soft", true);
+        addSuffix("Telecom", true);
+        addSuffix("Solutions", false);
+        addSuffix("Works", true);
+        addSuffix("Dyne", false);
+        addSuffix("Services", false);
+        addSuffix("Vers", false);
+        addSuffix("Devices", false);
+        addSuffix("Software", false);
+        addSuffix("Serv", false);
+        addSuffix("Systems", true);
+        addSuffix("Dynamics", true);
+        addSuffix("Net", false);
+        addSuffix("Sys", false);
+        addSuffix("Computing", false);
+        addSuffix("Scape", false);
+        addSuffix("Com", false);
+        addSuffix("Ware", false);
+        addSuffix("Widgets", false);
+        addSuffix("Media", false);
+        addSuffix("Computer", false);
+        addSuffix("Hardware", false);
+        addSuffix("Gizmos", false);
+        addSuffix("Concepts", false);
+    }
+
+    private JPanel createControlPanel() {
+        JPanel controlPanel = new JPanel() {
+            private final Insets insets = new Insets(0, 4, 10, 10);
+
+            @Override
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.X_AXIS));
+
+        JPanel prefixPanel = new JPanel();
+        prefixPanel.setLayout(new BoxLayout(prefixPanel, BoxLayout.Y_AXIS));
+        prefixPanel.add(new JLabel(resourceManager.getString("ListDemo.prefixes")));
+
+        JPanel suffixPanel = new JPanel();
+        suffixPanel.setLayout(new BoxLayout(suffixPanel, BoxLayout.Y_AXIS));
+        suffixPanel.add(new JLabel(resourceManager.getString("ListDemo.suffixes")));
+
+        prefixList = new JPanel() {
+            private final Insets insets = new Insets(0, 4, 0, 0);
+
+            @Override
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        prefixList.setLayout(new BoxLayout(prefixList, BoxLayout.Y_AXIS));
+        JScrollPane scrollPane = new JScrollPane(prefixList);
+        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
+        prefixPanel.add(scrollPane);
+        prefixPanel.add(Box.createRigidArea(HGAP10));
+
+        suffixList = new JPanel() {
+            private final Insets insets = new Insets(0, 4, 0, 0);
+
+            @Override
+            public Insets getInsets() {
+                return insets;
+            }
+        };
+        suffixList.setLayout(new BoxLayout(suffixList, BoxLayout.Y_AXIS));
+        scrollPane = new JScrollPane(suffixList);
+        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
+        suffixPanel.add(scrollPane);
+        suffixPanel.add(Box.createRigidArea(HGAP10));
+
+        controlPanel.add(prefixPanel);
+        controlPanel.add(Box.createRigidArea(HGAP15));
+        controlPanel.add(suffixPanel);
+        return controlPanel;
+    }
+
+    private final FocusListener listFocusListener = new FocusAdapter() {
+        @Override
+        public void focusGained(FocusEvent e) {
+            JComponent c = (JComponent) e.getComponent();
+            c.scrollRectToVisible(new Rectangle(0, 0, c.getWidth(), c.getHeight()));
+        }
+    };
+
+    private void addPrefix(String prefix, boolean selected) {
+        if (prefixAction == null) {
+            prefixAction = new UpdatePrefixListAction(listModel);
+        }
+        final JCheckBox cb = (JCheckBox) prefixList.add(new JCheckBox(prefix));
+        cb.setSelected(selected);
+        cb.addActionListener(prefixAction);
+        if (selected) {
+            listModel.addPrefix(prefix);
+        }
+        cb.addFocusListener(listFocusListener);
+    }
+
+    private void addSuffix(String suffix, boolean selected) {
+        if (suffixAction == null) {
+            suffixAction = new UpdateSuffixListAction(listModel);
+        }
+        final JCheckBox cb = (JCheckBox) suffixList.add(new JCheckBox(suffix));
+        cb.setSelected(selected);
+        cb.addActionListener(suffixAction);
+        if (selected) {
+            listModel.addSuffix(suffix);
+        }
+        cb.addFocusListener(listFocusListener);
+    }
+
+    private static class UpdatePrefixListAction extends AbstractAction {
+
+        private final GeneratedListModel listModel;
+
+        protected UpdatePrefixListAction(GeneratedListModel listModel) {
+            this.listModel = listModel;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            JCheckBox cb = (JCheckBox) e.getSource();
+            if (cb.isSelected()) {
+                listModel.addPrefix(cb.getText());
+            } else {
+                listModel.removePrefix(cb.getText());
+            }
+        }
+    }
+
+    private static class UpdateSuffixListAction extends AbstractAction {
+
+        private final GeneratedListModel listModel;
+
+        protected UpdateSuffixListAction(GeneratedListModel listModel) {
+            this.listModel = listModel;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            JCheckBox cb = (JCheckBox) e.getSource();
+            if (cb.isSelected()) {
+                listModel.addSuffix(cb.getText());
+            } else {
+                listModel.removeSuffix(cb.getText());
+            }
+        }
+    }
+
+    private static class GeneratedListModel extends AbstractListModel<String> {
+
+        private Permuter permuter;
+
+        private final Vector<String> prefix = new Vector<>();
+        private final Vector<String> suffix = new Vector<>();
+
+        private void update() {
+            permuter = new Permuter(getSize());
+            fireContentsChanged(this, 0, getSize());
+        }
+
+        public void addPrefix(String s) {
+            if (!prefix.contains(s)) {
+                prefix.addElement(s);
+                update();
+            }
+        }
+
+        public void removePrefix(String s) {
+            prefix.removeElement(s);
+            update();
+        }
+
+        public void addSuffix(String s) {
+            if (!suffix.contains(s)) {
+                suffix.addElement(s);
+                update();
+            }
+        }
+
+        public void removeSuffix(String s) {
+            suffix.removeElement(s);
+            update();
+        }
+
+        @Override
+        public int getSize() {
+            return prefix.size() * suffix.size();
+        }
+
+        @Override
+        public String getElementAt(int index) {
+            if (permuter == null) {
+                update();
+            }
+            // morph the index to another int -- this has the benefit of
+            // causing the list to look random.
+            int j = permuter.map(index);
+            int ps = prefix.size();
+            int ss = suffix.size();
+            return prefix.elementAt(j % ps) + suffix.elementAt((j / ps) % ss);
+        }
+    }
+
+    private final ImageIcon[] images = new ImageIcon[7];
+
+    void loadImages() {
+        images[0] = resourceManager.createImageIcon("red.gif", resourceManager.getString("ListDemo.red"));
+        images[1] = resourceManager.createImageIcon("blue.gif", resourceManager.getString("ListDemo.blue"));
+        images[2] = resourceManager.createImageIcon("yellow.gif", resourceManager.getString("ListDemo.yellow"));
+        images[3] = resourceManager.createImageIcon("green.gif", resourceManager.getString("ListDemo.green"));
+        images[4] = resourceManager.createImageIcon("gray.gif", resourceManager.getString("ListDemo.gray"));
+        images[5] = resourceManager.createImageIcon("cyan.gif", resourceManager.getString("ListDemo.cyan"));
+        images[6] = resourceManager.createImageIcon("magenta.gif", resourceManager.getString("ListDemo.magenta"));
+    }
+
+    private class CompanyLogoListCellRenderer extends DefaultListCellRenderer {
+
+        @Override
+        public Component getListCellRendererComponent(
+                JList<?> list,
+                Object value,
+                int index,
+                boolean isSelected,
+                boolean cellHasFocus) {
+            Component retValue = super.getListCellRendererComponent(
+                    list, value, index, isSelected, cellHasFocus
+            );
+            setIcon(images[index % 7]);
+            return retValue;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/Permuter.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos.list;
+
+/**
+ * An object that implements a cheesy pseudorandom permutation of the integers
+ * from zero to some user-specified value. (The permutation is a linear
+ * function.)
+ *
+ * @version 1.9 11/17/05
+ * @author Josh Bloch
+ */
+class Permuter {
+
+    /**
+     * The size of the permutation.
+     */
+    private int modulus;
+
+    /**
+     * Nonnegative integer less than n that is relatively prime to m.
+     */
+    private int multiplier;
+
+    /**
+     * Pseudorandom nonnegative integer less than n.
+     */
+    private static final int ADDEND = 22;
+
+    public Permuter(int n) {
+        if (n < 0) {
+            throw new IllegalArgumentException();
+        }
+        modulus = n;
+        if (n == 1) {
+            return;
+        }
+
+        // Initialize the multiplier and offset
+        multiplier = (int) Math.sqrt(n);
+        while (gcd(multiplier, n) != 1) {
+            if (++multiplier == n) {
+                multiplier = 1;
+            }
+        }
+    }
+
+    /**
+     * Returns the integer to which this permuter maps the specified integer.
+     * The specified integer must be between 0 and n-1, and the returned integer
+     * will be as well.
+     */
+    public int map(int i) {
+        return (multiplier * i + ADDEND) % modulus;
+    }
+
+    /**
+     * Calculate GCD of a and b, which are assumed to be non-negative.
+     */
+    private static int gcd(int a, int b) {
+        while (b != 0) {
+            int tmp = a % b;
+            a = b;
+            b = tmp;
+        }
+        return a;
+    }
+
+    /**
+     * Simple test. Takes modulus on command line and prints out permutation.
+     */
+    public static void main(String[] args) {
+        int modulus = Integer.parseInt(args[0]);
+        Permuter p = new Permuter(modulus);
+        for (int i = 0; i < modulus; i++) {
+            System.out.print(p.map(i) + " ");
+        }
+        System.out.println();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/ListDemo.properties	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,18 @@
+### List Demo ###
+
+ListDemo.accessible_description=JList Demo
+ListDemo.name=List Demo
+ListDemo.tooltip=JList demo
+ListDemo.prefixes=Prefixes
+ListDemo.suffixes=Suffixes
+ListDemo.count_label=Number of generated list entries:
+ListDemo.all=All
+ListDemo.none=None
+ListDemo.red=Red Company Logo Image
+ListDemo.yellow=Red Company Logo Image
+ListDemo.blue=Blue Company Logo Image
+ListDemo.gray=Gray Company Logo Image
+ListDemo.green=Green Company Logo Image
+ListDemo.magenta=Magenta Company Logo Image
+ListDemo.cyan=Cyan Company Logo Image
+ListDemo.description=<html><P STYLE="margin-left: .25in; margin-right: .25in">This demo shows how to present lists of data in two different ways. On the left is a <b>JList</b> component whose list items consist of the permutations of the checked prefixes and suffixes. The prefix and suffix checkbox columns on the right are created by using a <b>JPanel</b> with a Y Axis <b>BoxLayout</b> inside a <b>JScrollPane</b>.</P></html>
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/ListDemo.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/blue.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/cyan.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/gray.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/green.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/magenta.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/red.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/list/resources/images/yellow.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/OptionPaneDemo.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos.optionpane;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.net.URL;
+import javax.swing.*;
+
+import com.sun.swingset3.demos.ResourceManager;
+import com.sun.swingset3.DemoProperties;
+
+/**
+ * JOptionPaneDemo
+ *
+ * @author Jeff Dinkins
+ * @version 1.11 11/17/05
+ */
+@DemoProperties(
+        value = "JOptionPane Demo",
+        category = "Choosers",
+        description = "Demonstrates JOptionPane, a component which displays standard message dialogs (question, warning, error, etc).",
+        sourceFiles = {
+            "com/sun/swingset3/demos/optionpane/OptionPaneDemo.java",
+            "com/sun/swingset3/demos/ResourceManager.java",
+            "com/sun/swingset3/demos/optionpane/resources/OptionPaneDemo.properties",
+            "com/sun/swingset3/demos/optionpane/resources/images/bottle.gif",
+            "com/sun/swingset3/demos/optionpane/resources/images/OptionPaneDemo.gif"
+        }
+)
+public class OptionPaneDemo extends JPanel {
+
+    private static final Dimension VGAP15 = new Dimension(1, 15);
+    private static final Dimension VGAP30 = new Dimension(1, 30);
+
+    private static final ResourceManager resourceManager = new ResourceManager(OptionPaneDemo.class);
+    public static final String WARNING_TITLE = resourceManager.getString("OptionPaneDemo.warningtitle");
+    public static final String WARNING_TEXT = resourceManager.getString("OptionPaneDemo.warningtext");
+    public static final String WARNING_BUTTON = resourceManager.getString("OptionPaneDemo.warningbutton");
+    public static final String CONFIRM_NO = resourceManager.getString("OptionPaneDemo.confirmno");
+    public static final String CONFIRM_YES = resourceManager.getString("OptionPaneDemo.confirmyes");
+    public static final String CONFIRM_QUESTION = resourceManager.getString("OptionPaneDemo.confirmquestion");
+    public static final String CONFIRM_BUTTON = resourceManager.getString("OptionPaneDemo.confirmbutton");
+    public static final String MESSAGE_TEXT = resourceManager.getString("OptionPaneDemo.messagetext");
+    public static final String MESSAGE_BUTTON = resourceManager.getString("OptionPaneDemo.messagebutton");
+    public static final String INPUT_QUESTION = resourceManager.getString("OptionPaneDemo.inputquestion");
+    public static final String INPUT_RESPONSE = ": " + resourceManager.getString("OptionPaneDemo.inputresponse");
+    public static final String INPUT_BUTTON = resourceManager.getString("OptionPaneDemo.inputbutton");
+    public static final String COMPONENT_R4 = resourceManager.getString("OptionPaneDemo.component_r4");
+    public static final String COMPONENT_R3 = resourceManager.getString("OptionPaneDemo.component_r3");
+    public static final String COMPONENT_R2 = resourceManager.getString("OptionPaneDemo.component_r2");
+    public static final String COMPONENT_R1 = resourceManager.getString("OptionPaneDemo.component_r1");
+    public static final String COMPONENT_TITLE = resourceManager.getString("OptionPaneDemo.componenttitle");
+    public static final String COMPONENT_OP5 = resourceManager.getString("OptionPaneDemo.component_op5");
+    public static final String COMPONENT_OP4 = resourceManager.getString("OptionPaneDemo.component_op4");
+    public static final String COMPONENT_OP3 = resourceManager.getString("OptionPaneDemo.component_op3");
+    public static final String COMPONENT_OP2 = resourceManager.getString("OptionPaneDemo.component_op2");
+    public static final String COMPONENT_OP1 = resourceManager.getString("OptionPaneDemo.component_op1");
+    public static final String COMPONENT_MESSAGE_2 = resourceManager.getString("OptionPaneDemo.componentmessage2");
+    public static final String COMPONENT_CB3 = resourceManager.getString("OptionPaneDemo.component_cb3");
+    public static final String COMPONENT_CB2 = resourceManager.getString("OptionPaneDemo.component_cb2");
+    public static final String COMPONENT_CB1 = resourceManager.getString("OptionPaneDemo.component_cb1");
+    public static final String COMPONENT_BUTTON = resourceManager.getString("OptionPaneDemo.componentbutton");
+    public static final String COMPONENT_TEXT_FIELD = resourceManager.getString("OptionPaneDemo.componenttextfield");
+    public static final String COMPONENT_MESSAGE = resourceManager.getString("OptionPaneDemo.componentmessage");
+    public static final String DEMO_TITLE = OptionPaneDemo.class.getAnnotation(DemoProperties.class).value();
+
+    /**
+     * main method allows us to run as a standalone demo.
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        JFrame frame = new JFrame(DEMO_TITLE);
+
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.getContentPane().add(new OptionPaneDemo());
+        frame.setPreferredSize(new Dimension(800, 600));
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+    }
+
+    /**
+     * OptionPaneDemo Constructor
+     */
+    public OptionPaneDemo() {
+        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+
+        JPanel bp = new JPanel() {
+            @Override
+            public Dimension getMaximumSize() {
+                return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
+            }
+        };
+        bp.setLayout(new BoxLayout(bp, BoxLayout.Y_AXIS));
+
+        bp.add(Box.createRigidArea(VGAP30));
+        bp.add(Box.createRigidArea(VGAP30));
+
+        bp.add(createInputDialogButton());
+        bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createWarningDialogButton());
+        bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createMessageDialogButton());
+        bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createComponentDialogButton());
+        bp.add(Box.createRigidArea(VGAP15));
+        bp.add(createConfirmDialogButton());
+        bp.add(Box.createVerticalGlue());
+
+        add(Box.createHorizontalGlue());
+        add(bp);
+        add(Box.createHorizontalGlue());
+    }
+
+    private JButton createWarningDialogButton() {
+        Action a = new AbstractAction(WARNING_BUTTON) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane.showMessageDialog(OptionPaneDemo.this,
+                        WARNING_TEXT,
+                        WARNING_TITLE,
+                        JOptionPane.WARNING_MESSAGE
+                );
+            }
+        };
+        return createButton(a);
+    }
+
+    private JButton createMessageDialogButton() {
+        Action a = new AbstractAction(MESSAGE_BUTTON) {
+            final URL img = getClass().getResource("resources/images/bottle.gif");
+            final String imagesrc = "<img src=\"" + img + "\" width=\"284\" height=\"100\">";
+            final String message = MESSAGE_TEXT;
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane.showMessageDialog(
+                        OptionPaneDemo.this,
+                        "<html>" + imagesrc + "<br><center>" + message + "</center><br></html>"
+                );
+            }
+        };
+        return createButton(a);
+    }
+
+    private JButton createConfirmDialogButton() {
+        Action a = new AbstractAction(CONFIRM_BUTTON) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                int result = JOptionPane.showConfirmDialog(OptionPaneDemo.this, CONFIRM_QUESTION);
+                if (result == JOptionPane.YES_OPTION) {
+                    JOptionPane.showMessageDialog(OptionPaneDemo.this, CONFIRM_YES);
+                } else if (result == JOptionPane.NO_OPTION) {
+                    JOptionPane.showMessageDialog(OptionPaneDemo.this, CONFIRM_NO);
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    private JButton createInputDialogButton() {
+        Action a = new AbstractAction(INPUT_BUTTON) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                String result = JOptionPane.showInputDialog(OptionPaneDemo.this, INPUT_QUESTION);
+                if ((result != null) && (result.length() > 0)) {
+                    JOptionPane.showMessageDialog(OptionPaneDemo.this,
+                            result + INPUT_RESPONSE);
+                }
+            }
+        };
+        return createButton(a);
+    }
+
+    private JButton createComponentDialogButton() {
+        Action a = new AbstractAction(COMPONENT_BUTTON) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                // In a ComponentDialog, you can show as many message components and
+                // as many options as you want:
+
+                // Messages
+                Object[] message = new Object[4];
+                message[0] = COMPONENT_MESSAGE;
+                message[1] = new JTextField(COMPONENT_TEXT_FIELD);
+
+                JComboBox<String> cb = new JComboBox<>();
+                cb.addItem(COMPONENT_CB1);
+                cb.addItem(COMPONENT_CB2);
+                cb.addItem(COMPONENT_CB3);
+                message[2] = cb;
+
+                message[3] = COMPONENT_MESSAGE_2;
+
+                // Options
+                String[] options = {
+                    COMPONENT_OP1, COMPONENT_OP2, COMPONENT_OP3, COMPONENT_OP4, COMPONENT_OP5};
+                int result = JOptionPane.showOptionDialog(
+                        OptionPaneDemo.this, // the parent that the dialog blocks
+                        message, // the dialog message array
+                        COMPONENT_TITLE, // the title of the dialog window
+                        JOptionPane.DEFAULT_OPTION, // option type
+                        JOptionPane.INFORMATION_MESSAGE, // message type
+                        null, // optional icon, use null to use the default icon
+                        options, // options string array, will be made into buttons
+                        options[3] // option that should be made into a default button
+                );
+                switch (result) {
+                    case 0: // yes
+                        JOptionPane.showMessageDialog(OptionPaneDemo.this, COMPONENT_R1);
+                        break;
+                    case 1: // no
+                        JOptionPane.showMessageDialog(OptionPaneDemo.this, COMPONENT_R2);
+                        break;
+                    case 2: // maybe
+                        JOptionPane.showMessageDialog(OptionPaneDemo.this, COMPONENT_R3);
+                        break;
+                    case 3: // probably
+                        JOptionPane.showMessageDialog(OptionPaneDemo.this, COMPONENT_R4);
+                        break;
+                    default:
+                        break;
+                }
+
+            }
+        };
+        return createButton(a);
+    }
+
+    private JButton createButton(Action a) {
+        JButton b = new JButton() {
+            @Override
+            public Dimension getMaximumSize() {
+                int width = Short.MAX_VALUE;
+                int height = super.getMaximumSize().height;
+                return new Dimension(width, height);
+            }
+        };
+        // setting the following client property informs the button to show
+        // the action text as it's name. The default is to not show the
+        // action text.
+        b.putClientProperty("displayActionText", Boolean.TRUE);
+        b.setAction(a);
+        // b.setAlignmentX(JButton.CENTER_ALIGNMENT);
+        return b;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/resources/OptionPaneDemo.properties	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,42 @@
+### OptionPane Demo ###
+
+OptionPaneDemo.accessible_description=The OptionPane Demo shows examples of using JOptionPane to generate different common option dialog boxes
+OptionPaneDemo.tooltip=JOptionPane Demo
+OptionPaneDemo.name=Option Pane Demo
+
+OptionPaneDemo.warningbutton=Show Warning Dialog
+OptionPaneDemo.componentbutton=Show Component Dialog
+OptionPaneDemo.inputbutton=Show Input Dialog
+OptionPaneDemo.confirmbutton=Show Confirmation Dialog
+OptionPaneDemo.messagebutton=Show Message Dialog
+
+OptionPaneDemo.warningtitle=Warning Dialog Example
+OptionPaneDemo.warningtext=<html><P><font color=black>This is a test of the <font color=red><b>Emergency Broadcast System</b></font>. <i><b>This is <br> only a test</b></i>.  The webmaster of your local intranet, in voluntary <br> cooperation with the <font color=blue><b>Federal</b></font> and <font color=blue><b>State</b></font> authorities, have <br> developed this system to keep you informed in the event of an <br> emergency. If this had been an actual emergency, the signal you <br> just heard would have been followed by official information, news <br> or instructions. This concludes this test of the <font color=red><b>Emergency <br> Broadcast System</b></font>.</font></P><P><br>Developer Note: This dialog demo used HTML for text formatting.</P></html>
+
+OptionPaneDemo.messagetext=Message in a Bottle (yeah)
+
+OptionPaneDemo.confirmquestion=Is the sun shining outside today?
+OptionPaneDemo.confirmyes=<html>Well what are you doing playing on the computer?<br> Get outside! Take a trip to the beach! Get a little sun!</html>
+OptionPaneDemo.confirmno=Well good thing you're inside protected from the elements!
+
+OptionPaneDemo.inputquestion=What is your favorite movie?
+OptionPaneDemo.inputresponse=That was a pretty good movie!
+
+OptionPaneDemo.componenttitle=Component Dialog Example
+OptionPaneDemo.componentmessage=<html>JOptionPane can contain as many components <br> as you want, such as a text field:</html>
+OptionPaneDemo.componenttextfield=or a combobox:
+OptionPaneDemo.component_cb1=item 1
+OptionPaneDemo.component_cb2=item 2
+OptionPaneDemo.component_cb3=item 3
+OptionPaneDemo.componentmessage2=<html>JOptionPane can also show as many options <br> as you want:</html>
+OptionPaneDemo.component_op1=Yes
+OptionPaneDemo.component_op2=No
+OptionPaneDemo.component_op3=Maybe
+OptionPaneDemo.component_op4=Probably
+OptionPaneDemo.component_op5=Cancel
+
+OptionPaneDemo.component_r1=Upbeat and positive! I like that! Good choice.
+OptionPaneDemo.component_r2=Definitely not, I wouldn't do it either.
+OptionPaneDemo.component_r3=<html><font color=black> Mmmm.. yes, the situation is unclear at this <br> time. Check back when you know for sure.</font></html>
+OptionPaneDemo.component_r4=<html><font color=black>You know you want to. I think you should <br> have gone for broke and pressed "Yes".</font></html>
+
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/resources/images/OptionPaneDemo.gif has changed
Binary file test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/optionpane/resources/images/bottle.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/progressbar/ProgressBarDemo.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.swingset3.demos.progressbar;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import javax.swing.*;
+import javax.swing.border.BevelBorder;
+import javax.swing.border.SoftBevelBorder;
+
+import com.sun.swingset3.DemoProperties;
+import com.sun.swingset3.demos.ResourceManager;
+
+/**
+ * JProgressBar Demo
+ *
+ * @version 1.12 11/17/05
+ * @author Jeff Dinkins # @author Peter Korn (accessibility support)
+ */
+@DemoProperties(
+        value = "ProgressBar Demo",
+        category = "Controls",
+        description = "Demonstrates the JProgressBar, a control which displays progress to the user",
+        sourceFiles = {
+            "com/sun/swingset3/demos/progressbar/ProgressBarDemo.java",
+            "com/sun/swingset3/demos/ResourceManager.java",
+            "com/sun/swingset3/demos/progressbar/resources/ProgressBarDemo.properties",
+            "com/sun/swingset3/demos/progressbar/resources/images/ProgressBarDemo.gif"
+        }
+)
+public class ProgressBarDemo extends JPanel {
+
+    private static final ResourceManager resourceManager = new ResourceManager(ProgressBarDemo.class);
+    public static final String STOP_BUTTON = resourceManager.getString("ProgressBarDemo.stop_button");
+    public static final String START_BUTTON = resourceManager.getString("ProgressBarDemo.start_button");
+    public static final String DEMO_TITLE = ProgressBarDemo.class.getAnnotation(DemoProperties.class).value();
+
+    /**
+     * main method allows us to run as a standalone demo.
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        JFrame frame = new JFrame(DEMO_TITLE);
+
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.getContentPane().add(new ProgressBarDemo());
+        frame.setPreferredSize(new Dimension(800, 600));
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+    }
+
+    /**
+     * ProgressBarDemo Constructor
+     */
+    public ProgressBarDemo() {
+        createProgressPanel();
+    }
+
+    private final javax.swing.Timer timer = new javax.swing.Timer(18, createTextLoadAction());
+    private Action loadAction;
+    private Action stopAction;
+    private JProgressBar progressBar;
+    private JTextArea progressTextArea;
+
+    private void createProgressPanel() {
+        setLayout(new BorderLayout());
+
+        JPanel textWrapper = new JPanel(new BorderLayout());
+        textWrapper.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
+        textWrapper.setAlignmentX(LEFT_ALIGNMENT);
+        progressTextArea = new MyTextArea();
+
+        progressTextArea.getAccessibleContext().setAccessibleName(
+                resourceManager.getString("ProgressBarDemo.accessible_text_area_name"));
+        progressTextArea.getAccessibleContext().setAccessibleDescription(
+                resourceManager.getString("ProgressBarDemo.accessible_text_area_description"));
+        textWrapper.add(new JScrollPane(progressTextArea), BorderLayout.CENTER);
+
+        add(textWrapper, BorderLayout.CENTER);
+
+        JPanel progressPanel = new JPanel();
+        add(progressPanel, BorderLayout.SOUTH);
+
+        progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, text.length()) {
+            @Override
+            public Dimension getPreferredSize() {
+                return new Dimension(300, super.getPreferredSize().height);
+            }