changeset 4067:dce8f810aa88

Automated merge with ssh://jfxsrc.us.oracle.com//javafx/8.0/MASTER/jfx/rt
author David Grieve<david.grieve@oracle.com>
date Wed, 26 Jun 2013 11:06:51 -0400
parents 354decadfe6c 1c00e6382807
children a107004cac76
files
diffstat 59 files changed, 7366 insertions(+), 267 deletions(-) [+]
line wrap: on
line diff
--- a/javafx-ui-charts/src/javafx/scene/chart/XYChart.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-charts/src/javafx/scene/chart/XYChart.java	Wed Jun 26 11:06:51 2013 -0400
@@ -1258,7 +1258,9 @@
         public final void setXValue(X value) {
             xValue.set(value);
             // handle the case where this is a init because the default constructor was used
-            if (currentX.get() == null) currentX.setValue(value);
+            // and the case when series is not associated to a chart due to a remove series
+            if (currentX.get() == null ||
+                    (series != null && series.getChart() == null)) currentX.setValue(value);
         }
         /** 
          * The generic data value to be plotted on the X axis.
@@ -1303,7 +1305,10 @@
         public final void setYValue(Y value) {
             yValue.set(value);
             // handle the case where this is a init because the default constructor was used
-            if (currentY.get() == null) currentY.setValue(value);
+            // and the case when series is not associated to a chart due to a remove series
+            if (currentY.get() == null || 
+                    (series != null && series.getChart() == null)) currentY.setValue(value);
+            
         }
         /** 
          * The generic data value to be plotted on the Y axis.
--- a/javafx-ui-charts/test/javafx/scene/chart/ChartTestBase.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-charts/test/javafx/scene/chart/ChartTestBase.java	Wed Jun 26 11:06:51 2013 -0400
@@ -74,6 +74,22 @@
         toolkit.fireTestPulse();
     }
     
+    protected Scene getTestScene() {
+        return this.scene;
+    }
+    
+    protected void setTestScene(Scene scene) {
+        this.scene = scene;
+    }
+    
+    protected Stage getTestStage() {
+        return this.stage;
+    }
+    
+    protected void setTestStage(Stage stage) {
+        this.stage = stage;
+    }
+    
     protected abstract Chart createChart();
     
     StringBuffer computeSVGPath(Path line) {
--- a/javafx-ui-charts/test/javafx/scene/chart/LineChartTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-charts/test/javafx/scene/chart/LineChartTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -61,7 +61,6 @@
         yAxis.setLabel("Y Axis");
         lineChart.setTitle("HelloLineChart");
         // add starting data
-        ObservableList<XYChart.Data> data = FXCollections.observableArrayList();
         series1.getData().add(new XYChart.Data(10d, 10d));
         series1.getData().add(new XYChart.Data(25d, 20d));
         series1.getData().add(new XYChart.Data(30d, 15d));
@@ -113,4 +112,53 @@
          lineChart.getData().addAll(series1);
          assertEquals(5, countSymbols(lineChart, "chart-line-symbol"));
      }
+     
+    @Test
+    public void testDataItemAdd() {
+        startApp();
+        lineChart.getData().addAll(series1);
+        pulse();
+        series1.getData().add(new XYChart.Data(60d, 30d));
+        pulse();
+        // 5 stackpane nodes and 1 path node + new stackpane for data added
+        assertEquals(7, lineChart.getPlotChildren().size());
+    }
+    
+     @Test
+    public void testDataItemAddWithAnimation() {
+        startApp();
+        lineChart.setAnimated(true);
+        lineChart.getData().addAll(series1);
+        pulse();
+        series1.getData().add(new XYChart.Data(60d, 30d));
+        pulse();
+        // 5 stackpane nodes and 1 path node + new stackpane for data added
+        assertEquals(7, lineChart.getPlotChildren().size());
+    }
+      
+    @Test
+    public void testDataItemRemove() {
+        startApp();
+        lineChart.getData().addAll(series1);
+        pulse();
+        if (!lineChart.getData().isEmpty()) {
+            series1.getData().remove(0);
+            pulse();
+            // 4 stackpane nodes and one path node
+            assertEquals(5, lineChart.getPlotChildren().size());
+        }
+    }
+     
+     @Test
+    public void testSeriesAddWithAnimation() {
+        startApp();
+        lineChart.setAnimated(true);
+        final XYChart.Series<Number, Number> series2 = new XYChart.Series<Number, Number>();
+        series1.getData().add(new XYChart.Data(15d, 40d));
+        series1.getData().add(new XYChart.Data(25d, 10d));
+        series1.getData().add(new XYChart.Data(40d, 35d));
+        lineChart.getData().addAll(series1);
+        pulse();
+        assertEquals(true, lineChart.getAnimated());
+    }
 }
--- a/javafx-ui-charts/test/javafx/scene/chart/PieChartTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-charts/test/javafx/scene/chart/PieChartTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -86,4 +86,18 @@
         }
     }
     
+    @Test
+    public void testDataItemRemovedWithAnimation() {
+        startApp();
+        data.add(new PieChart.Data("Sun", 20));
+        data.add(new PieChart.Data("IBM", 12));
+        data.add(new PieChart.Data("HP", 25));
+        data.add(new PieChart.Data("Dell", 22));
+        data.add(new PieChart.Data("Apple", 30));
+        pc.setAnimated(true);
+        pc.getData().addAll(data);
+        pc.getData().remove(0);
+        assertEquals(4, pc.getData().size());
+    }
+    
 }
--- a/javafx-ui-charts/test/javafx/scene/chart/XYChartTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-charts/test/javafx/scene/chart/XYChartTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -34,10 +34,13 @@
 import javafx.css.StyleableProperty;
 import com.sun.javafx.css.parser.CSSParser;
 import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.layout.StackPane;
 import javafx.scene.paint.Color;
 
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
+import javafx.stage.Stage;
 import org.junit.Assert;
 import static org.junit.Assert.assertEquals;
 
@@ -109,4 +112,19 @@
             }
         }
     }
+    
+    @Test public void testAddAxisWithoutSpecifyingSide() {
+        final NumberAxis axis = new NumberAxis(0, 12, 1);
+        axis.setMaxWidth(Double.MAX_VALUE);
+        axis.setPrefWidth(400);
+        pulse();
+        StackPane layout = new StackPane();
+        layout.getChildren().addAll(axis);
+        pulse();
+        setTestScene(new Scene(layout));
+        setTestStage(new Stage());
+        getTestStage().setScene(getTestScene());
+        getTestStage().show();
+        pulse();
+    }
 }
--- a/javafx-ui-common/src/javafx/css/StyleableBooleanProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableBooleanProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -86,7 +86,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
 }
--- a/javafx-ui-common/src/javafx/css/StyleableDoubleProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableDoubleProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -85,7 +85,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
 }
--- a/javafx-ui-common/src/javafx/css/StyleableFloatProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableFloatProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -85,7 +85,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
     
--- a/javafx-ui-common/src/javafx/css/StyleableIntegerProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableIntegerProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -85,7 +85,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
     
--- a/javafx-ui-common/src/javafx/css/StyleableLongProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableLongProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -85,7 +85,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
     
--- a/javafx-ui-common/src/javafx/css/StyleableObjectProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableObjectProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -85,7 +85,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
 
--- a/javafx-ui-common/src/javafx/css/StyleableStringProperty.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/css/StyleableStringProperty.java	Wed Jun 26 11:06:51 2013 -0400
@@ -87,7 +87,7 @@
     
     /** {@inheritDoc} */
     @Override
-    public final StyleOrigin getStyleOrigin() { return origin; }
+    public StyleOrigin getStyleOrigin() { return origin; }
 
     private StyleOrigin origin = null;    
     
--- a/javafx-ui-common/src/javafx/scene/CssStyleHelper.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/src/javafx/scene/CssStyleHelper.java	Wed Jun 26 11:06:51 2013 -0400
@@ -233,7 +233,7 @@
             this.fontProp = styleableFontProperty;
             this.fontSizeCache = new HashMap<>();
 
-            this.cssSetProperties = new HashMap<String,StyleableProperty>();
+            this.cssSetProperties = new HashMap<>();
 
         }
 
@@ -267,7 +267,7 @@
         // Any properties that have been set by this style helper are tracked
         // here so the property can be reset without expanding properties that
         // were not set by css.
-        private Map<String, StyleableProperty> cssSetProperties;
+        private Map<CssMetaData, CalculatedValue> cssSetProperties;
     }
 
     private void resetToInitialValues(Styleable styleable) {
@@ -276,16 +276,15 @@
                 cacheContainer.cssSetProperties == null ||
                 cacheContainer.cssSetProperties.isEmpty()) return;
 
-        for (StyleableProperty styleableProperty : cacheContainer.cssSetProperties.values()) {
-            final StyleOrigin origin = styleableProperty.getStyleOrigin();
-            if (origin != null && origin != StyleOrigin.USER) {
-                // If a property is never set by the user or by CSS, then
-                // the StyleOrigin of the property is null. So, passing null
-                // here makes the property look (to CSS) like it was
-                // initialized but never used.
-                CssMetaData metaData = styleableProperty.getCssMetaData();
-                Object value = metaData.getInitialValue(styleable);
-                styleableProperty.applyStyle(null, value);
+        for (Entry<CssMetaData, CalculatedValue> resetValues : cacheContainer.cssSetProperties.entrySet()) {
+
+            final CssMetaData metaData = resetValues.getKey();
+            final StyleableProperty styleableProperty = metaData.getStyleableProperty(styleable);
+
+            final StyleOrigin styleOrigin = styleableProperty.getStyleOrigin();
+            if (styleOrigin != null && styleOrigin != StyleOrigin.USER) {
+                final CalculatedValue calculatedValue = resetValues.getValue();
+                styleableProperty.applyStyle(calculatedValue.getOrigin(), calculatedValue.getValue());
             }
         }
     }
@@ -537,14 +536,6 @@
             // from two places in this try block.
             try {
 
-                // cssSetProperties keeps track of the StyleableProperty's that were set by CSS in the previous state.
-                // If this property is not in cssSetProperties map, then the property was not set in the previous state.
-                // This accomplishes two things. First, it lets us know if the property was set in the previous state
-                // so it can be reset in this state if there is no value for it. Second, it calling
-                // CssMetaData#getStyleableProperty which is rather expensive as it may cause expansion of lazy
-                // properties.
-                StyleableProperty styleableProperty = cacheContainer.cssSetProperties.get(property);
-
                 //
                 // RT-19089
                 // If the current value of the property was set by CSS
@@ -554,13 +545,21 @@
                 //
                 if (calculatedValue == null || calculatedValue == SKIP) {
 
+                    // cssSetProperties keeps track of the StyleableProperty's that were set by CSS in the previous state.
+                    // If this property is not in cssSetProperties map, then the property was not set in the previous state.
+                    // This accomplishes two things. First, it lets us know if the property was set in the previous state
+                    // so it can be reset in this state if there is no value for it. Second, it calling
+                    // CssMetaData#getStyleableProperty which is rather expensive as it may cause expansion of lazy
+                    // properties.
+                    CalculatedValue initialValue = cacheContainer.cssSetProperties.get(cssMetaData);
+
                     // if the current value was set by CSS and there
                     // is no calculated value for the property, then
                     // there was no style for the property in the current
                     // state, so reset the property to its initial value.
-                    if (styleableProperty != null) {
-                        Object initial = cssMetaData.getInitialValue(node);
-                        styleableProperty.applyStyle(null, initial);
+                    if (initialValue != null) {
+                        StyleableProperty styleableProperty = cssMetaData.getStyleableProperty(node);
+                        styleableProperty.applyStyle(initialValue.getOrigin(), initialValue.getValue());
                     }
 
                     continue;
@@ -574,11 +573,7 @@
                     cacheEntry.put(property, calculatedValue);
                 }
 
-                if (styleableProperty == null) {
-                    styleableProperty = cssMetaData.getStyleableProperty(node);
-                    // track this property
-                    cacheContainer.cssSetProperties.put(property, styleableProperty);
-                }
+                StyleableProperty styleableProperty = cssMetaData.getStyleableProperty(node);
 
                 // need to know who set the current value - CSS, the user, or init
                 final StyleOrigin originOfCurrentValue = styleableProperty.getStyleOrigin();
@@ -620,6 +615,13 @@
                     }
 
                     styleableProperty.applyStyle(originOfCalculatedValue, value);
+
+                    if (cacheContainer.cssSetProperties.containsKey(cssMetaData) == false) {
+                        // track this property
+                        CalculatedValue initialValue = new CalculatedValue(currentValue, originOfCurrentValue, false);
+                        cacheContainer.cssSetProperties.put(cssMetaData, initialValue);
+                    }
+
                 }
 
                 if (observableStyleMap != null) {
@@ -632,12 +634,6 @@
                 // the value to initial and thereafter skip setting the property
                 cacheEntry.put(property, null);
 
-                StyleableProperty styleableProperty = cacheContainer.cssSetProperties.remove(property);
-                if (styleableProperty != null) {
-                    Object value = cssMetaData.getInitialValue(node);
-                    styleableProperty.applyStyle(null, value);
-                }
-
                 List<CssError> errors = null;
                 if ((errors = StyleManager.getErrors()) != null) {
                     final String msg = String.format("Failed to set css [%s] due to %s\n", cssMetaData, e.getMessage());
@@ -1482,17 +1478,13 @@
         // cvFont is returned.
         CalculatedValue cvFont = null;
 
-        // Whether or not to look past the current node for inherited styles
-        // Will be false if the user set the font or there is a font-shorthand
-        boolean lookupInherited = true;
-
         Set<PseudoClass> states = styleable.pseudoClassStates;
 
         // RT-20145 - if looking for font size and the node has a font,
         // use the font property's value if it was set by the user and
         // there is not an inline or author style.
 
-        if (lookupForFontCache && cacheContainer.fontProp != null) {
+        if (cacheContainer.fontProp != null) {
             StyleableProperty<Font> styleableProp = cacheContainer.fontProp.getStyleableProperty(styleable);
             StyleOrigin fpOrigin = styleableProp.getStyleOrigin();
             if (fpOrigin == StyleOrigin.USER) {
@@ -1506,7 +1498,7 @@
         // Look up the font- properties
         //
         CascadingStyle fontShorthand = getStyle(styleable, property, states);
-        if (fontShorthand == null && lookupForFontCache == false) {
+        if (fontShorthand == null) {
 
             Node parent = styleable != null ? styleable.getParent() : null;
 
@@ -1564,32 +1556,36 @@
         }
 
         CascadingStyle fontSize = getStyle(styleable, property.concat("-size"), states);
-        if (fontSize == null && lookupForFontCache == false) {
+        if (fontSize == null) {
             fontSize = lookupInheritedFont(styleable, property.concat("-size"), distance);
         }
 
         // font-size must be closer and more specific than font shorthand
         if (fontSize != null) {
 
-            if (origin == null || origin.compareTo(fontSize.getOrigin()) <= 0) {
+            if (fontShorthand == null || fontShorthand.compareTo(fontSize) > 0) {
 
-                final CalculatedValue cv =
-                        calculateValue(fontSize, styleable, dummyFontProperty,
-                                       states, styleable, cvFont, styleList);
+                if (origin == null || origin.compareTo(fontSize.getOrigin()) <= 0) {
 
-                if (cv.getValue() instanceof Double) {
-                    origin = cv.getOrigin();
+                    final CalculatedValue cv =
+                            calculateValue(fontSize, styleable, dummyFontProperty,
+                                    states, styleable, cvFont, styleList);
 
-                    if (cvFont != null) {
-                        boolean isRelative = cvFont.isRelative() || cv.isRelative();
-                        Font font = deriveFont((Font) cvFont.getValue(), ((Double) cv.getValue()).doubleValue());
-                        cvFont = new CalculatedValue(font, origin, isRelative);
-                    } else {
-                        boolean isRelative = cv.isRelative();
-                        Font font = deriveFont(Font.getDefault(), ((Double) cv.getValue()).doubleValue());
-                        cvFont = new CalculatedValue(font, origin, isRelative);
+                    if (cv.getValue() instanceof Double) {
+                        origin = cv.getOrigin();
+
+                        if (cvFont != null) {
+                            boolean isRelative = cvFont.isRelative() || cv.isRelative();
+                            Font font = deriveFont((Font) cvFont.getValue(), ((Double) cv.getValue()).doubleValue());
+                            cvFont = new CalculatedValue(font, origin, isRelative);
+                        } else {
+                            boolean isRelative = cv.isRelative();
+                            Font font = deriveFont(Font.getDefault(), ((Double) cv.getValue()).doubleValue());
+                            cvFont = new CalculatedValue(font, origin, isRelative);
+                        }
                     }
                 }
+
             }
 
         }
@@ -1603,22 +1599,25 @@
 
             if (fontWeight != null) {
 
-                if (origin == null || origin.compareTo(fontWeight.getOrigin()) <= 0) {
+                if (fontShorthand == null || fontShorthand.compareTo(fontWeight) > 0) {
 
-                    final CalculatedValue cv =
-                            calculateValue(fontWeight, styleable, dummyFontProperty,
-                                           states, styleable, null, null);
+                    if (origin == null || origin.compareTo(fontWeight.getOrigin()) <= 0) {
 
-                    if (cv.getValue() instanceof FontWeight) {
-                        origin = cv.getOrigin();
+                        final CalculatedValue cv =
+                                calculateValue(fontWeight, styleable, dummyFontProperty,
+                                        states, styleable, null, null);
 
-                        if (cvFont != null) {
-                            boolean isRelative = cvFont.isRelative();
-                            Font font = deriveFont((Font) cvFont.getValue(), (FontWeight) cv.getValue());
-                            cvFont = new CalculatedValue(font, origin, isRelative);
-                        } else {
-                            Font font = deriveFont(Font.getDefault(), (FontWeight) cv.getValue());
-                            cvFont = new CalculatedValue(font, origin, false);
+                        if (cv.getValue() instanceof FontWeight) {
+                            origin = cv.getOrigin();
+
+                            if (cvFont != null) {
+                                boolean isRelative = cvFont.isRelative();
+                                Font font = deriveFont((Font) cvFont.getValue(), (FontWeight) cv.getValue());
+                                cvFont = new CalculatedValue(font, origin, isRelative);
+                            } else {
+                                Font font = deriveFont(Font.getDefault(), (FontWeight) cv.getValue());
+                                cvFont = new CalculatedValue(font, origin, false);
+                            }
                         }
                     }
                 }
@@ -1632,27 +1631,30 @@
 
             if (fontStyle != null) {
 
-                if (origin == null || origin.compareTo(fontStyle.getOrigin()) <= 0) {
+                if (fontShorthand == null || fontShorthand.compareTo(fontStyle) > 0) {
 
-                    final CalculatedValue cv =
-                            calculateValue(fontStyle, styleable, dummyFontProperty,
-                                           states, styleable, null, null);
+                    if (origin == null || origin.compareTo(fontStyle.getOrigin()) <= 0) {
 
-                    if (cv.getValue() instanceof FontPosture) {
-                        origin = cv.getOrigin();
+                        final CalculatedValue cv =
+                                calculateValue(fontStyle, styleable, dummyFontProperty,
+                                        states, styleable, null, null);
 
-                        if (cvFont != null) {
-                            boolean isRelative = cvFont.isRelative();
-                            Font font = deriveFont((Font) cvFont.getValue(), (FontPosture) cv.getValue());
-                            cvFont = new CalculatedValue(font, origin, isRelative);
-                        } else {
-                            boolean isRelative = cv.isRelative();
-                            Font font = deriveFont(Font.getDefault(), (FontPosture) cv.getValue());
-                            cvFont = new CalculatedValue(font, origin, false);
+                        if (cv.getValue() instanceof FontPosture) {
+                            origin = cv.getOrigin();
+
+                            if (cvFont != null) {
+                                boolean isRelative = cvFont.isRelative();
+                                Font font = deriveFont((Font) cvFont.getValue(), (FontPosture) cv.getValue());
+                                cvFont = new CalculatedValue(font, origin, isRelative);
+                            } else {
+                                boolean isRelative = cv.isRelative();
+                                Font font = deriveFont(Font.getDefault(), (FontPosture) cv.getValue());
+                                cvFont = new CalculatedValue(font, origin, false);
+                            }
                         }
                     }
+
                 }
-
             }
 
             CascadingStyle fontFamily = getStyle(styleable, property.concat("-family"), states);
@@ -1662,22 +1664,25 @@
 
             if (fontFamily != null) {
 
-                if (origin == null || origin.compareTo(fontFamily.getOrigin()) <= 0) {
+                if (fontShorthand == null || fontShorthand.compareTo(fontFamily) > 0) {
 
-                    final CalculatedValue cv =
-                            calculateValue(fontFamily, styleable, dummyFontProperty,
-                                           states, styleable, null, null);
+                    if (origin == null || origin.compareTo(fontFamily.getOrigin()) <= 0) {
 
-                    if (cv.getValue() instanceof String) {
-                        origin = cv.getOrigin();
+                        final CalculatedValue cv =
+                                calculateValue(fontFamily, styleable, dummyFontProperty,
+                                        states, styleable, null, null);
 
-                        if (cvFont != null) {
-                            boolean isRelative = cvFont.isRelative();
-                            Font font = deriveFont((Font) cvFont.getValue(), (String) cv.getValue());
-                            cvFont = new CalculatedValue(font, origin, isRelative);
-                        } else {
-                            Font font = deriveFont(Font.getDefault(), (String) cv.getValue());
-                            cvFont = new CalculatedValue(font, origin, false);
+                        if (cv.getValue() instanceof String) {
+                            origin = cv.getOrigin();
+
+                            if (cvFont != null) {
+                                boolean isRelative = cvFont.isRelative();
+                                Font font = deriveFont((Font) cvFont.getValue(), (String) cv.getValue());
+                                cvFont = new CalculatedValue(font, origin, isRelative);
+                            } else {
+                                Font font = deriveFont(Font.getDefault(), (String) cv.getValue());
+                                cvFont = new CalculatedValue(font, origin, false);
+                            }
                         }
                     }
                 }
@@ -1685,12 +1690,23 @@
             }
         }
 
+        // If cvFont is null, then the node doesn't have a font property and
+        // there are no font styles.
+        // If cvFont is not null but the origin is null, then cvFont is from
+        // font property that hasn't been set by the user or by css.
+        // If the origin is USER, then skip the value.
         if (cvFont != null) {
-            return cvFont;
 
-        } else {
-            return SKIP;
+            if (lookupForFontCache) {
+                return cvFont;
+
+            } else if (origin != null && origin != StyleOrigin.USER) {
+                return cvFont;
+
+            }
         }
+
+        return SKIP;
     }
 
     /**
--- a/javafx-ui-common/test/unit/com/sun/javafx/css/FontTypeTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/test/unit/com/sun/javafx/css/FontTypeTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -29,9 +29,13 @@
 import com.sun.javafx.css.converters.SizeConverter;
 import com.sun.javafx.css.parser.CSSParser;
 import javafx.css.ParsedValue;
+import javafx.scene.Group;
+import javafx.scene.Scene;
 import javafx.scene.text.Font;
 import javafx.scene.text.FontPosture;
 import javafx.scene.text.FontWeight;
+import javafx.scene.text.Text;
+
 import static org.junit.Assert.assertEquals;
 import org.junit.Test;
 
@@ -142,6 +146,79 @@
         assertEquals("Regular", f.getStyle());
         assertEquals("Amble", f.getFamily());
         assertEquals(24, f.getSize(),0);
-    }    
+    }
+
+    @Test public void test_RT_25355_shorthandLast() {
+
+        Text txt = new Text("test_RT_25355");
+        txt.setStyle("-fx-font-weight: bold; -fx-font: 16 Amble;");
+
+        Scene scene  = new Scene(new Group());
+        ((Group)scene.getRoot()).getChildren().add(txt);
+
+        txt.impl_processCSS(true);
+
+        Font f = txt.getFont();
+        assertEquals("Regular", f.getStyle());
+        assertEquals("Amble", f.getFamily());
+        assertEquals(16, f.getSize(),0);
+    }
+
+    @Test public void test_RT_25355_shorthandFirst() {
+
+        Text txt = new Text("test_RT_25355");
+        txt.setStyle("-fx-font: 16 Amble; -fx-font-weight: bold;");
+
+        Scene scene  = new Scene(new Group());
+        ((Group)scene.getRoot()).getChildren().add(txt);
+
+        txt.impl_processCSS(true);
+
+        Font f = txt.getFont();
+        assertEquals("Bold", f.getStyle());
+        assertEquals("Amble", f.getFamily());
+        assertEquals(16, f.getSize(),0);
+
+    }
+
+    @Test public void test_RT_25355_shorthandFirstInheritedWeight() {
+
+        Text txt = new Text("test_RT_25355");
+        txt.setStyle("-fx-font: 16 Amble;");
+
+        Group g = new Group();
+        g.setStyle("-fx-font-weight: bold");
+
+        Scene scene  = new Scene(g);
+        g.getChildren().add(txt);
+
+        g.impl_processCSS(true);
+
+        Font f = txt.getFont();
+        assertEquals("Regular", f.getStyle());
+        assertEquals("Amble", f.getFamily());
+        assertEquals(16, f.getSize(),0);
+
+    }
+
+    @Test public void test_RT_25355_weightFirstInheritedShorthand() {
+
+        Text txt = new Text("test_RT_25355");
+        txt.setStyle("-fx-font-weight: bold;");
+
+        Group g = new Group();
+        g.setStyle("-fx-font: 16 Amble;");
+
+        Scene scene  = new Scene(g);
+        g.getChildren().add(txt);
+
+        g.impl_processCSS(true);
+
+        Font f = txt.getFont();
+        assertEquals("Bold", f.getStyle());
+        assertEquals("Amble", f.getFamily());
+        assertEquals(16, f.getSize(),0);
+
+    }
 
 }
--- a/javafx-ui-common/test/unit/com/sun/javafx/css/PseudoClassTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-common/test/unit/com/sun/javafx/css/PseudoClassTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -321,8 +321,38 @@
         }
                         
         assertTrue(bStates.containsAll(aStates) == false);
-    }        
-        
+    }
+
+    @Test
+    public void testPseudoClassState_containsAll_whenOneSetEmpty() {
+
+        String[] setA = new String[] {
+                "zero", "one", "two", "three"
+        };
+
+        PseudoClassState aStates = new PseudoClassState();
+        for(int n=0; n<setA.length; n++) {
+            aStates.add(PseudoClass.getPseudoClass(setA[n]));
+        }
+
+        PseudoClassState bStates = new PseudoClassState();
+
+        assertTrue(bStates.containsAll(aStates) == false);
+        assertTrue(aStates.containsAll(bStates));
+
+    }
+
+    @Test
+    public void testPseudoClassState_containsAll_whenBothSetsEmpty() {
+
+        PseudoClassState aStates = new PseudoClassState();
+        PseudoClassState bStates = new PseudoClassState();
+
+        assertTrue(bStates.containsAll(aStates));
+        assertTrue(aStates.containsAll(bStates));
+
+    }
+
     @Test
     public void testPseudoClassState_size() {
         
--- a/javafx-ui-controls/src/javafx/scene/chart/Axis.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/chart/Axis.java	Wed Jun 26 11:06:51 2013 -0400
@@ -541,9 +541,11 @@
      */
     @Override protected double computePrefHeight(double width) {
         final Side side = getSide();
-        if (side == null) {
-            return 50;
-        } else if (side.equals(Side.TOP) || side.equals(Side.BOTTOM)) { // HORIZONTAL
+        if (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) { // VERTICAL
+            // TODO for now we have no hard and fast answer here, I guess it should work
+            // TODO out the minimum size needed to display min, max and zero tick mark labels.
+            return 100;
+        } else { // HORIZONTAL
             // we need to first auto range as this may/will effect tick marks
             Object range = autoRange(width);
             // calculate max tick label height
@@ -562,11 +564,7 @@
                     axisLabel.getText() == null || axisLabel.getText().length() == 0 ?
                     0 : axisLabel.prefHeight(-1);
             return maxLabelHeight + getTickLabelGap() + tickMarkLength + labelHeight;
-        } else { // VERTICAL
-            // TODO for now we have no hard and fast answer here, I guess it should work
-            // TODO out the minimum size needed to display min, max and zero tick mark labels.
-            return 100;
-        }
+        } 
     }
 
     /**
@@ -578,13 +576,7 @@
      */
     @Override protected double computePrefWidth(double height) {
         final Side side = getSide();
-        if (side == null) {
-            return 50;
-        } else if (side.equals(Side.TOP) || side.equals(Side.BOTTOM)) { // HORIZONTAL
-            // TODO for now we have no hard and fast answer here, I guess it should work
-            // TODO out the minimum size needed to display min, max and zero tick mark labels.
-            return 100;
-        } else { // VERTICAL
+        if (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) { // VERTICAL
             // we need to first auto range as this may/will effect tick marks
             Object range = autoRange(height);
             // calculate max tick label width
@@ -603,7 +595,11 @@
                     axisLabel.getText() == null || axisLabel.getText().length() == 0 ?
                     0 : axisLabel.prefHeight(-1);
             return maxLabelWidth + getTickLabelGap() + tickMarkLength + labelHeight;
-        }
+        } else  { // HORIZONTAL
+            // TODO for now we have no hard and fast answer here, I guess it should work
+            // TODO out the minimum size needed to display min, max and zero tick mark labels.
+            return 100;
+        } 
     }
 
     /**
@@ -622,7 +618,7 @@
         final boolean isFirstPass = oldLength == 0;
         // auto range if it is not valid
         final Side side = getSide();
-        final double length = (Side.TOP.equals(side) || Side.BOTTOM.equals(side)) ? width : height;
+        final double length = (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) ? height : width;
         int numLabelsToSkip = 1;
         int tickIndex = 0;
         if (oldLength != length || !isRangeValid() || tickPropertyChanged || formatterValid) {
@@ -641,18 +637,15 @@
 
              // calculate maxLabelWidth / maxLabelHeight for respective orientations
             maxWidth = 0; maxHeight = 0;
-            if (side != null) {
-                if (Side.TOP.equals(side) || Side.BOTTOM.equals(side)) {
-                    for (T value: newTickValues) {
-                        maxWidth = Math.round(Math.max(maxWidth, measureTickMarkSize(value, range).getWidth()));
-                    }
-                } else {
-                    for (T value: newTickValues) {
-                        maxHeight = Math.round(Math.max(maxHeight, measureTickMarkSize(value, range).getHeight()));
-                    }
+            if (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) {
+                for (T value: newTickValues) {
+                    maxHeight = Math.round(Math.max(maxHeight, measureTickMarkSize(value, range).getHeight()));
+                }
+            } else {
+                for (T value: newTickValues) {
+                    maxWidth = Math.round(Math.max(maxWidth, measureTickMarkSize(value, range).getWidth()));
                 }
             }
-           
             // we have to work out what new or removed tick marks there are, then create new tick marks and their
             // text nodes where needed
             // find everything added or removed
@@ -736,21 +729,18 @@
 
         // RT-12272 : tick labels overlapping
         int numLabels = 0;
-        if (side != null) {
-            if (Side.TOP.equals(side) || Side.BOTTOM.equals(side)) {
-                numLabels = (maxWidth > 0) ? (int)(length/maxWidth) : 0;
-            } else {
-                numLabels = (maxHeight > 0) ? (int) (length/maxHeight) : 0;
-            }
+        if (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) {
+            numLabels = (maxHeight > 0) ? (int) (length/maxHeight) : 0;
+        } else {
+            numLabels = (maxWidth > 0) ? (int)(length/maxWidth) : 0;
         }
-       
         if (numLabels > 0) {
             numLabelsToSkip = ((int)(tickMarks.size()/numLabels)) + 1;
         }
         // clear tick mark path elements as we will recreate
         tickMarkPath.getElements().clear();
         // do layout of axis label, tick mark lines and text
-        if (getSide().equals(Side.LEFT)) {
+        if (Side.LEFT.equals(side)) {
             // offset path to make strokes snap to pixel
             tickMarkPath.setLayoutX(-0.5);
             tickMarkPath.setLayoutY(0.5);
@@ -782,7 +772,7 @@
                     tick.textNode.setVisible(false);
                 }
             }
-        } else if (getSide().equals(Side.RIGHT)) {
+        } else if (Side.RIGHT.equals(side)) {
             // offset path to make strokes snap to pixel
             tickMarkPath.setLayoutX(0.5);
             tickMarkPath.setLayoutY(0.5);
@@ -814,7 +804,7 @@
                 //noinspection SuspiciousNameCombination
                 axisLabel.resize(height, axisLabelWidth);
             }
-        } else if (getSide().equals(Side.TOP)) {
+        } else if (Side.TOP.equals(side)) {
             // offset path to make strokes snap to pixel
             tickMarkPath.setLayoutX(0.5);
             tickMarkPath.setLayoutY(-0.5);
@@ -896,13 +886,13 @@
         node.setLayoutY(0);
         node.setRotate(angle);
         final Bounds bounds = node.getBoundsInParent();
-        if (side.equals(Side.LEFT)) {
+        if (Side.LEFT.equals(side)) {
             node.setLayoutX(posX-bounds.getWidth()-bounds.getMinX());
             node.setLayoutY(posY - (bounds.getHeight() / 2d) - bounds.getMinY());
-        } else if (side.equals(Side.RIGHT)) {
+        } else if (Side.RIGHT.equals(side)) {
             node.setLayoutX(posX-bounds.getMinX());
             node.setLayoutY(posY-(bounds.getHeight()/2d)-bounds.getMinY());
-        } else if (side.equals(Side.TOP)) {
+        } else if (Side.TOP.equals(side)) {
             node.setLayoutX(posX-(bounds.getWidth()/2d)-bounds.getMinX());
             node.setLayoutY(posY-bounds.getHeight()-bounds.getMinY());
         } else {
--- a/javafx-ui-controls/src/javafx/scene/chart/ValueAxis.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/chart/ValueAxis.java	Wed Jun 26 11:06:51 2013 -0400
@@ -298,14 +298,12 @@
     protected final double calculateNewScale(double length, double lowerBound, double upperBound) {
         double newScale = 1;
         final Side side = getSide();
-        if(side != null) {
-            if (side.equals(Side.TOP) || side.equals(Side.BOTTOM)) { // HORIZONTAL
-                offset = 0;
-                newScale = ((upperBound-lowerBound) == 0) ? length : length / (upperBound - lowerBound);
-            } else { // VERTICAL
-                offset = length;
-                newScale = ((upperBound-lowerBound) == 0) ? -length : -(length / (upperBound - lowerBound));
-            }
+        if (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) { // VERTICAL 
+            offset = length;
+            newScale = ((upperBound-lowerBound) == 0) ? -length : -(length / (upperBound - lowerBound));
+        } else { // HORIZONTAL
+            offset = 0;
+            newScale = ((upperBound-lowerBound) == 0) ? length : length / (upperBound - lowerBound);
         }
         return newScale;
     }
@@ -349,7 +347,7 @@
      */
     @Override protected void layoutChildren() {
         final Side side = getSide();
-        final double length = (Side.TOP.equals(side) || Side.BOTTOM.equals(side)) ? getWidth() : getHeight();
+        final double length = (Side.LEFT.equals(side) || Side.RIGHT.equals(side)) ? getHeight() :getWidth() ;
         // if we are not auto ranging we need to calculate the new scale
         if(!isAutoRanging()) {
             // calculate new scale
@@ -376,7 +374,7 @@
         // Update minor tickmarks
         minorTickPath.getElements().clear();
         if (getMinorTickLength() > 0) {
-            if (side.equals(Side.LEFT)) {
+            if (Side.LEFT.equals(side)) {
                 // snap minorTickPath to pixels
                 minorTickPath.setLayoutX(-0.5);
                 minorTickPath.setLayoutY(0.5);
@@ -388,7 +386,7 @@
                                 new LineTo(getWidth()-1, y));
                     }
                 }
-            } else if (side.equals(Side.RIGHT)) {
+            } else if (Side.RIGHT.equals(side)) {
                 // snap minorTickPath to pixels
                 minorTickPath.setLayoutX(0.5);
                 minorTickPath.setLayoutY(0.5);
@@ -400,7 +398,7 @@
                                 new LineTo(getMinorTickLength(), y));
                     }
                 }
-            } else if (side.equals(Side.TOP)) {
+            } else if (Side.TOP.equals(side)) {
                 // snap minorTickPath to pixels
                 minorTickPath.setLayoutX(0.5);
                 minorTickPath.setLayoutY(-0.5);
@@ -412,7 +410,7 @@
                                 new LineTo(x, getHeight() - getMinorTickLength()));
                     }
                 }
-            } else if (side.equals(Side.BOTTOM)) {
+            } else { // BOTTOM
                 // snap minorTickPath to pixels
                 minorTickPath.setLayoutX(0.5);
                 minorTickPath.setLayoutY(0.5);
--- a/javafx-ui-controls/src/javafx/scene/control/Control.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/Control.java	Wed Jun 26 11:06:51 2013 -0400
@@ -648,7 +648,7 @@
 
                     if (get() != null) {
                         if (!get().equals(currentSkinClassName)) {
-                            loadSkinClass();
+                            loadSkinClass(Control.this, skinClassName.get());
                         }
                         // Note: CSS should not set skin to null
                     }
@@ -674,12 +674,10 @@
         return skinClassName;
     }
 
-    private void loadSkinClass() {
-        if (skinClassName == null
-                || skinClassName.get() == null
-                || skinClassName.get().isEmpty()) {
+    static void loadSkinClass(final Skinnable control, final String skinClassName) {
+        if (skinClassName == null || skinClassName.isEmpty()) {
             final String msg =
-                "Empty -fx-skin property specified for control " + this;
+                "Empty -fx-skin property specified for control " + control;
             final List<CssError> errors = StyleManager.getErrors();
             if (errors != null) {
                 CssError error = new CssError(msg);
@@ -690,7 +688,7 @@
         }
 
         try {
-            final Class<?> skinClass = Control.loadClass(skinClassName.get(), this);
+            final Class<?> skinClass = Control.loadClass(skinClassName, control);
             Constructor<?>[] constructors = skinClass.getConstructors();
             Constructor<?> skinConstructor = null;
             for (Constructor<?> c : constructors) {
@@ -703,7 +701,7 @@
 
             if (skinConstructor == null) {
                 final String msg =
-                    "No valid constructor defined in '" + skinClassName + "' for control " + this +
+                    "No valid constructor defined in '" + skinClassName + "' for control " + control +
                         ".\r\nYou must provide a constructor that accepts a single "
                         + "Control parameter in " + skinClassName + ".";
                 final List<CssError> errors = StyleManager.getErrors();
@@ -713,14 +711,14 @@
                 }
                 Logging.getControlsLogger().severe(msg);
             } else {
-                Skin<?> skinInstance = (Skin<?>) skinConstructor.newInstance(this);
+                Skin<?> skinInstance = (Skin<?>) skinConstructor.newInstance(control);
                 // Do not call setSkin here since it has the side effect of
                 // also setting the skinClassName!
-                skinProperty().set(skinInstance);
+                control.skinProperty().set(skinInstance);
             }
         } catch (InvocationTargetException e) {
             final String msg =
-                "Failed to load skin '" + skinClassName + "' for control " + this;
+                "Failed to load skin '" + skinClassName + "' for control " + control;
             final List<CssError> errors = StyleManager.getErrors();
             if (errors != null) {
                 CssError error = new CssError(msg + " :" + e.getLocalizedMessage());
@@ -729,7 +727,7 @@
             Logging.getControlsLogger().severe(msg, e.getCause());
         } catch (Exception e) {
             final String msg =
-                "Failed to load skin '" + skinClassName + "' for control " + this;
+                "Failed to load skin '" + skinClassName + "' for control " + control;
             final List<CssError> errors = StyleManager.getErrors();
             if (errors != null) {
                 CssError error = new CssError(msg + " :" + e.getLocalizedMessage());
--- a/javafx-ui-controls/src/javafx/scene/control/ListCell.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/ListCell.java	Wed Jun 26 11:06:51 2013 -0400
@@ -299,13 +299,28 @@
      * Public API                                                              *
      *                                                                         *
      **************************************************************************/
-    
+
+    private int index = -1;
+
     /** {@inheritDoc} */
     @Override void indexChanged() {
+        final int oldIndex = index;
         super.indexChanged();
-        updateItem();
-        updateSelection();
-        updateFocus();
+        index = getIndex();
+
+        if (isEditing() && index == oldIndex) {
+            // no-op
+            // Fix for RT-31165 - if we (needlessly) update the index whilst the
+            // cell is being edited it will no longer be in an editing state.
+            // This means that in certain (common) circumstances that it will
+            // appear that a cell is uneditable as, despite being clicked, it
+            // will not change to the editing state as a layout of VirtualFlow
+            // is immediately invoked, which forces all cells to be updated.
+        } else {
+            updateItem();
+            updateSelection();
+            updateFocus();
+        }
     }
 
     /** {@inheritDoc} */
--- a/javafx-ui-controls/src/javafx/scene/control/PopupControl.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/PopupControl.java	Wed Jun 26 11:06:51 2013 -0400
@@ -25,8 +25,6 @@
 
 package javafx.scene.control;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -1165,7 +1163,7 @@
                         //
                         if (get() != null) {
                             if (!get().equals(currentSkinClassName)) {
-                                loadSkinClass();
+                                Control.loadSkinClass(PopupControl.this, skinClassName.get());
                             }
                         // CSS should not set skin to null
     //                    } else {
@@ -1197,76 +1195,6 @@
             skinClassNameProperty().set(skinClassName);
         }
 
-        private void loadSkinClass() {
-            if (skinClassName == null
-                || skinClassName.get() == null
-                || skinClassName.get().isEmpty()) {
-                final String msg =
-                    "Empty -fx-skin property specified for popup control " + this;
-                final List<CssError> errors = StyleManager.getErrors();
-                if (errors != null) {
-                    CssError error = new CssError(msg);
-                    errors.add(error); // RT-19884
-                }
-                Logging.getControlsLogger().severe(msg);
-                return;
-            }
-
-            try {
-                final Class<?> skinClass = Control.loadClass(skinClassName.get(), this);
-                Constructor<?>[] constructors = skinClass.getConstructors();
-                Constructor<?> skinConstructor = null;
-                for (Constructor<?> c : constructors) {
-                    Class<?>[] parameterTypes = c.getParameterTypes();
-                    if (parameterTypes.length == 1 && PopupControl.class.isAssignableFrom(parameterTypes[0])) {
-                        skinConstructor = c;
-                        break;
-                    }
-                }
-
-                if (skinConstructor == null) {
-                    final String msg =
-                        "No valid constructor defined in '" + skinClassName
-                        + "' for popup control " + this
-                        + ".\r\nYou must provide a constructor that accepts a single "
-                        + "PopupControl parameter in " + skinClassName + ".";
-                    final List<CssError> errors = StyleManager.getErrors();
-                    if (errors != null) {
-                        CssError error = new CssError(msg);
-                        errors.add(error); // RT-19884
-                    }
-                    Logging.getControlsLogger().severe(msg);
-                    return;
-                } else {
-                    Skin<?> skinInstance = (Skin<?>) skinConstructor.newInstance(PopupControl.this);
-                    // Do not call setSkin here since it has the side effect of
-                    // also setting the skinClassName!
-                    skinProperty().set(skinInstance);
-                }
-
-            } catch (InvocationTargetException e) {
-                final String msg =
-                    "Failed to load skin '" + skinClassName
-                    + "' for popup control " + this;
-                final List<CssError> errors = StyleManager.getErrors();
-                if (errors != null) {
-                    CssError error = new CssError(msg + " :" + e.getLocalizedMessage());
-                    errors.add(error); // RT-19884
-                }
-                Logging.getControlsLogger().severe(msg, e.getCause());
-            } catch (Exception e) {
-                final String msg =
-                    "Failed to load skin '" + skinClassName
-                    + "' for popup control " + this;
-                final List<CssError> errors = StyleManager.getErrors();
-                if (errors != null) {
-                    CssError error = new CssError(msg + " :" + e.getLocalizedMessage());
-                    errors.add(error); // RT-19884
-                }
-                Logging.getControlsLogger().severe(msg, e.getCause());
-            }
-        }
-
         /**
          * @treatAsPrivate implementation detail
          * @deprecated This is an internal API that is not intended for use and will be removed in the next version
--- a/javafx-ui-controls/src/javafx/scene/control/TreeCell.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/TreeCell.java	Wed Jun 26 11:06:51 2013 -0400
@@ -443,14 +443,25 @@
     private int index = -1;
 
     @Override void indexChanged() {
-        int oldIndex = index;
+        final int oldIndex = index;
+
         index = getIndex();
         
         // when the cell index changes, this may result in the cell
         // changing state to be selected and/or focused.
-        updateItem();
-        updateSelection();
-        updateFocus();
+        if (isEditing() && index == oldIndex) {
+            // no-op
+            // Fix for RT-31165 - if we (needlessly) update the index whilst the
+            // cell is being edited it will no longer be in an editing state.
+            // This means that in certain (common) circumstances that it will
+            // appear that a cell is uneditable as, despite being clicked, it
+            // will not change to the editing state as a layout of VirtualFlow
+            // is immediately invoked, which forces all cells to be updated.
+        } else {
+            updateItem();
+            updateSelection();
+            updateFocus();
+        }
     }
     
     private void updateItem() {
--- a/javafx-ui-controls/src/javafx/scene/control/TreeTableCell.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/src/javafx/scene/control/TreeTableCell.java	Wed Jun 26 11:06:51 2013 -0400
@@ -386,7 +386,9 @@
      * Private Implementation                                                  *
      *                                                                         *
      **************************************************************************/
-    
+
+    private int index = -1;
+
     @Override void indexChanged() {
         super.indexChanged();
         // Ideally we would just use the following two lines of code, rather
@@ -394,9 +396,24 @@
         // RT-22428 where all the columns are collapsed.
         // itemDirty = true;
         // requestLayout();
-        updateItem();
-        updateSelection();
-        updateFocus();
+
+        final int oldIndex = index;
+        super.indexChanged();
+        index = getIndex();
+
+        if (isEditing() && index == oldIndex) {
+            // no-op
+            // Fix for RT-31165 - if we (needlessly) update the index whilst the
+            // cell is being edited it will no longer be in an editing state.
+            // This means that in certain (common) circumstances that it will
+            // appear that a cell is uneditable as, despite being clicked, it
+            // will not change to the editing state as a layout of VirtualFlow
+            // is immediately invoked, which forces all cells to be updated.
+        } else {
+            updateItem();
+            updateSelection();
+            updateFocus();
+        }
     }
     
     private boolean isLastVisibleColumn = false;
--- a/javafx-ui-controls/test/javafx/scene/control/ListViewTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/test/javafx/scene/control/ListViewTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -45,11 +45,14 @@
 import javafx.collections.ObservableList;
 import javafx.geometry.Orientation;
 import javafx.scene.Node;
+import javafx.scene.Scene;
 import javafx.scene.control.cell.CheckBoxListCell;
+import javafx.scene.control.cell.ComboBoxListCell;
 import javafx.scene.layout.StackPane;
 import javafx.scene.layout.VBox;
 import javafx.util.Callback;
 
+import com.sun.javafx.scene.control.infrastructure.MouseEventFirer;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -615,4 +618,32 @@
         final double afterEmptiedWidth = listView.prefWidth(-1);
         assertEquals(initialWidth, afterEmptiedWidth, 0.00);
     }
+
+    @Test public void test_rt31165() {
+        final ObservableList names = FXCollections.observableArrayList("Adam", "Alex", "Alfred", "Albert");
+        final ObservableList data = FXCollections.observableArrayList();
+        for (int i = 0; i < 18; i++) {
+            data.add(""+i);
+        }
+
+        final ListView listView = new ListView(data);
+        listView.setPrefSize(200, 250);
+        listView.setEditable(true);
+        listView.setCellFactory(ComboBoxListCell.forListView(names));
+
+        IndexedCell cell = VirtualFlowTestUtils.getCell(listView, 1);
+        assertEquals("1", cell.getText());
+        assertFalse(cell.isEditing());
+
+        listView.edit(1);
+
+        assertEquals(1, listView.getEditingIndex());
+        assertTrue(cell.isEditing());
+
+        VirtualFlowTestUtils.getVirtualFlow(listView).requestLayout();
+        Toolkit.getToolkit().firePulse();
+
+        assertEquals(1, listView.getEditingIndex());
+        assertTrue(cell.isEditing());
+    }
 }
--- a/javafx-ui-controls/test/javafx/scene/control/TableViewTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/test/javafx/scene/control/TableViewTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -48,9 +48,12 @@
 import javafx.collections.ObservableList;
 import javafx.event.EventHandler;
 import javafx.scene.control.cell.CheckBoxTableCell;
+import javafx.scene.control.cell.ChoiceBoxTableCell;
+import javafx.scene.control.cell.ComboBoxListCell;
 import javafx.scene.control.cell.PropertyValueFactory;
 import javafx.util.Callback;
 
+import com.sun.javafx.tk.Toolkit;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -1325,4 +1328,41 @@
         VirtualFlowTestUtils.assertCellEmpty(VirtualFlowTestUtils.getCell(tableView, 2));
         VirtualFlowTestUtils.assertCellEmpty(VirtualFlowTestUtils.getCell(tableView, 3));
     }
+
+    @Test public void test_rt31165() {
+        final ObservableList names = FXCollections.observableArrayList("Adam", "Alex", "Alfred", "Albert");
+
+        final TableView<Person> tableView = new TableView<Person>();
+        tableView.setEditable(true);
+        tableView.setItems(FXCollections.observableArrayList(
+            new Person("Jacob", "Smith", "jacob.smith@example.com"),
+            new Person("Jim", "Bob", "jim.bob@example.com")
+        ));
+
+        TableColumn firstNameCol = new TableColumn("First Name");
+        firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
+        firstNameCol.setCellFactory(ChoiceBoxTableCell.forTableColumn(names));
+        firstNameCol.setEditable(true);
+
+        tableView.getColumns().add(firstNameCol);
+
+        IndexedCell cell = VirtualFlowTestUtils.getCell(tableView, 1, 0);
+        assertEquals("Jim", cell.getText());
+        assertFalse(cell.isEditing());
+
+        tableView.edit(1, firstNameCol);
+
+        TablePosition editingCell = tableView.getEditingCell();
+        assertEquals(1, editingCell.getRow());
+        assertEquals(firstNameCol, editingCell.getTableColumn());
+        assertTrue(cell.isEditing());
+
+        VirtualFlowTestUtils.getVirtualFlow(tableView).requestLayout();
+        Toolkit.getToolkit().firePulse();
+
+        editingCell = tableView.getEditingCell();
+        assertEquals(1, editingCell.getRow());
+        assertEquals(firstNameCol, editingCell.getTableColumn());
+        assertTrue(cell.isEditing());
+    }
 }
--- a/javafx-ui-controls/test/javafx/scene/control/TreeTableViewTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/test/javafx/scene/control/TreeTableViewTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -59,6 +59,7 @@
 import javafx.scene.control.TreeTableView.TreeTableViewFocusModel;
 import javafx.scene.control.cell.CheckBoxTreeTableCell;
 import javafx.scene.control.cell.PropertyValueFactory;
+import javafx.scene.control.cell.TextFieldTreeTableCell;
 import javafx.scene.control.cell.TreeItemPropertyValueFactory;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.StackPane;
@@ -2061,4 +2062,36 @@
         VirtualFlowTestUtils.assertCellEmpty(VirtualFlowTestUtils.getCell(tableView, 2));
         VirtualFlowTestUtils.assertCellEmpty(VirtualFlowTestUtils.getCell(tableView, 3));
     }
+
+    @Ignore("This bug is not yet fixed")
+    @Test public void test_rt31165() {
+        installChildren();
+        treeTableView.setEditable(true);
+
+        TreeTableColumn firstNameCol = new TreeTableColumn("First Name");
+        firstNameCol.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures, ObservableValue>() {
+            @Override public ObservableValue call(TreeTableColumn.CellDataFeatures param) {
+                return new ReadOnlyStringWrapper("TEST");
+            }
+        });
+        firstNameCol.setCellFactory(TextFieldTreeTableCell.forTreeTableColumn());
+        firstNameCol.setEditable(true);
+
+        treeTableView.getColumns().add(firstNameCol);
+
+        IndexedCell cell = VirtualFlowTestUtils.getCell(treeTableView, 1, 0);
+        assertEquals("TEST", cell.getText());
+        assertFalse(cell.isEditing());
+
+        treeTableView.edit(child1);
+
+        assertEquals(child1, treeTableView.getEditingItem());
+        assertTrue(cell.isEditing());
+
+        VirtualFlowTestUtils.getVirtualFlow(treeTableView).requestLayout();
+        Toolkit.getToolkit().firePulse();
+
+        assertEquals(child1, treeTableView.getEditingItem());
+        assertTrue(cell.isEditing());
+    }
 }
--- a/javafx-ui-controls/test/javafx/scene/control/TreeViewTest.java	Tue Jun 25 09:52:01 2013 -0700
+++ b/javafx-ui-controls/test/javafx/scene/control/TreeViewTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -56,6 +56,7 @@
 import javafx.scene.Scene;
 import javafx.scene.control.cell.CheckBoxTreeCell;
 import javafx.scene.control.cell.PropertyValueFactory;
+import javafx.scene.control.cell.TextFieldTreeCell;
 import javafx.scene.control.cell.TreeItemPropertyValueFactory;
 import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
@@ -1009,11 +1010,13 @@
         treeView.setRoot(rootItem);
         treeView.setMinHeight(100);
         treeView.setPrefHeight(100);
-        treeView.setCellFactory(CheckBoxTreeCell.forTreeView(new Callback<TreeItem<String>, ObservableValue<Boolean>>() {
-            public javafx.beans.value.ObservableValue<Boolean> call(TreeItem<String> param) {
-                return new ReadOnlyBooleanWrapper(true);
-            }
-        }));
+        treeView.setCellFactory(
+                CheckBoxTreeCell.forTreeView(
+                        new Callback<TreeItem<String>, ObservableValue<Boolean>>() {
+                            public javafx.beans.value.ObservableValue<Boolean> call(TreeItem<String> param) {
+                                return new ReadOnlyBooleanWrapper(true);
+                            }
+                        }));
 
         // because only the first row has data, all other rows should be
         // empty (and not contain check boxes - we just check the first four here)
@@ -1023,4 +1026,25 @@
         VirtualFlowTestUtils.assertCellEmpty(VirtualFlowTestUtils.getCell(treeView, 2));
         VirtualFlowTestUtils.assertCellEmpty(VirtualFlowTestUtils.getCell(treeView, 3));
     }
+
+    @Test public void test_rt31165() {
+        installChildren();
+        treeView.setEditable(true);
+        treeView.setCellFactory(TextFieldTreeCell.forTreeView());
+
+        IndexedCell cell = VirtualFlowTestUtils.getCell(treeView, 1);
+        assertEquals(child1.getValue(), cell.getText());
+        assertFalse(cell.isEditing());
+
+        treeView.edit(child1);
+
+        assertEquals(child1, treeView.getEditingItem());
+        assertTrue(cell.isEditing());
+
+        VirtualFlowTestUtils.getVirtualFlow(treeView).requestLayout();
+        Toolkit.getToolkit().firePulse();
+
+        assertEquals(child1, treeView.getEditingItem());
+        assertTrue(cell.isEditing());
+    }
 }
--- a/tests/build.xml	Tue Jun 25 09:52:01 2013 -0700
+++ b/tests/build.xml	Wed Jun 26 11:06:51 2013 -0400
@@ -20,6 +20,22 @@
         </ant>
     </target>
 
+    <target name="golden-image-create">
+        <ant antfile="golden-image-suite/build.xml" target="golden-image-create" inheritAll="false"/>
+    </target>
+
+    <target name="golden-image-create-clean">
+        <ant antfile="golden-image-suite/build.xml" target="golden-image-create-clean" inheritAll="false"/>
+    </target>
+
+    <target name="golden-image-test">
+        <ant antfile="golden-image-suite/build.xml" target="golden-image-test" inheritAll="false"/>
+    </target>
+
+    <target name="golden-image-test-clean">
+        <ant antfile="golden-image-suite/build.xml" target="golden-image-test-clean" inheritAll="false"/>
+    </target>
+
     <target name="clean">
         <ant antfile="graphics/build.xml" target="clean" inheritAll="false"/>
         <ant antfile="app-lifecycle/build.xml" target="clean" inheritAll="false"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/Modena.iml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+      <excludeFolder url="file://$MODULE_DIR$/nbproject" />
+    </content>
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="decora-compiler" />
+    <orderEntry type="module" module-name="decora-d3d" />
+    <orderEntry type="module" module-name="decora-es2" />
+    <orderEntry type="module" module-name="decora-jsw" />
+    <orderEntry type="module" module-name="decora-prism" />
+    <orderEntry type="module" module-name="decora-prism-ps" />
+    <orderEntry type="module" module-name="decora-prism-sw" />
+    <orderEntry type="module" module-name="decora-runtime" />
+    <orderEntry type="module" module-name="decora-sse" />
+    <orderEntry type="module" module-name="glass-mat" />
+    <orderEntry type="module" module-name="javafx-accessible" />
+    <orderEntry type="module" module-name="javafx-anim" />
+    <orderEntry type="module" module-name="javafx-annotation-processor" />
+    <orderEntry type="module" module-name="javafx-beans" />
+    <orderEntry type="module" module-name="javafx-checkstyle" />
+    <orderEntry type="module" module-name="javafx-common" />
+    <orderEntry type="module" module-name="javafx-concurrent" />
+    <orderEntry type="module" module-name="javafx-deploy" />
+    <orderEntry type="module" module-name="javafx-embed-swing" />
+    <orderEntry type="module" module-name="javafx-embed-swt" />
+    <orderEntry type="module" module-name="javafx-font" />
+    <orderEntry type="module" module-name="javafx-fxml" />
+    <orderEntry type="module" module-name="javafx-geom" />
+    <orderEntry type="module" module-name="javafx-iio" />
+    <orderEntry type="module" module-name="javafx-logging" />
+    <orderEntry type="module" module-name="javafx-mx-common" />
+    <orderEntry type="module" module-name="javafx-sg-common" />
+    <orderEntry type="module" module-name="javafx-sg-prism" />
+    <orderEntry type="module" module-name="javafx-ui-charts" />
+    <orderEntry type="module" module-name="javafx-ui-common" />
+    <orderEntry type="module" module-name="javafx-ui-controls" />
+    <orderEntry type="module" module-name="javafx-ui-desktop" />
+    <orderEntry type="module" module-name="javafx-ui-quantum" />
+    <orderEntry type="module" module-name="javafx-util-converter" />
+    <orderEntry type="module" module-name="jfxmedia" />
+    <orderEntry type="module" module-name="pisces" />
+    <orderEntry type="module" module-name="prism-common" />
+    <orderEntry type="module" module-name="prism-d3d" />
+    <orderEntry type="module" module-name="prism-es2" />
+    <orderEntry type="module" module-name="prism-es2-mac" />
+    <orderEntry type="module" module-name="prism-j2d" />
+    <orderEntry type="module" module-name="prism-null" />
+    <orderEntry type="module" module-name="prism-ps" />
+    <orderEntry type="module" module-name="prism-util" />
+    <orderEntry type="module" module-name="test-stub-toolkit" />
+    <orderEntry type="module" module-name="webview" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="library" name="webkit-impl" level="project" />
+    <orderEntry type="module" module-name="javafx-builders" />
+    <orderEntry type="module" module-name="javafx-font-t2k" />
+    <orderEntry type="module" module-name="prism-sw" />
+  </component>
+</module>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/build.xml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,40 @@
+<project name="golden-image-suite" default="default" basedir=".">
+    <description>golden-image-suite tests.</description>
+    <import file="nbproject/build-impl.xml"/>
+
+    <target name="copy-to-artifacts">
+        <description>Copy generated golden images to artifacts / imports</description>
+        <delete dir="../../../artifacts/test/golden"/>
+        <copy todir="../../../artifacts/test/golden">
+            <fileset dir="golden"/>
+        </copy>
+    </target>
+    
+    <target name="golden-image-create" depends="golden-image-create-depend,copy-to-artifacts">
+        <description>Generate golden images</description>
+    </target>
+    
+    <target name="golden-image-create-depend">
+        <description>Generate the golden images</description>
+        <delete dir="golden"/>
+        <ant dir="." target="default" inheritAll="false"/>
+    </target>
+
+    <target name="golden-image-test">
+        <description>Test golden images</description>
+        <copy todir="golden">
+            <fileset dir="../../../artifacts/test/golden"/>
+        </copy>
+    </target>
+    
+    <target name="golden-image-create-clean">
+        <description>Clean generate golden images</description>
+        <delete dir="build"/>
+        <delete dir="golden"/>
+    </target>
+
+    <target name="golden-image-test-clean">
+        <description>Clean test golden images</description>
+        <delete dir="build"/>
+    </target>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/manifest.mf	Wed Jun 26 11:06:51 2013 -0400
@@ -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/tests/golden-image-suite/nbproject/build-impl.xml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,1444 @@
+<?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="golden-image-suite-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" 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">
+        <j2seproject1:property name="platform.home" value="platforms.${platform.active}.home"/>
+        <j2seproject1:property name="platform.bootcp" value="platforms.${platform.active}.bootclasspath"/>
+        <j2seproject1:property name="platform.compiler" value="platforms.${platform.active}.compile"/>
+        <j2seproject1:property name="platform.javac.tmp" value="platforms.${platform.active}.javac"/>
+        <condition property="platform.javac" value="${platform.home}/bin/javac">
+            <equals arg1="${platform.javac.tmp}" arg2="$${platforms.${platform.active}.javac}"/>
+        </condition>
+        <property name="platform.javac" value="${platform.javac.tmp}"/>
+        <j2seproject1:property name="platform.java.tmp" value="platforms.${platform.active}.java"/>
+        <condition property="platform.java" value="${platform.home}/bin/java">
+            <equals arg1="${platform.java.tmp}" arg2="$${platforms.${platform.active}.java}"/>
+        </condition>
+        <property name="platform.java" value="${platform.java.tmp}"/>
+        <j2seproject1:property name="platform.javadoc.tmp" value="platforms.${platform.active}.javadoc"/>
+        <condition property="platform.javadoc" value="${platform.home}/bin/javadoc">
+            <equals arg1="${platform.javadoc.tmp}" arg2="$${platforms.${platform.active}.javadoc}"/>
+        </condition>
+        <property name="platform.javadoc" value="${platform.javadoc.tmp}"/>
+        <condition property="platform.invalid" value="true">
+            <or>
+                <contains string="${platform.javac}" substring="$${platforms."/>
+                <contains string="${platform.java}" substring="$${platforms."/>
+                <contains string="${platform.javadoc}" substring="$${platforms."/>
+            </or>
+        </condition>
+        <fail unless="platform.home">Must set platform.home</fail>
+        <fail unless="platform.bootcp">Must set platform.bootcp</fail>
+        <fail unless="platform.java">Must set platform.java</fail>
+        <fail unless="platform.javac">Must set platform.javac</fail>
+        <fail if="platform.invalid">
+ The J2SE Platform is not correctly set up.
+ Your active platform is: ${platform.active}, but the corresponding property "platforms.${platform.active}.home" is not found in the project's properties files. 
+ Either open the project in the IDE and setup the Platform with the same name or add it manually.
+ For example like this:
+     ant -Duser.properties.file=&lt;path_to_property_file&gt; jar (where you put the property "platforms.${platform.active}.home" in a .properties file)
+  or ant -Dplatforms.${platform.active}.home=&lt;path_to_JDK_home&gt; jar (where no properties file is used) 
+  </fail>
+        <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="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class.available"/>
+            </and>
+        </condition>
+        <condition property="do.archive">
+            <not>
+                <istrue value="${jar.archive.disabled}"/>
+            </not>
+        </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="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </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+manifest.available+main.class">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="manifest.available-mkdist.available">
+            <or>
+                <istrue value="${manifest.available}"/>
+                <isset property="do.mkdist"/>
+            </or>
+        </condition>
+        <condition property="manifest.available+main.class-mkdist.available">
+            <or>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </or>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${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}'">
+            <length length="0" string="${endorsed.classpath}" when="greater"/>
+        </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>
+    </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.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.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.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}" executable="${platform.javac}" fork="yes" 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.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.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}" executable="${platform.javac}" fork="yes" 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.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.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}" jvm="${platform.java}" 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}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <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">
+                    <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
+                        <filename name="@{testincludes}"/>
+                    </fileset>
+                </union>
+                <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
+                <testng classfilesetref="test.set" failureProperty="tests.failed" jvm="${platform.java}" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="golden-image-suite" 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}" jvm="${platform.java}" 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}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                        <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 golden-image-suite -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}" 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>
+                    <bootclasspath>
+                        <path path="${platform.bootcp}"/>
+                    </bootclasspath>
+                </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">
+        <exec executable="${platform.java}" outputproperty="version-output">
+            <arg value="-version"/>
+        </exec>
+        <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}" fork="true" jvm="${platform.java}">
+                    <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}" fork="true" jvm="${platform.java}">
+                    <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}" 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}"/>
+                    <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}"/>
+            </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: golden-image-suite 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.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.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.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,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo level="info">To run this application from the command line without Ant, try:</echo>
+        <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>
+        <echo level="info">${platform.java} -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init" if="do.archive" name="-do-jar-with-libraries-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-with-libraries-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-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+        <manifest file="${tmp.manifest.file}" mode="update">
+            <attribute name="Main-Class" value="${main.class}"/>
+        </manifest>
+    </target>
+    <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-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-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+        <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">${platform.java} -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+        <delete>
+            <fileset file="${tmp.manifest.file}"/>
+        </delete>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-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-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-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>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" executable="${platform.javadoc}" 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.dir}" excludes="*.java,${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.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="${test.src.dir}"/>
+    </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="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </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="${test.src.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </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 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: golden-image-suite 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/tests/golden-image-suite/nbproject/configs/modena.properties	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,1 @@
+run.jvmargs=\ -Xmx1000m -Djava.library.path=artifacs/sdk/rt/lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/nbproject/configs/modena_sw_lcdtext_off.properties	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,2 @@
+$label=modena sw lcdtext off
+run.jvmargs=\ -Xmx1000m -Djava.library.path=artifacs/sdk/rt/lib   -Dprism.order=sw -Dprism.lcdtext=false
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/nbproject/genfiles.properties	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=7521e6e8
+build.xml.script.CRC32=09ddd46e
+build.xml.stylesheet.CRC32=28e38971@1.56.1.46
+# 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=7fea603f
+nbproject/build-impl.xml.script.CRC32=d22d7f6a
+nbproject/build-impl.xml.stylesheet.CRC32=c6d2a60f@1.56.1.46
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/nbproject/project.properties	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,80 @@
+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=golden-image-suite
+application.vendor=jpotts
+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.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/golden-image-suite.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+file.reference.jfxrt.jar=../../../artifacts/sdk/rt/lib/ext/jfxrt.jar
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${file.reference.jfxrt.jar}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+    ${javac.classpath}
+javac.source=1.8
+javac.target=1.8
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}:\
+    ${libs.junit_4.classpath}:\
+    ${import.jemmyfx.jar}:\
+    ${import.GlassImage.jar}:\
+    ${import.GlassRobot.jar}:\
+    ${import.JemmyAWTInput.jar}:\
+    ${import.JemmyCore.jar}
+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=modena.Modena
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+platform.active=JDK_1.8
+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=-Djava.library.path=artifacs/sdk/rt/lib
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/nbproject/project.xml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,16 @@
+<?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>golden-image-suite</name>
+            <explicit-platform explicit-source-supported="true"/>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/CombinationTest.fxml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.collections.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+<?import javafx.scene.text.*?>
+<?import javafx.scene.web.*?>
+
+<VBox id="VBox" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="-1.0" prefWidth="-1.0" spacing="10.0" xmlns:fx="http://javafx.com/fxml">
+  <children>
+    <Label prefWidth="632.0" text="X inside Y Combinations">
+      <font>
+        <Font name="System Bold" size="13.0" fx:id="x2" />
+      </font>
+    </Label>
+    <TilePane hgap="10.0" prefColumns="3" prefHeight="-1.0" prefTileHeight="300.0" prefTileWidth="300.0" prefWidth="-1.0" vgap="10.0">
+      <children>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="ScrollPane">
+              <content>
+                <ScrollPane content="$null" prefHeight="200.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="ListView">
+              <content>
+                <ListView prefHeight="200.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="TreeView">
+              <content>
+                <TreeView prefHeight="200.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="TableView">
+              <content>
+                <TableView prefHeight="200.0" prefWidth="200.0">
+                  <columns>
+                    <TableColumn prefWidth="75.0" text="Column X" />
+                    <TableColumn prefWidth="75.0" text="Column X" />
+                  </columns>
+                </TableView>
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="ScrollPane">
+              <content>
+                <ScrollPane prefHeight="200.0" prefWidth="200.0">
+                  <content>
+                    <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0" />
+                  </content>
+                </ScrollPane>
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="TableView">
+              <content>
+                <SplitPane dividerPositions="0.36577181208053694" focusTraversable="true" prefHeight="160.0" prefWidth="200.0">
+                  <items>
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
+                    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0" />
+                  </items>
+                </SplitPane>
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="HTML Editor">
+              <content>
+                <HTMLEditor minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" />
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+          <tabs>
+            <Tab text="TextArea">
+              <content>
+                <TextArea prefHeight="50.0" prefWidth="50.0" text="Text Area with Lots of text&#10;&#10;&#10;s&#10;a&#10;d&#10;s&#10;d&#10;sd&#10;&#10;s&#10;d&#10;s&#10;d&#10;&#10;s" wrapText="true" />
+              </content>
+            </Tab>
+            <Tab text="Untitled Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+        <SplitPane dividerPositions="0.5" focusTraversable="true" prefHeight="160.0" prefWidth="200.0">
+          <items>
+            <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
+              <tabs>
+                <Tab text="Untitled Tab 1">
+                  <content>
+                    <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                  </content>
+                </Tab>
+                <Tab text="Untitled Tab 2">
+                  <content>
+                    <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+                  </content>
+                </Tab>
+              </tabs>
+            </TabPane>
+            <TableView prefHeight="200.0" prefWidth="200.0">
+              <columns>
+                <TableColumn prefWidth="75.0" text="Column X" />
+                <TableColumn prefWidth="75.0" text="Column X" />
+              </columns>
+            </TableView>
+          </items>
+        </SplitPane>
+        <SplitPane dividerPositions="0.5167785234899329" focusTraversable="true" prefHeight="50.0" prefWidth="50.0">
+          <items>
+            <TreeView prefHeight="-1.0" prefWidth="-1.0" />
+            <ListView prefHeight="-1.0" prefWidth="-1.0" />
+          </items>
+        </SplitPane>
+        <SplitPane dividerPositions="0.5335570469798657" focusTraversable="true" prefHeight="-1.0" prefWidth="-1.0">
+          <items>
+            <ScrollPane prefHeight="-1.0" prefWidth="-1.0">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0" />
+              </content>
+            </ScrollPane>
+            <SplitPane dividerPositions="0.5" focusTraversable="true" orientation="VERTICAL" prefHeight="-1.0" prefWidth="-1.0">
+              <items>
+                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" />
+                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" />
+              </items>
+            </SplitPane>
+          </items>
+        </SplitPane>
+        <SplitPane dividerPositions="0.5" focusTraversable="true" prefHeight="160.0" prefWidth="200.0">
+          <items>
+            <HTMLEditor htmlText="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body contenteditable=&quot;true&quot;&gt;Dude's Html Editor&lt;/body&gt;&lt;/html&gt;" minWidth="20.0" prefHeight="190.0" prefWidth="50.0" />
+            <TextArea minWidth="20.0" prefHeight="30.0" prefWidth="30.0" text="Text Area with Lots of text&#10;&#10;&#10;s&#10;a&#10;d&#10;s&#10;d&#10;sd&#10;&#10;s&#10;d&#10;s&#10;d&#10;&#10;s" wrapText="true" />
+          </items>
+        </SplitPane>
+      </children>
+    </TilePane>
+  </children>
+  <padding>
+    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+  </padding>
+</VBox>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/Modena.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,687 @@
+/*
+ * Copyright (c) 2008, 2013 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.net.URLStreamHandlerFactory;
+import java.util.Locale;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.application.Application;
+import javafx.application.Platform;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXMLLoader;
+import javafx.geometry.NodeOrientation;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.SnapshotParameters;
+import javafx.scene.control.ButtonBuilder;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.control.ColorPicker;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.Menu;
+import javafx.scene.control.MenuBar;
+import javafx.scene.control.RadioMenuItem;
+import javafx.scene.control.RadioMenuItemBuilder;
+import javafx.scene.control.ScrollPaneBuilder;
+import javafx.scene.control.Separator;
+import javafx.scene.control.TabBuilder;
+import javafx.scene.control.TabPane;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleButtonBuilder;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.control.ToolBar;
+import javafx.scene.control.Tooltip;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.image.WritableImage;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.HBoxBuilder;
+import javafx.scene.layout.Pane;
+import javafx.scene.paint.Color;
+import javafx.scene.transform.Scale;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import javax.imageio.ImageIO;
+
+public class Modena extends Application {
+    public static final String TEST = "test";
+    static {
+        System.getProperties().put("javafx.pseudoClassOverrideEnabled", "true");
+    }
+    private static final String testAppCssUrl = Modena.class.getResource("TestApp.css").toExternalForm();
+    private static String MODENA_STYLESHEET_URL;
+    private static String MODENA_EMBEDDED_STYLESHEET_URL;
+    private static String MODENA_STYLESHEET_BASE;
+    private static String CASPIAN_STYLESHEET_URL;
+    private static String CASPIAN_STYLESHEET_BASE;
+    static {
+        try {
+            // these are not supported ways to find the platform themes and may 
+            // change release to release. Just used here for testing.
+            File caspianCssFile = new File("../../../javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css");
+            if (!caspianCssFile.exists()) {
+                caspianCssFile = new File("rt/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css");
+            }
+            CASPIAN_STYLESHEET_URL = caspianCssFile.exists() ? 
+                    caspianCssFile.toURI().toURL().toExternalForm() :
+                    com.sun.javafx.scene.control.skin.ButtonSkin.class.getResource("caspian/caspian.css").toExternalForm();
+            File modenaCssFile = new File("../../../javafx-ui-controls/src/com/sun/javafx/scene/control/skin/modena/modena.css");
+            if (!modenaCssFile.exists()) {
+                modenaCssFile = new File("rt/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/modena/modena.css");
+            }
+            MODENA_STYLESHEET_URL = modenaCssFile.exists() ? 
+                    modenaCssFile.toURI().toURL().toExternalForm() : 
+                    com.sun.javafx.scene.control.skin.ButtonSkin.class.getResource("modena/modena.css").toExternalForm();
+            MODENA_STYLESHEET_BASE = MODENA_STYLESHEET_URL.substring(0,MODENA_STYLESHEET_URL.lastIndexOf('/')+1);
+            CASPIAN_STYLESHEET_BASE = CASPIAN_STYLESHEET_URL.substring(0,CASPIAN_STYLESHEET_URL.lastIndexOf('/')+1);
+            MODENA_EMBEDDED_STYLESHEET_URL = MODENA_STYLESHEET_BASE + "modena-embedded-performance.css";
+            System.out.println("MODENA_EMBEDDED_STYLESHEET_URL = " + MODENA_EMBEDDED_STYLESHEET_URL);
+        } catch (MalformedURLException ex) {
+            Logger.getLogger(Modena.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+    
+    private BorderPane outerRoot;
+    private BorderPane root;
+    private SamplePageNavigation samplePageNavigation;
+    private SamplePage samplePage;
+    private Node mosaic;
+    private Node heightTest;
+    private SimpleWindowPage simpleWindows;
+    private Node combinationsTest;
+    private Node customerTest;
+    private Stage mainStage;
+    private Color backgroundColor;
+    private Color baseColor;
+    private Color accentColor;
+    private String fontName = null;
+    private int fontSize = 13;
+    private String styleSheetContent = "";
+    private String styleSheetBase = "";
+    private ToggleButton modenaButton,retinaButton,rtlButton,embeddedPerformanceButton;
+    private TabPane contentTabs;
+    private boolean test = false;
+    private boolean embeddedPerformanceMode = false;
+    private final EventHandler<ActionEvent> rebuild = new EventHandler<ActionEvent>(){
+        @Override public void handle(ActionEvent event) {
+            Platform.runLater(new Runnable() {
+                @Override public void run() {
+                    updateUserAgentStyleSheet();
+                    rebuildUI(modenaButton.isSelected(), retinaButton.isSelected(),
+                              contentTabs.getSelectionModel().getSelectedIndex(),
+                              samplePageNavigation.getCurrentSection());
+                }
+            });
+        }
+    };
+    
+    private static Modena instance;
+
+    public static Modena getInstance() {
+        return instance;
+    }
+    
+    public Map<String, Node> getContent() {
+        return samplePage.getContent();
+    }
+
+    public void setRetinaMode(boolean retinaMode) {
+        if (retinaMode) {
+            contentTabs.getTransforms().setAll(new Scale(2,2));
+        } else {
+            contentTabs.getTransforms().setAll(new Scale(1,1));
+        }
+        contentTabs.requestLayout();
+    }
+    
+    public void restart() {
+        mainStage.close();
+        root = null;
+        accentColor = null;
+        baseColor = null;
+        backgroundColor = null;
+        fontName = null;
+        fontSize = 13;
+        try {
+            start(new Stage());
+        } catch (Exception ex) {
+            throw new RuntimeException("Failed to start another Modena window", ex);
+        }
+    }
+    
+    @Override public void start(Stage stage) throws Exception {
+        if (getParameters().getRaw().contains(TEST)) {
+            test = true;
+        }
+        mainStage = stage;
+        // set user agent stylesheet
+        updateUserAgentStyleSheet(true);
+        // build Menu Bar
+        outerRoot = new BorderPane();
+        outerRoot.setTop(buildMenuBar());
+        outerRoot.setCenter(root);
+        // build UI
+        rebuildUI(true,false,0, null);
+        // show UI
+        Scene scene = new Scene(outerRoot, 1024, 768);
+        scene.getStylesheets().add(testAppCssUrl);
+        stage.setScene(scene);
+        stage.setTitle("Modena");
+//        stage.setIconified(test); // TODO: Blocked by http://javafx-jira.kenai.com/browse/JMY-203
+        stage.show(); // see SamplePage.java:110 comment on how test fails without having stage shown
+        instance = this;
+    }
+    
+    private MenuBar buildMenuBar() {
+        MenuBar menuBar = new MenuBar();
+        menuBar.setUseSystemMenuBar(true);
+        Menu fontSizeMenu = new Menu("Font");
+        ToggleGroup tg = new ToggleGroup();
+        fontSizeMenu.getItems().addAll(
+            buildFontRadioMenuItem("System Default", null, 0, tg),
+            buildFontRadioMenuItem("Mac (13px)", "Lucida Grande", 13, tg),
+            buildFontRadioMenuItem("Windows 100% (12px)", "Segoe UI", 12, tg),
+            buildFontRadioMenuItem("Windows 125% (15px)", "Segoe UI", 15, tg),
+            buildFontRadioMenuItem("Windows 150% (18px)", "Segoe UI", 18, tg),
+            buildFontRadioMenuItem("Linux (13px)", "Lucida Sans", 13, tg),
+            buildFontRadioMenuItem("Embedded Touch (22px)", "Arial", 22, tg),
+            buildFontRadioMenuItem("Embedded Small (9px)", "Arial", 9, tg)
+        );
+        menuBar.getMenus().add(fontSizeMenu);
+        return menuBar;
+    }
+    
+    private void updateUserAgentStyleSheet() {
+        updateUserAgentStyleSheet(modenaButton.isSelected());
+    }
+    
+    private void updateUserAgentStyleSheet(boolean modena) {
+        final SamplePage.Section scrolledSection = samplePageNavigation==null? null : samplePageNavigation.getCurrentSection();
+        if (!modena &&
+            (baseColor == null || baseColor == Color.TRANSPARENT) &&
+            (backgroundColor == null || backgroundColor == Color.TRANSPARENT) &&
+            (accentColor == null || accentColor == Color.TRANSPARENT) &&
+            (fontName == null)) {
+            // no customizations
+            System.out.println("USING NO CUSTIMIZATIONS TO CSS, stylesheet = "+(modena?"modena":"caspian"));
+            setUserAgentStylesheet(modena ? Application.STYLESHEET_MODENA : Application.STYLESHEET_CASPIAN);
+            return;
+        }
+        styleSheetContent = modena ? 
+                loadUrl(MODENA_STYLESHEET_URL) : 
+                loadUrl(CASPIAN_STYLESHEET_URL);
+        if (modena && embeddedPerformanceMode) styleSheetContent += loadUrl(MODENA_EMBEDDED_STYLESHEET_URL);
+        styleSheetBase = modena ? MODENA_STYLESHEET_BASE : CASPIAN_STYLESHEET_BASE;
+        styleSheetContent += "\n.root {\n";
+        System.out.println("baseColor = "+baseColor);
+        System.out.println("accentColor = " + accentColor);
+        System.out.println("backgroundColor = " + backgroundColor);
+        if (baseColor != null && baseColor != Color.TRANSPARENT) {
+            styleSheetContent += "    -fx-base:" + colorToRGBA(baseColor) + ";\n";
+        }
+        if (backgroundColor != null && backgroundColor != Color.TRANSPARENT) {
+            styleSheetContent += "    -fx-background:" + colorToRGBA(backgroundColor) + ";\n";
+        }
+        if (accentColor != null && accentColor != Color.TRANSPARENT) {
+            styleSheetContent += "    -fx-accent:" + colorToRGBA(accentColor) + ";\n";
+        }
+        if (fontName != null) {
+            styleSheetContent += "    -fx-font:"+fontSize+"px \""+fontName+"\";\n";
+        }
+        styleSheetContent += "}\n";
+        
+        // set white background for caspian
+        if (!modena) {
+            styleSheetContent += ".needs-background {\n-fx-background-color: white;\n}";
+        }
+            
+        // load theme
+        setUserAgentStylesheet("internal:stylesheet"+Math.random()+".css");
+        
+        if (root != null) root.requestLayout();
+
+        // restore scrolled section
+        Platform.runLater(new Runnable() {
+            @Override public void run() {
+                samplePageNavigation.setCurrentSection(scrolledSection);
+            }
+        });
+    }
+    
+    private void rebuildUI(boolean modena, boolean retina, int selectedTab, final SamplePage.Section scrolledSection) {
+        try {
+            if (root == null) {
+                root = new BorderPane();
+                outerRoot.setCenter(root);
+            } else {
+                // clear out old UI
+                root.setTop(null);
+                root.setCenter(null);
+            }
+            // Create sample page and nav
+            samplePageNavigation = new SamplePageNavigation();
+            samplePage = samplePageNavigation.getSamplePage();
+            // Create Content Area
+            contentTabs = new TabPane();
+            contentTabs.getTabs().addAll(
+                TabBuilder.create().text("All Controls").content( samplePageNavigation ).build(),
+                TabBuilder.create().text("UI Mosaic").content(
+                    ScrollPaneBuilder.create().content(
+                        mosaic = (Node)FXMLLoader.load(Modena.class.getResource("ui-mosaic.fxml"))
+                    ).build()
+                ).build(),
+                TabBuilder.create().text("Alignment Test").content(
+                    ScrollPaneBuilder.create().content(
+                        heightTest = (Node)FXMLLoader.load(Modena.class.getResource("SameHeightTest.fxml"))
+                    ).build()
+                ).build(),
+                TabBuilder.create().text("Simple Windows").content(
+                    ScrollPaneBuilder.create().content(
+                        simpleWindows = new SimpleWindowPage()
+                    ).build()
+                ).build(),
+                TabBuilder.create().text("Combinations").content(
+                    ScrollPaneBuilder.create().content(
+                        combinationsTest = (Node)FXMLLoader.load(Modena.class.getResource("CombinationTest.fxml"))
+                    ).build()
+                ).build(),
+                // Customer example from bug report http://javafx-jira.kenai.com/browse/DTL-5561
+                TabBuilder.create().text("Customer Example").content(
+                    ScrollPaneBuilder.create().content(
+                        customerTest = (Node)FXMLLoader.load(Modena.class.getResource("ScottSelvia.fxml"))
+                    ).build()
+                ).build()
+            );
+            contentTabs.getSelectionModel().select(selectedTab);
+            samplePage.setMouseTransparent(test);
+            // height test set selection for 
+            Platform.runLater(new Runnable() {
+                @Override public void run() {
+                    for (Node n: heightTest.lookupAll(".choice-box")) {
+                        ((ChoiceBox)n).getSelectionModel().selectFirst();
+                    }
+                    for (Node n: heightTest.lookupAll(".combo-box")) {
+                        ((ComboBox)n).getSelectionModel().selectFirst();
+                    }
+                }
+            });
+            // Create Toolbar
+            retinaButton = ToggleButtonBuilder.create()
+                .text("@2x")
+                .selected(retina)
+                .onAction(new EventHandler<ActionEvent>(){
+                    @Override public void handle(ActionEvent event) {
+                        ToggleButton btn = (ToggleButton)event.getSource();
+                        setRetinaMode(btn.isSelected());
+                    }
+                })
+                .build();
+            ToggleGroup themesToggleGroup = new ToggleGroup();
+            ToolBar toolBar = new ToolBar(
+                HBoxBuilder.create()
+                    .children(
+                        modenaButton = ToggleButtonBuilder.create()
+                            .text("Modena")
+                            .toggleGroup(themesToggleGroup)
+                            .selected(modena)
+                            .onAction(rebuild)
+                            .styleClass("left-pill")
+                            .build(),
+                        ToggleButtonBuilder.create()
+                            .text("Caspian")
+                            .toggleGroup(themesToggleGroup)
+                            .selected(!modena)
+                            .onAction(rebuild)
+                            .styleClass("right-pill")
+                            .build()
+                    )
+                    .build(),
+                ButtonBuilder.create()
+                    .graphic(new ImageView(new Image(Modena.class.getResource("reload_12x14.png").toString())))
+                    .onAction(rebuild)
+                    .build(),
+                rtlButton = ToggleButtonBuilder.create()
+                    .text("RTL")
+                    .onAction(new EventHandler<ActionEvent>() {
+                            @Override public void handle(ActionEvent event) {
+                                root.setNodeOrientation(rtlButton.isSelected() ? 
+                                        NodeOrientation.RIGHT_TO_LEFT : NodeOrientation.LEFT_TO_RIGHT);
+                            }
+                        })
+                    .build(),
+                embeddedPerformanceButton = ToggleButtonBuilder.create()
+                    .text("EP")
+                    .selected(embeddedPerformanceMode)
+                    .tooltip(new Tooltip("Apply Embedded Performance extra stylesheet"))
+                    .onAction(new EventHandler<ActionEvent>() {
+                        @Override public void handle(ActionEvent event) {
+                            embeddedPerformanceMode = embeddedPerformanceButton.isSelected();
+                            rebuild.handle(event);
+                        }
+                    })
+                    .build(),
+                new Separator(),
+                retinaButton,
+                new Label("Base:"),
+                createBaseColorPicker(),
+                new Label("Background:"),
+                createBackgroundColorPicker(),
+                new Label("Accent:"),
+                createAccentColorPicker(),
+                new Separator(),
+                ButtonBuilder.create().text("Save...").onAction(saveBtnHandler).build(),
+                ButtonBuilder.create().text("Restart").onAction(new EventHandler<ActionEvent>() {
+                    @Override public void handle(ActionEvent event) {
+                        restart();
+                    }
+                }).build()
+            );
+            toolBar.setId("TestAppToolbar");
+            // Create content group used for scaleing @2x
+            final Pane contentGroup = new Pane() {
+                @Override protected void layoutChildren() {
+                    double scale = contentTabs.getTransforms().isEmpty() ? 1 : ((Scale)contentTabs.getTransforms().get(0)).getX();
+                    contentTabs.resizeRelocate(0,0,getWidth()/scale, getHeight()/scale);
+                }
+            };
+            contentGroup.getChildren().add(contentTabs);
+            // populate root
+            root.setTop(toolBar);
+            root.setCenter(contentGroup);
+            
+            samplePage.getStyleClass().add("needs-background");
+            mosaic.getStyleClass().add("needs-background");
+            heightTest.getStyleClass().add("needs-background");
+            combinationsTest.getStyleClass().add("needs-background");
+            customerTest.getStyleClass().add("needs-background");
+            simpleWindows.setModena(modena);
+            // apply retina scale
+            if (retina) {
+                contentTabs.getTransforms().setAll(new Scale(2,2));
+            }
+            // update state
+            Platform.runLater(new Runnable() {
+                @Override public void run() {
+                    // move focus out of the way
+                    modenaButton.requestFocus();
+                    samplePageNavigation.setCurrentSection(scrolledSection);
+                }
+            });
+        } catch (IOException ex) {
+            Logger.getLogger(Modena.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    public RadioMenuItem buildFontRadioMenuItem(String name, final String in_fontName, final int in_fontSize, ToggleGroup tg) {
+        return RadioMenuItemBuilder.create().text(name).onAction(new EventHandler<ActionEvent>(){
+                   @Override public void handle(ActionEvent event) {
+                       setFont(in_fontName, in_fontSize);
+                   }
+               }).style("-fx-font: " + in_fontSize + "px \"" + in_fontName + "\";").toggleGroup(tg).build();
+    }
+    
+    public void setFont(String in_fontName, int in_fontSize) {
+        System.out.println("===================================================================");
+        System.out.println("==   SETTING FONT TO "+in_fontName+" "+in_fontSize+"px");
+        System.out.println("===================================================================");
+        fontName = in_fontName;
+        fontSize = in_fontSize;
+        updateUserAgentStyleSheet();
+    }
+    
+    private ColorPicker createBaseColorPicker() {
+        ColorPicker colorPicker = new ColorPicker(Color.TRANSPARENT);
+        colorPicker.getCustomColors().addAll(
+                Color.TRANSPARENT,
+                Color.web("#f3622d"),
+                Color.web("#fba71b"),
+                Color.web("#57b757"),
+                Color.web("#41a9c9"),
+                Color.web("#888"),
+                Color.RED,
+                Color.ORANGE,
+                Color.YELLOW,
+                Color.GREEN,
+                Color.CYAN,
+                Color.BLUE,
+                Color.PURPLE,
+                Color.MAGENTA,
+                Color.BLACK
+        );
+        colorPicker.valueProperty().addListener(new ChangeListener<Color>() {
+            @Override public void changed(ObservableValue<? extends Color> observable, Color oldValue, Color c) {
+                setBaseColor(c);
+            }
+        });
+        return colorPicker;
+    }
+    
+    public void setBaseColor(Color c) {
+        if (c == null) {
+            baseColor = null;
+        } else {
+            baseColor = c;
+        }
+        updateUserAgentStyleSheet();
+    }
+    
+    private ColorPicker createBackgroundColorPicker() {
+        ColorPicker colorPicker = new ColorPicker(Color.TRANSPARENT);
+        colorPicker.getCustomColors().addAll(
+                Color.TRANSPARENT,
+                Color.web("#f3622d"),
+                Color.web("#fba71b"),
+                Color.web("#57b757"),
+                Color.web("#41a9c9"),
+                Color.web("#888"),
+                Color.RED,
+                Color.ORANGE,
+                Color.YELLOW,
+                Color.GREEN,
+                Color.CYAN,
+                Color.BLUE,
+                Color.PURPLE,
+                Color.MAGENTA,
+                Color.BLACK
+        );
+        colorPicker.valueProperty().addListener(new ChangeListener<Color>() {
+            @Override public void changed(ObservableValue<? extends Color> observable, Color oldValue, Color c) {
+                if (c == null) {
+                    backgroundColor = null;
+                } else {
+                    backgroundColor = c;
+                }
+                updateUserAgentStyleSheet();
+            }
+        });
+        return colorPicker;
+    }
+    
+    private ColorPicker createAccentColorPicker() {
+        ColorPicker colorPicker = new ColorPicker(Color.web("#0096C9"));
+        colorPicker.getCustomColors().addAll(
+                Color.TRANSPARENT,
+                Color.web("#0096C9"),
+                Color.web("#4fb6d6"),
+                Color.web("#f3622d"),
+                Color.web("#fba71b"),
+                Color.web("#57b757"),
+                Color.web("#41a9c9"),
+                Color.web("#888"),
+                Color.RED,
+                Color.ORANGE,
+                Color.YELLOW,
+                Color.GREEN,
+                Color.CYAN,
+                Color.BLUE,
+                Color.PURPLE,
+                Color.MAGENTA,
+                Color.BLACK
+        );
+        colorPicker.valueProperty().addListener(new ChangeListener<Color>() {
+            @Override public void changed(ObservableValue<? extends Color> observable, Color oldValue, Color c) {
+                setAccentColor(c);
+            }
+        });
+        return colorPicker;
+    }
+
+    public void setAccentColor(Color c) {
+        if (c == null) {
+            accentColor = null;
+        } else {
+            accentColor = c;
+        }
+        updateUserAgentStyleSheet();
+    }
+    
+    private EventHandler<ActionEvent> saveBtnHandler = new EventHandler<ActionEvent>() {
+        @Override public void handle(ActionEvent event) {
+            FileChooser fc = new FileChooser();
+            fc.getExtensionFilters().add(new FileChooser.ExtensionFilter("PNG", "*.png"));
+            File file = fc.showSaveDialog(mainStage);
+            if (file != null) {
+                try {
+                    samplePage.getStyleClass().add("root");
+                    int width = (int)(samplePage.getLayoutBounds().getWidth()+0.5d);
+                    int height = (int)(samplePage.getLayoutBounds().getHeight()+0.5d);
+                    BufferedImage imgBuffer = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
+                    Graphics2D g2 = imgBuffer.createGraphics();
+                    for (int y=0; y<height; y+=2048) {
+                        SnapshotParameters snapshotParameters = new SnapshotParameters();
+                        int remainingHeight = Math.min(2048, height - y);
+                        snapshotParameters.setViewport(new Rectangle2D(0,y,width,remainingHeight));
+                        WritableImage img = samplePage.snapshot(snapshotParameters, null);
+                        g2.drawImage(SwingFXUtils.fromFXImage(img,null),0,y,null);
+                    }
+                    g2.dispose();
+                    ImageIO.write(imgBuffer, "PNG", file);
+                    System.out.println("Written image: "+file.getAbsolutePath());
+                } catch (IOException ex) {
+                    Logger.getLogger(Modena.class.getName()).log(Level.SEVERE, null, ex);
+                }
+            }
+        }
+    };
+    
+    public static void main(String[] args) {
+        launch(args);
+    }
+    
+    /** Utility method to load a URL into a string */
+    private static String loadUrl(String url) {
+        StringBuilder sb = new StringBuilder();
+        try {
+            BufferedReader br = new BufferedReader(new InputStreamReader(new URL(url).openStream()));
+            String line;
+            while ((line = br.readLine()) != null) {
+                sb.append(line);
+                sb.append('\n');
+            }
+        } catch (IOException ex) {
+            Logger.getLogger(Modena.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return sb.toString();
+    }
+    
+    // =========================================================================
+    // URL Handler to create magic "internal:stylesheet.css" url for our css string buffer
+    {
+        URL.setURLStreamHandlerFactory(new StringURLStreamHandlerFactory());
+    }
+
+    private String colorToRGBA(Color color) {
+        // Older version didn't care about opacity
+//        return String.format((Locale) null, "#%02x%02x%02x", 
+//                Math.round(color.getRed() * 255), 
+//                Math.round(color.getGreen() * 255), 
+//                Math.round(color.getBlue() * 255));
+        return String.format((Locale) null, "rgba(%d, %d, %d, %f)", 
+            (int) Math.round(color.getRed() * 255), 
+            (int) Math.round(color.getGreen() * 255), 
+            (int) Math.round(color.getBlue() * 255),
+            color.getOpacity());
+    }
+
+    /**
+     * Simple URLConnection that always returns the content of the cssBuffer
+     */
+    private class StringURLConnection extends URLConnection {
+        public StringURLConnection(URL url){
+            super(url);
+        }
+        
+        @Override public void connect() throws IOException {}
+
+        @Override public InputStream getInputStream() throws IOException {
+            return new ByteArrayInputStream(styleSheetContent.getBytes("UTF-8"));
+        }
+    }
+    
+    private class StringURLStreamHandlerFactory implements URLStreamHandlerFactory {
+        URLStreamHandler streamHandler = new URLStreamHandler(){
+            @Override protected URLConnection openConnection(URL url) throws IOException {
+                if (url.toString().toLowerCase().endsWith(".css")) {
+                    return new StringURLConnection(url);
+                } else {
+                    return new URL(styleSheetBase+url.getFile()).openConnection();
+                }
+            }
+        };
+        @Override public URLStreamHandler createURLStreamHandler(String protocol) {
+            if ("internal".equals(protocol)) {
+                return streamHandler;
+            }
+            return null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SameHeightTest.fxml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,375 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.collections.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+<?import javafx.scene.text.*?>
+
+<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="-1.0" prefWidth="-1.0" xmlns:fx="http://javafx.com/fxml" fx:controller="modena.SameHeightTestController">
+  <children>
+    <VBox id="VBox" alignment="TOP_LEFT" layoutX="15.0" layoutY="19.0" spacing="5.0">
+      <children>
+        <Label text="All of these controls should be the same height.">
+          <font>
+            <Font name="System Bold" size="13.0" fx:id="x2" />
+          </font>
+        </Label>
+        <HBox maxHeight="-Infinity" prefHeight="-1.0" prefWidth="-1.0" spacing="3.0" style="">
+          <children>
+            <TitledPane animated="false" expanded="false" prefWidth="80.0" text="TitledPane">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="40.0" prefWidth="80.0" />
+              </content>
+            </TitledPane>
+            <Button mnemonicParsing="false" text="Button" />
+            <ToggleButton mnemonicParsing="false" prefWidth="90.0" selected="true" text="Toggle">
+              <toggleGroup>
+                <ToggleGroup />
+              </toggleGroup>
+            </ToggleButton>
+            <MenuButton mnemonicParsing="false" prefWidth="100.0" text="MenuButton">
+              <items>
+                <MenuItem mnemonicParsing="false" text="Action 1" />
+                <MenuItem mnemonicParsing="false" text="Action 2" />
+              </items>
+            </MenuButton>
+            <SplitMenuButton mnemonicParsing="false" prefWidth="100.0" text="SplitMenuButton">
+              <items>
+                <MenuItem mnemonicParsing="false" text="Action 1" />
+                <MenuItem mnemonicParsing="false" text="Action 2" />
+              </items>
+            </SplitMenuButton>
+            <ChoiceBox prefWidth="60.0">
+              <items>
+                <FXCollections fx:factory="observableArrayList">
+                  <String fx:value="Item 1" />
+                  <String fx:value="Item 2" />
+                  <String fx:value="Item 3" />
+                </FXCollections>
+              </items>
+            </ChoiceBox>
+            <ComboBox prefWidth="60.0">
+              <items>
+                <FXCollections fx:factory="observableArrayList">
+                  <String fx:value="Item 1" />
+                  <String fx:value="Item 2" />
+                  <String fx:value="Item 3" />
+                </FXCollections>
+              </items>
+            </ComboBox>
+            <ComboBox editable="true" prefWidth="60.0" promptText="Choose">
+              <items>
+                <FXCollections fx:factory="observableArrayList">
+                  <String fx:value="Item 1" />
+                  <String fx:value="Item 2" />
+                  <String fx:value="Item 3" />
+                </FXCollections>
+              </items>
+            </ComboBox>
+            <ColorPicker />
+            <TextField prefWidth="100.0" promptText="Textfield" text="TextField" />
+            <PasswordField prefWidth="100.0" promptText="Password" text="password" />
+          </children>
+          <VBox.margin>
+            <Insets top="20.0" fx:id="x1" />
+          </VBox.margin>
+        </HBox>
+        <HBox maxHeight="-Infinity" prefHeight="-1.0" prefWidth="-1.0" spacing="3.0" style="-fx-border-color: #f09f9b transparent #f09f9b transparent;" VBox.margin="$x1">
+          <children>
+            <TitledPane animated="false" expanded="false" prefWidth="80.0" text="TitledPane">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="40.0" prefWidth="80.0" />
+              </content>
+            </TitledPane>
+            <Button mnemonicParsing="false" text="Button" />
+            <ToggleButton mnemonicParsing="false" prefWidth="90.0" selected="true" text="Toggle">
+              <toggleGroup>
+                <ToggleGroup />
+              </toggleGroup>
+            </ToggleButton>
+            <MenuButton mnemonicParsing="false" prefWidth="100.0" text="MenuButton">
+              <items>
+                <MenuItem mnemonicParsing="false" text="Action 1" />
+                <MenuItem mnemonicParsing="false" text="Action 2" />
+              </items>
+            </MenuButton>
+            <SplitMenuButton mnemonicParsing="false" prefWidth="100.0" text="SplitMenuButton">
+              <items>
+                <MenuItem mnemonicParsing="false" text="Action 1" />
+                <MenuItem mnemonicParsing="false" text="Action 2" />
+              </items>
+            </SplitMenuButton>
+            <ChoiceBox prefWidth="60.0">
+              <items>
+                <FXCollections fx:factory="observableArrayList">
+                  <String fx:value="Item 1" />
+                  <String fx:value="Item 2" />
+                  <String fx:value="Item 3" />
+                </FXCollections>
+              </items>
+            </ChoiceBox>
+            <ComboBox prefWidth="60.0">
+              <items>
+                <FXCollections fx:factory="observableArrayList">
+                  <String fx:value="Item 1" />
+                  <String fx:value="Item 2" />
+                  <String fx:value="Item 3" />
+                </FXCollections>
+              </items>
+            </ComboBox>
+            <ComboBox editable="true" prefWidth="60.0" promptText="Choose">
+              <items>
+                <FXCollections fx:factory="observableArrayList">
+                  <String fx:value="Item 1" />
+                  <String fx:value="Item 2" />
+                  <String fx:value="Item 3" />
+                </FXCollections>
+              </items>
+            </ComboBox>
+            <ColorPicker />
+            <TextField prefWidth="100.0" promptText="Textfield" text="TextField" />
+            <PasswordField prefWidth="100.0" promptText="Password" text="password" />
+          </children>
+          <padding>
+            <Insets />
+          </padding>
+        </HBox>
+        <Label font="$x2" text="All of these controls should be text aligned" VBox.margin="$x1" />
+        <HBox id="HBox" alignment="TOP_LEFT" spacing="5.0" VBox.margin="$x1">
+          <children>
+            <StackPane id="StackPane" alignment="TOP_LEFT">
+              <children>
+                <VBox prefHeight="-1.0" prefWidth="-1.0" spacing="3.0">
+                  <children>
+                    <HBox alignment="TOP_LEFT" maxHeight="-Infinity" prefHeight="-1.0" prefWidth="-1.0" spacing="3.0" style="">
+                      <children>
+                        <Button fx:id="horizFirstButton" mnemonicParsing="false" prefWidth="100.0" text="Sample" />
+                        <TextField prefWidth="80.0" promptText="Textfield" text="Sample" />
+                        <PasswordField prefWidth="80.0" promptText="Sample" text="" />
+                        <TextArea prefHeight="50.0" prefWidth="80.0" text="Sample" wrapText="true" />
+                        <TitledPane animated="false" prefWidth="80.0" text="Sample">
+                          <content>
+                            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="40.0" prefWidth="80.0" />
+                          </content>
+                        </TitledPane>
+                        <ToggleButton mnemonicParsing="false" prefWidth="90.0" selected="true" text="Toggle">
+                          <toggleGroup>
+                            <ToggleGroup />
+                          </toggleGroup>
+                        </ToggleButton>
+                        <MenuButton maxWidth="-1.0" mnemonicParsing="false" prefWidth="90.0" text="MenuButton">
+                          <items>
+                            <MenuItem mnemonicParsing="false" text="Sample MenuButton Item 1" />
+                            <MenuItem mnemonicParsing="false" text="Sample MenuButton Item 2" />
+                          </items>
+                        </MenuButton>
+                        <SplitMenuButton mnemonicParsing="false" prefWidth="90.0" text="SplitMenuButton">
+                          <items>
+                            <MenuItem mnemonicParsing="false" text="Sample SplitMenuButton Item 1" />
+                            <MenuItem mnemonicParsing="false" text="Sample SplitMenuButton Item 2" />
+                          </items>
+                        </SplitMenuButton>
+                        <ChoiceBox prefWidth="60.0">
+                          <items>
+                            <FXCollections fx:factory="observableArrayList">
+                              <String fx:value="Sample ChoiceBox Item 1" />
+                              <String fx:value="Sample ChoiceBox Item 2" />
+                            </FXCollections>
+                          </items>
+                        </ChoiceBox>
+                        <ComboBox prefWidth="60.0">
+                          <items>
+                            <FXCollections fx:factory="observableArrayList">
+                              <String fx:value="Sample ComboBox Item 1" />
+                              <String fx:value="Sample ComboBox Item 2" />
+                            </FXCollections>
+                          </items>
+                        </ComboBox>
+                        <ComboBox editable="true" prefWidth="60.0" promptText="Choose">
+                          <items>
+                            <FXCollections fx:factory="observableArrayList">
+                              <String fx:value="Sample ComboBox Item 1" />
+                              <String fx:value="Sample ComboBox Item 2" />
+                            </FXCollections>
+                          </items>
+                        </ComboBox>
+                        <ColorPicker />
+                      </children>
+                    </HBox>
+                    <TextField fx:id="vertFirstTextField" maxWidth="100.0" prefWidth="100.0" text="Sample" />
+                    <PasswordField maxWidth="100.0" prefWidth="100.0" promptText="Sample" text="" />
+                    <TextArea maxWidth="100.0" prefHeight="50.0" prefRowCount="10" prefWidth="100.0" text="Sample" wrapText="true" />
+                    <TitledPane animated="false" collapsible="false" maxWidth="100.0" prefWidth="100.0" text="Sample">
+                      <content>
+                        <AnchorPane id="Content" maxWidth="100.0" minHeight="0.0" minWidth="0.0" prefHeight="40.0" prefWidth="100.0" />
+                      </content>
+                    </TitledPane>
+                    <TitledPane animated="false" maxWidth="100.0" prefWidth="100.0" text="Sample">
+                      <content>
+                        <AnchorPane id="Content" maxWidth="100.0" minHeight="0.0" minWidth="0.0" prefHeight="40.0" prefWidth="100.0" />
+                      </content>
+                    </TitledPane>
+                    <MenuButton maxWidth="100.0" mnemonicParsing="false" prefWidth="100.0" text="Sample">
+                      <items>
+                        <MenuItem mnemonicParsing="false" text="Sample MenuButton Item 1" />
+                        <MenuItem mnemonicParsing="false" text="Sample MenuButton Item 2" />
+                      </items>
+                    </MenuButton>
+                    <SplitMenuButton maxWidth="100.0" mnemonicParsing="false" prefWidth="100.0" text="Sample">
+                      <items>
+                        <MenuItem mnemonicParsing="false" text="Sample SplitMenuButton Item 1" />
+                        <MenuItem mnemonicParsing="false" text="Sample SplitMenuButton Item 2" />
+                      </items>
+                    </SplitMenuButton>
+                    <ChoiceBox maxWidth="100.0" prefWidth="100.0">
+                      <items>
+                        <FXCollections fx:factory="observableArrayList">
+                          <String fx:value="Sample ChoiceBox Item 1" />
+                          <String fx:value="Sample ChoiceBox Item 2" />
+                        </FXCollections>
+                      </items>
+                    </ChoiceBox>
+                    <ComboBox maxWidth="100.0" prefWidth="100.0">
+                      <items>
+                        <FXCollections fx:factory="observableArrayList">
+                          <String fx:value="Sample ComboBox Item 1" />
+                          <String fx:value="Sample ComboBox Item 2" />
+                        </FXCollections>
+                      </items>
+                    </ComboBox>
+                    <ComboBox editable="true" maxWidth="100.0" prefWidth="100.0" promptText="Sample">
+                      <items>
+                        <FXCollections fx:factory="observableArrayList">
+                          <String fx:value="Sample Combo Box Item 1" />
+                          <String fx:value="Sample Combo Box Item 2" />
+                        </FXCollections>
+                      </items>
+                    </ComboBox>
+                    <ListView id="library-listview" maxWidth="150.0" minWidth="-1.0" prefHeight="71.0" prefWidth="150.0">
+                      <items>
+                        <FXCollections fx:factory="observableArrayList">
+                          <String fx:value="Sample 1" />
+                          <String fx:value="Sample 2" />
+                          <String fx:value="Sample 3" />
+                          <String fx:value="Sample 4" />
+                        </FXCollections>
+                      </items>
+                      <VBox.margin>
+                        <Insets bottom="20.0" />
+                      </VBox.margin>
+                    </ListView>
+                  </children>
+                </VBox>
+                <Region fx:id="horizBaseLine" maxHeight="1.0" maxWidth="-1.0" opacity="0.4" prefHeight="-1.0" prefWidth="-1.0" style="-fx-background-color: red;" visible="true">
+                  <StackPane.margin>
+                    <Insets top="15.0" />
+                  </StackPane.margin>
+                </Region>
+                <Region fx:id="vertBaseLine" maxHeight="-1.0" maxWidth="1.0" opacity="0.4" prefHeight="-1.0" prefWidth="-1.0" style="-fx-background-color: red;" visible="true">
+                  <StackPane.margin>
+                    <Insets left="9.0" />
+                  </StackPane.margin>
+                </Region>
+              </children>
+            </StackPane>
+          </children>
+          <padding>
+            <Insets />
+          </padding>
+        </HBox>
+      </children>
+    </VBox>
+    <AnchorPane fx:id="arrowButtonContainer" layoutX="284.0" layoutY="337.0" prefHeight="250.0" prefWidth="322.0" style="-fx-border-color: #cccccc;">
+      <children>
+        <VBox alignment="TOP_RIGHT" minHeight="-1.0" prefHeight="-1.0" prefWidth="216.0" spacing="10.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
+          <children>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="MenuButton:" />
+                <MenuButton mnemonicParsing="false" prefWidth="150.0" text="Sample">
+                  <items>
+                    <MenuItem mnemonicParsing="false" text="Action 1" />
+                    <MenuItem mnemonicParsing="false" text="Action 2" />
+                  </items>
+                </MenuButton>
+              </children>
+            </HBox>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="SplitMenuButton" />
+                <SplitMenuButton mnemonicParsing="false" prefWidth="150.0" text="Sample">
+                  <items>
+                    <MenuItem mnemonicParsing="false" text="Action 1" />
+                    <MenuItem mnemonicParsing="false" text="Action 2" />
+                  </items>
+                </SplitMenuButton>
+              </children>
+            </HBox>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="ChoiceBox" />
+                <ChoiceBox prefWidth="150.0">
+                  <items>
+                    <FXCollections fx:factory="observableArrayList">
+                      <String fx:value="Item 1" />
+                      <String fx:value="Item 2" />
+                      <String fx:value="Item 3" />
+                    </FXCollections>
+                  </items>
+                </ChoiceBox>
+              </children>
+            </HBox>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="ComboBox" />
+                <ComboBox prefWidth="150.0">
+                  <items>
+                    <FXCollections fx:factory="observableArrayList">
+                      <String fx:value="Item 1" />
+                      <String fx:value="Item 2" />
+                      <String fx:value="Item 3" />
+                    </FXCollections>
+                  </items>
+                </ComboBox>
+              </children>
+            </HBox>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="ComboBox (editable)" />
+                <ComboBox fx:id="editableCombo" editable="true" prefWidth="150.0" promptText="Sample">
+                  <items>
+                    <FXCollections fx:factory="observableArrayList">
+                      <String fx:value="Item 1" />
+                      <String fx:value="Item 2" />
+                      <String fx:value="Item 3" />
+                    </FXCollections>
+                  </items>
+                </ComboBox>
+              </children>
+            </HBox>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="ColorPicker" />
+                <ColorPicker prefWidth="150.0" />
+              </children>
+            </HBox>
+            <HBox id="HBox" alignment="CENTER_RIGHT" spacing="10.0">
+              <children>
+                <Label text="Split ColorPicker" />
+                <ColorPicker prefWidth="150.0" styleClass="split-button" />
+              </children>
+            </HBox>
+          </children>
+        </VBox>
+        <Region fx:id="arrowButtonLeftLine" layoutX="284.0" layoutY="0.0" maxHeight="-1.0" maxWidth="1.0" opacity="0.4" prefHeight="300.0" prefWidth="1.0" style="-fx-border-color: transparent transparent transparent red;&#10;-fx-border-style: dashed; " visible="true" />
+        <Region id="arrowButtonLeftLine" fx:id="arrowButtonRightLine" layoutX="303.0" layoutY="0.0" maxHeight="-1.0" maxWidth="1.0" opacity="0.4" prefHeight="300.0" prefWidth="1.0" style="-fx-border-color: transparent transparent transparent red;&#10;-fx-border-style: dashed; " visible="true" />
+        <Region id="arrowButtonLeftLine" fx:id="arrowLeftLine" layoutX="294.0" layoutY="0.0" maxHeight="-1.0" maxWidth="1.0" minWidth="1.0" opacity="0.4" prefHeight="300.0" prefWidth="1.0" style="-fx-border-color: transparent transparent transparent rgba(0,0,255,0.5);&#10;-fx-border-style: dashed; " visible="true" />
+        <Region id="arrowButtonLeftLine" fx:id="arrowRightLine" layoutX="299.0" layoutY="0.0" maxHeight="-1.0" maxWidth="1.0" minWidth="1.0" opacity="0.4" prefHeight="300.0" prefWidth="1.0" style="-fx-border-color: transparent transparent transparent rgba(0,0,255,0.5);&#10;-fx-border-style: dashed; " visible="true" />
+      </children>
+    </AnchorPane>
+  </children>
+</AnchorPane>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SameHeightTestController.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+import javafx.application.Platform;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.control.Button;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.scene.text.Text;
+
+/**
+ * Controller to auto align guidelines
+ */
+public class SameHeightTestController implements Initializable{
+    
+    private @FXML Button horizFirstButton;
+    private @FXML TextField vertFirstTextField;
+    private @FXML Region horizBaseLine;
+    private @FXML Region vertBaseLine;
+    private @FXML Region arrowButtonLeftLine;
+    private @FXML Region arrowButtonRightLine;
+    private @FXML Region arrowLeftLine;
+    private @FXML Region arrowRightLine;
+    private @FXML ComboBox editableCombo;
+    private @FXML AnchorPane arrowButtonContainer;
+    private Node arrowButton;
+    private Node arrow;
+
+    @Override public void initialize(URL url, ResourceBundle rb) {
+        Platform.runLater(new Runnable() {
+            @Override public void run() {
+                Text buttonTextNode = (Text)horizFirstButton.lookup(".text");
+                buttonTextNode.layoutYProperty().addListener(new ChangeListener<Number>() {
+                    @Override public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
+                        StackPane.setMargin(horizBaseLine, new Insets(t1.doubleValue(),0,0,0));
+                    }
+                });
+                Text textFieldTextNode = (Text)vertFirstTextField.lookup(".text");
+                textFieldTextNode.layoutXProperty().addListener(new ChangeListener<Number>() {
+                    @Override public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
+                        StackPane.setMargin(vertBaseLine, new Insets(0,0,0,t1.doubleValue()));
+                    }
+                });
+                arrowButton = editableCombo.lookup(".arrow-button");
+                arrow = editableCombo.lookup(".arrow");
+                ChangeListener updater = new ChangeListener() {
+                    @Override public void changed(ObservableValue ov, Object t, Object t1) {
+                        updateArrowLinePositions();
+                    }
+                };
+                arrow.layoutBoundsProperty().addListener(updater);
+                arrowButton.layoutBoundsProperty().addListener(updater);
+                editableCombo.layoutBoundsProperty().addListener(updater);
+                arrowButtonContainer.layoutBoundsProperty().addListener(updater);
+                updateArrowLinePositions();
+            }
+        });
+    }
+    
+    private void updateArrowLinePositions() {
+        double left = arrowButton.localToScene(0, 0).getX() - arrowButtonContainer.localToScene(0, 0).getX();
+        arrowButtonLeftLine.setLayoutX(left-1);
+        arrowButtonLeftLine.setPrefHeight(arrowButtonContainer.getLayoutBounds().getHeight());
+        arrowButtonRightLine.setLayoutX(left + arrowButton.getLayoutBounds().getWidth());
+        arrowButtonRightLine.setPrefHeight(arrowButtonContainer.getLayoutBounds().getHeight());
+        double arrowLeft = arrow.localToScene(0, 0).getX() - arrowButtonContainer.localToScene(0, 0).getX();
+        arrowLeftLine.setLayoutX(arrowLeft-1);
+        arrowLeftLine.setPrefHeight(arrowButtonContainer.getLayoutBounds().getHeight());
+        arrowRightLine.setLayoutX(arrowLeft + arrow.getLayoutBounds().getWidth());
+        arrowRightLine.setPrefHeight(arrowButtonContainer.getLayoutBounds().getHeight());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePage.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,792 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javafx.collections.ObservableList;
+import javafx.geometry.HPos;
+import javafx.geometry.Insets;
+import javafx.geometry.Orientation;
+import javafx.geometry.Pos;
+import javafx.geometry.Side;
+import javafx.geometry.VPos;
+import javafx.scene.Node;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonBuilder;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.CheckBoxBuilder;
+import javafx.scene.control.ChoiceBoxBuilder;
+import javafx.scene.control.ColorPicker;
+import javafx.scene.control.ColorPickerBuilder;
+import javafx.scene.control.ComboBoxBuilder;
+import javafx.scene.control.Hyperlink;
+import javafx.scene.control.Label;
+import javafx.scene.control.LabelBuilder;
+import javafx.scene.control.ListViewBuilder;
+import javafx.scene.control.MenuButtonBuilder;
+import javafx.scene.control.PasswordFieldBuilder;
+import javafx.scene.control.ProgressBarBuilder;
+import javafx.scene.control.ProgressIndicator;
+import javafx.scene.control.ProgressIndicatorBuilder;
+import javafx.scene.control.RadioButton;
+import javafx.scene.control.ScrollBar;
+import javafx.scene.control.ScrollBarBuilder;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.ScrollPaneBuilder;
+import javafx.scene.control.SeparatorBuilder;
+import javafx.scene.control.Slider;
+import javafx.scene.control.SliderBuilder;
+import javafx.scene.control.SplitMenuButtonBuilder;
+import javafx.scene.control.TableViewBuilder;
+import javafx.scene.control.TextAreaBuilder;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TextFieldBuilder;
+import javafx.scene.control.TitledPaneBuilder;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleButtonBuilder;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.control.Tooltip;
+import javafx.scene.control.TooltipBuilder;
+import javafx.scene.control.TreeTableView;
+import javafx.scene.control.TreeViewBuilder;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.HBoxBuilder;
+import javafx.scene.layout.Priority;
+import javafx.scene.layout.VBox;
+import javafx.scene.layout.VBoxBuilder;
+import javafx.scene.paint.Color;
+import javafx.scene.web.HTMLEditor;
+
+import static modena.SamplePageChartHelper.*;
+import static modena.SamplePageHelpers.*;
+import static modena.SamplePageTableHelper.*;
+import static modena.SamplePageTreeHelper.createTreeView;
+import static modena.SamplePageTreeTableHelper.createTreeTableView;
+
+/**
+ * Page showing every control in every state.
+ */
+public class SamplePage extends GridPane {
+    private int rowIndex = 0;
+    private Map<String, Node> content = new HashMap<>();
+    private List<Section> sections = new ArrayList<>();
+
+    public SamplePage() {
+        setVgap(25);
+        setHgap(15);
+        setPadding(new Insets(15));
+        newSection("Label:",
+                new Label("Label"),
+                withState(new Label("Disabled"), "disabled"));
+        newSection("Button:",
+                new Button("Button"),
+                withState(new Button("Hover"), "hover"),
+                withState(new Button("Armed"), "armed"),
+                withState(new Button("Focused"), "focused"),
+                withState(new Button("Focused & Hover"), "focused, hover"),
+                withState(new Button("Focused & Armed"), "focused, armed"),
+                withState(new Button("Disabled"), "disabled"));
+        newSection("Default Button:",
+                ButtonBuilder.create().text("Button").defaultButton(true).build(),
+                withState(new Button("Hover"), "default, hover"),
+                withState(new Button("Armed"), "default, armed"),
+                withState(new Button("Focused"), "default, focused"),
+                withState(new Button("Focused & Hover"), "default, focused, hover"),
+                withState(new Button("Focused & Armed"), "default, focused, armed"),
+                withState(new Button("Disabled"), "default, disabled"));
+        newSection("Nice Colors:",
+                ButtonBuilder.create().text("Button").style("-fx-base: #f3622d;").build(),
+                ButtonBuilder.create().text("Button").style("-fx-base: #fba71b;").build(),
+                ButtonBuilder.create().text("Button").style("-fx-base: #57b757;").build(),
+                ButtonBuilder.create().text("Button").style("-fx-base: #41a9c9;").build(),
+                ButtonBuilder.create().text("Button").style("-fx-base: #888;").build());
+        newSection("Greys:",0,
+                createGreyButton(0),
+                createGreyButton(0.1),
+                createGreyButton(0.2),
+                createGreyButton(0.3),
+                createGreyButton(0.4),
+                createGreyButton(0.5),
+                createGreyButton(0.6),
+                createGreyButton(0.7),
+                createGreyButton(0.8),
+                createGreyButton(0.9),
+                createGreyButton(1));
+        ToggleGroup tg1 = new ToggleGroup();
+        ToggleGroup tg2 = new ToggleGroup();
+        ToggleGroup tg3 = new ToggleGroup();
+        ToggleGroup tg4 = new ToggleGroup();
+        newSection("Pill Toggle\nButtons:",
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("Left").styleClass("left-pill").toggleGroup(tg1).build(),
+                        ToggleButtonBuilder.create().text("Center").styleClass("center-pill").toggleGroup(tg1).build(),
+                        ToggleButtonBuilder.create().text("Right").styleClass("right-pill").toggleGroup(tg1).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("Left").styleClass("left-pill").toggleGroup(tg2).selected(true).build(),
+                        ToggleButtonBuilder.create().text("Center").styleClass("center-pill").toggleGroup(tg2).build(),
+                        ToggleButtonBuilder.create().text("Right").styleClass("right-pill").toggleGroup(tg2).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("Left").styleClass("left-pill").toggleGroup(tg3).build(),
+                        ToggleButtonBuilder.create().text("Center").styleClass("center-pill").toggleGroup(tg3).selected(true).build(),
+                        ToggleButtonBuilder.create().text("Right").styleClass("right-pill").toggleGroup(tg3).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("Left").styleClass("left-pill").toggleGroup(tg4).build(),
+                        ToggleButtonBuilder.create().text("Center").styleClass("center-pill").toggleGroup(tg4).build(),
+                        ToggleButtonBuilder.create().text("Right").styleClass("right-pill").toggleGroup(tg4).selected(true).build()
+                    )
+                    .build());
+        ToggleGroup tg5 = new ToggleGroup();
+        ToggleGroup tg6 = new ToggleGroup();
+        ToggleGroup tg7 = new ToggleGroup();
+        ToggleGroup tg8 = new ToggleGroup();
+        newSection("Pill Toggle\nButtons\nFocused:",
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("#").styleClass("left-pill").toggleGroup(tg5).build(),
+                        ToggleButtonBuilder.create().text("#").styleClass("center-pill").toggleGroup(tg5).build(),
+                        ToggleButtonBuilder.create().text("#").styleClass("right-pill").toggleGroup(tg5).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        withState(ToggleButtonBuilder.create().text("L").styleClass("left-pill").toggleGroup(tg5).build(),"focused"),
+                        ToggleButtonBuilder.create().text("C").styleClass("center-pill").toggleGroup(tg5).build(),
+                        ToggleButtonBuilder.create().text("R").styleClass("right-pill").toggleGroup(tg5).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("L").styleClass("left-pill").toggleGroup(tg5).build(),
+                        withState(ToggleButtonBuilder.create().text("C").styleClass("center-pill").toggleGroup(tg5).build(),"focused"),
+                        ToggleButtonBuilder.create().text("R").styleClass("right-pill").toggleGroup(tg5).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("L").styleClass("left-pill").toggleGroup(tg5).build(),
+                        ToggleButtonBuilder.create().text("C").styleClass("center-pill").toggleGroup(tg5).build(),
+                        withState(ToggleButtonBuilder.create().text("R").styleClass("right-pill").toggleGroup(tg5).build(),"focused")
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        withState(ToggleButtonBuilder.create().text("L").styleClass("left-pill").toggleGroup(tg6).selected(true).build(),"focused"),
+                        ToggleButtonBuilder.create().text("C").styleClass("center-pill").toggleGroup(tg6).build(),
+                        ToggleButtonBuilder.create().text("R").styleClass("right-pill").toggleGroup(tg6).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("L").styleClass("left-pill").toggleGroup(tg7).build(),
+                        withState(ToggleButtonBuilder.create().text("C").styleClass("center-pill").toggleGroup(tg7).selected(true).build(),"focused"),
+                        ToggleButtonBuilder.create().text("R").styleClass("right-pill").toggleGroup(tg7).build()
+                    )
+                    .build(),
+                HBoxBuilder.create()
+                    .children(
+                        ToggleButtonBuilder.create().text("L").styleClass("left-pill").toggleGroup(tg8).build(),
+                        ToggleButtonBuilder.create().text("C").styleClass("center-pill").toggleGroup(tg8).build(),
+                        withState(ToggleButtonBuilder.create().text("R").styleClass("right-pill").toggleGroup(tg8).selected(true).build(),"focused")
+                    )
+                    .build());
+        newSection("ToggleButton:",
+                new ToggleButton("Button"),
+                withState(new ToggleButton("Hover"), "hover"),
+                withState(new ToggleButton("Armed"), "armed"),
+                withState(new ToggleButton("Focused"), "focused"),
+                withState(new ToggleButton("Focused & Hover"), "focused, hover"),
+                withState(new ToggleButton("Focused & Armed"), "focused, armed"),
+                withState(new ToggleButton("Disabled"), "disabled"));
+        newSection("ToggleButton Selected:",
+                withState(new ToggleButton("Button"), "selected"),
+                withState(new ToggleButton("Hover"), "selected, hover"),
+                withState(new ToggleButton("Armed"), "selected, armed"),
+                withState(new ToggleButton("Focused"), "selected, focused"),
+                withState(new ToggleButton("Focused & Hover"), "selected, focused, hover"),
+                withState(new ToggleButton("Focused & Armed"), "selected, focused, armed"),
+                withState(new ToggleButton("Disabled"), "selected, disabled"));
+        newSection("CheckBox:",
+                new CheckBox("CheckBox"),
+                withState(new CheckBox("Hover"), "hover"),
+                withState(new CheckBox("Armed"), "armed"),
+                withState(new CheckBox("Focused"), "focused"),
+                withState(new CheckBox("Focused & Hover"), "focused, hover"),
+                withState(new CheckBox("Focused & Armed"), "focused, armed"),
+                withState(new CheckBox("Disabled"), "disabled"));
+        newSection("CheckBox Selected:",
+                withState(new CheckBox("CheckBox"), "selected"),
+                withState(new CheckBox("Hover"), "selected, hover"),
+                withState(new CheckBox("Armed"), "selected, armed"),
+                withState(new CheckBox("Focused"), "selected, focused"),
+                withState(new CheckBox("Focused & Hover"), "selected, focused, hover"),
+                withState(new CheckBox("Focused & Armed"), "selected, focused, armed"),
+                withState(new CheckBox("Disabled"), "selected, disabled"));
+//        newSection("CheckBox\nIndeterminate:",
+//                CheckBoxBuilder.create().text("CheckBox").selected(true).indeterminate(true).allowIndeterminate(true).build(),
+//                withState(new CheckBox("Hover"), "indeterminate, selected, hover"),
+//                withState(new CheckBox("Armed"), "indeterminate, selected, armed"),
+//                withState(new CheckBox("Focused"), "indeterminate, selected, focused"),
+//                withState(new CheckBox("Focused & Hover"), "indeterminate, selected, focused, hover"),
+//                withState(new CheckBox("Focused & Armed"), "indeterminate, selected, focused, armed"),
+//                withState(new CheckBox("Disabled"), "indeterminate, selected, disabled"));
+        newSection("RadioButton:",
+                new RadioButton("RadioButton"),
+                withState(new RadioButton("Hover"), "hover"),
+                withState(new RadioButton("Armed"), "armed"),
+                withState(new RadioButton("Focused"), "focused"),
+                withState(new RadioButton("Focused & Hover"), "focused, hover"),
+                withState(new RadioButton("Focused & Armed"), "focused, armed"),
+                withState(new RadioButton("Disabled"), "disabled"));
+        newSection("RadioButton\nSelected:",
+                withState(new RadioButton("RadioButton"), "selected"),
+                withState(new RadioButton("Hover"), "selected, hover"),
+                withState(new RadioButton("Armed"), "selected, armed"),
+                withState(new RadioButton("Focused"), "selected, focused"),
+                withState(new RadioButton("Focused & Hover"), "selected, focused, hover"),
+                withState(new RadioButton("Focused & Armed"), "selected, focused, armed"),
+                withState(new RadioButton("Disabled"), "selected, disabled"));
+        newSection("HyperLink:",
+                new Hyperlink("Hyperlink"),
+                withState(new Hyperlink("Visited"), "visited"),
+                withState(new Hyperlink("Hover"), "hover"),
+                withState(new Hyperlink("Armed"), "armed"),
+                withState(new Hyperlink("Focused"), "focused"),
+                withState(new Hyperlink("F & Visited"), "focused, visited"),
+                withState(new Hyperlink("F & Hover"), "focused, hover"),
+                withState(new Hyperlink("F & Armed"), "focused, armed"),
+                withState(new Hyperlink("Disabled"), "disabled"));
+        ObservableList<String> choiceBoxLongList = sampleItems(200);
+        choiceBoxLongList.add(100, "Long List");
+        newSection(
+                "ChoiceBox:",
+                ChoiceBoxBuilder.<String>create().items(sampleItems()).value("Item A").build(),
+                ChoiceBoxBuilder.<String>create().items(choiceBoxLongList).value("Long List").build(),
+                withState(ChoiceBoxBuilder.<String>create().items(sampleItems()).value("Item B").build(), "hover"),
+                withState(ChoiceBoxBuilder.<String>create().items(sampleItems()).value("Item B").build(), "showing"),
+                withState(ChoiceBoxBuilder.<String>create().items(sampleItems()).value("Item B").build(), "focused"),
+                ChoiceBoxBuilder.<String>create().items(sampleItems()).value("Item C").disable(true).build()
+        );
+        newSection(
+                "ComboBox:",
+                ComboBoxBuilder.<String>create().items(sampleItems()).value("Item A").build(),
+                ComboBoxBuilder.<String>create().items(choiceBoxLongList).value("Long List").build(),
+                withState(ComboBoxBuilder.<String>create().items(sampleItems()).value("Item B").build(), "hover"),
+                withState(ComboBoxBuilder.<String>create().items(sampleItems()).value("Item B").build(), "showing"),
+                withState(ComboBoxBuilder.<String>create().items(sampleItems()).value("Item B").build(), "focused"),
+                ComboBoxBuilder.<String>create().items(sampleItems()).value("Item C").disable(true).build()
+                );
+        newSection(
+                "ComboBox\nEditable:",
+                ComboBoxBuilder.<String>create().items(sampleItems()).value("Item A").editable(true).build(),
+                withState(ComboBoxBuilder.<String>create().items(sampleItems()).value("Item B").editable(true).build(), "editable", ".arrow-button", "hover"),
+                withState(ComboBoxBuilder.<String>create().items(sampleItems()).value("Item B").editable(true).build(), "editable", ".arrow-button", "pressed")
+                );
+        newSection(
+                "ComboBox\nEditable\n(More):",
+                withState(ComboBoxBuilder.<String>create().items(sampleItems()).value("Item B").editable(true).build(), "editable,contains-focus", ".text-field", "focused"),
+                ComboBoxBuilder.<String>create().items(sampleItems()).value("Item C").editable(true).disable(true).build()
+                );
+        newSection(
+                "Color Picker:",
+                ColorPickerBuilder.create().value(Color.RED).build(),
+                withState(ColorPickerBuilder.create().value(Color.RED).build(), "hover"),
+                withState(ColorPickerBuilder.create().value(Color.RED).build(), "showing"),
+                withState(ColorPickerBuilder.create().value(Color.RED).build(), "focused"),
+                withState(ColorPickerBuilder.create().value(Color.RED).build(), "disabled")
+                );
+        newSection(
+                "Color Picker\n Split Button:",
+                ColorPickerBuilder.create().value(Color.RED).styleClass(ColorPicker.STYLE_CLASS_SPLIT_BUTTON).build(),
+                withState(ColorPickerBuilder.create().value(Color.RED).styleClass(ColorPicker.STYLE_CLASS_SPLIT_BUTTON).build(), "hover"),
+                withState(ColorPickerBuilder.create().value(Color.RED).styleClass(ColorPicker.STYLE_CLASS_SPLIT_BUTTON).build(), "showing"),
+                withState(ColorPickerBuilder.create().value(Color.RED).styleClass(ColorPicker.STYLE_CLASS_SPLIT_BUTTON).build(), "focused"),
+                withState(ColorPickerBuilder.create().value(Color.RED).styleClass(ColorPicker.STYLE_CLASS_SPLIT_BUTTON).build(), "disabled")
+                );
+        newSection(
+                "MenuButton:",
+                MenuButtonBuilder.create().items(createMenuItems(20)).text("right").popupSide(Side.RIGHT).build(),
+                MenuButtonBuilder.create().items(createMenuItems(20)).text("normal").build(),
+                withState(MenuButtonBuilder.create().items(createMenuItems(20)).text("hover").build(), "openvertically,hover"),
+                withState(MenuButtonBuilder.create().items(createMenuItems(20)).text("armed").build(), "openvertically,armed"),
+                withState(MenuButtonBuilder.create().items(createMenuItems(20)).text("focused").build(), "openvertically,focused"),
+                withState(MenuButtonBuilder.create().items(createMenuItems(20)).text("disabled").build(), "openvertically,disabled")
+                );
+        newSection(
+                "SplitMenuButton:",
+                SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("right").popupSide(Side.RIGHT).build(),
+                SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("normal").build(),
+                withState(SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("hover").build(),"openvertically",".label", "hover"),
+                withState(SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("armed").build(),"armed,openvertically",".label", "armed")
+                );
+        newSection(
+                "SplitMenuButton\nMore:",
+                withState(SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("arrow hover").build(),"openvertically",".arrow-button", "hover"),
+                withState(SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("showing").build(), "openvertically,showing"),
+                withState(SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("focused").build(), "openvertically,focused"),
+                withState(SplitMenuButtonBuilder.create().items(createMenuItems(20)).text("disabled").build(), "openvertically,disabled")
+                );
+        newDetailedSection(
+                new String[]{"Slider (H):", "normal", "hover", "pressed", "disabled", "tickmarks"},
+                withState(SliderBuilder.create().maxWidth(90).min(0).max(100).value(50).build(), null),
+                withState(SliderBuilder.create().maxWidth(90).min(0).max(100).value(50).build(), null, ".thumb", "hover"),
+                withState(SliderBuilder.create().maxWidth(90).min(0).max(100).value(50).build(), null, ".thumb", "hover, pressed"),
+                withState(SliderBuilder.create().maxWidth(90).min(0).max(100).value(50).build(), "disabled"),
+                SliderBuilder.create().min(0).max(100).value(50).showTickMarks(true).showTickLabels(true).build());
+        newDetailedSection(
+                new String[]{"Slider (H) Focused:", "normal", "hover", "pressed"},
+                withState(new Slider(0, 100, 50), "focused"),
+                withState(new Slider(0, 100, 50), "focused", ".thumb", "hover"),
+                withState(new Slider(0, 100, 50), "focused", ".thumb", "hover, pressed"));
+        newSection("Slider - V:",
+                SliderBuilder.create().min(0).max(100).value(50).orientation(Orientation.VERTICAL).build(),
+                withState(SliderBuilder.create().min(0).max(100).value(50).orientation(Orientation.VERTICAL).build(), null, ".thumb", "hover"),
+                withState(SliderBuilder.create().min(0).max(100).value(50).orientation(Orientation.VERTICAL).build(), null, ".thumb", "hover, pressed"),
+                withState(SliderBuilder.create().min(0).max(100).value(50).orientation(Orientation.VERTICAL).build(), "disabled"),
+                SliderBuilder.create().min(0).max(100).value(50).showTickMarks(true).showTickLabels(true).orientation(Orientation.VERTICAL).build());
+        newDetailedSection(
+                new String[] {"Scrollbar - H: ", "normal", "focused", "small", "big thumb"},
+                new ScrollBar(),
+                withState(ScrollBarBuilder.create().build(), "focused"),
+                ScrollBarBuilder.create().minWidth(30).prefWidth(30).build(),
+                ScrollBarBuilder.create().visibleAmount(60).max(100).build()
+                );
+        newDetailedSection(
+                new String[] {"Scrollbar - V: ", "normal", "focused", "small", "btn hover", "btn pressed", ".thumb hover", ".thumb pressed"},
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).build(), "vertical"),
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).build(), "focused"),
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).minHeight(30).prefHeight(30).build(), "vertical"),
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).build(), "vertical", ".decrement-button", "hover"),
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).build(), "vertical", ".decrement-button", "pressed"),
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).build(), "vertical", ".thumb", "hover"),
+                withState(ScrollBarBuilder.create().orientation(Orientation.VERTICAL).build(), "vertical", ".thumb", "pressed")
+                );
+        newDetailedSection(
+                new String[] {"ScrollPane: ", "normal", "small", "focused", "empty"},
+                ScrollPaneBuilder.create().content(scrollPaneContent()).build(),
+                ScrollPaneBuilder.create().content(scrollPaneContent()).minWidth(40).prefWidth(40).minHeight(40).prefHeight(40).build(),
+                withState(ScrollPaneBuilder.create().content(scrollPaneContent()).build(), "focused"),
+                ScrollPaneBuilder.create().build()
+                );
+        newDetailedSection(
+                new String[] {"ScrollPane H/V: ", "H Bar", "V bar"},
+                ScrollPaneBuilder.create().content(scrollPaneContent()).vbarPolicy(ScrollPane.ScrollBarPolicy.NEVER).build(),
+                ScrollPaneBuilder.create().content(scrollPaneContent()).hbarPolicy(ScrollPane.ScrollBarPolicy.NEVER).build()
+                );
+        newDetailedSection(
+                new String[] {"Separator: ", "horizontal", "vertical"},
+                SeparatorBuilder.create().prefWidth(100).build(),
+                SeparatorBuilder.create().orientation(Orientation.VERTICAL).prefHeight(50).build()
+                );
+        newDetailedSection(
+                new String[] {"ProgressBar: ", "normal", "disabled"/*, "indeterminate"*/},
+                ProgressBarBuilder.create().progress(0.6).prefWidth(200).build(),
+                withState(ProgressBarBuilder.create().progress(0.2).prefWidth(200).build(), "disabled")
+               // ProgressBarBuilder.create().progress(-1).prefWidth(200).build()
+                );
+        newDetailedSection(
+                new String[] {"ProgressIndicator: ", "normal 0%", "normal 60%", "normal 100%", "disabled"},
+                new ProgressIndicator(0),
+                new ProgressIndicator(0.6),
+                new ProgressIndicator(1),
+                withState(new ProgressIndicator(0.5), "disabled")
+                );
+//        newDetailedSection(
+//                new String[] {"ProgressIndicator\nIndeterminate: ", "normal", "small", "large", "disabled"},
+//                ProgressIndicatorBuilder.create().progress(-1).maxWidth(USE_PREF_SIZE).maxHeight(USE_PREF_SIZE).build(),
+//                ProgressIndicatorBuilder.create().progress(-1).prefWidth(30).prefHeight(30).build(),
+//                ProgressIndicatorBuilder.create().progress(-1).prefWidth(60).prefHeight(60).build(),
+//                ProgressIndicatorBuilder.create().progress(-1).maxWidth(USE_PREF_SIZE).maxHeight(USE_PREF_SIZE).disable(true).build()
+//                );
+        newSection(
+                "TextField:",
+                new TextField("TextField"),
+                TextFieldBuilder.create().promptText("Prompt Text").build(),
+                withState(new TextField("Focused"), "focused"),
+                withState(new TextField("Disabled"), "disabled")
+        );
+        newSection(
+                "PasswordField:",
+                PasswordFieldBuilder.create().text("Password").build(),
+                PasswordFieldBuilder.create().promptText("Prompt Text").build(),
+                withState(PasswordFieldBuilder.create().text("Password").build(), "focused"),
+                withState(PasswordFieldBuilder.create().text("Password").build(), "disabled")
+        );
+        newSection(
+                "TextArea:",
+                TextAreaBuilder.create().text("TextArea").prefColumnCount(10).prefRowCount(2).build(),
+                TextAreaBuilder.create().text("Many Lines of\nText.\n#3\n#4\n#5\n#6\n#7\n#8\n#9\n#10").prefColumnCount(10).prefRowCount(5).build(),
+                TextAreaBuilder.create().text("Many Lines of\nText.\n#3\n#4\n#5\n#6\n#7\n#8\n#9\n#10").prefColumnCount(6).prefRowCount(5).build(),
+                TextAreaBuilder.create().promptText("Prompt Text").prefColumnCount(10).prefRowCount(2).build(),
+                withState(TextAreaBuilder.create().text("Focused").prefColumnCount(7).prefRowCount(2).build(), "focused"),
+                withState(TextAreaBuilder.create().text("Disabled").prefColumnCount(8).prefRowCount(2).build(), "disabled")
+        );
+        newSection(
+                "HTMLEditor:",
+                new HTMLEditor() {{
+                    setHtmlText("Hello <b>Bold</b> Text");
+                    setPrefSize(650, 120);
+                }});
+        newSection(
+                "HTMLEditor\nFocused:",
+                withState(new HTMLEditor() {{
+                    setHtmlText("<i>Focused</i>");
+                    setPrefSize(650, 120);
+                }}, "focused")
+                );
+        newDetailedSection(
+                new String[] { "ToolBar (H|TOP):", "normal", "overflow", "disabled" },
+                createToolBar(Side.TOP, false, false),
+                createToolBar(Side.TOP, true, false),
+                createToolBar(Side.TOP, false, true)
+        );
+        newDetailedSection(
+                new String[] { "ToolBar (H|BOTTOM):", "normal", "overflow", "disabled" },
+                createToolBar(Side.BOTTOM, false, false),
+                createToolBar(Side.BOTTOM, true, false),
+                createToolBar(Side.BOTTOM, false, true)
+        );
+        newDetailedSection(
+                new String[] { "ToolBar (V|LEFT):", "normal", "overflow", "disabled" },
+                createToolBar(Side.LEFT, false, false),
+                createToolBar(Side.LEFT, true, false),
+                createToolBar(Side.LEFT, false, true)
+        );
+        newDetailedSection(
+                new String[] {"ToolBar (V|RIGHT):", "normal", "overflow", "disabled"},
+                createToolBar(Side.RIGHT,false,false),
+                createToolBar(Side.RIGHT,true,false),
+                createToolBar(Side.RIGHT,false,true)
+                );
+        newSection(
+                "Tabs\n(Top):",
+                wrapBdr(createTabPane(4, 250, 100, null, false, false, Side.TOP)),
+                wrapBdr(withState(createTabPane(5, 200, 100, "Tab Disabled &\nMany Tabs", false, true, Side.TOP), null, ".tab", "disabled")),
+                wrapBdr(withState(createTabPane(5, 200, 100, "Disabled", false, false, Side.TOP), "disabled"))
+        );
+        newSection(
+                "Tabs Floating\n(Top):",
+                createTabPane(4, 250, 100, null, true, false, Side.TOP),
+                withState(createTabPane(5, 200, 100, "Tab Disabled &\nMany Tabs", true, true, Side.TOP), null, ".tab", "disabled"),
+                withState(createTabPane(5, 200, 100, "Disabled", true, false, Side.TOP), "disabled")
+                );
+        newSection(
+                "Tabs\n(Bottom):",
+                wrapBdr(createTabPane(4, 250, 100, null, false, false, Side.BOTTOM)),
+                wrapBdr(withState(createTabPane(5, 200, 100, "Tab Disabled &\nMany Tabs", false, true, Side.BOTTOM), null, ".tab", "disabled")),
+                wrapBdr(withState(createTabPane(5, 200, 100, "Disabled", false, false, Side.BOTTOM), "disabled"))
+                );
+        newSection(
+                "Tabs Floating\n(Bottom):",
+                createTabPane(4, 250, 100, null, true, false, Side.BOTTOM),
+                withState(createTabPane(5, 200, 100, "Tab Disabled &\nMany Tabs", true, true, Side.BOTTOM), null, ".tab", "disabled"),
+                withState(createTabPane(5, 200, 100, "Disabled", true, false, Side.BOTTOM), "disabled")
+                );
+        newSection(
+                "Tabs\n(Left):",
+                wrapBdr(createTabPane(4, 250, 250, null, false, false, Side.LEFT)),
+                wrapBdr(withState(createTabPane(5, 200, 250, "Tab Disabled &\nMany Tabs", false, true, Side.LEFT), null, ".tab", "disabled")),
+                wrapBdr(withState(createTabPane(5, 200, 250, "Disabled", false, false, Side.LEFT), "disabled"))
+                );
+        newSection(
+                "Tabs Floating\n(Left):",
+                createTabPane(4, 250, 250, null, true, false, Side.LEFT),
+                withState(createTabPane(5, 200, 250, "Tab Disabled &\nMany Tabs", true, true, Side.LEFT), null, ".tab", "disabled"),
+                withState(createTabPane(5, 200, 250, "Disabled", true, false, Side.LEFT), "disabled")
+                );
+        newSection(
+                "Tabs\n(Right):",
+                wrapBdr(createTabPane(4, 250, 250, null, false, false, Side.RIGHT)),
+                wrapBdr(withState(createTabPane(5, 200, 250, "Tab Disabled &\nMany Tabs", false, true, Side.RIGHT), null, ".tab", "disabled")),
+                wrapBdr(withState(createTabPane(5, 200, 250, "Disabled", false, false, Side.RIGHT), "disabled"))
+                );
+        newSection(
+                "Tabs Floating\n(Right):",
+                createTabPane(4, 250, 250, null, true, false, Side.RIGHT),
+                withState(createTabPane(5, 200, 250, "Tab Disabled &\nMany Tabs", true, true, Side.RIGHT), null, ".tab", "disabled"),
+                withState(createTabPane(5, 200, 250, "Disabled", true, false, Side.RIGHT), "disabled")
+                );
+        newDetailedSection(
+                new String[] { "TitledPane:", "normal", "not collapsible", "hover", "focused", "disabled" },
+                TitledPaneBuilder.create().text("Title").content(new Label("Content\nLine2.")).build(),
+                TitledPaneBuilder.create().text("Not Collapsible").content(new Label("Content\nLine2.")).collapsible(false).build(),
+                withState(TitledPaneBuilder.create().text("Title").content(new Label("Content\nLine2.")).build(), "hover"),
+                withState(TitledPaneBuilder.create().text("Title").content(new Label("Content\nLine2.")).build(), "focused"),
+                withState(TitledPaneBuilder.create().text("Title").content(new Label("Content\nLine2.")).build(), "disabled")
+        );
+        newDetailedSection(
+                new String[] {"Accordion:", "normal", "hover", "focused", "disabled"},
+                createAccordion(),
+                withState(createAccordion(), null, ".titled-pane", "hover"),
+                withState(createAccordion(), null, ".titled-pane", "focused"),
+                withState(createAccordion(), "disabled")
+                );
+        newDetailedSection(
+                new String[] {"SplitPane (H):", "simple", "many", "complex"},
+                createSplitPane(2, false, null),
+                createSplitPane(4, false, null),
+                createSplitPane(2, false, createSplitPane(2, true, null))
+                );
+        newDetailedSection(
+                new String[] {"SplitPane (V):", "simple", "many", "complex"},
+                createSplitPane(2,true,null),
+                createSplitPane(4,true,null),
+                createSplitPane(2,true,createSplitPane(2,false,null))
+                );
+        newDetailedSection(
+                new String[] {"Pagination:", "simple", "infinate"},
+                createPagination(5, false, true),
+                createPagination(Integer.MAX_VALUE, false, true)
+                );
+        newDetailedSection(
+                new String[] {"Pagination\nBullet Style:", "simple", "infinate"},
+                createPagination(5, true, true),
+                createPagination(Integer.MAX_VALUE, true, true)
+                );
+        newSection(
+                "Pagination\nNo Arrows:",
+                createPagination(Integer.MAX_VALUE, false, false)
+        );
+        newDetailedSection(
+                new String[] { "ListView\n2 items\nsingle selection:", "normal", "focused", "disabled" },
+                createListView(3, false, false, false),
+                withState(createListView(3, false, false, false), "focused"),
+                createListView(3, false, true, false)
+        );
+        newDetailedSection(
+                new String[] {"ListView\n10,000 items\nmultiple selection:","normal", "focused", "disabled"},
+                createListView(10000, true, false, false),
+                withState(createListView(10000, true, false, false), "focused"),
+                createListView(10000, true, true, false)
+                );
+        newDetailedSection(
+                new String[] {"ListView (H)\n10,000 items\nmultiple selection:","normal", "focused", "disabled"},
+                createListView(10000, true, false, true),
+                withState(createListView(10000, true, false, true), "focused"),
+                createListView(10000, true, true, true)
+                );
+        newSection(
+                "TableView Simple:\n(Row Selection)",
+                createTableViewSimple(550, true, false),
+                withState(createTableViewSimple(150, true, false), "focused")
+        );
+        newSection(
+                "TableView Simple:\n(Constrained Resize)",
+                createTableViewSimple(550, true, true),
+                withState(createTableViewSimple(150, true, true), "focused")
+        );
+        newSection(
+                "TableView:\n(Row Selection)",
+                createTableView(550, true),
+                withState(createTableView(150, true), "focused")
+        );
+        newSection(
+                "TableView:\n(Cell Selection)",
+                createTableView(550, false),
+                withState(createTableView(150, false), "focused")
+                );
+        newSection(
+                "TreeView:",
+                createTreeView(350),
+                withState(createTreeView(350), "focused")
+                );
+        newSection(
+                "TreeTableView:\n" +
+                        "(Row Selection)",
+                createTreeTableView(550, false),
+                withState(createTreeTableView(200, false), "focused")
+                );
+        newSection(
+                "TreeTableView:\n(Cell Selection)",
+                createTreeTableView(550, true),
+                withState(createTreeTableView(200, true), "focused")
+                );
+        newDetailedSection(
+                new String[] {"Empty:", "ListView", "TableView", "TreeView", "TreeTableView"},
+                ListViewBuilder.<String>create().prefWidth(150).prefHeight(100).build(),
+                TableViewBuilder.create().prefWidth(150).prefHeight(100).build(),
+                TreeViewBuilder.create().prefWidth(150).prefHeight(100).build(),
+                new TreeTableView() {{
+                    setPrefSize(150, 100);
+                }}
+                );
+        newDetailedSection(
+                new String[] {"ToolTip:","inline","inline + graphic", "popup"},
+                LabelBuilder.create().text("This is a simple Tooltip.").styleClass("tooltip").build(),
+                LabelBuilder.create().text("This is a simple Tooltip\nwith graphic.").graphic(createGraphic()).styleClass("tooltip").build(),
+                VBoxBuilder.create().fillWidth(true).spacing(4).children(
+                    ButtonBuilder.create().text("Hover over me").tooltip(new Tooltip("This is a simple Tooltip.")).build(),
+                    ButtonBuilder.create().text("me too").tooltip(new Tooltip("This is a simple Tooltip\nwith more than one line.")).build(),
+                    ButtonBuilder.create().text("or me").tooltip(TooltipBuilder.create().text("This is a simple Tooltip\nwith graphic.").graphic(createGraphic()).build()).build()
+                ).build()
+                );
+        newSection(
+                "MenuBar & ContextMenu:",
+                createMenuBar(),
+                createContextMenu()
+                );
+        newSection(
+                "Menus:",
+                createInlineMenu(false),
+                createInlineMenu(true)
+                );
+        newSection(
+                "AreaChart:",
+                createAreaChart(false)
+                );
+        newSection(
+                "StackedAreaChart:",
+                createAreaChart(true)
+                );
+        newSection(
+                "BarChart\nSimple:",
+                createBarChart(false,true)
+                );
+        newSection(
+                "BarChart:",
+                createBarChart(false, false)
+                );
+        newSection(
+                "BarChart\n(H, Simple):",
+                createBarChart(true, true)
+                );
+        newSection(
+                "BarChart\n(H):",
+                createBarChart(true, false)
+                );
+        newSection(
+                "StackedBarChart\nSimple:",
+                createStackedBarChart(false,true)
+                );
+        newSection(
+                "StackedBarChart\n(H, Simple):",
+                createStackedBarChart(true, true)
+        );
+        newSection(
+                "BubbleChart:",
+                createBubbleChart(false)
+        );
+        newSection(
+                "BubbleChart\nTop & Right Axis:",
+                createBubbleChart(true)
+        );
+        newSection(
+                "LineChart:",
+                createLineChart()
+        );
+        newSection(
+                "PieChar:",
+                createPieChart()
+        );
+        newSection(
+                "ScatterChart:",
+                createScatterChart()
+        );
+    }
+
+    public List<Section> getSections() {
+        return sections;
+    }
+
+    private void newSection(String name, Node ...children) {
+        newSection(name, 10, children);
+    }
+
+    private void newSection(String name, int spacing, Node ...children) {
+        Label sectionLabel = new Label(name);
+        sectionLabel.getStyleClass().add("section-label");
+        sectionLabel.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);
+        HBox box = new HBox(spacing);
+        box.getStyleClass().add("section-border");
+        box.getChildren().addAll(children);
+        setConstraints(sectionLabel, 0, rowIndex, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
+        setConstraints(box, 1, rowIndex++);
+        getChildren().addAll(sectionLabel, box);
+        sections.add(new Section(name, sectionLabel, box));
+        content.put(name, box);
+    }
+
+    private void newDetailedSection(String[] labels, Node ...children) {
+        Label sectionLabel = new Label(labels[0]);
+        sectionLabel.getStyleClass().add("section-label");
+        sectionLabel.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
+        HBox hbox = new HBox(10);
+        for (int n = 0; n < children.length; n++ ) {
+            VBox vbox = new VBox(10);
+            vbox.getStyleClass().add("section-border");
+            vbox.setAlignment(Pos.CENTER);
+            Label stateLabel = new Label(labels[n+1]);
+            stateLabel.getStyleClass().add("section-label");
+            vbox.getChildren().add(stateLabel);
+            vbox.getChildren().add(children[n]);
+            hbox.getChildren().addAll(vbox);
+        }
+        setConstraints(sectionLabel, 0, rowIndex,1,1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS,Priority.ALWAYS);
+        setConstraints(hbox, 1, rowIndex++);
+        getChildren().addAll(sectionLabel, hbox);
+        sections.add(new Section(labels[0], sectionLabel, hbox));
+        content.put(labels[0], hbox);
+    }
+
+    public Map<String, Node> getContent() {
+        return content;
+    }
+
+    public static class Section {
+        public final String name;
+        public final Label label;
+        public final Node box;
+
+        public Section(String name, Label label, Node box) {
+            this.name = name;
+            this.label = label;
+            this.box = box;
+        }
+
+        @Override public String toString() {
+            return name.replaceAll("\n"," ");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePageChartHelper.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.util.Random;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.geometry.Side;
+import javafx.scene.Node;
+import javafx.scene.chart.AreaChart;
+import javafx.scene.chart.BarChart;
+import javafx.scene.chart.BubbleChart;
+import javafx.scene.chart.CategoryAxis;
+import javafx.scene.chart.LineChart;
+import javafx.scene.chart.NumberAxis;
+import javafx.scene.chart.PieChart;
+import javafx.scene.chart.ScatterChart;
+import javafx.scene.chart.StackedAreaChart;
+import javafx.scene.chart.StackedBarChart;
+import javafx.scene.chart.XYChart;
+
+/**
+ * Helper class for creating charts for testing
+ */
+public class SamplePageChartHelper {
+    
+    static Node createAreaChart(Boolean stacked) {
+        NumberAxis xAxis = new NumberAxis("X Values", 1.0d, 9.0d, 2.0d);
+        xAxis.setTickLength(12.0f);
+        NumberAxis yAxis = new NumberAxis();
+        yAxis.setLabel("Y Values");
+        ObservableList<AreaChart.Series> areaChartData = FXCollections.observableArrayList(
+                new AreaChart.Series("Series 1",FXCollections.observableArrayList(
+                    new AreaChart.Data(0,4),
+                    new AreaChart.Data(2,5),
+                    new AreaChart.Data(4,4),
+                    new AreaChart.Data(6,2),
+                    new AreaChart.Data(8,6),
+                    new AreaChart.Data(10,8)
+                )),
+                new AreaChart.Series("Series 2", FXCollections.observableArrayList(
+                    new AreaChart.Data(0,8),
+                    new AreaChart.Data(2,2),
+                    new AreaChart.Data(4,9),
+                    new AreaChart.Data(6,7),
+                    new AreaChart.Data(8,5),
+                    new AreaChart.Data(10,7)
+                )),
+                new AreaChart.Series("Series 3", FXCollections.observableArrayList(
+                    new AreaChart.Data(0,2),
+                    new AreaChart.Data(2,5),
+                    new AreaChart.Data(4,8),
+                    new AreaChart.Data(6,6),
+                    new AreaChart.Data(8,9),
+                    new AreaChart.Data(10,7)
+                ))
+        );
+        Node areaChart;
+        if (stacked) {
+            areaChart = new StackedAreaChart(xAxis, yAxis, areaChartData);
+        } else {
+            areaChart = new AreaChart(xAxis, yAxis, areaChartData);
+        }
+        return areaChart;
+    }
+    
+    static Node createStackedBarChart(boolean horizontal, boolean simple) {
+        return createBarChart(horizontal, simple, true);
+    }
+    
+    static Node createBarChart(boolean horizontal, boolean simple) {
+        return createBarChart(horizontal, simple, false);
+    }
+    
+    static Node createBarChart(boolean horizontal, boolean simple, boolean stacked) {
+        final Random RANDOM = new Random(29782198273l);
+        String[] years = {"2001","2002","2003"};
+        String[] series;
+        if (simple) {
+            series = new String[]{"A","B","C"};
+        } else {
+            series = new String[]{"A","B","C","D","E","F","G","H"};
+        }
+        CategoryAxis xAxis = new CategoryAxis(FXCollections.<String>observableArrayList(years));
+        NumberAxis yAxis = new NumberAxis();
+        yAxis.setLabel("Units Sold");
+        ObservableList<BarChart.Series> barChartData = FXCollections.observableArrayList();
+        final double negative = stacked ? 0 : -500;
+        for (int s=0; s<series.length; s++) {
+            ObservableList<BarChart.Data> sd = FXCollections.observableArrayList();
+            for(int y=0; y<years.length; y++) {
+                if (horizontal) {
+                    sd.add(new BarChart.Data(negative+(2000*RANDOM.nextDouble()), years[y]));
+                } else {
+                    sd.add(new BarChart.Data(years[y], negative+(2000*RANDOM.nextDouble())));
+                }
+            }
+            barChartData.add(new BarChart.Series(series[s],sd));
+        }
+        Node barChart;
+        if (stacked) {
+            if (horizontal) {
+                barChart = new StackedBarChart(yAxis, xAxis, barChartData);
+            } else {
+                barChart = new StackedBarChart(xAxis, yAxis, barChartData);
+            }
+        } else {
+            if (horizontal) {
+                barChart = new BarChart(yAxis, xAxis, barChartData);
+            } else {
+                barChart = new BarChart(xAxis, yAxis, barChartData);
+            }
+        }
+        return barChart;
+    }
+    
+    static Node createBubbleChart(boolean useRightTopAxis) {
+        final Random RANDOM = new Random(29782198273l);
+        NumberAxis xAxis = new NumberAxis();
+        xAxis.setLabel("Product");
+        NumberAxis yAxis = new NumberAxis();
+        yAxis.setLabel("Number Bought/Sold");
+        if (useRightTopAxis) {
+            xAxis.setSide(Side.TOP);
+            yAxis.setSide(Side.RIGHT);
+        }
+        ObservableList<BubbleChart.Series> bubbleChartData = FXCollections.observableArrayList();
+        for (int s=0; s<8; s++) {
+            ObservableList<BubbleChart.Data> seriesData = FXCollections.<BubbleChart.Data>observableArrayList();
+            for (int d=0; d<(8*(RANDOM.nextDouble()*10)); d++) {
+                seriesData.add(new XYChart.Data(100*RANDOM.nextDouble(), -50+(150*RANDOM.nextDouble()), 5+(10*RANDOM.nextDouble()) ));
+            }
+            bubbleChartData.add(new ScatterChart.Series("Product "+(s+1),seriesData));
+        }
+        return new BubbleChart(xAxis, yAxis, bubbleChartData);
+    }
+    
+    static Node createLineChart() {
+        NumberAxis xAxis = new NumberAxis("Values for X-Axis", 0, 3, 1);
+        NumberAxis yAxis = new NumberAxis("Values for Y-Axis", 0, 3, 1);
+        ObservableList<XYChart.Series<Double,Double>> lineChartData = FXCollections.observableArrayList(
+            new LineChart.Series<Double,Double>("Series 1", FXCollections.observableArrayList(
+                new XYChart.Data<Double,Double>(0.0, 1.0),
+                new XYChart.Data<Double,Double>(1.2, 1.4),
+                new XYChart.Data<Double,Double>(2.2, 1.9),
+                new XYChart.Data<Double,Double>(2.7, 2.3),
+                new XYChart.Data<Double,Double>(2.9, 0.5)
+            )),
+            new LineChart.Series<Double,Double>("Series 2", FXCollections.observableArrayList(
+                new XYChart.Data<Double,Double>(0.0, 1.6),
+                new XYChart.Data<Double,Double>(0.8, 0.4),
+                new XYChart.Data<Double,Double>(1.4, 2.9),
+                new XYChart.Data<Double,Double>(2.1, 1.3),
+                new XYChart.Data<Double,Double>(2.6, 0.9)
+            ))
+        );
+        return new LineChart(xAxis, yAxis, lineChartData);
+    }
+    
+    static Node createPieChart() {
+         ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
+             new PieChart.Data("Sun", 20),
+             new PieChart.Data("IBM", 12),
+             new PieChart.Data("HP", 25),
+             new PieChart.Data("Dell", 22),
+             new PieChart.Data("Apple", 30)
+         );
+        return new PieChart(pieChartData);
+    }
+    
+    static Node createScatterChart() {
+        final Random RANDOM = new Random(29782198273l);
+        NumberAxis xAxis = new NumberAxis("X-Axis", 0, 8, 1);
+        NumberAxis yAxis = new NumberAxis("Y-Axis", -5, 5, 1);
+        ObservableList<XYChart.Series> data = FXCollections.observableArrayList();
+        for (int s=0; s<8; s++) {
+            ObservableList<ScatterChart.Data> seriesData = FXCollections.<ScatterChart.Data>observableArrayList();
+            for (int d=0; d<(8*(RANDOM.nextDouble()*10)); d++) {
+                seriesData.add(new XYChart.Data(8*RANDOM.nextDouble(), -5+(10*RANDOM.nextDouble())));
+            }
+            data.add(new ScatterChart.Series("Product "+(s+1),seriesData));
+        }
+        return new ScatterChart(xAxis, yAxis, data);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePageHelpers.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,405 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.util.ArrayList;
+import java.util.List;
+import javafx.application.Platform;
+import javafx.beans.InvalidationListener;
+import javafx.beans.Observable;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.css.PseudoClass;
+import javafx.geometry.Insets;
+import javafx.geometry.Orientation;
+import javafx.geometry.Side;
+import javafx.scene.GroupBuilder;
+import javafx.scene.Node;
+import javafx.scene.control.Accordion;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonBuilder;
+import javafx.scene.control.CheckMenuItem;
+import javafx.scene.control.CheckMenuItemBuilder;
+import javafx.scene.control.ContextMenu;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListView;
+import javafx.scene.control.Menu;
+import javafx.scene.control.MenuBar;
+import javafx.scene.control.MenuItem;
+import javafx.scene.control.Pagination;
+import javafx.scene.control.RadioMenuItemBuilder;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.Separator;
+import javafx.scene.control.SeparatorMenuItem;
+import javafx.scene.control.SplitPane;
+import javafx.scene.control.TabBuilder;
+import javafx.scene.control.TabPane;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TitledPaneBuilder;
+import javafx.scene.control.ToolBar;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.KeyCharacterCombination;
+import javafx.scene.input.KeyCombination;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.StackPaneBuilder;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.LineBuilder;
+import javafx.scene.shape.RectangleBuilder;
+import javafx.util.Callback;
+
+/**
+ * Helper static methods for Sample Page
+ */
+public class SamplePageHelpers {
+    
+    static <T extends Node> T withState(T node, String state) {
+        if (node != null && state != null) {
+            // stop user from being able to change state
+            node.setMouseTransparent(true);
+            node.setFocusTraversable(false);
+            // set state to chosen state
+            final String[] pseudoClasses = (state).split("[\\s,]+");
+            for (String pseudoClass : pseudoClasses) {
+                node.pseudoClassStateChanged(PseudoClass.getPseudoClass(pseudoClass), true);
+            }
+        }
+        return node;
+    }
+    
+    static <T extends Node> T withState(final T node, final String state, final String subNodeStyleClass, final String subNodeState) {
+        withState(node, state);
+        Platform.runLater(new Runnable() {
+            @Override public void run() {
+                if (node != null) {
+                    Node subNode = node.lookup(subNodeStyleClass);
+                    if (subNode != null) {
+                        withState(node.lookup(subNodeStyleClass), subNodeState);
+                    } else {
+                        System.err.println("node = " + node+" node.lookup("+subNodeStyleClass+") = " + subNode);
+                    }
+                } else {
+                    System.err.println("node = " + node);
+                }
+            }
+        });
+        return node;
+    }
+    
+    private static final String[] LETTERS = new String[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
+    
+    static ObservableList<String> sampleItems() {
+        return sampleItems(7);
+    }
+    
+    static ObservableList<String> sampleItems(int numberOfItems) {
+        ArrayList<String> items = new ArrayList<String>();
+        if (numberOfItems < 26) {
+            for(int i=0; i<numberOfItems; i++) {
+                items.add("Item "+LETTERS[i]);
+            }
+        } else {
+            for(int i=0; i<numberOfItems; i++) {
+                items.add("Item "+i);
+            }
+        }
+        return FXCollections.observableArrayList(items);
+    }
+    
+    static Node scrollPaneContent() {
+        return GroupBuilder.create().children(
+                RectangleBuilder.create().width(200).height(200).fill(Color.PALETURQUOISE).build(),
+                LineBuilder.create().endX(200).endY(200).stroke(Color.DODGERBLUE).build(),
+                LineBuilder.create().startX(200).endX(0).endY(200).stroke(Color.DODGERBLUE).build()
+            ).build();
+    }
+    
+    static Node createTabPane(int numOfTabs, int prefWidth, int prefHeight, String firstTabText, boolean floating, boolean disableFirst, Side side) {
+        TabPane tabPane = new TabPane();
+        tabPane.setSide(side);
+        if (floating) tabPane.getStyleClass().add("floating");
+        for (int i=1; i<=numOfTabs; i++) {
+            tabPane.getTabs().add(
+                TabBuilder.create()
+                    .text("Tab "+i)
+                    .disable(i==0 && disableFirst)
+                    .content(new Label((i==1 && firstTabText!=null)? firstTabText :"Tab "+i+" Content"))
+                    .build()
+            );
+        }
+        if (disableFirst) tabPane.getSelectionModel().select(1);
+        tabPane.setPrefWidth(prefWidth);
+        tabPane.setPrefHeight(prefHeight);
+        return tabPane;
+    }
+    
+    static Node wrapBdr(Node node) {
+        return StackPaneBuilder.create().children(node)
+                .style("-fx-border-color: black; -fx-border-width: 3;").build();
+    }
+    
+    static ToolBar createToolBar(Side side, boolean overFlow, boolean disabled) {
+        final boolean vertical = side == Side.LEFT || side == Side.RIGHT;
+        ToolBar toolBar = new ToolBar();
+        if (vertical) toolBar.setOrientation(Orientation.VERTICAL);
+        if (side == Side.BOTTOM) toolBar.getStyleClass().add("bottom");
+        if (side == Side.RIGHT) toolBar.getStyleClass().add("right");
+        if (disabled) toolBar.setDisable(true);
+        toolBar.getItems().addAll(
+                new Button("A"),
+                new Button("B"),
+                new Separator()
+        );
+        if (vertical) {
+            toolBar.getItems().addAll(
+                new Button("C"),
+                new Button("D")
+            );
+        } else {
+            toolBar.getItems().addAll(
+                new Label("Search:"),
+                new TextField()
+            );
+        }
+        if (overFlow) {
+            if (vertical) {
+                toolBar.setPrefHeight(80);
+            } else {
+                toolBar.setPrefWidth(80);
+            }
+        }
+        return toolBar;
+    }
+    
+    static Accordion createAccordion() {
+        Accordion accordian = new Accordion();
+        accordian.getPanes().addAll(
+            TitledPaneBuilder.create().text("Title 1").content(new Label("Content\nLine2.")).build(),
+            TitledPaneBuilder.create().text("Title 2").content(new Label("Content\nLine2.")).build(),
+            TitledPaneBuilder.create().text("Title 3").content(new Label("Content\nLine2.")).build()
+        );
+        return accordian;
+    }
+    
+    static SplitPane createSplitPane(int numOfItems, boolean vertical, Node firstItem) {
+        SplitPane splitPane = new SplitPane();
+        if(vertical) splitPane.setOrientation(Orientation.VERTICAL);
+        if (firstItem != null) splitPane.getItems().add(firstItem);
+        for (int i=1; i<=numOfItems; i++) {
+            splitPane.getItems().add(new Label("Item "+i));
+        }
+        splitPane.setPrefSize(150, 150);
+        return splitPane;
+    }
+    
+    static Pagination createPagination(int numOfPages, boolean bullet, boolean arrows) {
+        Pagination pagination = new Pagination(numOfPages);
+        if (bullet) pagination.getStyleClass().add("bullet");
+        if (!arrows) pagination.setStyle("-fx-arrows-visible:false;");
+        pagination.setPageFactory(new Callback<Integer, Node>() {
+            @Override public Node call(Integer param) {
+                return new Label("Page Label "+param);
+            }
+        });
+        return pagination;
+    }
+    
+    static ListView<String> createListView(int numOfItems, boolean multipleSelection, boolean disable, boolean horiz) {
+        ListView<String> listView = new ListView<String>();
+        if (horiz) listView.setOrientation(Orientation.HORIZONTAL);
+        listView.setPrefHeight((24*7)+4);
+        listView.setPrefWidth(horiz ? 200 : 140);
+        listView.getItems().addAll(sampleItems(numOfItems));
+        listView.setDisable(disable);
+        if (multipleSelection) {
+            listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+            listView.getSelectionModel().selectRange(1, 5);
+        } else {
+            listView.getSelectionModel().select(1);
+        }
+        return listView;
+    }
+    
+    static MenuItem[] createMenuItems(int numberOfItems) {
+        ArrayList<MenuItem> items = new ArrayList<MenuItem>();
+        if (numberOfItems < 26) {
+            for(int i=0; i<numberOfItems; i++) {
+                items.add(new MenuItem("Item "+LETTERS[i]));
+            }
+        } else {
+            for(int i=0; i<numberOfItems; i++) {
+                items.add(new MenuItem("Item "+i));
+            }
+        }
+        return items.toArray(new MenuItem[items.size()]);
+    }
+    
+    static MenuBar createMenuBar() {
+        final MenuBar mb = new MenuBar();
+        mb.getMenus().addAll(
+            createMenu("File"),
+            createMenu("Edit"),
+            createMenu("View"),
+            createMenu("Help")
+        );
+//        mb.setMouseTransparent(true);
+        Platform.runLater(new Runnable() {
+            @Override public void run() {
+                // get second menu and force into hover state
+                try {
+                    new ArrayList<Node>(mb.lookupAll(".menu")).get(1).pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), true);
+                } catch (Exception e) { e.printStackTrace(); }
+            }
+        });
+        return  mb;
+    }
+    
+    static Menu createMenu(String name) {
+        Menu m = new Menu(name);
+        m.getStyleClass().add(name);
+        m.getItems().addAll(createMenuContents());
+        return  m;
+    }
+    
+    static Node createContextMenu() {
+        Button b = new Button("ContextMenu Right Click Me");
+        b.setContextMenu(new ContextMenu(createMenuContents()));
+        return b;
+    }
+    
+    static Node createInlineMenu(final boolean selectAll) {
+        // create a context menu so we can put it inline in our test page
+        final ContextMenu menu = new ContextMenu(createMenuContents());
+        // create a place holder container
+        final StackPane contextMenu = new StackPane();
+        // show context menu then steal and place inline
+        Platform.runLater(new Runnable() {
+            @Override public void run() {
+                menu.show(contextMenu,-1000,-1000);
+                menu.hide();
+                Platform.runLater(new Runnable() {
+                    @Override public void run() {
+                        final Node menuContent = menu.getSkin().getNode();
+                        contextMenu.getChildren().add(menuContent);
+                        menuContent.setMouseTransparent(true);
+//                        System.out.println("menuContent = " + menuContent);
+//                        System.out.println("menuContent.lookupAll(\".menu-item\") = " + menuContent.lookupAll(".menu-item"));
+                        
+//                        Platform.runLater(new Runnable() {
+//                            @Override public void run() {
+////                        if (selectAll) {
+////                            for (Node n: menuContent.lookupAll(".menu-item")) {
+////                                n.pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), true);
+////                            }
+////                        } else {
+//                            new ArrayList<Node>(menuContent.lookupAll(".menu-item")).get(2)
+//                                    .pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), true);
+////                        }
+//                            }
+//                        });
+                    }
+                });
+            }
+        });
+        return contextMenu;
+    }
+    
+    static MenuItem[] createMenuContents() {
+        List<MenuItem> menuItems = new ArrayList<>();
+//        Menu menu11 = makeMenu("_New", new ImageView(new Image(getClass().getResourceAsStream("about_16.png"))));
+//        final Menu menu11 = new Menu("_New", new ImageView(new Image("helloworld/about_16.png")));
+//        MenuItem menu12 = new MenuItem("_Open", new ImageView(new Image("helloworld/folder_16.png")));
+        final Menu menu11 = new Menu("_New");
+        MenuItem menu12 = new MenuItem("_Open");
+        menu12.getStyleClass().add("OpenMenuItem");
+        menu12.setAccelerator(new KeyCharacterCombination("]", 
+                KeyCombination.SHIFT_DOWN, KeyCombination.META_DOWN));
+        Menu menu13 = new Menu("_Submenu");
+//        CheckMenuItem showMessagesItem = new CheckMenuItem("Enable onShowing/onHiding _messages", 
+//                                             new ImageView(new Image("helloworld/about_16.png")));
+        CheckMenuItem showMessagesItem = new CheckMenuItem("Enable onShowing/onHiding _messages");
+        MenuItem menu15 = new MenuItem("E_xit");
+        final String change[] = {"Change Text", "Change Back"};
+        final MenuItem menu16 = new MenuItem(change[0]);
+        final boolean toggle = false;
+        menu16.setAccelerator(KeyCombination.keyCombination("Shortcut+C"));
+        menuItems.add(menu11);
+        menuItems.add(menu12);
+        menuItems.add(menu13);
+//        menuItems.add(showMessagesItem);
+        menuItems.add(menu16);
+        menuItems.add(new SeparatorMenuItem());
+        menuItems.add(CheckMenuItemBuilder.create().text("Check").build());
+        menuItems.add(CheckMenuItemBuilder.create().text("Check Selected").selected(true).build());
+        menuItems.add(new SeparatorMenuItem());
+        menuItems.add(RadioMenuItemBuilder.create().text("Radio").build());
+        menuItems.add(RadioMenuItemBuilder.create().text("Radio Selected").selected(true).build());
+        menuItems.add(new SeparatorMenuItem());
+        menuItems.add(menu15);
+
+        // --- Menu 11 submenu
+        final MenuItem menu111 = new MenuItem("blah");
+        final MenuItem menu112 = new MenuItem("foo");
+        final CheckMenuItem menu113 = new CheckMenuItem("Show \"foo\" item");
+        menu113.setSelected(true);
+        menu113.selectedProperty().addListener(new InvalidationListener() {
+            @Override public void invalidated(Observable valueModel) {
+                menu112.setVisible(menu113.isSelected());
+                System.err.println("MenuItem \"foo\" is now " + (menu112.isVisible() ? "" : "not") + " visible.");
+            }
+        });
+        menu11.getItems().addAll(menu111, menu112, menu113);
+
+        // --- Menu 13 submenu
+        MenuItem menu131 = new MenuItem("Item _1");
+        MenuItem menu132 = new MenuItem("Item _2");
+        menu13.getItems().addAll(menu131, menu132);
+        
+        return menuItems.toArray(new MenuItem[menuItems.size()]);
+    }
+    
+    static final Image recorder48 = new Image(SamplePageHelpers.class.getResource("recorder-icon-48.png").toExternalForm());
+    
+    static ImageView createGraphic() {
+        return new ImageView(recorder48);
+    }
+    
+    static Node createGreyButton(double percentageGrey) {
+        int grey = (int)(percentageGrey*255);
+        int percentage = (int)(percentageGrey * 100);
+        StackPane sp = new StackPane();
+        sp.setStyle("-fx-base: rgba("+grey+","+grey+","+grey+",1); -fx-background-color: -fx-background;");
+        sp.setPadding(new Insets(8));
+        sp.getChildren().add(ButtonBuilder.create().text(percentage+"%").build());
+        return sp;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePageNavigation.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,89 @@
+package modena;
+
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.control.ToolBar;
+import javafx.scene.layout.BorderPane;
+
+/**
+ * Container for samplePage that has scrolling and knows how to navigate to sections
+ */
+public class SamplePageNavigation extends BorderPane {
+    private SamplePage samplePage = new SamplePage();
+    private ScrollPane scrollPane = new ScrollPane(samplePage);
+    private boolean isLocalChange = false;
+    private SamplePage.Section currentSection;
+
+    public SamplePageNavigation() {
+        scrollPane.setId("SamplePageScrollPane");
+        setCenter(scrollPane);
+        ToolBar toolBar = new ToolBar();
+        toolBar.setId("SamplePageToolBar");
+        toolBar.getStyleClass().add("bottom");
+        toolBar.getItems().add(new Label("Go to section:"));
+        final ChoiceBox<SamplePage.Section> sectionChoiceBox = new ChoiceBox<>();
+        sectionChoiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<SamplePage.Section>() {
+            @Override public void changed(ObservableValue<? extends SamplePage.Section> observable, SamplePage.Section oldValue, SamplePage.Section newValue) {
+                setCurrentSection(newValue);
+            }
+        });
+        sectionChoiceBox.getItems().addAll(samplePage.getSections());
+        toolBar.getItems().add(sectionChoiceBox);
+        setBottom(toolBar);
+        scrollPane.vvalueProperty().addListener(new ChangeListener<Number>() {
+            @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
+                if (!isLocalChange) {
+                    isLocalChange = true;
+                    // calc scroll position relative to scroll pane content
+                    double posPixels = samplePage.getLayoutBounds().getHeight() * newValue.doubleValue();
+                    // move to top of view port
+                    posPixels -=  scrollPane.getLayoutBounds().getHeight() * newValue.doubleValue();
+                    // move to center of view port
+                    posPixels +=  scrollPane.getLayoutBounds().getHeight() * 0.5;
+                    // find section that contains view port center
+                    currentSection = null;
+                    for (SamplePage.Section section: samplePage.getSections()) {
+                        if (section.box.getBoundsInParent().getMaxY() > posPixels ) {
+                            currentSection = section;
+                            break;
+                        }
+                    }
+                    sectionChoiceBox.getSelectionModel().select(currentSection);
+                    isLocalChange = false;
+                }
+
+            }
+        });
+    }
+
+    public SamplePage.Section getCurrentSection() {
+        return currentSection;
+    }
+
+    public void setCurrentSection(SamplePage.Section currentSection) {
+        this.currentSection = currentSection;
+        if (!isLocalChange) {
+            isLocalChange = true;
+            double pos = 0;
+            if (currentSection != null) {
+                double sectionBoxCenterY = currentSection.box.getBoundsInParent().getMinY()
+                        + (currentSection.box.getBoundsInParent().getHeight()/2);
+                // move to center of view port
+                pos -=  scrollPane.getLayoutBounds().getHeight() * 0.5;
+                // move to top of view port
+                pos +=  scrollPane.getLayoutBounds().getHeight() * (sectionBoxCenterY / samplePage.getLayoutBounds().getHeight());
+                // find relative pos
+                pos = sectionBoxCenterY / samplePage.getLayoutBounds().getHeight();
+            }
+            scrollPane.setVvalue(pos);
+            isLocalChange = false;
+        }
+    }
+
+    public SamplePage getSamplePage() {
+        return samplePage;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePageTableHelper.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,353 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import javafx.beans.binding.ObjectBinding;
+import javafx.beans.binding.StringBinding;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.ReadOnlyObjectWrapper;
+import javafx.beans.property.SimpleBooleanProperty;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.collections.SetChangeListener;
+import javafx.event.EventHandler;
+import javafx.scene.Node;
+import javafx.scene.control.Label;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.TableCell;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableColumnBase;
+import javafx.scene.control.TableView;
+import javafx.scene.control.cell.CheckBoxTableCell;
+import javafx.scene.control.cell.PropertyValueFactory;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.Paint;
+import javafx.scene.shape.Rectangle;
+import javafx.util.Callback;
+
+/**
+ * Helper class for creating table views for testing
+ */
+public class SamplePageTableHelper {
+    
+    public static class Person {
+
+        private BooleanProperty invited;
+        private StringProperty firstName;
+        private StringProperty lastName;
+        private StringProperty name;
+        private StringProperty email;
+        
+        private final String country = "New Zealand";
+
+        public Person(String fName, String lName) {
+            this(fName, lName, null);
+        }
+
+        public Person(String fName, String lName, String email) {
+            this(fName, lName, email, false);
+        }
+        
+        public Person(String fName, String lName, String email, boolean invited) {
+            this.firstName = new SimpleStringProperty(fName);
+            this.lastName = new SimpleStringProperty(lName);
+            this.email = new SimpleStringProperty(email);
+            this.invited = new SimpleBooleanProperty(invited);
+            this.name = new SimpleStringProperty();
+            this.name.bind(new StringBinding() {
+                { bind(firstName,lastName); }
+                @Override protected String computeValue() {
+                    return firstName.get() + " " + lastName.get();
+                }
+            });
+            this.invited.addListener(new ChangeListener<Boolean>() {
+                public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
+                    System.out.println(getFirstName() + " invited: " + t1);
+                }
+            });
+        }
+        
+        public Boolean isInvited() { return invited.get(); }
+        public BooleanProperty invitedProperty() { return invited; }
+
+        public String getName() {
+            return name.get();
+        }
+
+        public StringProperty nameProperty() {
+            return name;
+        }
+
+        public String getFirstName() {
+            return firstName.get();
+        }
+
+        public void setFirstName(String firstName) {
+            this.firstName.set(firstName);
+        }
+
+        public StringProperty firstNameProperty() {
+            return firstName;
+        }
+
+        public String getLastName() {
+            return lastName.get();
+        }
+
+        public void setLastName(String lastName) {
+            this.lastName.set(lastName);
+        }
+
+        public StringProperty lastNameProperty() {
+            return lastName;
+        }
+
+        public String getEmail() {
+            return email.get();
+        }
+
+        public void setEmail(String email) {
+            this.email.set(email);
+        }
+
+        public StringProperty emailProperty() {
+            return email;
+        }
+        
+        public String getCountry() {
+            return country;
+        }
+
+        public String toString() {
+            return "Person [ " + getFirstName() + " " + getLastName()/* + ", " + getEmail()*/ + " ]";
+        }
+    }
+
+    private static ObservableList<Person> data = FXCollections.<Person>observableArrayList();
+    
+    static {
+        // Data
+        data.addAll(
+            new Person("Jacob",     "Smith\nSmith\nSmith",    "jacob.smith<at>example.com", true ),
+            new Person("Isabella",  "Johnson",  "isabella.johnson<at>example.com" ),
+            new Person("Ethan",     "Williams", "ethan.williams<at>example.com", true ),
+            new Person("Emma",      "Jones",    "emma.jones<at>example.com" ),
+            new Person("Michael",   "Brown",    "michael.brown<at>example.com", true ),
+            new Person("Olivia",    "Davis",    "olivia.davis<at>example.com" ),
+            new Person("Alexander", "Miller",   "alexander.miller<at>example.com", true ),
+            new Person("Sophia",    "Wilson",   "sophia.wilson<at>example.com" ),
+            new Person("William",   "Moore",    "william.moore<at>example.com", true ),
+            new Person("Ava",       "Taylor",   "ava.taylor<at>example.com" ),
+            new Person("Joshua",    "Anderson", "joshua.anderson<at>example.com" ),
+            new Person("Emily",     "Thomas",   "emily.thomas<at>example.com" ),
+            new Person("Daniel",    "Jackson",  "daniel.jackson<at>example.com" ),
+            new Person("Madison",   "White",    "madison.white<at>example.com" ),
+            new Person("Jayden",    "Harris",   "jayden.harris<at>example.com" ),
+            new Person("Abigail",   "Martin",   "abigail.martin<at>example.com" ),
+            new Person("Noah",      "Thompson", "noah.thompson<at>example.com" ),
+            new Person("Chloe",     "Garcia",   "chloe.garcia<at>example.com" ),
+            new Person("Anthony",   "Martinez", "anthony.martinez<at>example.com" ),
+            new Person("Mia",       "Robinson", "mia.robinson<at>example.com" ),
+            new Person("Jacob",     "Smith" ),
+            new Person("Isabella",  "Johnson" ),
+            new Person("Ethan",     "Williams" ),
+            new Person("Emma",      "Jones" ),
+            new Person("Michael",   "Brown" ),
+            new Person("Olivia",    "Davis" ),
+            new Person("Alexander", "Miller" ),
+            new Person("Sophia",    "Wilson" ),
+            new Person("William",   "Moore" ),
+            new Person("Ava",       "Taylor" ),
+            new Person("Joshua",    "Anderson" ),
+            new Person("Emily",     "Thomas" ),
+            new Person("Daniel",    "Jackson" ),
+            new Person("Madison",   "White" ),
+            new Person("Jayden",    "Harris" ),
+            new Person("Abigail",   "Martin" ),
+            new Person("Noah",      "Thompson" ),
+            new Person("Chloe",     "Garcia" ),
+            new Person("Anthony",   "Martinez" ),
+            new Person("Mia",       "Robinson" )
+        );
+
+    }
+
+    static TableView createTableViewSimple(int width, boolean rowSelection, boolean constrainedResize) {
+        TableColumn<Person, String> nameCol, emailCol, countryCol;
+        // Columns
+        nameCol = new TableColumn<Person, String>();
+        nameCol.setText("Name");
+        nameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("name"));
+        emailCol = new TableColumn<Person, String>();
+        emailCol.setText("Email");
+        emailCol.setMinWidth(200);
+        emailCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
+            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
+                return p.getValue().emailProperty();
+            }
+        });
+        countryCol = new TableColumn<Person, String>();
+        countryCol.setText("Country");
+        countryCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
+            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
+                return new ReadOnlyObjectWrapper<String>("New Zealand");
+            }
+        });
+        // Create TableView
+        TableView<Person> tableView = new TableView<Person>();
+        tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+        tableView.getSelectionModel().setCellSelectionEnabled(!rowSelection);
+        tableView.setTableMenuButtonVisible(false);
+        if (constrainedResize) tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
+        tableView.setItems(data);
+        tableView.getColumns().addAll(nameCol, emailCol, countryCol);
+        tableView.setPrefSize(width, 300);
+        if (rowSelection) {
+            tableView.getSelectionModel().selectRange(2, 5);
+        } else {
+            tableView.getSelectionModel().select(2,emailCol);
+            tableView.getSelectionModel().select(3,nameCol);
+            tableView.getSelectionModel().select(3,countryCol);
+            tableView.getSelectionModel().select(5,nameCol);
+        }
+        tableView.getSortOrder().addAll(nameCol,emailCol,countryCol);
+        return tableView;
+    }
+
+    static TableView createTableView(int width, boolean rowSelection) {
+        TableColumn<Person, String> firstNameCol, lastNameCol, nameCol, emailCol, countryCol;
+        TableColumn<Person, Boolean> invitedCol;
+        // Columns
+        firstNameCol = new TableColumn<Person, String>();
+        firstNameCol.setText("First");
+//        Rectangle sortNode = new Rectangle(10, 10, Color.RED);
+//        sortNode.fillProperty().bind(new ObjectBinding<Paint>() {
+//            { bind(firstNameCol.sortTypeProperty()); }
+//            @Override protected Paint computeValue() {
+//                switch (firstNameCol.getSortType()) {
+//                    case ASCENDING: return Color.GREEN;
+//                    case DESCENDING: return Color.RED;
+//                    default: return Color.BLACK;
+//                }
+//            }
+//        });
+//        firstNameCol.setSortNode(sortNode);
+        firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
+        firstNameCol.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Person, String>>() {
+            @Override public void handle(TableColumn.CellEditEvent<Person, String> t) {
+                System.out.println("Edit commit event: " + t.getNewValue());
+            }
+        });
+        final Node graphic1 = new ImageView(new Image("file:src/helloworld/about_16.png"));
+        lastNameCol = new TableColumn<Person, String>();
+        lastNameCol.setGraphic(graphic1);
+        lastNameCol.setText("Last");
+        lastNameCol.setSortType(TableColumn.SortType.DESCENDING);
+        lastNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
+            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
+                return p.getValue().lastNameProperty();
+            }
+        });
+        nameCol = new TableColumn<Person, String>();
+        nameCol.setText("Name");
+        nameCol.getColumns().addAll(firstNameCol, lastNameCol);
+        emailCol = new TableColumn<Person, String>();
+        emailCol.setText("Email");
+        emailCol.setMinWidth(200);
+        emailCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
+            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
+                return p.getValue().emailProperty();
+            }
+        });
+        countryCol = new TableColumn<Person, String>();
+        countryCol.setText("Country");
+        countryCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
+            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
+                return new ReadOnlyObjectWrapper<String>("New Zealand");
+            }
+        });
+        // Test case for RT-28410 MODENA: can't make tree/table cell factories change color based
+        // on background when setGraphic(...) is used
+        countryCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
+            @Override public TableCell<Person, String> call(TableColumn<Person, String> param) {
+                final Label label = new Label();
+                label.setStyle(
+                        "-fx-font-family: 'Times New Roman';" +
+                        "-fx-font-size: 0.8em;" +
+                        "-fx-text-fill: ladder(-fx-background, yellow 49%, red 50%);");
+                TableCell cell = new TableCell() {
+                    @Override protected void updateItem(Object item, boolean empty) {
+                        label.setText(empty ? null : item.toString());
+                    }
+                };
+                cell.setGraphic(label);
+                return cell;
+            }
+        });
+
+        invitedCol = new TableColumn<Person, Boolean>();
+        invitedCol.setText("Invited");
+        invitedCol.setPrefWidth(55);
+        invitedCol.setMaxWidth(55);
+        invitedCol.setCellValueFactory(new PropertyValueFactory("invited"));
+        invitedCol.setCellFactory(new Callback<TableColumn<Person, Boolean>, TableCell<Person, Boolean>>() {
+            public TableCell<Person, Boolean> call(TableColumn<Person, Boolean> p) {
+                return new CheckBoxTableCell<Person, Boolean>();
+            }
+        });
+        
+        
+        TableView<Person> tableView = new TableView<Person>();
+        tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+        tableView.getSelectionModel().setCellSelectionEnabled(!rowSelection);
+        tableView.setTableMenuButtonVisible(true);
+        tableView.setItems(data);
+        tableView.getColumns().addAll(invitedCol, nameCol, emailCol, countryCol);
+        tableView.setPrefSize(width, 300);
+        if (rowSelection) {
+            tableView.getSelectionModel().selectRange(2, 5);
+        } else {
+            tableView.getSelectionModel().select(2,emailCol);
+            tableView.getSelectionModel().select(3,firstNameCol);
+            tableView.getSelectionModel().select(3,countryCol);
+            tableView.getSelectionModel().select(4,lastNameCol);
+        }
+        tableView.getSortOrder().addAll(firstNameCol,lastNameCol,emailCol,countryCol);
+        return tableView;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePageTreeHelper.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import javafx.scene.Node;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeView;
+import javafx.scene.shape.SVGPath;
+
+/**
+ * Helper class for creating tree views for testing
+ */
+public class SamplePageTreeHelper {
+    
+    private static final String RSS = "M13.33,13.334h-1.693c0-4.954-4.016-8.97-8.97-8.97V2.66"
+            + "9l0.243-0.002c5.757,0,10.423,4.667,10.423,10.425L13.33,13.334z M9.45,13.334H7."
+            + "758c0-2.812-2.279-5.091-5.091-5.091V6.551l0.243-0.005c3.615,0,6.545,2.93,6.545"
+            + ",6.546L9.45,13.334z M2.667,11.878c0-0.802,0.651-1.455,1.455-1.455c0.803,0,1.45"
+            + "4,0.653,1.454,1.455c0,0.804-0.651,1.456-1.454,1.456C3.318,13.334,2.667,12.682,"
+            + "2.667,11.878z M1.6,0C0.716,0,0,0.716,0,1.6v12.8C0,15.283,0.716,16,1.6,16H14.4c"
+            + "0.885,0,1.6-0.717,1.6-1.6V1.6C16,0.716,15.285,0,14.4,0H1.6z";
+    private static final String CLOUD = "M8.972,8.088h1.91v2.39l1.433-0.956l1.06,0.986l-3.448"
+            + ",3.313l-3.418-3.299l1.03-1l1.434,0.956V8.088z M-0.104,12.685c0,2.211,1.563,4.0"
+            + "03,3.489,4.003c0.112,0,12.275,0,12.275,0c2.382-0.044,4.299-2.089,4.299-4.607c0"
+            + "-2.542-1.961-4.605-4.379-4.605l-0.173,0.002c-0.673-2.396-3.037-4.165-5.849-4.1"
+            + "65c-3.268,0-5.931,2.389-6.037,5.374L3.385,8.682C1.459,8.682-0.104,10.475-0.104"
+            + ",12.685z";
+    
+    private static Node createRSS() { 
+        SVGPath sp = new SVGPath();
+        sp.setContent(RSS);
+        return sp;
+    }
+    
+    private static Node createCLOUD() { 
+        SVGPath sp = new SVGPath();
+        sp.setContent(CLOUD);
+        return sp;
+    }
+    
+    static TreeView createTreeView(int width) {
+        final TreeItem<String> root = new TreeItem<String>("Root node");
+        final TreeItem<String> childNode1 = new TreeItem<String>("Child Node 1", createCLOUD());
+        final TreeItem<String> childNode2 = new TreeItem<String>("Child Node 2", createCLOUD());
+        final TreeItem<String> childNode3 = new TreeItem<String>("Child Node 3", createCLOUD());
+        final TreeItem<String> childNode4 = new TreeItem<String>("Child Node 4", createRSS());
+        final TreeItem<String> childNode5 = new TreeItem<String>("Child Node 5", createRSS());
+        final TreeItem<String> childNode6 = new TreeItem<String>("Child Node 6", createRSS());
+        final TreeItem<String> childNode7 = new TreeItem<String>("Child Node 7", createRSS());
+        final TreeItem<String> childNode8 = new TreeItem<String>("Child Node 8", createRSS());
+        final TreeItem<String> childNode9 = new TreeItem<String>("Child Node 9", createRSS());
+        final TreeItem<String> childNode10 = new TreeItem<String>("Child Node 10");
+        final TreeItem<String> childNode11 = new TreeItem<String>("Child Node 11");
+        final TreeItem<String> childNode12 = new TreeItem<String>("Child Node 12");
+        final TreeItem<String> childNode13 = new TreeItem<String>("Child Node 13");
+        final TreeItem<String> childNode14 = new TreeItem<String>("Child Node 14");
+        final TreeItem<String> childNode15 = new TreeItem<String>("Child Node 15");
+        final TreeItem<String> childNode16 = new TreeItem<String>("Child Node 16");
+        final TreeItem<String> childNode17 = new TreeItem<String>("Child Node 17");
+        final TreeItem<String> childNode18 = new TreeItem<String>("Child Node 18");
+        final TreeItem<String> childNode19 = new TreeItem<String>("Child Node 19");
+        final TreeItem<String> childNode20 = new TreeItem<String>("Child Node 20");
+        final TreeItem<String> childNode21 = new TreeItem<String>("Child Node 21");
+    
+        root.setExpanded(true);
+        root.getChildren().setAll(childNode1, childNode2, childNode3);
+        childNode3.setExpanded(true);
+        childNode3.getChildren().setAll(childNode4, childNode5, childNode6,
+                childNode7, childNode8, childNode9,
+                childNode10, childNode11, childNode12,
+                childNode13, childNode14, childNode15,
+                childNode16, childNode17, childNode18,
+                childNode19, childNode20, childNode21);
+        
+        final TreeView treeView = new TreeView(root);
+        treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+        treeView.setShowRoot(true);
+        treeView.setPrefSize(width, 300);
+        treeView.getSelectionModel().selectRange(5, 8);
+        return treeView;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SamplePageTreeTableHelper.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,295 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.text.DateFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import javafx.beans.property.ReadOnlyObjectWrapper;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ObservableList;
+import javafx.scene.Node;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeSortMode;
+import javafx.scene.control.TreeTableCell;
+import javafx.scene.control.TreeTableColumn;
+import javafx.scene.control.TreeTableView;
+import javafx.scene.shape.SVGPath;
+import javafx.util.Callback;
+
+/**
+ * Helper class for creating tree table views for testing
+ */
+public class SamplePageTreeTableHelper {
+    private static final NumberFormat nf = NumberFormat.getNumberInstance();
+    private static final DateFormat df = new SimpleDateFormat("EEE, MMM d, yyyy");
+    private static final String FOLDER = "M8,2.001V0H0v6.002v1.688V14c0,1.105,0.895,2,2,2h12c"
+            + "1.104,0,2-0.895,2-2V8.002v-2V2.001H8z M6,2L6,2v2.001h2h6V6H2V2H6z M14,14H2V8h1"
+            + "2v0.002V14z";
+    private static final String FILE = "M4.775,1.592h5.836c0.293,0,0.531,0.238,0.531,0.53v11"
+            + ".673c0,0.293-0.237,0.53-0.531,0.53H2.122c-0.293,0-0.53-0.237-0.53-0.53v-9.02h3"
+            + ".183V1.592z M0,4.245v10.611c0,0.586,0.475,1.061,1.061,1.061h10.611c0.586,0,1.0"
+            + "61-0.475,1.061-1.061V1.061C12.733,0.475,12.258,0,11.672,0H4.245L0,4.245z";
+    private static final DummyFile ROOT;
+    private static final Random RANDOM = new Random(745288528l);
+    private static int directoryCount = 0;
+    private static int fileCount = 0;
+    
+    static {
+        ROOT = createDirectory(0.8);
+    }
+    
+    private static DummyFile createDirectory(double subdirectoryPercentage) {
+        final int numFiles = (int)(3 + (7*RANDOM.nextDouble()));
+        final DummyFile[] files = new DummyFile[numFiles];
+        for(int i=0; i< numFiles; i++) {
+            files[i] = (RANDOM.nextDouble()<subdirectoryPercentage) ? 
+                    createDirectory(subdirectoryPercentage-0.4) :
+                    createFile();
+        }
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(RANDOM.nextLong());
+        calendar.set(Calendar.YEAR, 2013);
+        return new DummyFile("Directory "+(directoryCount++), calendar.getTime(), files);
+    }
+    
+    private static DummyFile createFile() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(RANDOM.nextLong());
+        calendar.set(Calendar.YEAR, 2013);
+        return new DummyFile(
+            "File "+(fileCount++),
+            (int)(1024*1000*RANDOM.nextDouble()),
+            calendar.getTime()
+        );
+    }
+    
+    private static Node createFOLDER() { 
+        SVGPath sp = new SVGPath();
+        sp.setContent(FOLDER);
+        return sp;
+    }
+    
+    private static Node createFILE() { 
+        SVGPath sp = new SVGPath();
+        sp.setContent(FILE);
+        return sp;
+    }
+    
+    static TreeTableView createTreeTableView(int width, boolean cellSelection) {
+        TreeTableView treeTableView = buildFileBrowserTreeTableView();
+        treeTableView.setSortMode(TreeSortMode.ONLY_FIRST_LEVEL);
+        treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+        treeTableView.getSelectionModel().setCellSelectionEnabled(cellSelection);
+        treeTableView.setPrefSize(width, 300);
+        if (cellSelection) {
+            treeTableView.getSelectionModel().select(2,(TreeTableColumn)treeTableView.getColumns().get(0));
+            treeTableView.getSelectionModel().select(3,(TreeTableColumn)treeTableView.getColumns().get(1));
+            treeTableView.getSelectionModel().select(3,(TreeTableColumn)treeTableView.getColumns().get(2));
+            treeTableView.getSelectionModel().select(5,(TreeTableColumn)treeTableView.getColumns().get(1));
+        } else {
+            treeTableView.getSelectionModel().selectRange(5, 8);
+        }
+        return treeTableView;
+    } 
+    
+    private static TreeTableView buildFileBrowserTreeTableView() {
+        // create a simple String treeview
+        TreeItem<DummyFile> root = new FileTreeItem(ROOT);
+        root.setExpanded(true);
+        
+        final TreeTableView<DummyFile> treeTableView = new TreeTableView<DummyFile>();
+        treeTableView.setShowRoot(true);
+        treeTableView.setRoot(root);
+        
+        // --- name column
+        TreeTableColumn<DummyFile, String> nameColumn = new TreeTableColumn<DummyFile, String>("Name");
+        nameColumn.setPrefWidth(300);
+        nameColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<DummyFile, String>, ObservableValue<String>>() {
+            @Override public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<DummyFile, String> p) {
+                DummyFile f = p.getValue().getValue();
+                String text = f == ROOT ? "/" : f.getName();
+                return new ReadOnlyObjectWrapper<String>(text);
+            }
+        });
+
+        // --- size column
+        TreeTableColumn<DummyFile, DummyFile> sizeColumn = new TreeTableColumn<DummyFile, DummyFile>("Size");
+        sizeColumn.setPrefWidth(100);
+        sizeColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<DummyFile, DummyFile>, ObservableValue<DummyFile>>() {
+            @Override public ObservableValue<DummyFile> call(TreeTableColumn.CellDataFeatures<DummyFile, DummyFile> p) {
+                return new ReadOnlyObjectWrapper<DummyFile>(p.getValue().getValue());
+            }
+        });
+        sizeColumn.setCellFactory(new Callback<TreeTableColumn<DummyFile, DummyFile>, TreeTableCell<DummyFile, DummyFile>>() {
+            @Override public TreeTableCell<DummyFile, DummyFile> call(final TreeTableColumn<DummyFile, DummyFile> p) {
+                return new TreeTableCell<DummyFile, DummyFile>() {
+                    @Override protected void updateItem(DummyFile item, boolean empty) {
+                        super.updateItem(item, empty);
+                        
+                        TreeTableView treeTable = p.getTreeTableView();
+
+                        // if the File is a directory, it has no size...
+//                        ObservableList<TreeItem<DummyFile>> items = p.getTreeTableView().getItems();
+                        if (getIndex() >= treeTable.getExpandedItemCount()) {
+                            setText(null);
+                        } else {
+                            TreeItem<DummyFile> treeItem = treeTable.getTreeItem(getIndex());
+                            if (item == null || empty || treeItem == null || 
+                                    treeItem.getValue() == null || treeItem.getValue().isDirectory()) {
+                                setText(null);
+                            } else {
+                                setText(nf.format(item.getSize()) + " KB");
+                            }
+                        }
+                    }
+                };
+            }
+        });
+        sizeColumn.setComparator(new Comparator<DummyFile>() {
+            @Override public int compare(DummyFile f1, DummyFile f2) {
+                long s1 = f1.isDirectory() ? 0 : f1.getSize();
+                long s2 = f2.isDirectory() ? 0 : f2.getSize();
+                long result = s1 - s2;
+                if (result < 0) {
+                    return -1;
+                } else if (result == 0) {
+                    return 0;
+                } else {
+                    return 1;
+                }
+            }
+        });
+        
+        // --- modified column
+        TreeTableColumn<DummyFile, Date> lastModifiedColumn = new TreeTableColumn<DummyFile, Date>("Last Modified");
+        lastModifiedColumn.setPrefWidth(130);
+        lastModifiedColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<DummyFile, Date>, ObservableValue<Date>>() {
+            @Override public ObservableValue<Date> call(TreeTableColumn.CellDataFeatures<DummyFile, Date> p) {
+                return new ReadOnlyObjectWrapper<Date>(p.getValue().getValue().getModified());
+            }
+        });
+        lastModifiedColumn.setCellFactory(new Callback<TreeTableColumn<DummyFile, Date>, TreeTableCell<DummyFile, Date>>() {
+            @Override public TreeTableCell<DummyFile, Date> call(TreeTableColumn<DummyFile, Date> p) {
+                return new TreeTableCell<DummyFile, Date>() {
+                    @Override protected void updateItem(Date item, boolean empty) {
+                        super.updateItem(item, empty);
+                        
+                        if (item == null || empty) {
+                            setText(null);
+                        } else {
+                            setText(df.format(item));
+                        }
+                    }
+                };
+            }
+        });
+        
+        treeTableView.getColumns().setAll(nameColumn, sizeColumn, lastModifiedColumn);
+        return treeTableView;
+    }
+    
+    private static class DummyFile {
+        private final String name;
+        private final int size;
+        private final Date modified;
+        private final DummyFile[] children;
+
+        public DummyFile(String name, int size, Date modified) {
+            this.name = name;
+            this.size = size;
+            this.modified = modified;
+            this.children = null;
+        }
+        
+        public DummyFile(String name, Date modified, DummyFile[] children) {
+            this.name = name;
+            this.size = 0;
+            this.modified = modified;
+            this.children = children;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public int getSize() {
+            return size;
+        }
+
+        public Date getModified() {
+            return modified;
+        }
+
+        public DummyFile[] getChildren() {
+            return children;
+        }
+        
+        public boolean isDirectory() {
+            return children != null;
+        }
+    }
+    
+    private static class FileTreeItem extends TreeItem<DummyFile> {
+        private boolean isFirstTimeChildren = true;
+
+        public FileTreeItem(DummyFile value) {
+            super(value);
+//            setGraphic(value.isFile() ? createFILE() : createFOLDER());
+        }
+
+        @Override public ObservableList<TreeItem<DummyFile>> getChildren() {
+            if (isFirstTimeChildren) {
+                isFirstTimeChildren = false;
+                if(getValue().isDirectory()) {
+                    List<FileTreeItem> childNodes = new ArrayList<FileTreeItem>();
+                    for (DummyFile child: getValue().getChildren()) {
+                        childNodes.add(new FileTreeItem(child));
+                    }
+                    super.getChildren().setAll(childNodes);
+                }
+            }
+            return super.getChildren();
+        }
+
+        @Override public boolean isLeaf() {
+            return !getValue().isDirectory();
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/ScottSelvia.fxml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,495 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+
+<?import java.lang.*?> 
+<?import java.util.*?> 
+<?import javafx.collections.*?> 
+<?import javafx.scene.control.*?> 
+<?import javafx.scene.layout.*?> 
+<?import javafx.scene.paint.*?> 
+<?import javafx.scene.text.*?> 
+
+<!-- Customer test case from bug http://javafx-jira.kenai.com/browse/DTL-5561 -->
+<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="768.0" prefWidth="1024.0" xmlns:fx="http://javafx.com/fxml"> 
+  <children> 
+    <TabPane fx:id="tabPane" prefHeight="712.0" prefWidth="996.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="42.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> 
+      <tabs> 
+        <Tab fx:id="tabDS" text="Firmographic Search"> 
+          <content> 
+            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="672.0" prefWidth="996.0"> 
+              <children> 
+                <Accordion prefHeight="667.0" prefWidth="968.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> 
+                  <expandedPane> 
+                    <TitledPane fx:id="titlePaneDSSearch" animated="false" graphicTextGap="4.0" prefHeight="664.0" prefWidth="968.0" text="Search Options:">
+                      <content> 
+                        <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="494.0" prefWidth="964.0"> 
+                          <children> 
+                            <Label fx:id="lblDSCompanyName" alignment="CENTER_RIGHT" contentDisplay="CENTER" layoutX="7.0" layoutY="13.0" prefWidth="102.0" text="Company Name:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSCompanyName" layoutX="117.0" layoutY="11.0" prefWidth="200.0" promptText="Enter Company Name" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSCompanyName" /> 
+                            <VBox id="VBoxDSCompanyName" alignment="CENTER_LEFT" layoutX="323.0" layoutY="11.0" prefWidth="91.0" spacing="5.0"> 
+                              <children> 
+                                <RadioButton fx:id="rbtnDSCompanyNameEquals" mnemonicParsing="false" selected="true" text="Equals"> 
+                                  <toggleGroup> 
+                                    <ToggleGroup fx:id="tGrpDSCompanyName" /> 
+                                  </toggleGroup> 
+                                </RadioButton> 
+                                <RadioButton fx:id="rbtnDSCompanyNameStartsWith" mnemonicParsing="false" text="Starts With" toggleGroup="$tGrpDSCompanyName" /> 
+                                <RadioButton fx:id="rbtnDSCompanyNameContains" mnemonicParsing="false" text="Contains" toggleGroup="$tGrpDSCompanyName" /> 
+                                <RadioButton fx:id="rbtnDSCompanyNameEndsWith" mnemonicParsing="false" text="Ends With" toggleGroup="$tGrpDSCompanyName" /> 
+                              </children> 
+                            </VBox> 
+                            <Label fx:id="lblDSContactName" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="101.0" prefWidth="96.0" text="Contact Name:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSContactName" layoutX="117.0" layoutY="98.0" prefWidth="200.0" promptText="Enter Contact Name" text="" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSContactName" /> 
+                            <VBox id="VBoxDSContactName" alignment="CENTER_LEFT" layoutX="323.0" layoutY="98.0" prefWidth="91.0" spacing="5.0"> 
+                              <children> 
+                                <RadioButton fx:id="rbtnDSContactNameEquals" mnemonicParsing="false" selected="true" text="Equals"> 
+                                  <toggleGroup> 
+                                    <ToggleGroup fx:id="tGrpDSContactName" /> 
+                                  </toggleGroup> 
+                                </RadioButton> 
+                                <RadioButton fx:id="rbtnDSContactNameStartsWith" mnemonicParsing="false" text="Starts With" toggleGroup="$tGrpDSContactName" /> 
+                                <RadioButton fx:id="rbtnDSContactNameContains" mnemonicParsing="false" text="Contains" toggleGroup="$tGrpDSContactName" /> 
+                                <RadioButton fx:id="rbtnDSContactNameEndsWith" mnemonicParsing="false" text="Ends With" toggleGroup="$tGrpDSContactName" /> 
+                              </children> 
+                            </VBox> 
+                            <Label fx:id="lblDSAddress" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="189.0" prefWidth="96.0" text="Address:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSAddress" layoutX="117.0" layoutY="187.0" prefWidth="200.0" promptText="Enter Address" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSAddress" /> 
+                            <VBox id="VBoxDSAddress" alignment="CENTER_LEFT" layoutX="323.0" layoutY="187.0" spacing="5.0"> 
+                              <children> 
+                                <RadioButton fx:id="rbtnDSAddrEquals" mnemonicParsing="false" selected="true" text="Equals"> 
+                                  <toggleGroup> 
+                                    <ToggleGroup fx:id="tGrpDSAddress" /> 
+                                  </toggleGroup> 
+                                </RadioButton> 
+                                <RadioButton fx:id="rbtnDSAddrStartsWith" mnemonicParsing="false" text="Starts With" toggleGroup="$tGrpDSAddress" /> 
+                                <RadioButton fx:id="rbtnDSAddrContains" mnemonicParsing="false" text="Contains" toggleGroup="$tGrpDSAddress" /> 
+                                <RadioButton fx:id="rbtnDSAddrEndsWith" mnemonicParsing="false" text="Ends With" toggleGroup="$tGrpDSAddress" /> 
+                              </children> 
+                            </VBox> 
+                            <Label fx:id="lblDSCity" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="274.0" prefWidth="96.0" text="City:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSCity" layoutX="117.0" layoutY="272.0" prefWidth="200.0" promptText="Enter City" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSCity" /> 
+                            <VBox id="VBoxDSCity" alignment="CENTER_LEFT" layoutX="323.0" layoutY="275.0" spacing="5.0"> 
+                              <children> 
+                                <RadioButton fx:id="rbtnDSCityEquals" mnemonicParsing="false" selected="true" text="Equals"> 
+                                  <toggleGroup> 
+                                    <ToggleGroup fx:id="tGrpDSCity" /> 
+                                  </toggleGroup> 
+                                </RadioButton> 
+                                <RadioButton fx:id="rbtnDSCityStartsWith" mnemonicParsing="false" text="Starts With" toggleGroup="$tGrpDSCity" /> 
+                                <RadioButton fx:id="rbtnDSCityContains" mnemonicParsing="false" text="Contains" toggleGroup="$tGrpDSCity" /> 
+                                <RadioButton fx:id="rbtnDSCityEndsWith" mnemonicParsing="false" text="Ends With" toggleGroup="$tGrpDSCity" /> 
+                              </children> 
+                            </VBox> 
+                            <Label fx:id="lblDSCounty" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="362.0" prefWidth="96.0" text="County:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSCounty" layoutX="117.0" layoutY="360.0" prefWidth="200.0" promptText="Enter County Name" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSCounty" /> 
+                            <VBox id="VBoxDSCounty" alignment="CENTER_LEFT" layoutX="323.0" layoutY="360.0" spacing="5.0"> 
+                              <children> 
+                                <RadioButton fx:id="rbtnDSCountyEquals" mnemonicParsing="false" selected="true" text="Equals"> 
+                                  <toggleGroup> 
+                                    <ToggleGroup fx:id="tGrpDSCounty" /> 
+                                  </toggleGroup> 
+                                </RadioButton> 
+                                <RadioButton fx:id="rbtnDSCountyStartsWith" mnemonicParsing="false" text="Starts With" toggleGroup="$tGrpDSCounty" /> 
+                                <RadioButton fx:id="rbtnDSCountyContains" mnemonicParsing="false" text="Contains" toggleGroup="$tGrpDSCounty" /> 
+                                <RadioButton fx:id="rbtnDSCountyEndsWith" mnemonicParsing="false" text="Ends With" toggleGroup="$tGrpDSCounty" /> 
+                              </children> 
+                            </VBox> 
+                            <Label fx:id="lblDSState" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="390.0" prefWidth="96.0" text="State:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSState" layoutX="117.0" layoutY="388.0" prefWidth="34.0" text="" />
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSState" /> 
+                            <Label fx:id="lblDSZipCode" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="417.0" prefWidth="96.0" text="Zip Code:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSZipCode" layoutX="117.0" layoutY="415.0" prefWidth="77.0" text="" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSZipCode" /> 
+                            <Label fx:id="lblDSPhone" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="444.0" prefWidth="96.0" text="Phone:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSPhone" layoutX="117.0" layoutY="442.0" prefWidth="81.0" text="" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSPhone" /> 
+                            <Label fx:id="lblDSEmail" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="471.0" prefWidth="96.0" text="Email:"> 
+                              <labelFor> 
+                                <TextField fx:id="txtDSEmail" layoutX="117.0" layoutY="469.0" prefWidth="200.0" promptText="Enter Email Address" /> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="txtDSEmail" /> 
+                            <VBox id="VBoxDSEmail" alignment="CENTER_LEFT" layoutX="323.0" layoutY="469.0" spacing="5.0"> 
+                              <children> 
+                                <RadioButton fx:id="rbtnDSEmailEquals" mnemonicParsing="false" selected="true" text="Equals"> 
+                                  <toggleGroup> 
+                                    <ToggleGroup fx:id="tGrpDSEmail" /> 
+                                  </toggleGroup> 
+                                </RadioButton> 
+                                <RadioButton fx:id="rbtnDSEmailStartsWith" mnemonicParsing="false" text="Starts With" toggleGroup="$tGrpDSEmail" /> 
+                                <RadioButton fx:id="rbtnDSEmailContains" mnemonicParsing="false" text="Contains" toggleGroup="$tGrpDSEmail" /> 
+                                <RadioButton fx:id="rbtnDSEmailEndsWith" mnemonicParsing="false" text="Ends With" toggleGroup="$tGrpDSEmail" /> 
+                              </children> 
+                            </VBox> 
+                            <Label fx:id="lblDSSalesSize" alignment="CENTER_RIGHT" layoutX="426.0" layoutY="11.0" prefWidth="75.0" text="Sales Size:"> 
+                              <labelFor> 
+                                <ListView fx:id="lviewDSSalesSize" layoutX="507.0" layoutY="11.0" prefHeight="85.0" prefWidth="181.0"> 
+                                  <items> 
+                                    <FXCollections fx:factory="observableArrayList"> 
+                                      <String fx:value="Unknown" /> 
+                                      <String fx:value="Less than $500,000" /> 
+                                      <String fx:value="$500,000 - $999,999" /> 
+                                      <String fx:value="$1,000,000 - $1,999,999" /> 
+                                      <String fx:value="$2,000,000 - $4,999,999" /> 
+                                      <String fx:value="$5,000,000 - $9,999,999" /> 
+                                      <String fx:value="$10,000,000 - $49,999,999" /> 
+                                      <String fx:value="$50,000,000 - $99,999,999" /> 
+                                      <String fx:value="$100,000,000 - $499,999,999" /> 
+                                      <String fx:value="$500,000,000 - $999,999,999" /> 
+                                      <String fx:value="$1,000,000,000 - Plus" /> 
+                                    </FXCollections> 
+                                  </items> 
+                                </ListView> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="lviewDSSalesSize" /> 
+                            <Label fx:id="lblDSEmployeeSize" alignment="CENTER_RIGHT" layoutX="703.0" layoutY="11.0" text="Employee Size:"> 
+                              <labelFor> 
+                                <ListView fx:id="lviewDSEmployeeSize" layoutX="791.0" layoutY="11.0" prefHeight="85.0" prefWidth="92.0"> 
+                                  <items> 
+                                    <FXCollections fx:factory="observableArrayList"> 
+                                      <String fx:value="Unknown" /> 
+                                      <String fx:value="Less than 5" /> 
+                                      <String fx:value="5 - 9" /> 
+                                      <String fx:value="10 - 19" /> 
+                                      <String fx:value="20 - 49" /> 
+                                      <String fx:value="50 - 99" /> 
+                                      <String fx:value="100 - 249" /> 
+                                      <String fx:value="250 - 499" /> 
+                                      <String fx:value="500 - 999" /> 
+                                      <String fx:value="1,000 Plus" /> 
+                                    </FXCollections> 
+                                  </items> 
+                                </ListView> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="lviewDSEmployeeSize" /> 
+                            <Label fx:id="lblDSNAICSCode" alignment="CENTER_RIGHT" layoutX="426.0" layoutY="110.0" prefHeight="-1.0" prefWidth="75.0" text="NAICS Code:"> 
+                              <labelFor> 
+                                <ComboBox fx:id="cmbDSNAICSCode" layoutX="507.0" layoutY="108.0" prefHeight="21.0" prefWidth="53.0" promptText="ID"> 
+                                  <items> 
+                                    <FXCollections fx:factory="observableArrayList"> 
+                                      <String fx:value="01" /> 
+                                      <String fx:value="02" /> 
+                                      <String fx:value="03" /> 
+                                      <String fx:value="04" /> 
+                                      <String fx:value="05" /> 
+                                      <String fx:value="06" /> 
+                                    </FXCollections> 
+                                  </items> 
+                                </ComboBox> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="cmbDSNAICSCode" /> 
+                            <ListView fx:id="lviewDSNAICSCode" layoutX="568.0" layoutY="108.0" prefHeight="220.0" prefWidth="388.0"> 
+                              <items> 
+                                <FXCollections fx:factory="observableArrayList"> 
+                                  <String fx:value="Men's and Boys' Cut and Sew Underwear and Nightwear Manufact" /> 
+                                  <String fx:value="Women's and Girls' Cut and Sew Other Outerwear Manufacturing" /> 
+                                  <String fx:value="Personal Leather Good (except Women's Handbag and Purse) Man" /> 
+                                  <String fx:value="Laminated Aluminum Foil Manufacturing for Flexible Packaging" /> 
+                                  <String fx:value="Urethane and Other Foam Product (except Polystyrene) Manufac" /> 
+                                  <String fx:value="All Other Miscellaneous Nonmetallic Mineral Product Manufact" /> 
+                                  <String fx:value="Lawn and Garden Tractor and Home Lawn and Garden Equipment M" /> 
+                                  <String fx:value="Air-Conditioning and Warm Air Heating Equipment and Commerci" /> 
+                                  <String fx:value="Computer Terminal and Other Computer Peripheral Equipment Ma" />
+                                  <String fx:value="All Other Miscellaneous Electrical Equipment and Component M" /> 
+                                </FXCollections> 
+                              </items> 
+                            </ListView> 
+                            <Label fx:id="lblDSSICCode" alignment="CENTER_RIGHT" layoutX="426.0" layoutY="345.0" prefWidth="75.0" text="SIC Code:"> 
+                              <labelFor> 
+                                <ComboBox fx:id="cmbDSSICCode" layoutX="507.0" layoutY="342.0" prefHeight="21.0" prefWidth="52.0" promptText="ID"> 
+                                  <items> 
+                                    <FXCollections fx:factory="observableArrayList"> 
+                                      <String fx:value="01" /> 
+                                      <String fx:value="02" /> 
+                                      <String fx:value="03" /> 
+                                      <String fx:value="04" /> 
+                                      <String fx:value="05" /> 
+                                      <String fx:value="06" /> 
+                                    </FXCollections> 
+                                  </items> 
+                                </ComboBox> 
+                              </labelFor> 
+                            </Label> 
+                            <fx:reference source="cmbDSSICCode" /> 
+                            <ListView fx:id="lviewDSSICCode" layoutX="568.0" layoutY="342.0" prefHeight="195.0" prefWidth="388.0"> 
+                              <items> 
+                                <FXCollections fx:factory="observableArrayList"> 
+                                  <String fx:value="Men's and Boys' Cut and Sew Underwear and Nightwear Manufact" /> 
+                                  <String fx:value="Women's and Girls' Cut and Sew Other Outerwear Manufacturing" /> 
+                                  <String fx:value="Personal Leather Good (except Women's Handbag and Purse) Man" /> 
+                                  <String fx:value="Laminated Aluminum Foil Manufacturing for Flexible Packaging" /> 
+                                  <String fx:value="Urethane and Other Foam Product (except Polystyrene) Manufac" /> 
+                                  <String fx:value="All Other Miscellaneous Nonmetallic Mineral Product Manufact" /> 
+                                  <String fx:value="Lawn and Garden Tractor and Home Lawn and Garden Equipment M" /> 
+                                  <String fx:value="Air-Conditioning and Warm Air Heating Equipment and Commerci" /> 
+                                  <String fx:value="Computer Terminal and Other Computer Peripheral Equipment Ma" />
+                                  <String fx:value="All Other Miscellaneous Electrical Equipment and Component M" /> 
+                                </FXCollections> 
+                              </items> 
+                            </ListView> 
+                            <FlowPane alignment="BOTTOM_CENTER" minHeight="21.0" prefHeight="42.0" prefWidth="939.0" AnchorPane.bottomAnchor="8.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="11.0"> 
+                              <children> 
+                                <HBox id="HBox" alignment="CENTER" spacing="5.0"> 
+                                  <children> 
+                                    <Button id="brnCount" fx:id="btnDSCount" mnemonicParsing="false" text="Count" /> 
+                                    <TextField fx:id="txtDSCount" editable="false" prefWidth="90.0" /> 
+                                    <Button fx:id="btnDSDisplay" mnemonicParsing="false" text="Display" /> 
+                                    <ProgressIndicator fx:id="pIndDSProgress" progress="0.0" /> 
+                                  </children> 
+                                </HBox> 
+                              </children> 
+                            </FlowPane> 
+                            <Button fx:id="btnDSSearchClear" mnemonicParsing="false" text="Clear" AnchorPane.bottomAnchor="16.0" AnchorPane.rightAnchor="8.0" /> 
+                          </children> 
+                        </AnchorPane> 
+                      </content> 
+                    </TitledPane> 
+                  </expandedPane> 
+                  <panes> 
+                    <fx:reference source="titlePaneDSSearch" /> 
+                    <TitledPane fx:id="titlePaneDSResults" animated="false" prefHeight="525.0" prefWidth="968.0" text="Search Results"> 
+                      <content> 
+                        <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="561.0" prefWidth="964.0"> 
+                          <children> 
+                            <TableView fx:id="tblViewDSResults" prefHeight="560.0" prefWidth="939.0" tableMenuButtonVisible="true" AnchorPane.bottomAnchor="45.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="11.0" AnchorPane.topAnchor="14.0"> 
+                              <!-- 
+                              <columns> 
+                                <TableColumn prefWidth="75.0" text="Column X" /> 
+                                <TableColumn prefWidth="75.0" text="Column X" /> 
+                              </columns> 
+                              --> 
+                            </TableView> 
+                            <FlowPane alignment="BOTTOM_CENTER" prefHeight="22.0" prefWidth="938.0" AnchorPane.bottomAnchor="12.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="12.0"> 
+                              <children> 
+                                <Button fx:id="btnDSResultsLoad" mnemonicParsing="false" text="Load into Salesforce.com" /> 
+                              </children> 
+                            </FlowPane> 
+                            <HBox id="HBox" alignment="CENTER" spacing="5.0" AnchorPane.bottomAnchor="12.0" AnchorPane.leftAnchor="14.0"> 
+                              <children> 
+                                <Button fx:id="btnDSResultsSelectAll" mnemonicParsing="false" text="Select All" /> 
+                                <Button fx:id="btnDSResultsDeselectAll" mnemonicParsing="false" text="Deselect All" /> 
+                                <TextField fx:id="txtDSResults" editable="false" prefWidth="90.0" /> 
+                                <ProgressBar fx:id="pBarDSProgress" prefWidth="99.0" progress="0.0" /> 
+                              </children> 
+                            </HBox> 
+                            <Button fx:id="btnDSResultsClear" mnemonicParsing="false" text="Clear" AnchorPane.bottomAnchor="12.0" AnchorPane.rightAnchor="14.0" /> 
+                            <Label fx:id="lblDSLoadStatus" prefWidth="316.0" text="Status" AnchorPane.bottomAnchor="15.0" AnchorPane.rightAnchor="71.0" /> 
+                          </children> 
+                        </AnchorPane> 
+                      </content> 
+                    </TitledPane> 
+                  </panes> 
+                </Accordion> 
+              </children> 
+            </AnchorPane> 
+          </content> 
+        </Tab> 
+        <Tab fx:id="tabAD" text="Append Firmographics"> 
+          <content> 
+            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
+              <children> 
+                <TitledPane fx:id="titlePaneADCRMSearch" animated="false" collapsible="false" prefHeight="667.0" prefWidth="969.0" text="Salesforce.com CRM Record" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> 
+                  <content> 
+                    <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
+                      <children> 
+                        <Label fx:id="lblADCompanyName" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="14.0" prefWidth="115.0" text="Company Name:" /> 
+                        <TextField fx:id="txtADCompanyName" layoutX="135.0" layoutY="11.0" prefWidth="413.0" promptText="Enter Company Name" /> 
+                        <Label fx:id="lblADContactName" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="43.0" prefWidth="115.0" text="Contact Name:" /> 
+                        <TextField fx:id="txtADContactName" layoutX="135.0" layoutY="40.0" prefWidth="413.0" promptText="Enter Contact Name" /> 
+                        <Label fx:id="lblADAddress1" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="71.0" prefWidth="115.0" text="Address 1:" /> 
+                        <TextField fx:id="txtADAddress1" layoutX="135.0" layoutY="68.0" prefWidth="413.0" promptText="Enter Address" /> 
+                        <Label fx:id="lblADAddress2" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="102.0" prefWidth="115.0" text="Address 2:" /> 
+                        <TextField fx:id="txtADAddress2" layoutX="135.0" layoutY="98.0" prefWidth="413.0" promptText="Enter Address" /> 
+                        <Label fx:id="lblADCity" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="129.0" prefWidth="115.0" text="City:" /> 
+                        <TextField fx:id="txtADCity" layoutX="135.0" layoutY="125.0" prefWidth="284.0" promptText="Enter City" /> 
+                        <Label fx:id="lblADState" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="159.0" prefWidth="115.0" text="State:" /> 
+                        <TextField fx:id="txtADState" layoutX="135.0" layoutY="156.0" prefWidth="39.0" /> 
+                        <Label fx:id="lblADZipCode" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="190.0" prefWidth="115.0" text="Zip Code:" /> 
+                        <TextField fx:id="txtADZipCode" layoutX="135.0" layoutY="187.0" prefWidth="88.0" /> 
+                        <Label fx:id="lblADPhone" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="220.0" prefWidth="115.0" text="Phone:" /> 
+                        <TextField fx:id="txtADPhone" layoutX="135.0" layoutY="216.0" prefWidth="88.0" /> 
+                        <Label fx:id="lblADAddressKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="68.0" prefWidth="157.0" text="Address Key:" /> 
+                        <Label fx:id="lblADHouseholdKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="12.0" prefWidth="157.0" text="Site Key:" /> 
+                        <Label fx:id="lblADIndividualKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="40.0" prefWidth="157.0" text="Contact Key:" /> 
+                        <Label fx:id="lblADAddrKeyWithSuiteKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="97.0" prefWidth="157.0" text="Address Key w/Suite:" /> 
+                        <TextField fx:id="txtADAddressKey" editable="false" layoutX="726.0" layoutY="65.0" prefWidth="115.0" /> 
+                        <TextField fx:id="txtADHouseholdKey" editable="false" layoutX="726.0" layoutY="9.0" prefWidth="115.0" /> 
+                        <TextField fx:id="txtADIndividualKey" editable="false" layoutX="726.0" layoutY="37.0" prefWidth="115.0" /> 
+                        <TextField fx:id="txtADAddrKeyWithSuiteKey" editable="false" layoutX="726.0" layoutY="93.0" prefWidth="115.0" /> 
+                        <Label fx:id="lblADLooseMatchKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="123.0" prefWidth="157.0" text="Business Relationship Key:" /> 
+                        <TextField fx:id="txtADLooseMatchKey" layoutX="726.0" layoutY="119.0" prefWidth="115.0" />
+                        <TabPane id="tapPaneAD" fx:id="tabPaneAD" prefHeight="373.0" prefWidth="939.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="254.0"> 
+                          <tabs> 
+                            <Tab fx:id="tabADMatchResults" text="Match Results"> 
+                              <content> 
+                                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
+                                  <children> 
+                                    <TableView fx:id="tblViewADResults" editable="false" prefHeight="268.0" prefWidth="906.0" tableMenuButtonVisible="true" AnchorPane.bottomAnchor="61.0" AnchorPane.leftAnchor="16.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="13.0"> 
+                                      <!-- 
+                          <columns> 
+                            <TableColumn prefWidth="75.0" text="Column X" /> 
+                            <TableColumn prefWidth="75.0" text="Column X" /> 
+                          </columns> 
+                          --> 
+                                    </TableView> 
+                                    <FlowPane alignment="BOTTOM_CENTER" hgap="10.0" prefHeight="46.0" prefWidth="908.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0"> 
+                                      <children> 
+                                        <Button fx:id="btnADSearch" mnemonicParsing="false" text="Display Matched Records" /> 
+                                        <ProgressIndicator fx:id="pIndADProgress" progress="0.0" /> 
+                                      </children> 
+                                    </FlowPane> 
+                                    <Button fx:id="btnADResultsClear" mnemonicParsing="false" text="Clear" AnchorPane.bottomAnchor="22.0" AnchorPane.rightAnchor="14.0" /> 
+                                    <Button fx:id="btnADDisplay" mnemonicParsing="false" text="Display Firmographic Data" AnchorPane.bottomAnchor="22.0" AnchorPane.leftAnchor="14.0" /> 
+                                  </children> 
+                                </AnchorPane> 
+                              </content> 
+                            </Tab> 
+                            <Tab fx:id="tabADDataFields" text="Firmographic Data"> 
+                              <content> 
+                                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
+                                  <children> 
+                                    <TableView fx:id="tblViewADFields" prefHeight="290.0" prefWidth="908.0" AnchorPane.bottomAnchor="38.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> 
+                                      <!-- 
+                                      <columns> 
+                                        <TableColumn prefWidth="75.0" text="Column X" /> 
+                                        <TableColumn prefWidth="75.0" text="Column X" /> 
+                                      </columns> 
+                                      --> 
+                                    </TableView> 
+                                    <FlowPane alignment="BOTTOM_CENTER" prefHeight="22.0" prefWidth="908.0" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0"> 
+                                      <children> 
+                                        <Button fx:id="btnADAppend" mnemonicParsing="false" text="Append Firmographic Data" /> 
+                                      </children> 
+                                    </FlowPane> 
+                                  </children> 
+                                </AnchorPane> 
+                              </content> 
+                            </Tab> 
+                          </tabs> 
+                        </TabPane> 
+                        <Label alignment="CENTER_RIGHT" layoutX="386.0" layoutY="156.0" prefWidth="144.0" text="DataMentors Drive Time:" /> 
+                        <ListView fx:id="lviewDriveTimeResults" layoutX="546.0" layoutY="151.0" prefHeight="84.0" prefWidth="295.0"> 
+                          <items> 
+                            <FXCollections fx:factory="observableArrayList"> 
+                              <String fx:value="" /> 
+                            </FXCollections> 
+                          </items> 
+                        </ListView> 
+                        <Button fx:id="btnADDriveTimeCalc" layoutX="396.0" layoutY="185.0" mnemonicParsing="false" prefWidth="134.0" text="Calculate" /> 
+                      </children> 
+                    </AnchorPane> 
+                  </content> 
+                </TitledPane> 
+              </children> 
+            </AnchorPane> 
+          </content> 
+        </Tab> 
+        <Tab fx:id="tabCS" text="Customer Search"> 
+          <content> 
+            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
+              <children> 
+                <TitledPane fx:id="titlePaneCSSearch" animated="false" collapsible="false" prefHeight="667.0" prefWidth="969.0" text="BB&amp;T CIF Record" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> 
+                  <content> 
+                    <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
+                      <children> 
+                        <Label fx:id="lblCSName" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="14.0" prefWidth="115.0" text="Name:" /> 
+                        <TextField fx:id="txtCSName" layoutX="135.0" layoutY="11.0" prefWidth="413.0" promptText="Enter Name" /> 
+                        <Label fx:id="lblCSAddress1" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="44.0" prefWidth="115.0" text="Address 1:" /> 
+                        <TextField fx:id="txtCSAddress1" layoutX="135.0" layoutY="41.0" prefWidth="413.0" promptText="Enter Address" /> 
+                        <Label fx:id="lblCSAddress2" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="75.0" prefWidth="115.0" text="Address 2:" /> 
+                        <TextField fx:id="txtCSAddress2" layoutX="135.0" layoutY="71.0" prefWidth="413.0" promptText="Enter Address" /> 
+                        <Label fx:id="lblCSCity" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="102.0" prefWidth="115.0" text="City:" /> 
+                        <TextField fx:id="txtCSCity" layoutX="135.0" layoutY="98.0" prefWidth="284.0" promptText="Enter City" /> 
+                        <Label fx:id="lblCSState" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="132.0" prefWidth="115.0" text="State:" /> 
+                        <TextField fx:id="txtCSState" layoutX="135.0" layoutY="129.0" prefWidth="39.0" /> 
+                        <Label fx:id="lblCSZipCode" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="163.0" prefWidth="115.0" text="Zip Code:" /> 
+                        <TextField fx:id="txtCSZipCode" layoutX="135.0" layoutY="160.0" prefWidth="88.0" /> 
+                        <Label fx:id="lblCSPhone" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="193.0" prefWidth="115.0" text="Phone:" /> 
+                        <TextField fx:id="txtCSPhone" layoutX="135.0" layoutY="189.0" prefWidth="88.0" /> 
+                        <Label fx:id="lblCSAcctType" alignment="CENTER_RIGHT" layoutX="14.0" layoutY="223.0" prefWidth="115.0" text="Account Type:" /> 
+                        <TextField fx:id="txtCSAcctType" layoutX="135.0" layoutY="219.0" prefWidth="88.0" /> 
+                        <Label fx:id="lblCSRealStype" alignment="CENTER_RIGHT" layoutX="261.0" layoutY="132.0" prefWidth="115.0" text="Real SType:" visible="false" /> 
+                        <TextField fx:id="txtCSRealStype" focusTraversable="false" layoutX="382.0" layoutY="128.0" prefWidth="88.0" visible="false" /> 
+                        <Label fx:id="lblCSUniqueNumber" alignment="CENTER_RIGHT" layoutX="261.0" layoutY="161.0" prefWidth="115.0" text="Unique Number:" visible="false" /> 
+                        <TextField fx:id="txtCSUniqueNumber" focusTraversable="false" layoutX="382.0" layoutY="157.0" prefWidth="88.0" visible="false" /> 
+                        <Label fx:id="lblCSURIL1" alignment="CENTER_RIGHT" layoutX="261.0" layoutY="189.0" prefWidth="115.0" text="URIL1:" visible="false" /> 
+                        <TextField fx:id="txtCSURIL1" focusTraversable="false" layoutX="382.0" layoutY="186.0" prefWidth="88.0" visible="false" /> 
+                        <Label fx:id="lblCSMatchAddrFlag" alignment="CENTER_RIGHT" layoutX="261.0" layoutY="219.0" prefWidth="115.0" text="Match Address Flag:" /> 
+                        <TextField fx:id="txtCSMatchAddrFlag" layoutX="382.0" layoutY="216.0" prefWidth="88.0" /> 
+                        <Label fx:id="lblCSIDNumber" alignment="CENTER_RIGHT" layoutX="496.0" layoutY="131.0" prefWidth="115.0" text="ID Number:" visible="false" /> 
+                        <TextField fx:id="txtCSIDNumber" focusTraversable="false" layoutX="617.0" layoutY="128.0" prefWidth="88.0" visible="false" /> 
+                        <Label fx:id="lblCSMatchingL1" alignment="CENTER_RIGHT" layoutX="496.0" layoutY="161.0" prefWidth="115.0" text="Matching L1:" visible="false" /> 
+                        <TextField fx:id="txtCSMatchingL1" focusTraversable="false" layoutX="617.0" layoutY="158.0" prefWidth="88.0" visible="false" /> 
+                        <Label fx:id="lblCSDNBNumberL1" alignment="CENTER_RIGHT" layoutX="496.0" layoutY="192.0" prefWidth="115.0" text="DNB Number:" visible="false" /> 
+                        <TextField fx:id="txtCSDNBNumberL1" focusTraversable="false" layoutX="617.0" layoutY="189.0" prefWidth="88.0" visible="false" /> 
+                        <Label fx:id="lblCSAddressKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="68.0" prefWidth="152.0" text="Address Key:" /> 
+                        <TextField fx:id="txtCSAddressKey" editable="false" layoutX="726.0" layoutY="65.0" prefWidth="115.0" /> 
+                        <Label fx:id="lblCSHouseholdKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="12.0" prefWidth="152.0" text="Household/Business Key:" /> 
+                        <TextField fx:id="txtCSHouseholdKey" editable="false" layoutX="726.0" layoutY="9.0" prefWidth="115.0" /> 
+                        <Label fx:id="lblCSIndividualKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="40.0" prefWidth="152.0" text="Individual/Contact Key:" /> 
+                        <TextField fx:id="txtCSIndividualKey" editable="false" layoutX="726.0" layoutY="37.0" prefWidth="115.0" /> 
+                        <Label fx:id="lblCSSuperGroupKey" alignment="CENTER_RIGHT" layoutX="553.0" layoutY="98.0" prefWidth="152.0" text="Super Group Key:" /> 
+                        <TextField fx:id="txtCSSuperGroupKey" editable="false" layoutX="726.0" layoutY="95.0" prefWidth="115.0" /> 
+                        <TableView fx:id="tblViewCSResults" editable="false" prefHeight="334.0" prefWidth="936.0" tableMenuButtonVisible="true" AnchorPane.bottomAnchor="54.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="253.0"> 
+                          <!-- 
+                          <columns> 
+                            <TableColumn prefWidth="75.0" text="Column X" /> 
+                            <TableColumn prefWidth="75.0" text="Column X" /> 
+                          </columns> 
+                          --> 
+                        </TableView> 
+                        <FlowPane alignment="BOTTOM_CENTER" hgap="10.0" prefHeight="46.0" prefWidth="936.0" AnchorPane.bottomAnchor="8.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0"> 
+                          <children> 
+                            <Button fx:id="btnCSSearch" mnemonicParsing="false" text="Search CIF Database" /> 
+                            <ProgressIndicator fx:id="pIndCSProgress" progress="0.0" /> 
+                          </children> 
+                        </FlowPane> 
+                        <Button fx:id="btnCSResultsClear" mnemonicParsing="false" text="Clear" AnchorPane.bottomAnchor="16.0" AnchorPane.rightAnchor="14.0" /> 
+                      </children> 
+                    </AnchorPane> 
+                  </content> 
+                </TitledPane> 
+              </children> 
+            </AnchorPane> 
+          </content> 
+        </Tab> 
+      </tabs> 
+    </TabPane> 
+    <FlowPane alignment="BOTTOM_CENTER" prefHeight="22.0" prefWidth="1050.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="29.0" AnchorPane.rightAnchor="27.0"> 
+      <children> 
+        <Button fx:id="btnExit" mnemonicParsing="false" text="Exit" /> 
+      </children> 
+    </FlowPane> 
+  </children> 
+</AnchorPane> 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/SimpleWindowPage.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package modena;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.application.Platform;
+import javafx.css.PseudoClass;
+import javafx.fxml.FXMLLoader;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.layout.Background;
+import javafx.scene.layout.BackgroundFill;
+import javafx.scene.layout.CornerRadii;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.TilePane;
+import javafx.scene.paint.Color;
+
+/**
+ * Simple page with two windows with mac and window styling
+ */
+public class SimpleWindowPage extends StackPane {
+    private Node macWindowContent;
+    private Node windows7WindowContent;
+    private Node windows8WindowContent;
+    private Node ubuntuWindowContent;
+    
+    public SimpleWindowPage() {
+        setPadding(new Insets(20));
+        TilePane box = new TilePane(10,10);
+        box.setPrefColumns(2);
+        getChildren().add(box);
+        box.setPadding(new Insets(15));
+        box.setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));
+        try {
+            StackPane macWindow = new StackPane();
+            macWindow.getStyleClass().add("macWindow");
+            macWindowContent = (Node)FXMLLoader.load(SimpleWindowPage.class.getResource("simple-window.fxml"));
+            macWindowContent.lookup("#MenuBar").setVisible(false);
+            macWindowContent.lookup("#MenuBar").setManaged(false);
+            macWindow.getChildren().add(macWindowContent);
+            
+            StackPane windows7Window = new StackPane();
+            windows7Window.getStyleClass().add("windows7Window");
+            windows7WindowContent = (Node)FXMLLoader.load(SimpleWindowPage.class.getResource("simple-window.fxml"));
+            windows7Window.getChildren().add(windows7WindowContent);
+            
+            StackPane windows8Window = new StackPane();
+            windows8Window.getStyleClass().add("windows8Window");
+            windows8WindowContent = (Node)FXMLLoader.load(SimpleWindowPage.class.getResource("simple-window.fxml"));
+            windows8Window.getChildren().add(windows8WindowContent);
+            
+            StackPane ubuntuWindow = new StackPane();
+            ubuntuWindow.getStyleClass().add("ubuntuWindow");
+            ubuntuWindowContent = (Node)FXMLLoader.load(SimpleWindowPage.class.getResource("simple-window.fxml"));
+            ubuntuWindow.getChildren().add(ubuntuWindowContent);
+            
+            Platform.runLater(new Runnable() {
+                @Override public void run() {
+                    final Node macRB2 = macWindowContent.lookup("#RadioButton2");
+                    macRB2.setMouseTransparent(true);
+                    macRB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+                    final Node windows7RB2 = windows7WindowContent.lookup("#RadioButton2");
+                    windows7RB2.setMouseTransparent(true);
+                    windows7RB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+                    final Node windows8RB2 = windows8WindowContent.lookup("#RadioButton2");
+                    windows8RB2.setMouseTransparent(true);
+                    windows8RB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+                    final Node ubuntuRB2 = ubuntuWindowContent.lookup("#RadioButton2");
+                    ubuntuRB2.setMouseTransparent(true);
+                    ubuntuRB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+                }
+            });
+            
+            box.getChildren().addAll(macWindow, ubuntuWindow, windows7Window, windows8Window);
+        } catch (IOException ex) {
+            Logger.getLogger(SimpleWindowPage.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+    
+    public void setModena(boolean modena) {
+        if (modena) {
+            macWindowContent.setStyle("-fx-background-color: -fx-background;");
+            windows7WindowContent.setStyle("-fx-background-color: -fx-background;");
+            windows8WindowContent.setStyle("-fx-background-color: -fx-background;");
+            ubuntuWindowContent.setStyle("-fx-background-color: -fx-background;");
+        } else {
+            macWindowContent.setStyle(null);
+            windows7WindowContent.setStyle(null);
+            windows8WindowContent.setStyle(null);
+            ubuntuWindowContent.setStyle(null);
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/TestApp.css	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+ #TestAppToolbar > * > .label {
+     -fx-font-size: 10px;
+ }
+#SamplePageToolBar {
+    -fx-base: #666;
+    -fx-background: #444;
+}
+#SamplePageScrollPane {
+    -fx-background-insets: 0,0;
+    -fx-padding: 0;
+}
+.section-label {
+    -fx-font-weight: normal;
+    -fx-text-fill: derive(-fx-text-background-color,30%);
+}
+.section-border {
+    -fx-border-color: ladder(
+        -fx-background,
+        derive(-fx-background,10%) 20%,
+        derive(-fx-background,-10%)  21%
+     );
+    -fx-padding: 20;
+}
+/*.root {
+    -fx-text-base-color:rgba(255, 255, 255,0.5);
+    -fx-text-inner-color:rgba(255, 255, 255,0.5);
+}*/
+/*.text {
+    visibility:false;
+}*/
+.macWindow {
+    -fx-border-image-source: url("mac-window-frame.png"); 
+    -fx-border-image-slice: 49 49 71 49;
+    -fx-border-image-width: 49 49 71 49;
+    -fx-border-image-repeat: stretch;
+    -fx-font: 13px "Lucida Grande";
+}
+.windows7Window {
+    -fx-border-image-source: url("windows7-window-frame.png"); 
+    -fx-border-image-slice: 49 49 71 49;
+    -fx-border-image-width: 49 49 71 49;
+    -fx-border-image-repeat: stretch;
+    -fx-font: 12px "Segoe UI";
+}
+.windows8Window {
+    -fx-border-image-source: url("windows8-window-frame.png"); 
+    -fx-border-image-slice: 49 49 71 49;
+    -fx-border-image-width: 49 49 71 49;
+    -fx-border-image-repeat: stretch;
+    -fx-font: 12px "Segoe UI";
+}
+.ubuntuWindow {
+    -fx-border-image-source: url("ubuntu-window-frame.png"); 
+    -fx-border-image-slice: 49 49 71 49;
+    -fx-border-image-width: 49 49 71 49;
+    -fx-border-image-repeat: stretch;
+    /*-fx-font: 15px "Ubuntu";*/
+    -fx-font: 13px "Lucida Sans";
+}
Binary file tests/golden-image-suite/src/modena/mac-window-frame.png has changed
Binary file tests/golden-image-suite/src/modena/recorder-icon-48.png has changed
Binary file tests/golden-image-suite/src/modena/reload_12x14.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/simple-window.fxml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.collections.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.chart.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+
+<VBox prefHeight="230.0" prefWidth="300.0" style="" xmlns:fx="http://javafx.com/fxml">
+  <children>
+    <MenuBar id="MenuBar" prefWidth="200.0">
+      <menus>
+        <Menu mnemonicParsing="false" text="File">
+          <items>
+            <MenuItem mnemonicParsing="false" text="Close" />
+          </items>
+        </Menu>
+        <Menu mnemonicParsing="false" text="Edit">
+          <items>
+            <MenuItem mnemonicParsing="false" text="Delete" />
+          </items>
+        </Menu>
+        <Menu mnemonicParsing="false" text="Help">
+          <items>
+            <MenuItem mnemonicParsing="false" text="About" />
+          </items>
+        </Menu>
+      </menus>
+    </MenuBar>
+    <ToolBar prefWidth="200.0">
+      <items>
+        <Button mnemonicParsing="false" text="New" />
+        <Button id="DeleteButton" mnemonicParsing="false" text="Delete" />
+        <Button mnemonicParsing="false" text="Save" />
+        <Button mnemonicParsing="false" text="Exit" />
+      </items>
+    </ToolBar>
+    <TabPane prefHeight="130.0" prefWidth="200.0" style="" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="ALWAYS">
+      <tabs>
+        <Tab text="Example Controls">
+          <content>
+            <GridPane id="GridPane" hgap="10.0" style="" vgap="10.0">
+              <children>
+                <RadioButton mnemonicParsing="false" text="RadioButton 1" GridPane.columnIndex="0" GridPane.rowIndex="0">
+                  <toggleGroup>
+                    <ToggleGroup fx:id="toggle2" />
+                  </toggleGroup>
+                </RadioButton>
+                <RadioButton id="RadioButton2" mnemonicParsing="false" selected="true" text="RadioButton 2" toggleGroup="$toggle2" GridPane.columnIndex="0" GridPane.rowIndex="1" />
+                <CheckBox mnemonicParsing="false" selected="true" text="CheckBox" GridPane.columnIndex="0" GridPane.rowIndex="2" />
+                <CheckBox mnemonicParsing="false" text="CheckBox" GridPane.columnIndex="0" GridPane.rowIndex="3" GridPane.valignment="TOP" />
+                <HBox id="HBox" alignment="CENTER" spacing="5.0" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="4">
+                  <children>
+                    <ProgressBar maxWidth="1.7976931348623157E308" prefWidth="-1.0" progress="0.68" HBox.hgrow="ALWAYS">
+                      <HBox.margin>
+                        <Insets right="5.0" />
+                      </HBox.margin>
+                    </ProgressBar>
+                    <Button mnemonicParsing="false" text="Cancel" />
+                    <Button defaultButton="true" mnemonicParsing="false" text="Save..." />
+                  </children>
+                </HBox>
+                <TextArea maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="70.0" prefWidth="120.0" text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vulputate sem id velit sagittis quis imperdiet nunc imperdiet. Etiam consequat purus nec nibh viverra aliquam. Donec urna odio, posuere quis placerat non, tristique a augue. In hac habitasse platea dictumst. Cras eget turpis dui. Pellentesque vel leo arcu, et blandit quam. Integer congue tempus purus, ac rhoncus neque semper nec. Integer elit mauris, dictum non sodales sed, semper in urna. Mauris rutrum faucibus faucibus. Praesent id dui dignissim massa mollis tempus in ut mi.&#10;&#10;Curabitur augue turpis, lacinia ac vehicula id, porta et nisl. Quisque id porttitor eros. Aenean eget fringilla nisi. Etiam posuere cursus pharetra. Aenean aliquam nisl nec sapien viverra id eleifend velit elementum. In et arcu in ligula vestibulum rhoncus. Integer nec odio odio. Nulla scelerisque faucibus urna, sit amet viverra arcu congue eget. Aliquam ut sapien justo. Mauris eu velit massa. Pellentesque tristique aliquet porttitor. Vestibulum rhoncus tristique arcu, sed consectetur ante molestie nec. Nunc egestas posuere fermentum. Sed est urna, tempus sed tempor ac, pulvinar vel dui. Morbi tortor mi, semper non aliquam at, consectetur eu quam." wrapText="true" GridPane.columnIndex="1" GridPane.columnSpan="1" GridPane.rowIndex="0" GridPane.rowSpan="4" />
+              </children>
+              <columnConstraints>
+                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
+                <ColumnConstraints hgrow="ALWAYS" minWidth="10.0" />
+              </columnConstraints>
+              <padding>
+                <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+              </padding>
+              <rowConstraints>
+                <RowConstraints maxHeight="14.0" minHeight="10.0" prefHeight="14.0" vgrow="SOMETIMES" />
+                <RowConstraints maxHeight="15.0" minHeight="10.0" prefHeight="15.0" vgrow="SOMETIMES" />
+                <RowConstraints maxHeight="15.0" minHeight="10.0" prefHeight="15.0" vgrow="SOMETIMES" />
+                <RowConstraints maxHeight="1.7976931348623157E308" minHeight="10.0" prefHeight="15.0" vgrow="ALWAYS" />
+                <RowConstraints maxHeight="20.0" minHeight="10.0" prefHeight="20.0" vgrow="NEVER" />
+              </rowConstraints>
+            </GridPane>
+          </content>
+        </Tab>
+        <Tab text="Tab 2">
+          <content>
+            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+          </content>
+        </Tab>
+        <Tab text="Tab 3">
+          <content>
+            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+          </content>
+        </Tab>
+      </tabs>
+    </TabPane>
+  </children>
+</VBox>
Binary file tests/golden-image-suite/src/modena/ubuntu-window-frame.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/src/modena/ui-mosaic.fxml	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,360 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.collections.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.chart.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+<?import javafx.scene.web.*?>
+
+<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="935.0" prefWidth="927.0" xmlns:fx="http://javafx.com/fxml">
+  <children>
+    <Button layoutX="40.0" layoutY="41.0" mnemonicParsing="false" text="Button" />
+    <Hyperlink layoutX="134.0" layoutY="40.0" text="Hyperlink" />
+    <ComboBox layoutX="234.0" layoutY="41.0" prefWidth="160.0">
+      <items>
+        <FXCollections fx:factory="observableArrayList">
+          <String fx:value="Item 1" />
+          <String fx:value="Item 2" />
+          <String fx:value="Item 3" />
+        </FXCollections>
+      </items>
+    </ComboBox>
+    <SplitMenuButton layoutX="40.0" layoutY="83.0" mnemonicParsing="false" prefWidth="153.0" text="SplitMenuButton">
+      <items>
+        <MenuItem mnemonicParsing="false" text="Action 1" />
+        <MenuItem mnemonicParsing="false" text="Action 2" />
+      </items>
+    </SplitMenuButton>
+    <ChoiceBox layoutX="234.0" layoutY="85.0" prefWidth="160.0">
+      <items>
+        <FXCollections fx:factory="observableArrayList">
+          <String fx:value="Item 1" />
+          <String fx:value="Item 2" />
+          <String fx:value="Item 3" />
+        </FXCollections>
+      </items>
+    </ChoiceBox>
+    <ProgressIndicator layoutX="435.0" layoutY="45.0" prefHeight="59.0" prefWidth="56.0" progress="0.58" />
+    <TextField layoutX="40.0" layoutY="149.0" prefWidth="160.0" promptText="Textfield" text="Textfield" />
+    <TextArea layoutX="40.0" layoutY="180.0" prefHeight="130.0" prefWidth="160.0" promptText="Text Area" text="Text Area with some text spanning over a few lines." wrapText="true" />
+    <Label layoutX="242.0" layoutY="153.0" text="A label" />
+    <Separator layoutX="41.0" layoutY="129.0" prefWidth="490.0" />
+    <Separator layoutX="217.0" layoutY="151.0" orientation="VERTICAL" prefHeight="158.0" />
+    <Slider layoutX="304.0" layoutY="154.0" prefWidth="230.0" />
+    <RadioButton layoutX="240.0" layoutY="199.0" mnemonicParsing="false" text="r1">
+      <toggleGroup>
+        <ToggleGroup fx:id="toggle1" />
+      </toggleGroup>
+    </RadioButton>
+    <RadioButton layoutX="290.0" layoutY="199.0" mnemonicParsing="false" text="r2" toggleGroup="$toggle1" />
+    <ToggleButton layoutX="341.0" layoutY="196.0" mnemonicParsing="false" prefWidth="90.0" selected="true" text="Toggle" toggleGroup="$toggle1" />
+    <ToggleButton layoutX="441.0" layoutY="196.0" mnemonicParsing="false" prefWidth="90.0" selected="false" text="Toggle" toggleGroup="$toggle1" />
+    <PasswordField layoutX="240.0" layoutY="243.0" prefWidth="138.0" promptText="Password" />
+    <ComboBox editable="true" layoutX="395.0" layoutY="243.0" prefWidth="136.0001220703125" promptText="Choose">
+      <items>
+        <FXCollections fx:factory="observableArrayList">
+          <String fx:value="Item 1" />
+          <String fx:value="Item 2" />
+          <String fx:value="Item 3" />
+        </FXCollections>
+      </items>
+    </ComboBox>
+    <CheckBox layoutX="471.0" layoutY="294.0" mnemonicParsing="false" selected="true" text="Check" />
+    <ProgressBar layoutX="240.0" layoutY="291.0" prefWidth="200.0" progress="0.3" />
+    <ScrollBar layoutX="41.0" layoutY="329.0" prefWidth="493.0" />
+    <TitledPane animated="false" layoutX="656.0" layoutY="287.0" prefHeight="59.0" prefWidth="216.0" text="Hello World">
+      <content>
+        <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+      </content>
+    </TitledPane>
+    <Accordion layoutX="39.0" layoutY="358.0" minWidth="345.0" prefHeight="554.0" prefWidth="857.0">
+      <expandedPane>
+        <TitledPane id="x1" fx:id="x3" animated="true" expanded="true" text="VBox">
+          <content>
+            <VBox prefHeight="200.0" prefWidth="100.0">
+              <children>
+                <Button mnemonicParsing="false" text="Button" />
+                <Button mnemonicParsing="false" text="Button" />
+              </children>
+            </VBox>
+          </content>
+        </TitledPane>
+      </expandedPane>
+      <panes>
+        <TitledPane id="x2" animated="true" expanded="false" text="Split Pane Padded">
+          <content>
+            <StackPane prefHeight="150.0" prefWidth="200.0">
+              <children>
+                <SplitPane dividerPositions="0.5185185185185185" focusTraversable="true" maxHeight="-Infinity" orientation="VERTICAL" prefHeight="191.0" prefWidth="447.0">
+                  <items>
+                    <SplitPane dividerPositions="0.4969097651421508" focusTraversable="true" prefHeight="172.0" prefWidth="490.0">
+                      <items>
+                        <TreeView prefHeight="130.0" prefWidth="179.0" showRoot="false">
+                          <root>
+                            <TreeItem value="Family">
+                              <children>
+                                <TreeItem value="Grandparent A">
+                                  <children>
+                                    <TreeItem value="Parent A">
+                                      <children>
+                                        <TreeItem value="Child A" />
+                                      </children>
+                                    </TreeItem>
+                                  </children>
+                                </TreeItem>
+                                <TreeItem value="Grandparent B">
+                                  <children>
+                                    <TreeItem value="Parent B">
+                                      <children>
+                                        <TreeItem value="Child B" />
+                                      </children>
+                                    </TreeItem>
+                                  </children>
+                                </TreeItem>
+                                <TreeItem value="Grandparent C">
+                                  <children>
+                                    <TreeItem value="Parent C">
+                                      <children>
+                                        <TreeItem value="Child C" />
+                                      </children>
+                                    </TreeItem>
+                                  </children>
+                                </TreeItem>
+                              </children>
+                            </TreeItem>
+                          </root>
+                        </TreeView>
+                        <TableView prefHeight="130.0" prefWidth="241.0">
+                          <columns>
+                            <TableColumn prefWidth="75.0" text="Column X" />
+                            <TableColumn prefWidth="75.0" text="Column X" />
+                          </columns>
+                        </TableView>
+                      </items>
+                    </SplitPane>
+                    <ListView prefHeight="130.0" prefWidth="200.0" />
+                  </items>
+                </SplitPane>
+              </children>
+              <padding>
+                <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
+              </padding>
+            </StackPane>
+          </content>
+        </TitledPane>
+        <TitledPane fx:id="x2" animated="true" expanded="false" text="Form">
+          <content>
+            <GridPane id="GridPane" hgap="10.0" prefHeight="139.0" prefWidth="288.0" vgap="10.0">
+              <children>
+                <Button mnemonicParsing="false" text="Submit" GridPane.columnIndex="1" GridPane.rowIndex="2" />
+                <TextField prefWidth="160.0" promptText="Name" text="" GridPane.columnIndex="1" GridPane.rowIndex="0" />
+                <TextArea prefHeight="75.0" prefWidth="160.0" promptText="Address" text="" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+                <Label text="Name" GridPane.columnIndex="0" GridPane.rowIndex="0" />
+                <AnchorPane id="AnchorPane" minHeight="-Infinity" minWidth="-Infinity" prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="0" GridPane.rowIndex="1" GridPane.valignment="TOP">
+                  <children>
+                    <Label layoutX="55.0" layoutY="5.0" text="Address" />
+                  </children>
+                </AnchorPane>
+              </children>
+              <columnConstraints>
+                <ColumnConstraints halignment="RIGHT" hgrow="SOMETIMES" maxWidth="111.0" minWidth="10.0" prefWidth="65.0" />
+                <ColumnConstraints halignment="RIGHT" hgrow="SOMETIMES" maxWidth="216.0" minWidth="10.0" prefWidth="213.0" />
+              </columnConstraints>
+              <rowConstraints>
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+              </rowConstraints>
+            </GridPane>
+          </content>
+        </TitledPane>
+        <TitledPane animated="true" expanded="false" text="Chart">
+          <content>
+            <ScrollPane prefHeight="200.0" prefWidth="200.0">
+              <content>
+                <BubbleChart id="BubbleChart" title="My Bubble Chart" titleSide="TOP">
+                  <xAxis>
+                    <NumberAxis side="BOTTOM" />
+                  </xAxis>
+                  <yAxis>
+                    <NumberAxis side="LEFT" />
+                  </yAxis>
+                </BubbleChart>
+              </content>
+            </ScrollPane>
+          </content>
+        </TitledPane>
+        <TitledPane animated="false" expanded="false" text="Table">
+          <content>
+            <TableView prefHeight="200.0" prefWidth="200.0">
+              <columns>
+                <TableColumn prefWidth="75.0" text="Column X" />
+                <TableColumn prefWidth="75.0" text="Column X" />
+              </columns>
+            </TableView>
+          </content>
+        </TitledPane>
+        <TitledPane fx:id="x1" animated="true" expanded="false" text="Tree">
+          <content>
+            <TreeView prefHeight="200.0" prefWidth="200.0" />
+          </content>
+        </TitledPane>
+        <TitledPane id="x1" animated="true" expanded="false" text="List">
+          <content>
+            <ListView prefHeight="200.0" prefWidth="200.0" />
+          </content>
+        </TitledPane>
+        <TitledPane id="x1" animated="true" expanded="false" text="Text Area">
+          <content>
+            <TextArea prefWidth="200.0" text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper varius lobortis. Donec porttitor, diam ut adipiscing sollicitudin, massa mi cursus orci, sed faucibus libero lectus id augue. Cras tristique odio tincidunt massa vehicula sed pellentesque orci pretium. Donec placerat ullamcorper magna cursus volutpat. Nulla facilisi. In faucibus ullamcorper tincidunt. Nam ante ante, consequat vitae egestas non, tincidunt eu mauris. Vivamus aliquam nibh justo, tincidunt vehicula metus. Suspendisse ut dui quis ligula aliquet venenatis. Nullam lacinia lectus non ipsum sagittis at eleifend mauris pretium. Vestibulum nisi metus, rhoncus vitae condimentum a, condimentum fermentum urna. Quisque ut nisi massa. Sed auctor euismod urna eu tincidunt. Mauris facilisis tempor molestie. In in quam in mauris placerat malesuada id a magna.&#10;&#10;Donec ligula velit, ornare nec semper a, aliquet at nibh. Morbi pulvinar sollicitudin ultricies. Donec quis eros eu turpis facilisis placerat. Aenean non neque libero. Vestibulum orci magna, auctor et tempus sit amet, dictum et libero. Praesent dapibus justo eget elit ultrices bibendum. In eget nisl augue, id imperdiet magna. Suspendisse at augue vitae dolor consectetur mollis at et orci. Nam sit amet mi in diam pulvinar ornare. Fusce vitae neque eget urna interdum rhoncus rhoncus id lectus. Vestibulum eget leo non nunc porttitor bibendum. Nullam justo nisi, mattis id adipiscing quis, egestas a lorem. Donec mi ligula, dictum id mattis sed, vehicula vitae metus.&#10;&#10;Etiam id felis in velit blandit dignissim vel non libero. Aenean tristique euismod libero, at faucibus purus aliquam ut. Duis placerat lectus sit amet odio ultrices vestibulum. Aliquam erat volutpat. Praesent odio lorem, commodo eget tristique et, placerat at lorem. Curabitur blandit condimentum magna, at pretium nulla interdum a. Sed magna nulla, malesuada quis dignissim sit amet, eleifend at nisl. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec vehicula vehicula molestie. Phasellus ultricies volutpat cursus. Praesent in leo sit amet arcu accumsan tincidunt. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum dignissim hendrerit erat, nec bibendum metus sodales eget. Integer congue felis sit amet dolor sollicitudin nec dapibus nisi tempus. Cras malesuada, mi vitae gravida iaculis, mi dui pharetra risus, ac condimentum urna ipsum blandit elit.&#10;&#10;Aenean pharetra aliquam velit in porta. Phasellus leo erat, iaculis et pharetra non, dignissim eu velit. Sed rutrum tortor vel purus adipiscing vitae ultrices erat sollicitudin. Vestibulum tempus consectetur est id porttitor. Proin hendrerit dictum dapibus. Sed viverra, erat at condimentum molestie, orci purus blandit eros, nec scelerisque nulla justo vitae neque. Sed tempor massa venenatis tortor condimentum viverra. Duis a egestas mauris. Curabitur egestas tincidunt sodales. Sed ornare, nulla at adipiscing ullamcorper, quam orci facilisis erat, non hendrerit nisl enim et lacus.&#10;&#10;Phasellus ac lacus gravida mauris malesuada accumsan id eleifend quam. Pellentesque quis mi urna. Mauris a pulvinar enim. Duis molestie lacinia vehicula. Vivamus semper consequat mauris a placerat. Suspendisse felis massa, suscipit vel aliquet at, pellentesque eget tellus. Sed aliquam tortor felis." wrapText="true" />
+          </content>
+        </TitledPane>
+        <TitledPane id="x1" animated="true" expanded="false" text="HTML Editor">
+          <content>
+            <HTMLEditor htmlText="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body contenteditable=&quot;true&quot;&gt;&lt;/body&gt;&lt;/html&gt;" minWidth="100.0" prefHeight="200.0" prefWidth="-1.0" />
+          </content>
+        </TitledPane>
+        <TitledPane id="x1" animated="true" expanded="false" text="Empty">
+          <content>
+            <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
+              <padding>
+                <Insets top="10.0" />
+              </padding>
+            </AnchorPane>
+          </content>
+        </TitledPane>
+        <TitledPane id="x2" animated="true" expanded="false" text="Split Pane No Padding">
+          <content>
+            <SplitPane dividerPositions="0.5065359477124183" focusTraversable="true" maxHeight="1.7976931348623157E308" orientation="VERTICAL" prefHeight="-1.0" prefWidth="-1.0">
+              <items>
+                <SplitPane dividerPositions="0.49705535924617195" focusTraversable="true" prefHeight="172.0" prefWidth="490.0">
+                  <items>
+                    <TreeView prefHeight="130.0" prefWidth="179.0" showRoot="false">
+                      <root>
+                        <TreeItem value="Family">
+                          <children>
+                            <TreeItem value="Grandparent A">
+                              <children>
+                                <TreeItem value="Parent A">
+                                  <children>
+                                    <TreeItem value="Child A" />
+                                  </children>
+                                </TreeItem>
+                              </children>
+                            </TreeItem>
+                            <TreeItem value="Grandparent B">
+                              <children>
+                                <TreeItem value="Parent B">
+                                  <children>
+                                    <TreeItem value="Child B" />
+                                  </children>
+                                </TreeItem>
+                              </children>
+                            </TreeItem>
+                            <TreeItem value="Grandparent C">
+                              <children>
+                                <TreeItem value="Parent C">
+                                  <children>
+                                    <TreeItem value="Child C" />
+                                  </children>
+                                </TreeItem>
+                              </children>
+                            </TreeItem>
+                          </children>
+                        </TreeItem>
+                      </root>
+                    </TreeView>
+                    <TableView prefHeight="130.0" prefWidth="241.0">
+                      <columns>
+                        <TableColumn prefWidth="75.0" text="Column X" />
+                        <TableColumn prefWidth="75.0" text="Column X" />
+                      </columns>
+                    </TableView>
+                  </items>
+                </SplitPane>
+                <ListView prefHeight="130.0" prefWidth="200.0" />
+              </items>
+            </SplitPane>
+          </content>
+        </TitledPane>
+        <fx:reference source="x3" />
+      </panes>
+    </Accordion>
+    <Slider layoutX="541.0" layoutY="34.0" orientation="VERTICAL" prefHeight="240.0" showTickMarks="true" />
+    <ProgressIndicator layoutX="582.0" layoutY="287.0" prefHeight="52.0" prefWidth="46.0" progress="-1.0" />
+    <VBox layoutX="582.0" layoutY="39.0" prefHeight="235.0" prefWidth="315.0" style="-fx-border-color: black; -fx-border-width: 3; -fx-border-insets: -3;&#10;">
+      <children>
+        <MenuBar prefWidth="200.0">
+          <menus>
+            <Menu mnemonicParsing="false" text="File">
+              <items>
+                <MenuItem mnemonicParsing="false" text="Close" />
+              </items>
+            </Menu>
+            <Menu mnemonicParsing="false" text="Edit">
+              <items>
+                <MenuItem mnemonicParsing="false" text="Delete" />
+              </items>
+            </Menu>
+            <Menu mnemonicParsing="false" text="ABCqypgj">
+              <items>
+                <MenuItem mnemonicParsing="false" text="ABCqypgj" />
+              </items>
+            </Menu>
+            <Menu mnemonicParsing="false" text="Help">
+              <items>
+                <MenuItem mnemonicParsing="false" text="About" />
+              </items>
+            </Menu>
+          </menus>
+        </MenuBar>
+        <ToolBar prefWidth="200.0">
+          <items>
+            <Button mnemonicParsing="false" text="New" />
+            <Button mnemonicParsing="false" text="Delete" />
+            <Button mnemonicParsing="false" text="Save" />
+            <Button mnemonicParsing="false" text="Exit" />
+          </items>
+        </ToolBar>
+        <TabPane prefHeight="130.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="ALWAYS">
+          <tabs>
+            <Tab text="Tab 1">
+              <content>
+                <VBox prefHeight="200.0" prefWidth="100.0" spacing="6.0">
+                  <children>
+                    <RadioButton mnemonicParsing="false" text="RadioButton 1">
+                      <toggleGroup>
+                        <ToggleGroup fx:id="toggle2" />
+                      </toggleGroup>
+                    </RadioButton>
+                    <RadioButton mnemonicParsing="false" text="RadioButton 2" toggleGroup="$toggle2" />
+                    <CheckBox mnemonicParsing="false" selected="true" text="CheckBox" />
+                    <CheckBox mnemonicParsing="false" text="CheckBox" />
+                  </children>
+                  <padding>
+                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                  </padding>
+                </VBox>
+              </content>
+            </Tab>
+            <Tab text="Tab 2">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+            <Tab text="Tab 3">
+              <content>
+                <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
+              </content>
+            </Tab>
+          </tabs>
+        </TabPane>
+      </children>
+    </VBox>
+  </children>
+</AnchorPane>
Binary file tests/golden-image-suite/src/modena/windows7-window-frame.png has changed
Binary file tests/golden-image-suite/src/modena/windows8-window-frame.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/golden-image-suite/test/modenatest/ModenaTest.java	Wed Jun 26 11:06:51 2013 -0400
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ */
+package modenatest;
+
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.scene.Node;
+import javafx.scene.image.WritableImage;
+import javafx.scene.paint.Color;
+import modena.Modena;
+import org.jemmy.Rectangle;
+import org.jemmy.control.Wrap;
+import org.jemmy.env.Environment;
+import org.jemmy.env.Timeout;
+import org.jemmy.fx.NodeDock;
+import org.jemmy.image.AWTImage;
+import org.jemmy.image.FilesystemImageLoader;
+import org.jemmy.image.Image;
+import org.jemmy.image.ImageCapturer;
+import org.jemmy.image.ImageLoader;
+import org.jemmy.image.StrictImageComparator;
+import org.jemmy.timing.State;
+import org.jemmy.timing.Waiter;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import static modenatest.ModenaTest.Configuration.*;
+import org.jemmy.action.GetAction;
+import org.jemmy.fx.QueueExecutor;
+import org.jemmy.image.NaturalImageComparator;
+
+
+/**
+ * This test runs Modena app and waits for snapshots obtained from the app content
+ * to match the golden files.
+ * 
+ * Unless they perfectly match test will fail. The following information is collected
+ * for failed comparisons:
+ * current snapshot in build/test/results folder
+ * observed image difference in build/test/results/diffs folder
+ * 
+ * Not all failures necessary mean JavaFX is broken. Here are possible exceptions:
+ * - Animated content can't be compared exactly using this approach.
+ * - Some minor variations in layout/colors are possible.
+ * Manual image comparison is required for all such cases. If observed image is
+ * correct you could copy it to corresponding golden images folder. Golden images
+ * are located in golden/seven, golden/xp, golden/mac or golden/linux folders.
+ * 
+ * This project requires Jemmy libraries which are downloaded from SQE repository
+ * on first run (see build.xml or lib/readme.txt)
+ * 
+ * @author akouznet
+ */
+@RunWith(Parameterized.class)
+public class ModenaTest {
+    
+    private static File osFolder;
+    private static File goldenFolder;
+    private static File resFolder;
+    private static File diffFolder;
+    private static ImageLoader imageLoader;
+    private static final String DEFAULT_OS_FOLDER_NAME = "seven";
+    private static ModenaTest.Configuration[] configurations;
+    
+    /*
+     * The following method copied from
+     * SharedTestUtils\src\test\javaclient\shared\screenshots\ImagesManager.java
+     */
+    private static String osFolder() {
+        String os = System.getProperty("os.name").toLowerCase();
+        String version = System.getProperty("os.version").toLowerCase();
+        if (os.indexOf("win") >= 0) {
+            configurations = new ModenaTest.Configuration[] { DEFAULT };
+//            configurations = new ModenaTest.Configuration[] { DEFAULT, ALTERED_COLORS, WINDOWS_125, WINDOWS_150 };
+            if (version.startsWith("5.")) {
+                return "xp";
+            } else if (version.startsWith("6.")) {
+                return "seven";
+            }
+        } else if (os.indexOf("mac") >= 0) {
+            if (isRetina()) {
+                configurations = new ModenaTest.Configuration[] { DEFAULT_RETINA, ALTERED_COLORS_RETINA };
+            } else {
+                configurations = new ModenaTest.Configuration[] { DEFAULT };
+                //configurations = new ModenaTest.Configuration[] { DEFAULT, ALTERED_COLORS };
+            }
+            return "mac";
+        } else if ((os.indexOf("linux") >= 0) || (os.indexOf("ubuntu") >= 0)) {
+            configurations = new ModenaTest.Configuration[] { DEFAULT, ALTERED_COLORS };
+            return "linux";
+        }
+        configurations = new ModenaTest.Configuration[] { DEFAULT, ALTERED_COLORS };
+        return DEFAULT_OS_FOLDER_NAME;
+    }
+    
+    private static boolean isRetina() {
+        return false; // TODO: Fix this
+    }
+