changeset 7839:aa3fda00ace5

Automated merge with http://hg.openjdk.java.net/openjfx/8u/rt
author kcr
date Thu, 28 Aug 2014 17:49:22 -0700
parents a2dda1afa7b5 b72f6918383b
children 5c12620f83f9
files apps/toys/Hello/src/main/java/alertdialog/Alert.java apps/toys/Hello/src/main/java/alertdialog/AlertImpl.java modules/graphics/src/main/java/com/sun/javafx/css/converters/SizeConverter.java
diffstat 204 files changed, 13865 insertions(+), 2645 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Wed Aug 27 07:55:19 2014 -0700
+++ b/.hgignore	Thu Aug 28 17:49:22 2014 -0700
@@ -33,3 +33,4 @@
 */Debug/*
 *~
 modules/web/src/main/native/LayoutTests
+apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/about/about.properties
--- a/.idea/copyright/profiles_settings.xml	Wed Aug 27 07:55:19 2014 -0700
+++ b/.idea/copyright/profiles_settings.xml	Thu Aug 28 17:49:22 2014 -0700
@@ -1,5 +1,3 @@
 <component name="CopyrightManager">
-  <settings default="">
-    <module2copyright />
-  </settings>
+  <settings default="" />
 </component>
\ No newline at end of file
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/about/AboutWindowController.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/about/AboutWindowController.java	Thu Aug 28 17:49:22 2014 -0700
@@ -63,7 +63,7 @@
     // The resource bundle contains two keys: about.copyright and about.copyright.open
     private String sbAboutCopyrightKeyName = "about.copyright.open"; //NOI18N
     // File name must be in sync with what we use in logging.properties
-    private final String LOG_FILE_NAME = "scenebuilder-2.u.log"; //NOI18N
+    private final String LOG_FILE_NAME = "scenebuilder-2.0.1.log"; //NOI18N
 
     public AboutWindowController() {
         super(AboutWindowController.class.getResource("About.fxml"), //NOI18N
@@ -147,7 +147,7 @@
     
     private StringBuilder getVersionParagraph() {
         StringBuilder sb = new StringBuilder(I18N.getString("about.product.version"));
-        sb.append("\nJavaFX Scene Builder 2.u\n\n"); //NOI18N
+        sb.append("\nJavaFX Scene Builder 2.0.1\n\n"); //NOI18N
         return sb;
     }
     private String getLogFilePath() {
Binary file apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/about/about-header.png has changed
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preview/PreviewWindowController.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preview/PreviewWindowController.java	Thu Aug 28 17:49:22 2014 -0700
@@ -242,9 +242,7 @@
 
                         Object sceneGraphRoot = clone.getSceneGraphRoot();
                         final List<String> themeStyleSheetStrings = new ArrayList<>();
-                        for (URL themeURL : EditorPlatform.getThemeStylesheetURLs(editorControllerTheme)) {
-                            themeStyleSheetStrings.add(themeURL.toString());
-                        }
+                        themeStyleSheetStrings.add( EditorPlatform.getThemeStylesheetURL(editorControllerTheme).toString());
 
                         if (sceneGraphRoot instanceof Parent) {
                             ((Parent) sceneGraphRoot).setId(NID_PREVIEW_ROOT);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorPlatform.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorPlatform.java	Thu Aug 28 17:49:22 2014 -0700
@@ -99,85 +99,78 @@
     private final static URL caspianThemeUrl = Deprecation.getCaspianStylesheetURL();
     private final static URL caspianHighContrastThemeUrl = Deprecation.getCaspianHighContrastStylesheetURL();
     private final static URL caspianEmbeddedThemeUrl = Deprecation.getCaspianEmbeddedStylesheetURL();
+    private final static URL caspianEmbeddedHighContrastThemeUrl = Deprecation.getCaspianEmbeddedHighContrastStylesheetURL();
     private final static URL caspianEmbeddedQVGAThemeUrl = Deprecation.getCaspianEmbeddedQVGAStylesheetURL();
+    private final static URL caspianEmbeddedQVGAHighContrastThemeUrl = Deprecation.getCaspianEmbeddedQVGAHighContrastStylesheetURL();
     private final static URL modenaThemeUrl = Deprecation.getModenaStylesheetURL();
     private final static URL modenaTouchThemeUrl = Deprecation.getModenaTouchStylesheetURL();
     private final static URL modenaHighContrastBlackonwhiteThemeUrl = Deprecation.getModenaHighContrastBlackonwhiteStylesheetURL();
     private final static URL modenaHighContrastWhiteonblackThemeUrl = Deprecation.getModenaHighContrastWhiteonblackStylesheetURL();
     private final static URL modenaHighContrastYellowonblackThemeUrl = Deprecation.getModenaHighContrastYellowonblackStylesheetURL();
+    private final static URL modenaTouchHighContrastBlackonwhiteThemeUrl = Deprecation.getModenaTouchHighContrastBlackonwhiteStylesheetURL();
+    private final static URL modenaTouchHighContrastWhiteonblackThemeUrl = Deprecation.getModenaTouchHighContrastWhiteonblackStylesheetURL();
+    private final static URL modenaTouchHighContrastYellowonblackThemeUrl = Deprecation.getModenaTouchHighContrastYellowonblackStylesheetURL();
 
     /**
-     * Returns the list of url for locating the specified set of stylesheet in jfxrt.jar.
+     * Returns the list of url for locating the specified stylesheet.
+     * SB uses a set of CSS files aggregating several @import statements (see DTL-6699).
      *
      * @param theme theme for which list of url should be computed
-     * @return list of url for locating the specified stylesheet.
+     * @return url for locating the specified stylesheet.
      */
-    public static List<URL> getThemeStylesheetURLs(Theme theme) {
-        final List<URL> result = new ArrayList<>();
+    public static URL getThemeStylesheetURL(Theme theme) {
+        final URL result;
 
-        // In all modena cases below we do not add to the result the modenaThemeUrl
-        // because it is already the default, set on top of the scenegraph
-        // (it is an FX 8 platform built-in behavior).
         switch (theme) {
             default:
+                result = null;
                 break;
             case MODENA:
+                result = modenaThemeUrl;
                 break;
             case MODENA_TOUCH:
-                result.add(modenaTouchThemeUrl);
+                result = modenaTouchThemeUrl;
                 break;
             case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
-                result.add(modenaHighContrastBlackonwhiteThemeUrl);
+                result = modenaHighContrastBlackonwhiteThemeUrl;
                 break;
             case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
-                result.add(modenaHighContrastWhiteonblackThemeUrl);
+                result = modenaHighContrastWhiteonblackThemeUrl;
                 break;
             case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
-                result.add(modenaHighContrastYellowonblackThemeUrl);
+                result = modenaHighContrastYellowonblackThemeUrl;
                 break;
             case MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE:
-                result.add(modenaTouchThemeUrl);
-                result.add(modenaHighContrastBlackonwhiteThemeUrl);
+                result = modenaTouchHighContrastBlackonwhiteThemeUrl;
                 break;
             case MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK:
-                result.add(modenaTouchThemeUrl);
-                result.add(modenaHighContrastWhiteonblackThemeUrl);
+                result = modenaTouchHighContrastWhiteonblackThemeUrl;
                 break;
             case MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK:
-                result.add(modenaTouchThemeUrl);
-                result.add(modenaHighContrastYellowonblackThemeUrl);
+                result = modenaTouchHighContrastYellowonblackThemeUrl;
                 break;
             case CASPIAN:
-                result.add(caspianThemeUrl);
+                result = caspianThemeUrl;
                 break;
             case CASPIAN_HIGH_CONTRAST:
-                result.add(caspianThemeUrl);
-                result.add(caspianHighContrastThemeUrl);
+                result = caspianHighContrastThemeUrl;
                 break;
             case CASPIAN_EMBEDDED:
-                result.add(caspianThemeUrl);
-                result.add(caspianEmbeddedThemeUrl);
+                result = caspianEmbeddedThemeUrl;
                 break;
             case CASPIAN_EMBEDDED_HIGH_CONTRAST:
-                result.add(caspianThemeUrl);
-                result.add(caspianEmbeddedThemeUrl);
-                result.add(caspianHighContrastThemeUrl);
+                result = caspianEmbeddedHighContrastThemeUrl;
                 break;
             case CASPIAN_EMBEDDED_QVGA:
-                result.add(caspianThemeUrl);
-                result.add(caspianEmbeddedThemeUrl);
-                result.add(caspianEmbeddedQVGAThemeUrl);
+                result = caspianEmbeddedQVGAThemeUrl;
                 break;
             case CASPIAN_EMBEDDED_QVGA_HIGH_CONTRAST:
-                result.add(caspianThemeUrl);
-                result.add(caspianEmbeddedThemeUrl);
-                result.add(caspianEmbeddedQVGAThemeUrl);
-                result.add(caspianHighContrastThemeUrl);
+                result = caspianEmbeddedQVGAHighContrastThemeUrl;
                 break;
         }
         
         if (!theme.equals(Theme.MODENA)) {
-            assert !result.isEmpty() : "Missing logic for " + theme;
+            assert result != null : "Missing logic for " + theme;
         }
 
         return result;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BatchDocumentJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BatchDocumentJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -65,7 +65,7 @@
     }
 
     @Override
-    public final void execute() {
+    public void execute() {
         final FXOMDocument fxomDocument
                 = getEditorController().getFxomDocument();
         fxomDocument.beginUpdate();
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public final void undo() {
+    public void undo() {
         final FXOMDocument fxomDocument
                 = getEditorController().getFxomDocument();
         fxomDocument.beginUpdate();
@@ -87,7 +87,7 @@
     }
 
     @Override
-    public final void redo() {
+    public void redo() {
         final FXOMDocument fxomDocument
                 = getEditorController().getFxomDocument();
         fxomDocument.beginUpdate();
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BatchSelectionJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BatchSelectionJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,8 +34,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -43,9 +41,8 @@
  *
  * The sub jobs are FIRST all created, THEN executed.
  */
-public abstract class BatchSelectionJob extends CompositeJob2 {
+public abstract class BatchSelectionJob extends BatchDocumentJob {
 
-    private List<Job> subJobs;
     private AbstractSelectionGroup oldSelectionGroup;
     private AbstractSelectionGroup newSelectionGroup;
 
@@ -60,36 +57,16 @@
     protected abstract AbstractSelectionGroup getNewSelectionGroup();
 
     @Override
-    public final List<Job> getSubJobs() {
-        if (subJobs == null) {
-            subJobs = makeSubJobs();
-            assert subJobs != null;
-            subJobs = Collections.unmodifiableList(subJobs);
-        }
-        return subJobs;
-    }
-
-    @Override
-    public final boolean isExecutable() {
-        return getSubJobs().isEmpty() == false;
-    }
-
-    @Override
     public final void execute() {
         final Selection selection = getEditorController().getSelection();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
         try {
-            fxomDocument.beginUpdate();
             selection.beginUpdate();
             oldSelectionGroup = selection.getGroup() == null ? null
                     : selection.getGroup().clone();
-            for (Job subJob : getSubJobs()) {
-                subJob.execute();
-            }
+            super.execute();
             newSelectionGroup = getNewSelectionGroup();
             selection.select(newSelectionGroup);
             selection.endUpdate();
-            fxomDocument.endUpdate();
 
         } catch (CloneNotSupportedException x) {
             // Emergency code
@@ -100,30 +77,21 @@
     @Override
     public final void undo() {
         final Selection selection = getEditorController().getSelection();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
         selection.beginUpdate();
-        for (int i = getSubJobs().size() - 1; i >= 0; i--) {
-            getSubJobs().get(i).undo();
-        }
+        super.undo();
         selection.select(oldSelectionGroup);
         selection.endUpdate();
-        fxomDocument.endUpdate();
     }
 
     @Override
     public final void redo() {
         final Selection selection = getEditorController().getSelection();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
         selection.beginUpdate();
-        for (Job subJob : getSubJobs()) {
-            subJob.redo();
-        }
+        super.redo();
         selection.select(newSelectionGroup);
         selection.endUpdate();
-        fxomDocument.endUpdate();
     }
 
+    @Override
     protected abstract List<Job> makeSubJobs();
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringForwardJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringForwardJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,7 +33,6 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
@@ -46,7 +45,7 @@
 /**
  *
  */
-public class BringForwardJob extends BatchSelectionJob {
+public class BringForwardJob extends BatchDocumentJob {
 
     public BringForwardJob(EditorController editorController) {
         super(editorController);
@@ -106,12 +105,6 @@
         return result;
     }
 
-    @Override
-    protected AbstractSelectionGroup getNewSelectionGroup() {
-        // Selection unchanged
-        return getOldSelectionGroup();
-    }
-
     private String makeMultipleSelectionDescription() {
         final StringBuilder result = new StringBuilder();
         result.append("Bring Forward ");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringToFrontJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringToFrontJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,7 +33,6 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
@@ -46,7 +45,7 @@
 /**
  *
  */
-public class BringToFrontJob extends BatchSelectionJob {
+public class BringToFrontJob extends BatchDocumentJob {
 
     public BringToFrontJob(EditorController editorController) {
         super(editorController);
@@ -104,12 +103,6 @@
         return result;
     }
 
-    @Override
-    protected AbstractSelectionGroup getNewSelectionGroup() {
-        // Selection unchanged
-        return getOldSelectionGroup();
-    }
-
     private String makeMultipleSelectionDescription() {
         final StringBuilder result = new StringBuilder();
         result.append("Bring To Front ");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/CutSelectionJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/CutSelectionJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,45 +33,47 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController.ControlAction;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  *
  */
-public class CutSelectionJob extends Job {
+public class CutSelectionJob extends BatchSelectionJob {
 
-    private final DeleteSelectionJob deleteSelectionSubJob;
+    private DeleteSelectionJob deleteSelectionSubJob;
 
     public CutSelectionJob(EditorController editorController) {
         super(editorController);
-        deleteSelectionSubJob = new DeleteSelectionJob(editorController);
     }
 
     @Override
-    public boolean isExecutable() {
-        return deleteSelectionSubJob.isExecutable()
-                && getEditorController().canPerformControlAction(ControlAction.COPY);
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        // Selection emptied
+        return null;
     }
 
     @Override
-    public void execute() {
-        // Update clipboard with current selection BEFORE EXECUTING DELETE job
-        assert getEditorController().canPerformControlAction(ControlAction.COPY);
-        getEditorController().performControlAction(ControlAction.COPY);
-        deleteSelectionSubJob.execute();
+    protected List<Job> makeSubJobs() {
+
+        final List<Job> result = new ArrayList<>();
+        if (getEditorController().canPerformControlAction(ControlAction.COPY)) {
+            // Update clipboard with current selection BEFORE EXECUTING DELETE job
+            assert getEditorController().canPerformControlAction(ControlAction.COPY);
+            getEditorController().performControlAction(ControlAction.COPY);
+
+            deleteSelectionSubJob = new DeleteSelectionJob(getEditorController());
+            if (deleteSelectionSubJob.isExecutable()) {
+                result.add(deleteSelectionSubJob);
+            }
+        }
+        return result;
     }
 
     @Override
-    public void undo() {
-        deleteSelectionSubJob.undo();
-    }
-
-    @Override
-    public void redo() {
-        deleteSelectionSubJob.redo();
-    }
-
-    @Override
-    public String getDescription() {
+    protected String makeDescription() {
+        assert deleteSelectionSubJob != null;
         return deleteSelectionSubJob.getDescription();
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DeleteObjectJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DeleteObjectJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,13 +32,11 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemoveObjectJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMIntrinsic;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
 import java.util.ArrayList;
 import java.util.List;
 import javafx.scene.chart.Axis;
@@ -79,7 +77,8 @@
     protected List<Job> makeAndExecuteSubJobs() {
 
         final List<Job> result = new ArrayList<>();
-        if (targetFxomObject.getParentProperty() == null) {
+        if ((targetFxomObject.getParentProperty() == null) &&
+            (targetFxomObject.getParentCollection() == null)) {
             /*
              * targetFxomObject is the root object
              */
@@ -87,34 +86,11 @@
 
         } else {
 
-            /*
-             * Two cases:
-             *    1) targetFxomObject is the last value of its parent property
-             *       => the property itself must be removed from its parent instance
-             *    2) targetFxomObject is not the last value of its parent property
-             *       => targetFxomObject is removed from its parent property
-             *
-             * Note : in case #1, we also remove targetFxomObject from its 
-             *   parent property ; like this, it can safely be reinserted else
-             *   in the FXOM tree.
-             */
-
-            final FXOMPropertyC parentProperty = targetFxomObject.getParentProperty();
-            final FXOMInstance parentInstance = parentProperty.getParentInstance();
-
-            if ((parentProperty.getValues().size() == 1) && (parentInstance != null)) {
-                // We make a job for removing the property
-                final Job removePropJob = new RemovePropertyJob(
-                        targetFxomObject.getParentProperty(),
-                        getEditorController());
-                result.add(removePropJob);
-            }
-
-            // Then we make a job for removing the value
-            final Job removeValueJob = new RemovePropertyValueJob(
+            // Then we make a job for removing the object
+            final Job removeObjectJob = new RemoveObjectJob(
                     targetFxomObject,
                     getEditorController());
-            result.add(removeValueJob);
+            result.add(removeObjectJob);
         }
 
         for (Job subJob : result) {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/FitToParentSelectionJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/FitToParentSelectionJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,6 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
@@ -46,7 +45,7 @@
 /**
  *
  */
-public class FitToParentSelectionJob extends BatchSelectionJob {
+public class FitToParentSelectionJob extends BatchDocumentJob {
 
     public FitToParentSelectionJob(EditorController editorController) {
         super(editorController);
@@ -106,12 +105,6 @@
         return result;
     }
 
-    @Override
-    protected AbstractSelectionGroup getNewSelectionGroup() {
-        // Selection unchanged
-        return getOldSelectionGroup();
-    }
-
     private String makeMultipleSelectionDescription() {
         final StringBuilder result = new StringBuilder();
         result.append("Fit To Parent ");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ImportFileJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ImportFileJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,8 +33,8 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes;
@@ -48,13 +48,13 @@
 /**
  *
  */
-public class ImportFileJob extends CompositeJob {
+public class ImportFileJob extends BatchSelectionJob {
 
     private final File file;
-    private FXOMObject targetObject;
+    private FXOMObject newObject, targetObject;
 
     public ImportFileJob(File file, EditorController editorController) {
-        super(editorController, true /* shouldRefreshSceneGraph */, false /* shouldUpdateSelection */);
+        super(editorController);
 
         assert file != null;
         this.file = file;
@@ -64,15 +64,11 @@
         return targetObject;
     }
 
-    /*
-     * CompositeJob
-     */
     @Override
     protected List<Job> makeSubJobs() {
         final List<Job> result = new ArrayList<>();
 
         final FXOMDocument targetDocument = getEditorController().getFxomDocument();
-        final FXOMObject newObject;
 
         try {
             newObject = FXOMNodes.newObject(targetDocument, file);
@@ -87,7 +83,6 @@
 
                 if (rootObject == null) {
                     result.add(new SetDocumentRootJob(newObject, getEditorController()));
-                    result.add(new UpdateSelectionJob(newObject, getEditorController()));
                 } else {
                     final Selection selection = getEditorController().getSelection();
                     if (selection.isEmpty() || selection.isSelected(rootObject)) {
@@ -106,7 +101,6 @@
                                 targetObject,
                                 targetMask.getSubComponentCount(),
                                 getEditorController()));
-                        result.add(new UpdateSelectionJob(newObject, getEditorController()));
                     }
                 }
             }
@@ -120,4 +114,11 @@
     protected String makeDescription() {
         return I18N.getString("import.from.file", file.getName());
     }
+
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final List<FXOMObject> fxomObjects = new ArrayList<>();
+        fxomObjects.add(newObject);
+        return new ObjectSelectionGroup(fxomObjects, newObject, null);
+    }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/IncludeFileJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/IncludeFileJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,8 +33,8 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMIntrinsic;
@@ -51,13 +51,14 @@
 /**
  *
  */
-public class IncludeFileJob extends CompositeJob {
+public class IncludeFileJob extends BatchSelectionJob {
 
     private final File file;
     private FXOMObject targetObject;
+    private FXOMIntrinsic newInclude;
 
     public IncludeFileJob(File file, EditorController editorController) {
-        super(editorController, true /* shouldRefreshSceneGraph */, false /* shouldUpdateSelection */);
+        super(editorController);
 
         assert file != null;
         this.file = file;
@@ -67,9 +68,6 @@
         return targetObject;
     }
 
-    /*
-     * CompositeJob
-     */
     @Override
     protected List<Job> makeSubJobs() {
         final List<Job> result = new ArrayList<>();
@@ -82,7 +80,7 @@
             // Cannot include in non saved document
             // Cannot include same file as document one which will create cyclic reference
             if (documentURL != null && URLUtils.equals(documentURL, fileURL) == false) {
-                final FXOMIntrinsic newInclude = FXOMNodes.newInclude(targetDocument, file);
+                newInclude = FXOMNodes.newInclude(targetDocument, file);
 
                 // newInclude is null when file is empty
                 if (newInclude != null) {
@@ -109,7 +107,6 @@
                                     targetObject,
                                     targetMask.getSubComponentCount(),
                                     getEditorController()));
-                            result.add(new UpdateSelectionJob(newInclude, getEditorController()));
                         }
                     }
                 }
@@ -125,4 +122,11 @@
     protected String makeDescription() {
         return I18N.getString("include.file", file.getName());
     }
+
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final List<FXOMObject> fxomObjects = new ArrayList<>();
+        fxomObjects.add(newInclude);
+        return new ObjectSelectionGroup(fxomObjects, newInclude, null);
+    }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsAccessoryJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsAccessoryJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,6 +34,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
@@ -43,18 +45,20 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask.Accessory;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 /**
  * Job used to insert new FXOM objects into an accessory location.
  *
  */
-public class InsertAsAccessoryJob extends Job {
+public class InsertAsAccessoryJob extends BatchSelectionJob {
 
     private final FXOMObject newObject;
     private final FXOMObject targetObject;
     private final Accessory accessory;
-    private BatchJob subJob; // Initialized by execute()
-    private String description; // final but initialized lazily
 
     public InsertAsAccessoryJob(
             FXOMObject newObject,
@@ -74,103 +78,76 @@
         this.accessory = accessory;
     }
 
-    FXOMObject getNewObject() {
-        return newObject;
-    }
-    
-    /*
-     * Job
-     */
     @Override
-    public boolean isExecutable() {
-        final boolean result;
+    protected List<Job> makeSubJobs() {
+        final List<Job> result = new ArrayList<>();
         if (targetObject instanceof FXOMInstance) {
+
             final DesignHierarchyMask mask = new DesignHierarchyMask(targetObject);
-            result = mask.isAcceptingAccessory(accessory, newObject)
-                    && mask.getAccessory(accessory) == null;
-        } else {
-            // TODO(elp): someday we should support insering in FXOMCollection
-            result = false;
+            if (mask.isAcceptingAccessory(accessory, newObject)
+                    && mask.getAccessory(accessory) == null) { // (1)
+
+                final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+                final FXOMInstance targetInstance = (FXOMInstance) targetObject;
+                final PropertyName accessoryName = mask.getPropertyNameForAccessory(accessory);
+                assert accessoryName != null;
+
+                // Property has no value yet because of (1)
+                FXOMProperty targetProperty = new FXOMPropertyC(fxomDocument, accessoryName);
+
+                final Job addValueJob
+                        = new AddPropertyValueJob(newObject,
+                                (FXOMPropertyC) targetProperty,
+                                -1,
+                                getEditorController());
+                result.add(addValueJob);
+
+                if (targetProperty.getParentInstance() == null) {
+                    assert targetObject instanceof FXOMInstance;
+                    final Job addPropertyJob
+                            = new AddPropertyJob(targetProperty, targetInstance,
+                                    -1, getEditorController());
+                    result.add(addPropertyJob);
+                }
+
+                final Job pruneJob = new PrunePropertiesJob(newObject, targetObject,
+                        getEditorController());
+                if (pruneJob.isExecutable()) {
+                    result.add(0, pruneJob);
+                }
+            }
         }
         return result;
     }
 
     @Override
-    public void execute() {
-        assert isExecutable(); // (1)
+    protected String makeDescription() {
+        final String result;
+        final StringBuilder sb = new StringBuilder();
 
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final FXOMInstance targetInstance = (FXOMInstance) targetObject;
-        final DesignHierarchyMask mask = new DesignHierarchyMask(targetObject);
-        final PropertyName accessoryName = mask.getPropertyNameForAccessory(accessory);
-        assert accessoryName != null;
+        sb.append("Insert ");
 
-        // Property has no value yet because of (1)
-        FXOMProperty targetProperty = new FXOMPropertyC(fxomDocument, accessoryName);
-
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldUpdateSceneGraph */, null);
-        final Job addValueJob
-                = new AddPropertyValueJob(newObject,
-                        (FXOMPropertyC) targetProperty,
-                        -1,
-                        getEditorController());
-        subJob.addSubJob(addValueJob);
-
-        if (targetProperty.getParentInstance() == null) {
-            assert targetObject instanceof FXOMInstance;
-            final Job addPropertyJob
-                    = new AddPropertyJob(targetProperty, targetInstance,
-                            -1, getEditorController());
-            subJob.addSubJob(addPropertyJob);
+        if (newObject instanceof FXOMInstance) {
+            final Object sceneGraphObject = newObject.getSceneGraphObject();
+            if (sceneGraphObject != null) {
+                sb.append(sceneGraphObject.getClass().getSimpleName());
+            } else {
+                sb.append("Unresolved Object");
+            }
+        } else if (newObject instanceof FXOMCollection) {
+            sb.append("Collection");
+        } else {
+            assert false;
+            sb.append(newObject.getClass().getSimpleName());
         }
-
-        final Job pruneJob = new PrunePropertiesJob(newObject, targetObject, 
-                getEditorController());
-        if (pruneJob.isExecutable()) {
-            subJob.prependSubJob(pruneJob);
-        }
-            
-        /*
-         * Executes the subjob.
-         */
-        subJob.execute();
+        result = sb.toString();
+        return result;
     }
 
     @Override
-    public void undo() {
-        assert subJob != null;
-        subJob.undo();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        subJob.redo();
-    }
-
-    @Override
-    public String getDescription() {
-        if (description == null) {
-            final StringBuilder sb = new StringBuilder();
-
-            sb.append("Insert ");
-
-            if (newObject instanceof FXOMInstance) {
-                final Object sceneGraphObject = newObject.getSceneGraphObject();
-                if (sceneGraphObject != null) {
-                    sb.append(sceneGraphObject.getClass().getSimpleName());
-                } else {
-                    sb.append("Unresolved Object");
-                }
-            } else if (newObject instanceof FXOMCollection) {
-                sb.append("Collection");
-            } else {
-                assert false;
-                sb.append(newObject.getClass().getSimpleName());
-            }
-            description = sb.toString();
-        }
-        return description;
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final Set<FXOMObject> newObjects = new HashSet<>();
+        newObjects.add(newObject);
+        return new ObjectSelectionGroup(newObjects, newObject, null);
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsSubComponentJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsSubComponentJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,9 +34,9 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
@@ -48,13 +48,15 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Job used to insert new FXOM objects into a sub component location.
  *
  */
-public class InsertAsSubComponentJob extends CompositeJob {
+public class InsertAsSubComponentJob extends BatchSelectionJob {
 
     private final FXOMObject newObject;
     private final FXOMObject targetObject;
@@ -78,17 +80,6 @@
         this.targetIndex = targetIndex;
     }
 
-    public FXOMObject getTargetObject() {
-        return targetObject;
-    }
-
-    FXOMObject getNewObject() {
-        return newObject;
-    }
-    
-    /*
-     * CompositeJob
-     */
     @Override
     protected List<Job> makeSubJobs() {
         final List<Job> result;
@@ -164,11 +155,6 @@
             }
             
             /*
-             * UpdateSelectionJob
-             */
-            result.add(new UpdateSelectionJob(newObject, getEditorController()));
-            
-            /*
              * PrunePropertiesJob
              */
             final Job pruneJob = new PrunePropertiesJob(newObject, targetObject, 
@@ -206,4 +192,11 @@
         
         return sb.toString();
     }
+
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final Set<FXOMObject> newObjects = new HashSet<>();
+        newObjects.add(newObject);
+        return new ObjectSelectionGroup(newObjects, newObject, null);
+    }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PasteIntoJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PasteIntoJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,9 +34,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.ClearSelectionJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
@@ -55,7 +53,9 @@
 /**
  *
  */
-public class PasteIntoJob extends CompositeJob {
+public class PasteIntoJob extends BatchSelectionJob {
+
+    private List<FXOMObject> newObjects;
 
     public PasteIntoJob(EditorController editorController) {
         super(editorController);
@@ -71,8 +71,8 @@
             // Retrieve the FXOMObjects from the clipboard
             final ClipboardDecoder clipboardDecoder
                     = new ClipboardDecoder(Clipboard.getSystemClipboard());
-            final List<FXOMObject> newObjects
-                    = clipboardDecoder.decode(fxomDocument);
+            newObjects = clipboardDecoder.decode(fxomDocument);
+            assert newObjects != null; // But possible empty
 
             // Retrieve the target FXOMObject
             final Selection selection = getEditorController().getSelection();
@@ -111,14 +111,8 @@
                         }
                     }
 
-                    // Build Selection jobs if needed
                     if (result.size() > 0) {
-                        result.add(0, new ClearSelectionJob(
-                                getEditorController()));
-                        result.add(new AdjustAllToggleGroupJob(
-                                getEditorController()));
-                        result.add(new UpdateSelectionJob(newObjects,
-                                getEditorController()));
+                        result.add(new AdjustAllToggleGroupJob(getEditorController()));
                     }
                 }
             }
@@ -130,7 +124,7 @@
     protected String makeDescription() {
         final String result;
 
-        if (getSubJobs().size() == 4) { // ClearSelectionJob + InsertJob + AdjustAllToggleGroupJob + UpdateSelectionJob
+        if (newObjects.size() == 1) {
             result = makeSingleSelectionDescription();
         } else {
             result = makeMultipleSelectionDescription();
@@ -139,21 +133,21 @@
         return result;
     }
 
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        assert newObjects != null; // But possibly empty
+        if (newObjects.isEmpty()) {
+            return null;
+        } else {
+            return new ObjectSelectionGroup(newObjects, newObjects.iterator().next(), null);
+        }
+    }
+    
     private String makeSingleSelectionDescription() {
         final String result;
 
-        assert getSubJobs().size() == 4; // ClearSelectionJob + InsertJob + AdjustAllToggleGroupJob + UpdateSelectionJob
-        final Job subJob0 = getSubJobs().get(1);
-        final FXOMObject newObject;
-        assert subJob0 instanceof InsertAsSubComponentJob
-                || subJob0 instanceof InsertAsAccessoryJob;
-        if (subJob0 instanceof InsertAsSubComponentJob) {
-            final InsertAsSubComponentJob insertJob = (InsertAsSubComponentJob) subJob0;
-            newObject = insertJob.getNewObject();
-        } else {
-            final InsertAsAccessoryJob insertJob = (InsertAsAccessoryJob) subJob0;
-            newObject = insertJob.getNewObject();
-        }
+        assert newObjects.size() == 1;
+        final FXOMObject newObject = newObjects.get(0);
         if (newObject instanceof FXOMInstance) {
             final Object sceneGraphObject = newObject.getSceneGraphObject();
             if (sceneGraphObject != null) {
@@ -172,7 +166,7 @@
     }
 
     private String makeMultipleSelectionDescription() {
-        final int objectCount = getSubJobs().size() - 3;
+        final int objectCount = newObjects.size();
         return I18N.getString("label.action.edit.paste.into.n", objectCount);
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PrunePropertiesJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PrunePropertiesJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,7 +33,6 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemoveFxControllerJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
@@ -47,13 +46,13 @@
 /**
  *
  */
-public class PrunePropertiesJob extends CompositeJob {
+public class PrunePropertiesJob extends BatchDocumentJob {
     
     private final FXOMObject fxomObject;
     private final FXOMObject targetParent;
 
     public PrunePropertiesJob(FXOMObject fxomObject, FXOMObject targetParent, EditorController editorController) {
-        super(editorController, true /* shouldRefreshSceneGraph */, false /* shouldUpdateSelection */);
+        super(editorController);
         
         assert fxomObject != null;
         
@@ -62,10 +61,6 @@
     }
     
 
-    /*
-     * CompositeJob
-     */
-    
     @Override
     protected List<Job> makeSubJobs() {
         final List<Job> result = new ArrayList<>();
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateSelectionJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateSelectionJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,7 +34,6 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
@@ -51,7 +50,7 @@
 /**
  *
  */
-public class RelocateSelectionJob extends CompositeJob {
+public class RelocateSelectionJob extends BatchDocumentJob {
     
     private static final long MERGE_PERIOD = 1000; //  milliseconds
     
@@ -154,10 +153,6 @@
         return result;
     }
     
-    /*
-     * CompositeJob
-     */
-    
     @Override
     protected List<Job> makeSubJobs() {
         final List<Job> result = new ArrayList<>();
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendBackwardJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendBackwardJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,7 +33,6 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
@@ -46,7 +45,7 @@
 /**
  *
  */
-public class SendBackwardJob extends BatchSelectionJob {
+public class SendBackwardJob extends BatchDocumentJob {
 
     public SendBackwardJob(EditorController editorController) {
         super(editorController);
@@ -105,12 +104,6 @@
         return result;
     }
 
-    @Override
-    protected AbstractSelectionGroup getNewSelectionGroup() {
-        // Selection unchanged
-        return getOldSelectionGroup();
-    }
-
     private String makeMultipleSelectionDescription() {
         final StringBuilder result = new StringBuilder();
         result.append("Send Backward ");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendToBackJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendToBackJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -33,7 +33,6 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
@@ -47,7 +46,7 @@
 /**
  *
  */
-public class SendToBackJob extends BatchSelectionJob {
+public class SendToBackJob extends BatchDocumentJob {
 
     public SendToBackJob(EditorController editorController) {
         super(editorController);
@@ -108,12 +107,6 @@
         return result;
     }
 
-    @Override
-    protected AbstractSelectionGroup getNewSelectionGroup() {
-        // Selection unchanged
-        return getOldSelectionGroup();
-    }
-
     private String makeMultipleSelectionDescription() {
         final StringBuilder result = new StringBuilder();
         result.append("Send To Back ");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/TrimSelectionJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/TrimSelectionJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -29,42 +29,107 @@
  * (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 com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.ClearSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMFxIdIndex;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  *
  */
-public class TrimSelectionJob extends Job {
-    
-    private BatchJob batchJob;
-    
+public class TrimSelectionJob extends BatchSelectionJob {
 
     public TrimSelectionJob(EditorController editorController) {
         super(editorController);
     }
 
-    
-    /*
-     * Job
-     */
-    
     @Override
-    public boolean isExecutable() {
+    protected List<Job> makeSubJobs() {
+        final List<Job> result = new ArrayList<>();
+
+        if (canTrim()) {
+
+            final Selection selection = getEditorController().getSelection();
+            assert selection.getGroup() instanceof ObjectSelectionGroup; // Because (1)
+            final ObjectSelectionGroup osg = (ObjectSelectionGroup) selection.getGroup();
+            assert osg.getItems().size() == 1;
+            final FXOMObject oldRoot = getEditorController().getFxomDocument().getFxomRoot();
+            final FXOMObject candidateRoot = osg.getItems().iterator().next();
+
+            /*
+             *  This job is composed of subjobs:
+             *      0) Remove fx:controller/fx:root (if defined) from the old root object if any
+             *      1) Unselect the candidate
+             *          => ClearSelectionJob
+             *      2) Disconnect the candidate from its existing parent
+             *          => DeleteObjectJob
+             *      3) Set the candidate as the root of the document
+             *          => SetDocumentRootJob
+             *      4) Add fx:controller/fx:root (if defined) to the new root object
+             */
+            assert oldRoot instanceof FXOMInstance;
+            boolean isFxRoot = ((FXOMInstance) oldRoot).isFxRoot();
+            final String fxController = oldRoot.getFxController();
+            // First remove the fx:controller/fx:root from the old root object
+            if (isFxRoot) {
+                final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
+                result.add(fxRootJob);
+            }
+            if (fxController != null) {
+                final ModifyFxControllerJob fxControllerJob
+                        = new ModifyFxControllerJob(oldRoot, null, getEditorController());
+                result.add(fxControllerJob);
+            }
+
+            final Job deleteNewRoot = new DeleteObjectJob(candidateRoot, getEditorController());
+            result.add(deleteNewRoot);
+
+            final Job setDocumentRoot = new SetDocumentRootJob(candidateRoot, getEditorController());
+            result.add(setDocumentRoot);
+
+            final Job adjustToggleGroups = new AdjustAllToggleGroupJob(getEditorController());
+            result.add(adjustToggleGroups);
+
+            // Finally add the fx:controller/fx:root to the new root object
+            if (isFxRoot) {
+                final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
+                result.add(fxRootJob);
+            }
+            if (fxController != null) {
+                final ModifyFxControllerJob fxControllerJob
+                        = new ModifyFxControllerJob(candidateRoot, fxController, getEditorController());
+                result.add(fxControllerJob);
+            }
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return I18N.getString("label.action.edit.trim");
+    }
+
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        // Selection unchanged
+        return getOldSelectionGroup();
+    }
+
+    private boolean canTrim() {
         final Selection selection = getEditorController().getSelection();
         final boolean result;
-        
+
         if (selection.getGroup() instanceof ObjectSelectionGroup) {
             final ObjectSelectionGroup osg = (ObjectSelectionGroup) selection.getGroup();
             if (osg.getItems().size() == 1) {
@@ -89,92 +154,7 @@
             //      => cannot trim a selected row/column in a grid pane
             result = false;
         }
-        
+
         return result;
     }
-
-    @Override
-    public void execute() {
-        assert batchJob == null;
-        assert isExecutable(); // (1)
-        
-        final Selection selection = getEditorController().getSelection();
-        assert selection.getGroup() instanceof ObjectSelectionGroup; // Because (1)
-        final ObjectSelectionGroup osg = (ObjectSelectionGroup) selection.getGroup();
-        assert osg.getItems().size() == 1;
-        final FXOMObject oldRoot = getEditorController().getFxomDocument().getFxomRoot();
-        final FXOMObject candidateRoot = osg.getItems().iterator().next();
-        
-        /*
-         *  This job is composed of subjobs:
-         *      0) Remove fx:controller/fx:root (if defined) from the old root object if any
-         *      1) Unselect the candidate
-         *          => ClearSelectionJob
-         *      2) Disconnect the candidate from its existing parent
-         *          => DeleteObjectJob
-         *      3) Set the candidate as the root of the document
-         *          => SetDocumentRootJob
-         *      4) Add fx:controller/fx:root (if defined) to the new root object
-         */
-        
-        batchJob = new BatchJob(getEditorController());
-        
-        assert oldRoot instanceof FXOMInstance;
-        boolean isFxRoot = ((FXOMInstance) oldRoot).isFxRoot();
-        final String fxController = oldRoot.getFxController();
-        // First remove the fx:controller/fx:root from the old root object
-        if (isFxRoot) {
-            final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
-            batchJob.addSubJob(fxRootJob);
-        }
-        if (fxController != null) {
-            final ModifyFxControllerJob fxControllerJob
-                    = new ModifyFxControllerJob(oldRoot, null, getEditorController());
-            batchJob.addSubJob(fxControllerJob);
-        }
-        
-        final Job clearSelectionJob = new ClearSelectionJob(getEditorController());
-        batchJob.addSubJob(clearSelectionJob);
-        
-        final Job deleteNewRoot = new DeleteObjectJob(candidateRoot, getEditorController());
-        batchJob.addSubJob(deleteNewRoot);
-        
-        final Job setDocumentRoot = new SetDocumentRootJob(candidateRoot, getEditorController());
-        batchJob.addSubJob(setDocumentRoot);
-
-        final Job adjustToggleGroups = new AdjustAllToggleGroupJob(getEditorController());
-        batchJob.addSubJob(adjustToggleGroups);
-               
-        // Finally add the fx:controller/fx:root to the new root object
-        if (isFxRoot) {
-            final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
-            batchJob.addSubJob(fxRootJob);
-        }
-        if (fxController != null) {
-            final ModifyFxControllerJob fxControllerJob
-                    = new ModifyFxControllerJob(candidateRoot, fxController, getEditorController());
-            batchJob.addSubJob(fxControllerJob);
-        }
-
-        // Now execute the batch
-        batchJob.execute();
-    }
-
-    @Override
-    public void undo() {
-        assert batchJob != null;
-        batchJob.undo();
-    }
-
-    @Override
-    public void redo() {
-        assert batchJob != null;
-        batchJob.redo();
-    }
-
-    @Override
-    public String getDescription() {
-        return I18N.getString("label.action.edit.trim");
-    }
-    
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UseComputedSizesSelectionJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UseComputedSizesSelectionJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,6 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
@@ -47,7 +46,7 @@
 /**
  *
  */
-public class UseComputedSizesSelectionJob extends BatchSelectionJob {
+public class UseComputedSizesSelectionJob extends BatchDocumentJob {
 
     public UseComputedSizesSelectionJob(EditorController editorController) {
         super(editorController);
@@ -120,12 +119,6 @@
         return result;
     }
 
-    @Override
-    protected AbstractSelectionGroup getNewSelectionGroup() {
-        // Selection unchanged
-        return getOldSelectionGroup();
-    }
-
     private String makeMultipleSelectionDescription() {
         final StringBuilder result = new StringBuilder();
         result.append("Use Computed Sizes on ");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnConstraintsJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnConstraintsJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
@@ -45,19 +45,21 @@
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import javafx.scene.layout.ColumnConstraints;
 
 /**
  * Job invoked when adding column constraints.
  */
-public class AddColumnConstraintsJob extends Job {
+public class AddColumnConstraintsJob extends BatchDocumentJob {
 
-    private BatchJob subJob;
     // Key = target GridPane instance
     // Value = list of target column indexes for this GridPane
-    private final Map<FXOMObject, List<Integer>> targetGridPanes;
+    private final Map<FXOMObject, Set<Integer>> targetGridPanes;
     private final Position position;
     // If the selected column is associated to an existing constraints, 
     // we duplicate the existing constraints.
@@ -68,68 +70,38 @@
     public AddColumnConstraintsJob(
             final EditorController editorController,
             final Position position,
-            final Map<FXOMObject, List<Integer>> targetGridPanes) {
+            final Map<FXOMObject, Set<Integer>> targetGridPanes) {
         super(editorController);
         this.position = position;
         this.targetGridPanes = targetGridPanes;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        assert isExecutable();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Add Column Constraints"; //NOI18N
-    }
-
-    private void buildSubJobs() {
-
-        // Create sub job
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldRefreshSceneGraph */, null);
+        final List<Job> result = new ArrayList<>();
 
         // Add column constraints job
         assert targetGridPanes.isEmpty() == false;
         for (FXOMObject targetGridPane : targetGridPanes.keySet()) {
             assert targetGridPane instanceof FXOMInstance;
-            final List<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
-            addColumnConstraints((FXOMInstance) targetGridPane, targetIndexes);
+            final Set<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
+            result.addAll(addColumnConstraints((FXOMInstance) targetGridPane, targetIndexes));
         }
+        
+        return result;
     }
+    
+    @Override
+    protected String makeDescription() {
+        return "Add Column Constraints"; //NOI18N
+    }
+    
+    private Set<Job> addColumnConstraints(
+            final FXOMInstance targetGridPane,
+            final Set<Integer> targetIndexes) {
 
-    private void addColumnConstraints(
-            final FXOMInstance targetGridPane,
-            final List<Integer> targetIndexes) {
-
-        assert subJob != null;
+        final Set<Job> result = new HashSet<>();
         final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
 
         // Retrieve the constraints property for the specified target GridPane
@@ -166,7 +138,7 @@
                         addedConstraints,
                         (FXOMPropertyC) constraintsProperty,
                         addedIndex, getEditorController());
-                subJob.addSubJob(addValueJob);
+                result.add(addValueJob);
             } //
             // The target index is not associated to an existing constraints value :
             // - we add new empty constraints from the last existing one to the added index (excluded)
@@ -179,7 +151,7 @@
                             addedConstraints,
                             (FXOMPropertyC) constraintsProperty,
                             index, getEditorController());
-                    subJob.addSubJob(addValueJob);
+                    result.add(addValueJob);
                 }
                 // Create new constraints with default values for the new added column
                 final FXOMInstance addedConstraints = makeColumnConstraintsInstance();
@@ -189,7 +161,7 @@
                         addedConstraints,
                         (FXOMPropertyC) constraintsProperty,
                         addedIndex, getEditorController());
-                subJob.addSubJob(addValueJob);
+                result.add(addValueJob);
                 constraintsSize = addedIndex + 1;
             }
             shiftIndex++;
@@ -203,8 +175,10 @@
                     constraintsProperty,
                     targetGridPane,
                     -1, getEditorController());
-            subJob.addSubJob(addPropertyJob);
+            result.add(addPropertyJob);
         }
+        
+        return result;
     }
 
     private FXOMInstance makeColumnConstraintsInstance() {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,22 +32,24 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup.Type;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Job invoked when adding columns.
@@ -60,98 +62,31 @@
  * We add new columns for each selected column, either before or after.
  *
  */
-public class AddColumnJob extends Job {
+public class AddColumnJob extends BatchSelectionJob {
 
-    private BatchJob subJob;
-    private AbstractSelectionGroup selectionSnapshot;
     // Key = target GridPane instance
-    // Value = list of target column indexes for this GridPane
-    private final Map<FXOMObject, List<Integer>> targetGridPanes = new HashMap<>();
+    // Value = set of target column indexes for this GridPane
+    private final Map<FXOMObject, Set<Integer>> targetGridPanes = new HashMap<>();
     private final Position position;
 
     public AddColumnJob(EditorController editorController, Position position) {
         super(editorController);
         assert position == Position.BEFORE || position == Position.AFTER;
         this.position = position;
-        buildSubJobs();
     }
-
+    
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
-
-    @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        assert isExecutable(); // (1)
-        assert targetGridPanes.isEmpty() == false; // Because of (1)
-
-        try {
-            selectionSnapshot = selection.getGroup().clone();
-        } catch (CloneNotSupportedException x) {
-            // Emergency code
-            throw new RuntimeException(x);
-        }
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-        selection.select(selectionSnapshot);
-        selection.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Add Column " + position.name(); //NOI18N
-    }
-
-    private void buildSubJobs() {
+    protected List<Job> makeSubJobs() {
+        final List<Job> result = new ArrayList<>();
 
         if (GridPaneJobUtils.canPerformAdd(getEditorController())) {
 
-            // Create sub job
-            subJob = new BatchJob(getEditorController(),
-                    true /* shouldUpdateSceneGraph */, null);
-
             // Populate the target GridPane map
             assert targetGridPanes.isEmpty() == true;
             final List<FXOMObject> objectList
                     = GridPaneJobUtils.getTargetGridPanes(getEditorController());
             for (FXOMObject object : objectList) {
-                final List<Integer> indexList
+                final Set<Integer> indexList
                         = getTargetColumnIndexes(getEditorController(), object);
                 targetGridPanes.put(object, indexList);
             }
@@ -160,19 +95,48 @@
             // First add the new column constraints
             final Job addConstraints = new AddColumnConstraintsJob(
                     getEditorController(), position, targetGridPanes);
-            subJob.addSubJob(addConstraints);
+            result.add(addConstraints);
             // Then move the column content
-            moveColumnContent();
+            result.addAll(moveColumnContent());
         }
+        return result;
     }
 
-    private void moveColumnContent() {
+    @Override
+    protected String makeDescription() {
+        return "Add Column " + position.name(); //NOI18N
+    }
 
-        assert subJob != null;
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final AbstractSelectionGroup asg;
+        // Update new selection :
+        // - if there is more than 1 GridPane, we select the GridPane instances
+        // - if there is a single GridPane, we select the added columns
+        if (targetGridPanes.size() > 1) {
+            Set<FXOMObject> objects = targetGridPanes.keySet();
+            asg = new ObjectSelectionGroup(objects, objects.iterator().next(), null);
+        } else {
+            assert targetGridPanes.size() == 1;
+            final FXOMInstance targetGridPane
+                    = (FXOMInstance) targetGridPanes.keySet().iterator().next();
+            final Set<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
+            assert targetIndexes.size() >= 1;
+            final Set<Integer> addedIndexes
+                    = GridPaneJobUtils.getAddedIndexes(targetIndexes, position);
+            
+            asg = new GridSelectionGroup(targetGridPane, Type.COLUMN, addedIndexes);
+        }
+        return asg;
+    }
+
+    private List<Job> moveColumnContent() {
+
+        final List<Job> result = new ArrayList<>();
 
         for (FXOMObject targetGridPane : targetGridPanes.keySet()) {
 
-            final List<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
+            final Set<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
 
             final DesignHierarchyMask mask = new DesignHierarchyMask(targetGridPane);
             final int columnsSize = mask.getColumnsSize();
@@ -213,7 +177,7 @@
                         break;
                     default:
                         assert false;
-                        return;
+                        return result;
                 }
 
                 // If fromIndex >= columnsSize, we are below the last existing column 
@@ -224,39 +188,13 @@
                             = GridPaneJobUtils.getIndexes(fromIndex, toIndex);
                     final ReIndexColumnContentJob reIndexJob = new ReIndexColumnContentJob(
                             getEditorController(), offset, targetGridPane, indexes);
-                    subJob.addSubJob(reIndexJob);
+                    result.add(reIndexJob);
                 }
 
                 shiftIndex++;
             }
         }
-    }
-
-    private void updateSelection() {
-        final Selection selection = getEditorController().getSelection();
-        // Update new selection :
-        // - if there is more than 1 GridPane, we select the GridPane instances
-        // - if there is a single GridPane, we select the added columns
-        if (targetGridPanes.size() > 1) {
-            selection.select(targetGridPanes.keySet());
-        } else {
-            assert targetGridPanes.size() == 1;
-            final FXOMInstance targetGridPane
-                    = (FXOMInstance) targetGridPanes.keySet().iterator().next();
-            final List<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
-            assert targetIndexes.size() >= 1;
-            final List<Integer> addedIndexes
-                    = GridPaneJobUtils.getAddedIndexes(targetIndexes, position);
-
-            // Selection has been cleared at execution time
-            assert selection.isEmpty();
-            // Select added columns
-            for (int addedIndex : addedIndexes) {
-                // Selection is empty => just toggle selection
-                selection.toggleSelection(targetGridPane,
-                        GridSelectionGroup.Type.COLUMN, addedIndex);
-            }
-        }
+        return result;
     }
 
     /**
@@ -265,14 +203,14 @@
      *
      * @return the list of target indexes
      */
-    private List<Integer> getTargetColumnIndexes(
+    private Set<Integer> getTargetColumnIndexes(
             final EditorController editorController,
             final FXOMObject targetGridPane) {
 
         final Selection selection = editorController.getSelection();
         final AbstractSelectionGroup asg = selection.getGroup();
 
-        final List<Integer> result = new ArrayList<>();
+        final Set<Integer> result = new HashSet<>();
 
         // Selection == GridPane columns
         // => return the list of selected columns
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowConstraintsJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowConstraintsJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
@@ -45,19 +45,21 @@
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import javafx.scene.layout.RowConstraints;
 
 /**
  * Job invoked when adding row constraints.
  */
-public class AddRowConstraintsJob extends Job {
+public class AddRowConstraintsJob extends BatchDocumentJob {
 
-    private BatchJob subJob;
     // Key = target GridPane instance
     // Value = list of target row indexes for this GridPane
-    private final Map<FXOMObject, List<Integer>> targetGridPanes;
+    private final Map<FXOMObject, Set<Integer>> targetGridPanes;
     private final Position position;
     // If the selected row is associated to an existing constraints, 
     // we duplicate the existing constraints.
@@ -68,68 +70,38 @@
     public AddRowConstraintsJob(
             final EditorController editorController,
             final Position position,
-            final Map<FXOMObject, List<Integer>> targetGridPanes) {
+            final Map<FXOMObject, Set<Integer>> targetGridPanes) {
         super(editorController);
         this.position = position;
         this.targetGridPanes = targetGridPanes;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
+    protected List<Job> makeSubJobs() {
+
+        final List<Job> result = new ArrayList<>();
+
+        // Add column constraints job
+        assert targetGridPanes.isEmpty() == false;
+        for (FXOMObject targetGridPane : targetGridPanes.keySet()) {
+            assert targetGridPane instanceof FXOMInstance;
+            final Set<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
+            result.addAll(addRowConstraints((FXOMInstance) targetGridPane, targetIndexes));
+        }
+        
+        return result;
     }
-
+    
     @Override
-    public void execute() {
-        assert isExecutable();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
+    protected String makeDescription() {
         return "Add Row Constraints"; //NOI18N
     }
 
-    private void buildSubJobs() {
+    private Set<Job> addRowConstraints(
+            final FXOMInstance targetGridPane,
+            final Set<Integer> targetIndexes) {
 
-        // Create sub job
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldRefreshSceneGraph */, null);
-
-        // Add row constraints job
-        assert targetGridPanes.isEmpty() == false;
-        for (FXOMObject targetGridPane : targetGridPanes.keySet()) {
-            assert targetGridPane instanceof FXOMInstance;
-            final List<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
-            addRowConstraints((FXOMInstance) targetGridPane, targetIndexes);
-        }
-    }
-
-    private void addRowConstraints(
-            final FXOMInstance targetGridPane,
-            final List<Integer> targetIndexes) {
-
-        assert subJob != null;
+        final Set<Job> result = new HashSet<>();
         final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
 
         // Retrieve the constraints property for the specified target GridPane
@@ -166,7 +138,7 @@
                         addedConstraints,
                         (FXOMPropertyC) constraintsProperty,
                         addedIndex, getEditorController());
-                subJob.addSubJob(addValueJob);
+                result.add(addValueJob);
             } //
             // The target index is not associated to an existing constraints value :
             // - we add new empty constraints from the last existing one to the added index (excluded)
@@ -179,7 +151,7 @@
                             addedConstraints,
                             (FXOMPropertyC) constraintsProperty,
                             index, getEditorController());
-                    subJob.addSubJob(addValueJob);
+                    result.add(addValueJob);
                 }
                 // Create new constraints with default values for the new added row
                 final FXOMInstance addedConstraints = makeRowConstraintsInstance();
@@ -189,7 +161,7 @@
                         addedConstraints,
                         (FXOMPropertyC) constraintsProperty,
                         addedIndex, getEditorController());
-                subJob.addSubJob(addValueJob);
+                result.add(addValueJob);
                 constraintsSize = addedIndex + 1;
             }
             shiftIndex++;
@@ -203,8 +175,10 @@
                     constraintsProperty,
                     targetGridPane,
                     -1, getEditorController());
-            subJob.addSubJob(addPropertyJob);
+            result.add(addPropertyJob);
         }
+        
+        return result;
     }
 
     private FXOMInstance makeRowConstraintsInstance() {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,22 +32,24 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup.Type;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Job invoked when adding rows.
@@ -60,98 +62,32 @@
  * We add new rows for each selected row, either above or below.
  *
  */
-public class AddRowJob extends Job {
+public class AddRowJob extends BatchSelectionJob {
 
-    private BatchJob subJob;
-    private AbstractSelectionGroup selectionSnapshot;
     // Key = target GridPane instance
-    // Value = list of target row indexes for this GridPane
-    private final Map<FXOMObject, List<Integer>> targetGridPanes = new HashMap<>();
+    // Value = set of target row indexes for this GridPane
+    private final Map<FXOMObject, Set<Integer>> targetGridPanes = new HashMap<>();
     private final Position position;
 
     public AddRowJob(final EditorController editorController, final Position position) {
         super(editorController);
         assert position == Position.ABOVE || position == Position.BELOW;
         this.position = position;
-        buildSubJobs();
     }
 
-    @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
 
     @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        assert isExecutable(); // (1)
-        assert targetGridPanes.isEmpty() == false; // Because of (1)
-
-        try {
-            selectionSnapshot = selection.getGroup().clone();
-        } catch (CloneNotSupportedException x) {
-            // Emergency code
-            throw new RuntimeException(x);
-        }
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-        selection.select(selectionSnapshot);
-        selection.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Add Row " + position.name(); //NOI18N
-    }
-
-    private void buildSubJobs() {
+    protected List<Job> makeSubJobs() {
+        final List<Job> result = new ArrayList<>();
 
         if (GridPaneJobUtils.canPerformAdd(getEditorController())) {
 
-            // Create sub job
-            subJob = new BatchJob(getEditorController(),
-                    true /* shouldUpdateSceneGraph */, null);
-
             // Populate the target GridPane map
             assert targetGridPanes.isEmpty() == true;
             final List<FXOMObject> objectList
                     = GridPaneJobUtils.getTargetGridPanes(getEditorController());
             for (FXOMObject object : objectList) {
-                final List<Integer> indexList
+                final Set<Integer> indexList
                         = getTargetIndexes(getEditorController(), object);
                 targetGridPanes.put(object, indexList);
             }
@@ -160,19 +96,48 @@
             // First add the new row constraints
             final Job addConstraints = new AddRowConstraintsJob(
                     getEditorController(), position, targetGridPanes);
-            subJob.addSubJob(addConstraints);
+            result.add(addConstraints);
             // Then move the row content
-            moveRowContent();
+            result.addAll(moveRowContent());
         }
+        return result;
     }
 
-    private void moveRowContent() {
+    @Override
+    protected String makeDescription() {
+        return "Add Row " + position.name(); //NOI18N
+    }
 
-        assert subJob != null;
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final AbstractSelectionGroup asg;
+        // Update new selection :
+        // - if there is more than 1 GridPane, we select the GridPane instances
+        // - if there is a single GridPane, we select the added rows
+        if (targetGridPanes.size() > 1) {
+            Set<FXOMObject> objects = targetGridPanes.keySet();
+            asg = new ObjectSelectionGroup(objects, objects.iterator().next(), null);
+        } else {
+            assert targetGridPanes.size() == 1;
+            final FXOMInstance targetGridPane
+                    = (FXOMInstance) targetGridPanes.keySet().iterator().next();
+            final Set<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
+            assert targetIndexes.size() >= 1;
+            final Set<Integer> addedIndexes
+                    = GridPaneJobUtils.getAddedIndexes(targetIndexes, position);
+
+            asg = new GridSelectionGroup(targetGridPane, Type.ROW, addedIndexes);
+        }
+        return asg;
+    }
+
+    private List<Job> moveRowContent() {
+
+        final List<Job> result = new ArrayList<>();
 
         for (FXOMObject targetGridPane : targetGridPanes.keySet()) {
 
-            final List<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
+            final Set<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
 
             final DesignHierarchyMask mask = new DesignHierarchyMask(targetGridPane);
             final int rowsSize = mask.getRowsSize();
@@ -213,7 +178,7 @@
                         break;
                     default:
                         assert false;
-                        return;
+                        return result;
                 }
 
                 // If fromIndex >= rowsSize, we are below the last existing row 
@@ -224,39 +189,13 @@
                             = GridPaneJobUtils.getIndexes(fromIndex, toIndex);
                     final ReIndexRowContentJob reIndexJob = new ReIndexRowContentJob(
                             getEditorController(), offset, targetGridPane, indexes);
-                    subJob.addSubJob(reIndexJob);
+                    result.add(reIndexJob);
                 }
 
                 shiftIndex++;
             }
         }
-    }
-
-    private void updateSelection() {
-        final Selection selection = getEditorController().getSelection();
-        // Update new selection :
-        // - if there is more than 1 GridPane, we select the GridPane instances
-        // - if there is a single GridPane, we select the added rows
-        if (targetGridPanes.size() > 1) {
-            selection.select(targetGridPanes.keySet());
-        } else {
-            assert targetGridPanes.size() == 1;
-            final FXOMInstance targetGridPane
-                    = (FXOMInstance) targetGridPanes.keySet().iterator().next();
-            final List<Integer> targetIndexes = targetGridPanes.get(targetGridPane);
-            assert targetIndexes.size() >= 1;
-            final List<Integer> addedIndexes
-                    = GridPaneJobUtils.getAddedIndexes(targetIndexes, position);
-
-            // Selection has been cleared at execution time
-            assert selection.isEmpty();
-            // Select added rows
-            for (int addedIndex : addedIndexes) {
-                // Selection is empty => just toggle selection
-                selection.toggleSelection(targetGridPane,
-                        GridSelectionGroup.Type.ROW, addedIndex);
-            }
-        }
+        return result;
     }
 
     /**
@@ -265,14 +204,14 @@
      *
      * @return the list of target indexes
      */
-    private List<Integer> getTargetIndexes(
+    private Set<Integer> getTargetIndexes(
             final EditorController editorController,
             final FXOMObject targetGridPane) {
 
         final Selection selection = editorController.getSelection();
         final AbstractSelectionGroup asg = selection.getGroup();
 
-        final List<Integer> result = new ArrayList<>();
+        final Set<Integer> result = new HashSet<>();
 
         // Selection == GridPane rows
         // => return the list of selected rows
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/DeleteColumnJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/DeleteColumnJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,13 +32,12 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import java.util.ArrayList;
@@ -48,72 +47,22 @@
 /**
  * Job invoked when removing columns.
  */
-public class DeleteColumnJob extends Job {
+public class DeleteColumnJob extends BatchSelectionJob {
 
-    private BatchJob subJob;
     private FXOMObject targetGridPane;
     private final List<Integer> targetIndexes = new ArrayList<>();
-    private String description; // Final but constructed lazily
 
     public DeleteColumnJob(EditorController editorController) {
         super(editorController);
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-
-        assert isExecutable(); // (1)
-        assert targetIndexes.isEmpty() == false; // Because of (1)
-
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        if (description == null) {
-            buildDescription();
-        }
-
-        return description;
-    }
-
-    private void buildSubJobs() {
+        final List<Job> result = new ArrayList<>();
 
         if (GridPaneJobUtils.canPerformRemove(getEditorController())) { // (1)
 
-            // Create sub job
-            subJob = new BatchJob(getEditorController(),
-                    true /* shouldUpdateSceneGraph */, null);
-
             // Retrieve the target GridPane
             final Selection selection = getEditorController().getSelection();
             final AbstractSelectionGroup asg = selection.getGroup();
@@ -127,20 +76,44 @@
             // First remove the column constraints
             final Job removeConstraints = new RemoveColumnConstraintsJob(
                     getEditorController(), targetGridPane, targetIndexes);
-            subJob.addSubJob(removeConstraints);
+            result.add(removeConstraints);
             // Then remove the column content
             final Job removeContent = new RemoveColumnContentJob(
                     getEditorController(), targetGridPane, targetIndexes);
-            subJob.addSubJob(removeContent);
-            subJob.addSubJob(new AdjustAllToggleGroupJob(getEditorController()));
+            result.add(removeContent);
+            result.add(new AdjustAllToggleGroupJob(getEditorController()));
             // Finally shift the column content
-            moveColumnContent();
+            result.addAll(moveColumnContent());
         }
+        return result;
     }
 
-    private void moveColumnContent() {
+    @Override
+    protected String makeDescription() {
+        String result;
+        switch (targetIndexes.size()) {
+            case 0:
+                result = "Unexecutable Delete"; //NO18N
+                break;
+            case 1:
+                result = "Delete Column"; //NO18N
+                break;
+            default:
+                result = makeMultipleSelectionDescription();
+                break;
+        }
+        return result;
+    }
 
-        assert subJob != null;
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        // Selection emptied
+        return null;
+    }
+
+    private List<Job> moveColumnContent() {
+
+        final List<Job> result = new ArrayList<>();
 
         final DesignHierarchyMask targetGridPaneMask
                 = new DesignHierarchyMask(targetGridPane);
@@ -178,26 +151,13 @@
                         = GridPaneJobUtils.getIndexes(fromIndex, toIndex);
                 final ReIndexColumnContentJob reIndexJob = new ReIndexColumnContentJob(
                         getEditorController(), offset, targetGridPane, indexes);
-                subJob.addSubJob(reIndexJob);
+                result.add(reIndexJob);
             }
 
             targetIndex = nextTargetIndex;
             shiftIndex--;
         }
-    }
-
-    private void buildDescription() {
-        switch (targetIndexes.size()) {
-            case 0:
-                description = "Unexecutable Delete"; //NO18N
-                break;
-            case 1:
-                description = "Delete Column"; //NO18N
-                break;
-            default:
-                description = makeMultipleSelectionDescription();
-                break;
-        }
+        return result;
     }
 
     private String makeMultipleSelectionDescription() {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/DeleteRowJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/DeleteRowJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,13 +32,12 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import java.util.ArrayList;
@@ -48,72 +47,22 @@
 /**
  * Job invoked when removing rows.
  */
-public class DeleteRowJob extends Job {
+public class DeleteRowJob extends BatchSelectionJob {
 
-    private BatchJob subJob;
     private FXOMObject targetGridPane;
     private final List<Integer> targetIndexes = new ArrayList<>();
-    private String description; // Final but constructed lazily
 
     public DeleteRowJob(EditorController editorController) {
         super(editorController);
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-
-        assert isExecutable(); // (1)
-        assert targetIndexes.isEmpty() == false; // Because of (1)
-
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        if (description == null) {
-            buildDescription();
-        }
-
-        return description;
-    }
-
-    private void buildSubJobs() {
+        final List<Job> result = new ArrayList<>();
 
         if (GridPaneJobUtils.canPerformRemove(getEditorController())) { // (1)
 
-            // Create sub job
-            subJob = new BatchJob(getEditorController(),
-                    true /* shouldUpdateSceneGraph */, null);
-
             // Retrieve the target GridPane
             final Selection selection = getEditorController().getSelection();
             final AbstractSelectionGroup asg = selection.getGroup();
@@ -127,20 +76,44 @@
             // First remove the row constraints
             final Job removeConstraints = new RemoveRowConstraintsJob(
                     getEditorController(), targetGridPane, targetIndexes);
-            subJob.addSubJob(removeConstraints);
+            result.add(removeConstraints);
             // Then remove the row content
             final Job removeContent = new RemoveRowContentJob(
                     getEditorController(), targetGridPane, targetIndexes);
-            subJob.addSubJob(removeContent);
-            subJob.addSubJob(new AdjustAllToggleGroupJob(getEditorController()));
+            result.add(removeContent);
+            result.add(new AdjustAllToggleGroupJob(getEditorController()));
             // Finally shift the row content
-            moveRowContent();
+            result.addAll(moveRowContent());
         }
+        return result;
     }
 
-    private void moveRowContent() {
+    @Override
+    protected String makeDescription() {
+        String result;
+        switch (targetIndexes.size()) {
+            case 0:
+                result = "Unexecutable Delete"; //NO18N
+                break;
+            case 1:
+                result = "Delete Row"; //NO18N
+                break;
+            default:
+                result = makeMultipleSelectionDescription();
+                break;
+        }
+        return result;
+    }
 
-        assert subJob != null;
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        // Selection emptied
+        return null;
+    }
+
+    private List<Job> moveRowContent() {
+
+        final List<Job> result = new ArrayList<>();
 
         final DesignHierarchyMask targetGridPaneMask
                 = new DesignHierarchyMask(targetGridPane);
@@ -178,26 +151,13 @@
                         = GridPaneJobUtils.getIndexes(fromIndex, toIndex);
                 final ReIndexRowContentJob reIndexJob = new ReIndexRowContentJob(
                         getEditorController(), offset, targetGridPane, indexes);
-                subJob.addSubJob(reIndexJob);
+                result.add(reIndexJob);
             }
 
             targetIndex = nextTargetIndex;
             shiftIndex--;
         }
-    }
-
-    private void buildDescription() {
-        switch (targetIndexes.size()) {
-            case 0:
-                description = "Unexecutable Delete"; //NO18N
-                break;
-            case 1:
-                description = "Delete Row"; //NO18N
-                break;
-            default:
-                description = makeMultipleSelectionDescription();
-                break;
-        }
+        return result;
     }
 
     private String makeMultipleSelectionDescription() {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/GridPaneJobUtils.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/GridPaneJobUtils.java	Thu Aug 28 17:49:22 2014 -0700
@@ -40,7 +40,9 @@
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import javafx.scene.layout.GridPane;
 
 /**
@@ -108,10 +110,10 @@
      *
      * @return the list of target indexes
      */
-    static List<Integer> getAddedIndexes(
-            final List<Integer> targetIndexes,
+    static Set<Integer> getAddedIndexes(
+            final Set<Integer> targetIndexes,
             final Position position) {
-        final List<Integer> result = new ArrayList<>();
+        final Set<Integer> result = new HashSet<>();
         int shiftIndex = 0;
         for (int targetIndex : targetIndexes) {
             int addedIndex = targetIndex + shiftIndex++;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveColumnJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveColumnJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
@@ -48,16 +48,16 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import javafx.scene.layout.ColumnConstraints;
 
 /**
  * Job invoked when moving columns BEFORE or AFTER.
  */
-public class MoveColumnJob extends Job {
+public class MoveColumnJob extends BatchSelectionJob {
 
-    private BatchJob subJob;
-    private AbstractSelectionGroup selectionSnapshot;
     private FXOMObject targetGridPane;
     private final List<Integer> targetIndexes = new ArrayList<>();
     private final GridPaneJobUtils.Position position;
@@ -66,79 +66,15 @@
         super(editorController);
         assert position == Position.BEFORE || position == Position.AFTER;
         this.position = position;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        assert isExecutable(); // (1)
-        assert targetIndexes.isEmpty() == false; // Because of (1)
-
-        try {
-            selectionSnapshot = selection.getGroup().clone();
-        } catch (CloneNotSupportedException x) {
-            // Emergency code
-            throw new RuntimeException(x);
-        }
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-        selection.select(selectionSnapshot);
-        selection.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Move Column " + position.name(); //NOI18N
-    }
-
-    private void buildSubJobs() {
+        final List<Job> result = new ArrayList<>();
 
         if (GridPaneJobUtils.canPerformMove(getEditorController(), position)) {
 
-            // Create sub job
-            subJob = new BatchJob(getEditorController(),
-                    true /* shouldUpdateSceneGraph */, null);
-
             // Retrieve the target GridPane
             final Selection selection = getEditorController().getSelection();
             final AbstractSelectionGroup asg = selection.getGroup();
@@ -150,15 +86,32 @@
 
             // Add sub jobs
             // First move the column constraints
-            moveColumnConstraints();
+            result.addAll(moveColumnConstraints());
             // Then move the column content
-            moveColumnContent();
+            result.addAll(moveColumnContent());
         }
+        return result;
     }
 
-    private void moveColumnConstraints() {
+    @Override
+    protected String makeDescription() {
+        return "Move Column " + position.name(); //NOI18N
+    }
 
-        assert subJob != null;
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final Set<Integer> movedIndexes = new HashSet<>();
+        for (int targetIndex : targetIndexes) {
+            int movedIndex = position == Position.BEFORE
+                    ? targetIndex - 1 : targetIndex + 1;
+            movedIndexes.add(movedIndex);
+        }
+        return new GridSelectionGroup(targetGridPane, GridSelectionGroup.Type.COLUMN, movedIndexes);
+    }
+
+    private List<Job> moveColumnConstraints() {
+
+        final List<Job> result = new ArrayList<>();
 
         // Retrieve the constraints property for the specified target GridPane
         final PropertyName propertyName = new PropertyName("columnConstraints"); //NOI18N
@@ -167,7 +120,7 @@
                 = ((FXOMInstance) targetGridPane).getProperties().get(propertyName);
         // GridPane has no constraints property => no constraints to move
         if (constraintsProperty == null) {
-            return;
+            return result;
         }
 
         final DesignHierarchyMask mask = new DesignHierarchyMask(targetGridPane);
@@ -183,7 +136,7 @@
                     break;
                 default:
                     assert false;
-                    return;
+                    return result;
             }
 
             // Retrieve the target constraints
@@ -199,14 +152,14 @@
                 final Job removeValueJob = new DeleteObjectJob(
                         targetConstraints,
                         getEditorController());
-                subJob.addSubJob(removeValueJob);
+                result.add(removeValueJob);
 
                 // Then add the target constraints at new positionIndex
                 final Job addValueJob = new AddPropertyValueJob(
                         targetConstraints,
                         (FXOMPropertyC) constraintsProperty,
                         positionIndex, getEditorController());
-                subJob.addSubJob(addValueJob);
+                result.add(addValueJob);
             }//
             // The target index is not associated to an existing constraints value :
             // we may need to move the constraints before the target one if any
@@ -224,22 +177,23 @@
                             addedConstraints,
                             (FXOMPropertyC) constraintsProperty,
                             positionIndex, getEditorController());
-                    subJob.addSubJob(addValueJob);
+                    result.add(addValueJob);
                 }
             }
         }
+        return result;
     }
 
-    private void moveColumnContent() {
+    private List<Job> moveColumnContent() {
 
-        assert subJob != null;
+        final List<Job> result = new ArrayList<>();
 
         for (int targetIndex : targetIndexes) {
 
             switch (position) {
                 case BEFORE:
                     // First move the target column content
-                    subJob.addSubJob(new ReIndexColumnContentJob(
+                    result.add(new ReIndexColumnContentJob(
                             getEditorController(),
                             -1, targetGridPane, targetIndex));
                     int beforeIndex = targetIndex - 1;
@@ -251,14 +205,14 @@
                         while (targetIndexes.contains(targetIndex + shiftIndex)) {
                             shiftIndex++;
                         }
-                        subJob.addSubJob(new ReIndexColumnContentJob(
+                        result.add(new ReIndexColumnContentJob(
                                 getEditorController(),
                                 shiftIndex, targetGridPane, beforeIndex));
                     }
                     break;
                 case AFTER:
                     // First move the target column content
-                    subJob.addSubJob(new ReIndexColumnContentJob(
+                    result.add(new ReIndexColumnContentJob(
                             getEditorController(),
                             +1, targetGridPane, targetIndex));
                     int afterIndex = targetIndex + 1;
@@ -270,16 +224,16 @@
                         while (targetIndexes.contains(targetIndex + shiftIndex)) {
                             shiftIndex--;
                         }
-                        subJob.addSubJob(new ReIndexColumnContentJob(
+                        result.add(new ReIndexColumnContentJob(
                                 getEditorController(),
                                 shiftIndex, targetGridPane, afterIndex));
                     }
                     break;
                 default:
                     assert false;
-                    return;
             }
         }
+        return result;
     }
 
     private FXOMInstance makeColumnConstraintsInstance() {
@@ -293,19 +247,4 @@
 
         return result;
     }
-
-    private void updateSelection() {
-        final Selection selection = getEditorController().getSelection();
-
-        // Selection has been cleared at execution time
-        assert selection.isEmpty();
-        for (int targetIndex : targetIndexes) {
-            int positionIndex = position == Position.BEFORE
-                    ? targetIndex - 1 : targetIndex + 1;
-
-            // Selection is empty => just toggle selection
-            selection.toggleSelection((FXOMInstance) targetGridPane,
-                    GridSelectionGroup.Type.COLUMN, positionIndex);
-        }
-    }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveRowJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveRowJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
@@ -48,16 +48,16 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import javafx.scene.layout.RowConstraints;
 
 /**
  * Job invoked when moving rows ABOVE or BELOW.
  */
-public class MoveRowJob extends Job {
+public class MoveRowJob extends BatchSelectionJob {
 
-    private BatchJob subJob;
-    private AbstractSelectionGroup selectionSnapshot;
     private FXOMObject targetGridPane;
     private final List<Integer> targetIndexes = new ArrayList<>();
     private final Position position;
@@ -66,79 +66,15 @@
         super(editorController);
         assert position == Position.ABOVE || position == Position.BELOW;
         this.position = position;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        return subJob != null && subJob.isExecutable();
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        assert isExecutable(); // (1)
-        assert targetIndexes.isEmpty() == false; // Because of (1)
-
-        try {
-            selectionSnapshot = selection.getGroup().clone();
-        } catch (CloneNotSupportedException x) {
-            // Emergency code
-            throw new RuntimeException(x);
-        }
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-        selection.select(selectionSnapshot);
-        selection.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert subJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-        updateSelection();
-        selection.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Move Row " + position.name(); //NOI18N
-    }
-
-    private void buildSubJobs() {
+        final List<Job> result = new ArrayList<>();
 
         if (GridPaneJobUtils.canPerformMove(getEditorController(), position)) {
 
-            // Create sub job
-            subJob = new BatchJob(getEditorController(),
-                    true /* shouldUpdateSceneGraph */, null);
-
             // Retrieve the target GridPane
             final Selection selection = getEditorController().getSelection();
             final AbstractSelectionGroup asg = selection.getGroup();
@@ -150,15 +86,32 @@
 
             // Add sub jobs
             // First move the row constraints
-            moveRowConstraints();
+            result.addAll(moveRowConstraints());
             // Then move the row content
-            moveRowContent();
+            result.addAll(moveRowContent());
         }
+        return result;
     }
 
-    private void moveRowConstraints() {
+    @Override
+    protected String makeDescription() {
+        return "Move Row " + position.name(); //NOI18N
+    }
 
-        assert subJob != null;
+    @Override
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        final Set<Integer> movedIndexes = new HashSet<>();
+        for (int targetIndex : targetIndexes) {
+            int movedIndex = position == Position.ABOVE
+                    ? targetIndex - 1 : targetIndex + 1;
+            movedIndexes.add(movedIndex);
+        }
+        return new GridSelectionGroup(targetGridPane, GridSelectionGroup.Type.ROW, movedIndexes);
+    }
+
+    private List<Job> moveRowConstraints() {
+
+        final List<Job> result = new ArrayList<>();
 
         // Retrieve the constraints property for the specified target GridPane
         final PropertyName propertyName = new PropertyName("rowConstraints"); //NOI18N
@@ -167,7 +120,7 @@
                 = ((FXOMInstance) targetGridPane).getProperties().get(propertyName);
         // GridPane has no constraints property => no constraints to move
         if (constraintsProperty == null) {
-            return;
+            return result;
         }
 
         final DesignHierarchyMask mask = new DesignHierarchyMask(targetGridPane);
@@ -183,7 +136,7 @@
                     break;
                 default:
                     assert false;
-                    return;
+                    return result;
             }
 
             // Retrieve the target constraints
@@ -199,14 +152,14 @@
                 final Job removeValueJob = new DeleteObjectJob(
                         targetConstraints,
                         getEditorController());
-                subJob.addSubJob(removeValueJob);
+                result.add(removeValueJob);
 
                 // Then add the target constraints at new positionIndex
                 final Job addValueJob = new AddPropertyValueJob(
                         targetConstraints,
                         (FXOMPropertyC) constraintsProperty,
                         positionIndex, getEditorController());
-                subJob.addSubJob(addValueJob);
+                result.add(addValueJob);
             }//
             // The target index is not associated to an existing constraints value :
             // we may need to move the constraints above the target one if any
@@ -224,22 +177,23 @@
                             addedConstraints,
                             (FXOMPropertyC) constraintsProperty,
                             positionIndex, getEditorController());
-                    subJob.addSubJob(addValueJob);
+                    result.add(addValueJob);
                 }
             }
         }
+        return result;
     }
 
-    private void moveRowContent() {
+    private List<Job> moveRowContent() {
 
-        assert subJob != null;
+        final List<Job> result = new ArrayList<>();
 
         for (int targetIndex : targetIndexes) {
 
             switch (position) {
                 case ABOVE:
                     // First move the target row content
-                    subJob.addSubJob(new ReIndexRowContentJob(
+                    result.add(new ReIndexRowContentJob(
                             getEditorController(),
                             -1, targetGridPane, targetIndex));
                     int aboveIndex = targetIndex - 1;
@@ -251,14 +205,14 @@
                         while (targetIndexes.contains(targetIndex + shiftIndex)) {
                             shiftIndex++;
                         }
-                        subJob.addSubJob(new ReIndexRowContentJob(
+                        result.add(new ReIndexRowContentJob(
                                 getEditorController(),
                                 shiftIndex, targetGridPane, aboveIndex));
                     }
                     break;
                 case BELOW:
                     // First move the target row content
-                    subJob.addSubJob(new ReIndexRowContentJob(
+                    result.add(new ReIndexRowContentJob(
                             getEditorController(),
                             +1, targetGridPane, targetIndex));
                     int belowIndex = targetIndex + 1;
@@ -270,16 +224,16 @@
                         while (targetIndexes.contains(targetIndex + shiftIndex)) {
                             shiftIndex--;
                         }
-                        subJob.addSubJob(new ReIndexRowContentJob(
+                        result.add(new ReIndexRowContentJob(
                                 getEditorController(),
                                 shiftIndex, targetGridPane, belowIndex));
                     }
                     break;
                 default:
                     assert false;
-                    return;
             }
         }
+        return result;
     }
 
     private FXOMInstance makeRowConstraintsInstance() {
@@ -293,19 +247,4 @@
 
         return result;
     }
-
-    private void updateSelection() {
-        final Selection selection = getEditorController().getSelection();
-
-        // Selection has been cleared at execution time
-        assert selection.isEmpty();
-        for (int targetIndex : targetIndexes) {
-            int positionIndex = position == Position.ABOVE
-                    ? targetIndex - 1 : targetIndex + 1;
-
-            // Selection is empty => just toggle selection
-            selection.toggleSelection((FXOMInstance) targetGridPane,
-                    GridSelectionGroup.Type.ROW, positionIndex);
-        }
-    }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveColumnConstraintsJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveColumnConstraintsJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,21 +32,20 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Job invoked when removing column constraints.
  */
-public class RemoveColumnConstraintsJob extends Job {
+public class RemoveColumnConstraintsJob extends BatchDocumentJob {
 
-    private BatchJob subJob;
     private final FXOMObject targetGridPane;
     private final List<Integer> targetIndexes;
 
@@ -60,51 +59,12 @@
         assert targetIndexes != null;
         this.targetGridPane = targetGridPane;
         this.targetIndexes = targetIndexes;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        // Remove column constraints job may be empty 
-        // (when there is no constraints defined for the selected column).
-        return subJob != null;
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        assert isExecutable();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Remove Column Constraints"; //NOI18N
-    }
-
-    private void buildSubJobs() {
-
-        // Create sub job
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldRefreshSceneGraph */, null);
+        final List<Job> result = new ArrayList<>();
 
         // Remove column constraints job
         assert targetGridPane instanceof FXOMInstance;
@@ -112,7 +72,7 @@
 
         final DesignHierarchyMask mask = new DesignHierarchyMask(targetGridPane);
         for (int targetIndex : targetIndexes) {
-            final FXOMObject targetConstraints 
+            final FXOMObject targetConstraints
                     = mask.getColumnConstraintsAtIndex(targetIndex);
             // The target index is associated to an existing constraints value :
             // => we remove the constraints value
@@ -120,8 +80,14 @@
                 final Job removeValueJob = new DeleteObjectJob(
                         targetConstraints,
                         getEditorController());
-                subJob.addSubJob(removeValueJob);
+                result.add(removeValueJob);
             }
         }
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return "Remove Column Constraints"; //NOI18N
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveColumnContentJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveColumnContentJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,22 +32,21 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Job invoked when removing column content.
  */
-public class RemoveColumnContentJob extends Job {
+public class RemoveColumnContentJob extends BatchDocumentJob {
 
-    private BatchJob subJob;
     private final FXOMObject targetGridPane;
     private final List<Integer> targetIndexes;
 
@@ -61,52 +60,12 @@
         assert targetIndexes != null;
         this.targetGridPane = targetGridPane;
         this.targetIndexes = targetIndexes;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        // Remove column content job may be empty 
-        // (when removing a column with no content).
-        // So we do not invoke subJob.isExecutable() here. 
-        return subJob != null;
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        assert isExecutable();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Remove Column Content"; //NOI18N
-    }
-
-    private void buildSubJobs() {
-
-        // Create sub job
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldRefreshSceneGraph */, null);
+        final List<Job> result = new ArrayList<>();
 
         assert targetGridPane instanceof FXOMInstance;
         assert targetIndexes.isEmpty() == false;
@@ -120,11 +79,17 @@
                 final Job removeChildJob = new DeleteObjectJob(
                         child,
                         getEditorController());
-                subJob.addSubJob(removeChildJob);
+                result.add(removeChildJob);
             }
         }
-        
+
         final Job adjustToggleGroups = new AdjustAllToggleGroupJob(getEditorController());
-        subJob.addSubJob(adjustToggleGroups);
+        result.add(adjustToggleGroups);
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return "Remove Column Content"; //NOI18N
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveRowConstraintsJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveRowConstraintsJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,21 +32,20 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Job invoked when removing row constraints.
  */
-public class RemoveRowConstraintsJob extends Job {
+public class RemoveRowConstraintsJob extends BatchDocumentJob {
 
-    private BatchJob subJob;
     private final FXOMObject targetGridPane;
     private final List<Integer> targetIndexes;
 
@@ -60,51 +59,12 @@
         assert targetIndexes != null;
         this.targetGridPane = targetGridPane;
         this.targetIndexes = targetIndexes;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        // Remove row constraints job may be empty 
-        // (when there is no constraints defined for the selected row).
-        return subJob != null;
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        assert isExecutable();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Remove Row Constraints"; //NOI18N
-    }
-
-    private void buildSubJobs() {
-
-        // Create sub job
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldRefreshSceneGraph */, null);
+        final List<Job> result = new ArrayList<>();
 
         // Remove row constraints job
         assert targetGridPane instanceof FXOMInstance;
@@ -112,7 +72,7 @@
 
         final DesignHierarchyMask mask = new DesignHierarchyMask(targetGridPane);
         for (int targetIndex : targetIndexes) {
-            final FXOMObject targetConstraints 
+            final FXOMObject targetConstraints
                     = mask.getRowConstraintsAtIndex(targetIndex);
             // The target index is associated to an existing constraints value :
             // => we remove the constraints value
@@ -120,8 +80,14 @@
                 final Job removeValueJob = new DeleteObjectJob(
                         targetConstraints,
                         getEditorController());
-                subJob.addSubJob(removeValueJob);
+                result.add(removeValueJob);
             }
         }
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return "Remove Row Constraints"; //NOI18N
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveRowContentJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/RemoveRowContentJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,22 +32,21 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.gridpane;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Job invoked when removing row content.
  */
-public class RemoveRowContentJob extends Job {
+public class RemoveRowContentJob extends BatchDocumentJob {
 
-    private BatchJob subJob;
     private final FXOMObject targetGridPane;
     private final List<Integer> targetIndexes;
 
@@ -61,52 +60,12 @@
         assert targetIndexes != null;
         this.targetGridPane = targetGridPane;
         this.targetIndexes = targetIndexes;
-        buildSubJobs();
     }
 
     @Override
-    public boolean isExecutable() {
-        // Remove row content job may be empty 
-        // (when removing a row with no content).
-        // So we do not invoke subJob.isExecutable() here. 
-        return subJob != null;
-    }
+    protected List<Job> makeSubJobs() {
 
-    @Override
-    public void execute() {
-        assert isExecutable();
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.execute();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.undo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        subJob.redo();
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Remove Row Content"; //NOI18N
-    }
-
-    private void buildSubJobs() {
-
-        // Create sub job
-        subJob = new BatchJob(getEditorController(),
-                true /* shouldRefreshSceneGraph */, null);
+        final List<Job> result = new ArrayList<>();
 
         assert targetGridPane instanceof FXOMInstance;
         assert targetIndexes.isEmpty() == false;
@@ -120,11 +79,18 @@
                 final Job removeChildJob = new DeleteObjectJob(
                         child,
                         getEditorController());
-                subJob.addSubJob(removeChildJob);
+                result.add(removeChildJob);
             }
         }
-        
+
         final Job adjustToggleGroups = new AdjustAllToggleGroupJob(getEditorController());
-        subJob.addSubJob(adjustToggleGroups);
+        result.add(adjustToggleGroups);
+
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return "Remove Row Content"; //NOI18N
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveCollectionItemJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2012, 2014, 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 com.oracle.javafx.scenebuilder.kit.editor.job.v2;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+
+/**
+ *
+ */
+public class RemoveCollectionItemJob extends Job {
+
+    private final FXOMObject targetValue;
+    
+    private FXOMCollection parentCollection;
+    private int indexInParentCollection;
+
+    public RemoveCollectionItemJob(FXOMObject value, EditorController editorController) {
+        super(editorController);
+        this.targetValue = value;
+    }
+    
+    
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return targetValue.getParentCollection() != null;
+    }
+
+    @Override
+    public void execute() {
+        assert parentCollection == null;
+        assert isExecutable();
+        
+        parentCollection = targetValue.getParentCollection();
+        indexInParentCollection = targetValue.getIndexInParentCollection();
+        
+        // Now same as redo()
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert targetValue.getParentCollection() == null;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        targetValue.addToParentCollection(indexInParentCollection, parentCollection);
+        getEditorController().getFxomDocument().endUpdate();
+
+        assert targetValue.getParentCollection() == parentCollection;
+        assert targetValue.getIndexInParentCollection() == indexInParentCollection;
+    }
+
+    @Override
+    public void redo() {
+        assert targetValue.getParentCollection() == parentCollection;
+        assert targetValue.getIndexInParentCollection() == indexInParentCollection;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        targetValue.removeFromParentCollection();
+        getEditorController().getFxomDocument().endUpdate();
+
+        assert targetValue.getParentCollection() == null;
+    }
+
+    @Override
+    public String getDescription() {
+        // Should normally not reach the user
+        return getClass().getSimpleName() 
+                + "[" //NOI18N
+                + targetValue.getGlueElement().getTagName()
+                + "]"; //NOI18N
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveNodeJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2012, 2014, 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 com.oracle.javafx.scenebuilder.kit.editor.job.v2;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNode;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
+
+/**
+ *
+ */
+public class RemoveNodeJob extends Job {
+    
+    private final Job subJob;
+    
+    public RemoveNodeJob(FXOMNode targetNode, EditorController editorController) {
+        super(editorController);
+        
+        assert (targetNode instanceof FXOMObject) || (targetNode instanceof FXOMProperty);
+        
+        if (targetNode instanceof FXOMObject) {
+            subJob = new RemoveObjectJob((FXOMObject)targetNode, editorController);
+        } else {
+            assert targetNode instanceof FXOMProperty;
+            subJob = new RemovePropertyJob((FXOMProperty)targetNode, editorController);
+        }
+    }
+    
+    
+    /*
+     * Job
+     */
+
+    @Override
+    public boolean isExecutable() {
+        return subJob.isExecutable();
+    }
+
+    @Override
+    public void execute() {
+        subJob.execute();
+    }
+
+    @Override
+    public void undo() {
+        subJob.undo();
+    }
+
+    @Override
+    public void redo() {
+        subJob.redo();
+    }
+
+    @Override
+    public String getDescription() {
+        return getClass().getSimpleName(); // Should not reach end user
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveObjectJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2012, 2014, 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 com.oracle.javafx.scenebuilder.kit.editor.job.v2;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+
+/**
+ *
+ */
+public class RemoveObjectJob extends Job {
+    
+    private final Job subJob;
+    
+    public RemoveObjectJob(FXOMObject targetObject, EditorController editorController) {
+        super(editorController);
+        
+        assert targetObject != null;
+        assert (targetObject.getParentProperty() != null) || (targetObject.getParentCollection() != null);
+        
+        if (targetObject.getParentProperty() != null) {
+            subJob = new RemovePropertyValueJob(targetObject, editorController);
+        } else {
+            assert targetObject.getParentCollection() != null;
+            subJob = new RemoveCollectionItemJob(targetObject, editorController);
+        }
+    }
+    
+    
+    /*
+     * Job
+     */
+
+    @Override
+    public boolean isExecutable() {
+        return subJob.isExecutable();
+    }
+
+    @Override
+    public void execute() {
+        subJob.execute();
+    }
+
+    @Override
+    public void undo() {
+        subJob.undo();
+    }
+
+    @Override
+    public void redo() {
+        subJob.redo();
+    }
+
+    @Override
+    public String getDescription() {
+        return getClass().getSimpleName(); // Should not reach end user
+    }
+    
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -53,7 +53,10 @@
         this.targetProperty = targetProperty;
     }
     
-    
+    public FXOMProperty getTargetProperty() {
+        return targetProperty;
+    }
+
 
     /*
      * Job
@@ -67,6 +70,7 @@
     @Override
     public void execute() {
         assert parentInstance == null;
+        assert isExecutable();
         
         parentInstance = targetProperty.getParentInstance();
         indexInParentInstance = targetProperty.getIndexInParentInstance();
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyValueJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyValueJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -45,6 +45,7 @@
     
     private FXOMPropertyC parentProperty;
     private int indexInParentProperty;
+    private RemovePropertyJob removePropertyJob;
 
     public RemovePropertyValueJob(FXOMObject value, EditorController editorController) {
         super(editorController);
@@ -58,18 +59,30 @@
     
     @Override
     public boolean isExecutable() {
-        final FXOMPropertyC p = targetValue.getParentProperty();
-        return (p != null) && (p.getValues().size() >= 2);
+        return targetValue.getParentProperty() != null;
     }
 
     @Override
     public void execute() {
         assert parentProperty == null;
+        assert isExecutable();
         
         parentProperty = targetValue.getParentProperty();
         indexInParentProperty = targetValue.getIndexInParentProperty();
+        if ((parentProperty.getValues().size() == 1) && (parentProperty.getParentInstance() != null)) {
+            // targetValue is the last value of its parent property
+            // => parent property must also be removed from its parent instance
+            removePropertyJob = new RemovePropertyJob(parentProperty, getEditorController());
+        }
         
-        redo();
+        // Note : below we may have to run removePropertyJob.execute() so
+        // we cannot re-use redo() here.
+        getEditorController().getFxomDocument().beginUpdate();
+        if (removePropertyJob != null) {
+            removePropertyJob.execute();
+        }
+        targetValue.removeFromParentProperty();
+        getEditorController().getFxomDocument().endUpdate();
     }
 
     @Override
@@ -78,6 +91,9 @@
         
         getEditorController().getFxomDocument().beginUpdate();
         targetValue.addToParentProperty(indexInParentProperty, parentProperty);
+        if (removePropertyJob != null) {
+            removePropertyJob.undo();
+        }
         getEditorController().getFxomDocument().endUpdate();
 
         assert targetValue.getParentProperty() == parentProperty;
@@ -89,8 +105,10 @@
         assert targetValue.getParentProperty() == parentProperty;
         assert targetValue.getIndexInParentProperty() == indexInParentProperty;
         
-        getEditorController().getSelection().clear();
         getEditorController().getFxomDocument().beginUpdate();
+        if (removePropertyJob != null) {
+            removePropertyJob.redo();
+        }
         targetValue.removeFromParentProperty();
         getEditorController().getFxomDocument().endUpdate();
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.wrap;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
 import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxControllerJob;
@@ -62,11 +62,9 @@
 /**
  * Main class used for the wrap jobs.
  */
-public abstract class AbstractWrapInJob extends Job {
+public abstract class AbstractWrapInJob extends BatchSelectionJob {
 
     protected Class<?> newContainerClass;
-    private BatchJob batchJob;
-    private AbstractSelectionGroup selectionSnapshot;
     protected FXOMInstance oldContainer, newContainer;
 
     public AbstractWrapInJob(EditorController editorController) {
@@ -113,163 +111,115 @@
     }
 
     @Override
-    public boolean isExecutable() {
-        return WrapJobUtils.canWrapIn(getEditorController());
+    protected List<Job> makeSubJobs() {
+        final List<Job> result = new ArrayList<>();
+
+        if (WrapJobUtils.canWrapIn(getEditorController())) { // (1)
+
+            final Selection selection = getEditorController().getSelection();
+            final AbstractSelectionGroup asg = selection.getGroup();
+            assert asg instanceof ObjectSelectionGroup; // Because of (1)
+            final ObjectSelectionGroup osg = (ObjectSelectionGroup) asg;
+
+            // Retrieve the old container
+            oldContainer = (FXOMInstance) osg.getAncestor();
+
+            // Retrieve the children to be wrapped
+            final List<FXOMObject> children = osg.getSortedItems();
+
+            // Create the new container
+            newContainer = makeNewContainerInstance();
+            // Update the new container
+            modifyNewContainer(children);
+
+            //==================================================================
+            // STEP #1
+            //==================================================================
+            // If the target object is NOT the FXOM root :
+            // - we add the new container to the old container
+            // - we remove the children from the old container
+            //------------------------------------------------------------------
+            if (oldContainer != null) {
+
+                // Retrieve the old container property name in use
+                final PropertyName oldContainerPropertyName
+                        = WrapJobUtils.getContainerPropertyName(oldContainer, children);
+                // Retrieve the old container property (already defined and not null)
+                final FXOMPropertyC oldContainerProperty
+                        = (FXOMPropertyC) oldContainer.getProperties().get(oldContainerPropertyName);
+                assert oldContainerProperty != null
+                        && oldContainerProperty.getParentInstance() != null;
+
+                // Add the new container to the old container
+                final int newContainerIndex = getIndex(oldContainer, children);
+                final Job newContainerAddValueJob = new AddPropertyValueJob(
+                        newContainer,
+                        oldContainerProperty,
+                        newContainerIndex, getEditorController());
+                result.add(newContainerAddValueJob);
+
+                // Remove children from the old container
+                final List<Job> removeChildrenJobs = removeChildrenJobs(oldContainerProperty, children);
+                result.addAll(removeChildrenJobs);
+            } //
+            //------------------------------------------------------------------
+            // If the target object is the FXOM root :
+            // - we update the document root with the new container
+            //------------------------------------------------------------------
+            else {
+                assert children.size() == 1; // Wrap the single root node
+                final FXOMObject rootObject = children.iterator().next();
+                assert rootObject instanceof FXOMInstance;
+                boolean isFxRoot = ((FXOMInstance) rootObject).isFxRoot();
+                final String fxController = rootObject.getFxController();
+                // First remove the fx:controller/fx:root from the old root object
+                if (isFxRoot) {
+                    final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
+                    result.add(fxRootJob);
+                }
+                if (fxController != null) {
+                    final ModifyFxControllerJob fxControllerJob
+                            = new ModifyFxControllerJob(rootObject, null, getEditorController());
+                    result.add(fxControllerJob);
+                }
+                // Then set the new container as root object
+                final Job setDocumentRoot = new SetDocumentRootJob(
+                        newContainer, getEditorController());
+                result.add(setDocumentRoot);
+                // Finally add the fx:controller/fx:root to the new root object
+                if (isFxRoot) {
+                    final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
+                    result.add(fxRootJob);
+                }
+                if (fxController != null) {
+                    final ModifyFxControllerJob fxControllerJob
+                            = new ModifyFxControllerJob(newContainer, fxController, getEditorController());
+                    result.add(fxControllerJob);
+                }
+            }
+
+            //==================================================================
+            // STEP #2
+            //==================================================================
+            // This step depends on the new container property 
+            // (either either the SUB COMPONENT or the CONTENT property)
+            //------------------------------------------------------------------
+            result.addAll(wrapChildrenJobs(children));
+        }
+
+        return result;
     }
 
     @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        assert isExecutable();
-        buildSubJobs();
-
-        try {
-            selectionSnapshot = selection.getGroup().clone();
-        } catch (CloneNotSupportedException x) {
-            // Emergency code
-            throw new RuntimeException(x);
-        }
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        batchJob.execute();
-        fxomDocument.endUpdate();
-        selection.select(newContainer);
-        selection.endUpdate();
+    protected String makeDescription() {
+        return "Wrap in " + newContainerClass.getSimpleName();
     }
 
     @Override
-    public void undo() {
-        assert batchJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        batchJob.undo();
-        fxomDocument.endUpdate();
-        selection.select(selectionSnapshot);
-        selection.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert batchJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        batchJob.redo();
-        fxomDocument.endUpdate();
-        selection.select(newContainer);
-        selection.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Wrap in " + newContainerClass.getSimpleName();
-    }
-
-    protected void buildSubJobs() {
-
-        assert isExecutable(); // (1)
-
-        // Create batch job
-        batchJob = new BatchJob(getEditorController());
-
-        final Selection selection = getEditorController().getSelection();
-        final AbstractSelectionGroup asg = selection.getGroup();
-        assert asg instanceof ObjectSelectionGroup; // Because of (1)
-        final ObjectSelectionGroup osg = (ObjectSelectionGroup) asg;
-
-        // Retrieve the old container
-        oldContainer = (FXOMInstance) osg.getAncestor();
-
-        // Retrieve the children to be wrapped
-        final List<FXOMObject> children = osg.getSortedItems();
-
-        // Create the new container
-        newContainer = makeNewContainerInstance();
-        // Update the new container
-        modifyNewContainer(children);
-
-        //==================================================================
-        // STEP #1
-        //==================================================================
-        // If the target object is NOT the FXOM root :
-        // - we add the new container to the old container
-        // - we remove the children from the old container
-        //------------------------------------------------------------------
-        if (oldContainer != null) {
-
-            // Retrieve the old container property name in use
-            final PropertyName oldContainerPropertyName
-                    = WrapJobUtils.getContainerPropertyName(oldContainer, children);
-            // Retrieve the old container property (already defined and not null)
-            final FXOMPropertyC oldContainerProperty
-                    = (FXOMPropertyC) oldContainer.getProperties().get(oldContainerPropertyName);
-            assert oldContainerProperty != null
-                    && oldContainerProperty.getParentInstance() != null;
-
-            // Add the new container to the old container
-            final int newContainerIndex = getIndex(oldContainer, children);
-            final Job newContainerAddValueJob = new AddPropertyValueJob(
-                    newContainer,
-                    oldContainerProperty,
-                    newContainerIndex, getEditorController());
-            batchJob.addSubJob(newContainerAddValueJob);
-
-            // Remove children from the old container
-            final List<Job> removeChildrenJobs = removeChildrenJobs(oldContainerProperty, children);
-            batchJob.addSubJobs(removeChildrenJobs);
-        } //
-        //------------------------------------------------------------------
-        // If the target object is the FXOM root :
-        // - we update the document root with the new container
-        //------------------------------------------------------------------
-        else {
-            assert children.size() == 1; // Wrap the single root node
-            final FXOMObject rootObject = children.iterator().next();
-            assert rootObject instanceof FXOMInstance;
-            boolean isFxRoot = ((FXOMInstance) rootObject).isFxRoot();
-            final String fxController = rootObject.getFxController();
-            // First remove the fx:controller/fx:root from the old root object
-            if (isFxRoot) {
-                final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
-                batchJob.addSubJob(fxRootJob);
-            }
-            if (fxController != null) {
-                final ModifyFxControllerJob fxControllerJob
-                        = new ModifyFxControllerJob(rootObject, null, getEditorController());
-                batchJob.addSubJob(fxControllerJob);
-            }
-            // Then set the new container as root object
-            final Job setDocumentRoot = new SetDocumentRootJob(
-                    newContainer, getEditorController());
-            batchJob.addSubJob(setDocumentRoot);
-            // Finally add the fx:controller/fx:root to the new root object
-            if (isFxRoot) {
-                final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
-                batchJob.addSubJob(fxRootJob);
-            }
-            if (fxController != null) {
-                final ModifyFxControllerJob fxControllerJob
-                        = new ModifyFxControllerJob(newContainer, fxController, getEditorController());
-                batchJob.addSubJob(fxControllerJob);
-            }
-        }
-
-        //==================================================================
-        // STEP #2
-        //==================================================================
-        // This step depends on the new container property 
-        // (either either the SUB COMPONENT or the CONTENT property)
-        //------------------------------------------------------------------
-        batchJob.addSubJobs(wrapChildrenJobs(children));
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        List<FXOMObject> newObjects = new ArrayList<>();
+        newObjects.add(newContainer);
+        return new ObjectSelectionGroup(newObjects, newObjects.iterator().next(), null);
     }
 
     /**
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.wrap;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxControllerJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
@@ -44,7 +44,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
@@ -60,10 +59,8 @@
 /**
  * Main class used for the unwrap jobs.
  */
-public class UnwrapJob extends Job {
+public class UnwrapJob extends BatchSelectionJob {
 
-    private BatchJob batchJob;
-    private AbstractSelectionGroup selectionSnapshot;
     private FXOMInstance oldContainer, newContainer;
     private List<FXOMObject> oldContainerChildren;
 
@@ -72,180 +69,129 @@
     }
 
     @Override
-    public boolean isExecutable() {
-        return WrapJobUtils.canUnwrap(getEditorController());
+    protected List<Job> makeSubJobs() {
+        final List<Job> result = new ArrayList<>();
+
+        if (WrapJobUtils.canUnwrap(getEditorController())) { // (1)
+
+            final Selection selection = getEditorController().getSelection();
+            final AbstractSelectionGroup asg = selection.getGroup();
+            assert asg instanceof ObjectSelectionGroup; // Because of (1)
+            final ObjectSelectionGroup osg = (ObjectSelectionGroup) asg;
+            assert osg.getItems().size() == 1; // Because of (1)
+
+            // Retrieve the old container (container to unwrap)
+            oldContainer = (FXOMInstance) osg.getItems().iterator().next();
+            // Retrieve the children of the old container
+            oldContainerChildren = getChildren(oldContainer);
+            // Retrieve the old container property name in use
+            final PropertyName oldContainerPropertyName
+                    = WrapJobUtils.getContainerPropertyName(oldContainer, oldContainerChildren);
+            // Retrieve the old container property (already defined and not null)
+            final FXOMPropertyC oldContainerProperty
+                    = (FXOMPropertyC) oldContainer.getProperties().get(oldContainerPropertyName);
+            assert oldContainerProperty != null
+                    && oldContainerProperty.getParentInstance() != null;
+
+            // Retrieve the parent of the old container (aka new container)
+            newContainer = (FXOMInstance) oldContainer.getParentObject();
+
+            // Remove the old container property from the old container instance
+            final Job removePropertyJob = new RemovePropertyJob(
+                    oldContainerProperty,
+                    getEditorController());
+            result.add(removePropertyJob);
+
+            // Remove the children from the old container property
+            final List<Job> removeChildrenJobs
+                    = removeChildrenJobs(oldContainerProperty, oldContainerChildren);
+            result.addAll(removeChildrenJobs);
+
+            //------------------------------------------------------------------
+            // If the target object is NOT the FXOM root :
+            // - we update the new container bounds and add it to the old container
+            // - we update the children bounds and remove them from the old container
+            //------------------------------------------------------------------
+            if (newContainer != null) {
+
+                // Retrieve the new container property name in use
+                final List<FXOMObject> newContainerChildren = new ArrayList<>();
+                newContainerChildren.add(oldContainer);
+                final PropertyName newContainerPropertyName
+                        = WrapJobUtils.getContainerPropertyName(newContainer, newContainerChildren);
+                // Retrieve the new container property (already defined and not null)
+                final FXOMPropertyC newContainerProperty
+                        = (FXOMPropertyC) newContainer.getProperties().get(newContainerPropertyName);
+                assert newContainerProperty != null
+                        && newContainerProperty.getParentInstance() != null;
+
+                // Update children bounds before adding them to the new container
+                final DesignHierarchyMask newContainerMask
+                        = new DesignHierarchyMask(newContainer);
+                if (newContainerMask.isFreeChildPositioning()) {
+                    final List<Job> modifyChildrenLayoutJobs
+                            = modifyChildrenJobs(oldContainerChildren);
+                    result.addAll(modifyChildrenLayoutJobs);
+                }
+
+                // Add the children to the new container
+                int index = oldContainer.getIndexInParentProperty();
+                final List<Job> addChildrenJobs
+                        = addChildrenJobs(newContainerProperty, index, oldContainerChildren);
+                result.addAll(addChildrenJobs);
+
+                // Remove the old container from the new container property
+                final Job removeValueJob = new RemovePropertyValueJob(
+                        oldContainer,
+                        getEditorController());
+                result.add(removeValueJob);
+            } //
+            //------------------------------------------------------------------
+            // If the target object is the FXOM root :
+            // - we update the document root with the single child of the root node
+            //------------------------------------------------------------------
+            else {
+                assert oldContainerChildren.size() == 1; // Because of (1)
+                boolean isFxRoot = oldContainer.isFxRoot();
+                final String fxController = oldContainer.getFxController();
+                // First remove the fx:controller/fx:root from the old root object
+                if (isFxRoot) {
+                    final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
+                    result.add(fxRootJob);
+                }
+                if (fxController != null) {
+                    final ModifyFxControllerJob fxControllerJob
+                            = new ModifyFxControllerJob(oldContainer, null, getEditorController());
+                    result.add(fxControllerJob);
+                }
+                // Then set the new container as root object            
+                final FXOMObject child = oldContainerChildren.iterator().next();
+                final Job setDocumentRoot = new SetDocumentRootJob(
+                        child, getEditorController());
+                result.add(setDocumentRoot);
+                // Finally add the fx:controller/fx:root to the new root object
+                if (isFxRoot) {
+                    final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
+                    result.add(fxRootJob);
+                }
+                if (fxController != null) {
+                    final ModifyFxControllerJob fxControllerJob
+                            = new ModifyFxControllerJob(child, fxController, getEditorController());
+                    result.add(fxControllerJob);
+                }
+            }
+        }
+        return result;
     }
 
     @Override
-    public void execute() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        assert isExecutable();
-        buildSubJobs();
-
-        try {
-            selectionSnapshot = selection.getGroup().clone();
-        } catch (CloneNotSupportedException x) {
-            // Emergency code
-            throw new RuntimeException(x);
-        }
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        batchJob.execute();
-        fxomDocument.endUpdate();
-        selection.select(oldContainerChildren);
-        selection.endUpdate();
+    protected String makeDescription() {
+        return "Unwrap";
     }
 
     @Override
-    public void undo() {
-        assert batchJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        batchJob.undo();
-        fxomDocument.endUpdate();
-        selection.select(selectionSnapshot);
-        selection.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert batchJob != null;
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final Selection selection = getEditorController().getSelection();
-
-        selection.clear();
-        selection.beginUpdate();
-        fxomDocument.beginUpdate();
-        batchJob.redo();
-        fxomDocument.endUpdate();
-        selection.select(oldContainerChildren);
-        selection.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return "Unwrap";
-    }
-
-    protected void buildSubJobs() {
-
-        assert isExecutable(); // (1)
-
-        // Create batch job
-        batchJob = new BatchJob(getEditorController());
-
-        final Selection selection = getEditorController().getSelection();
-        final AbstractSelectionGroup asg = selection.getGroup();
-        assert asg instanceof ObjectSelectionGroup; // Because of (1)
-        final ObjectSelectionGroup osg = (ObjectSelectionGroup) asg;
-        assert osg.getItems().size() == 1; // Because of (1)
-
-        // Retrieve the old container (container to unwrap)
-        oldContainer = (FXOMInstance) osg.getItems().iterator().next();
-        // Retrieve the children of the old container
-        oldContainerChildren = getChildren(oldContainer);
-        // Retrieve the old container property name in use
-        final PropertyName oldContainerPropertyName
-                = WrapJobUtils.getContainerPropertyName(oldContainer, oldContainerChildren);
-        // Retrieve the old container property (already defined and not null)
-        final FXOMPropertyC oldContainerProperty
-                = (FXOMPropertyC) oldContainer.getProperties().get(oldContainerPropertyName);
-        assert oldContainerProperty != null
-                && oldContainerProperty.getParentInstance() != null;
-
-        // Retrieve the parent of the old container (aka new container)
-        newContainer = (FXOMInstance) oldContainer.getParentObject();
-
-        // Remove the old container property from the old container instance
-        final Job removePropertyJob = new RemovePropertyJob(
-                oldContainerProperty,
-                getEditorController());
-        batchJob.addSubJob(removePropertyJob);
-
-        // Remove the children from the old container property
-        final List<Job> removeChildrenJobs
-                = removeChildrenJobs(oldContainerProperty, oldContainerChildren);
-        batchJob.addSubJobs(removeChildrenJobs);
-
-        //------------------------------------------------------------------
-        // If the target object is NOT the FXOM root :
-        // - we update the new container bounds and add it to the old container
-        // - we update the children bounds and remove them from the old container
-        //------------------------------------------------------------------
-        if (newContainer != null) {
-
-            // Retrieve the new container property name in use
-            final List<FXOMObject> newContainerChildren = new ArrayList<>();
-            newContainerChildren.add(oldContainer);
-            final PropertyName newContainerPropertyName
-                    = WrapJobUtils.getContainerPropertyName(newContainer, newContainerChildren);
-            // Retrieve the new container property (already defined and not null)
-            final FXOMPropertyC newContainerProperty
-                    = (FXOMPropertyC) newContainer.getProperties().get(newContainerPropertyName);
-            assert newContainerProperty != null
-                    && newContainerProperty.getParentInstance() != null;
-
-            // Update children bounds before adding them to the new container
-            final DesignHierarchyMask newContainerMask
-                    = new DesignHierarchyMask(newContainer);
-            if (newContainerMask.isFreeChildPositioning()) {
-                final List<Job> modifyChildrenLayoutJobs
-                        = modifyChildrenJobs(oldContainerChildren);
-                batchJob.addSubJobs(modifyChildrenLayoutJobs);
-            }
-
-            // Add the children to the new container
-            int index = oldContainer.getIndexInParentProperty();
-            final List<Job> addChildrenJobs
-                    = addChildrenJobs(newContainerProperty, index, oldContainerChildren);
-            batchJob.addSubJobs(addChildrenJobs);
-
-            // Remove the old container from the new container property
-            final Job removeValueJob = new RemovePropertyValueJob(
-                    oldContainer,
-                    getEditorController());
-            batchJob.addSubJob(removeValueJob);
-        } //
-        //------------------------------------------------------------------
-        // If the target object is the FXOM root :
-        // - we update the document root with the single child of the root node
-        //------------------------------------------------------------------
-        else {
-            assert oldContainerChildren.size() == 1; // Because of (1)
-            boolean isFxRoot = oldContainer.isFxRoot();
-            final String fxController = oldContainer.getFxController();
-            // First remove the fx:controller/fx:root from the old root object
-            if (isFxRoot) {
-                final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
-                batchJob.addSubJob(fxRootJob);
-            }
-            if (fxController != null) {
-                final ModifyFxControllerJob fxControllerJob
-                        = new ModifyFxControllerJob(oldContainer, null, getEditorController());
-                batchJob.addSubJob(fxControllerJob);
-            }
-            // Then set the new container as root object            
-            final FXOMObject child = oldContainerChildren.iterator().next();
-            final Job setDocumentRoot = new SetDocumentRootJob(
-                    child, getEditorController());
-            batchJob.addSubJob(setDocumentRoot);
-            // Finally add the fx:controller/fx:root to the new root object
-            if (isFxRoot) {
-                final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
-                batchJob.addSubJob(fxRootJob);
-            }
-            if (fxController != null) {
-                final ModifyFxControllerJob fxControllerJob
-                        = new ModifyFxControllerJob(child, fxController, getEditorController());
-                batchJob.addSubJob(fxControllerJob);
-            }
-        }
+    protected AbstractSelectionGroup getNewSelectionGroup() {
+        return new ObjectSelectionGroup(oldContainerChildren, oldContainerChildren.iterator().next(), null);
     }
 
     protected List<Job> addChildrenJobs(
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInSplitPaneJob.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInSplitPaneJob.java	Thu Aug 28 17:49:22 2014 -0700
@@ -32,7 +32,6 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.wrap;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
 import com.oracle.javafx.scenebuilder.kit.editor.job.wrap.FXOMObjectCourseComparator.BidimensionalComparator;
 import com.oracle.javafx.scenebuilder.kit.editor.job.wrap.FXOMObjectCourseComparator.GridCourse;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/ContentPanelController.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/ContentPanelController.java	Thu Aug 28 17:49:22 2014 -0700
@@ -1007,8 +1007,8 @@
     private void themeDidChange() {
         if (contentGroup != null) {
             final EditorPlatform.Theme theme = getEditorController().getTheme();
-            final List<URL> themeStyleSheets = EditorPlatform.getThemeStylesheetURLs(theme);
-            workspaceController.setThemeStyleSheets(themeStyleSheets);
+            final URL themeStyleSheet = EditorPlatform.getThemeStylesheetURL(theme);
+            workspaceController.setThemeStyleSheet(themeStyleSheet);
         }
     }
     
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/WorkspaceController.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/WorkspaceController.java	Thu Aug 28 17:49:22 2014 -0700
@@ -146,15 +146,14 @@
         return result;
     }
     
-    public void setThemeStyleSheets(List<URL> themeStyleSheets) {
+    public void setThemeStyleSheet(URL themeStyleSheet) {
         assert contentGroup.getParent() instanceof Group;
         final Group isolationGroup = (Group) contentGroup.getParent();
         assert isolationGroup.getStyleClass().contains("root");
         
         isolationGroup.getStylesheets().clear();
-        for (URL url : themeStyleSheets) {
-            isolationGroup.getStylesheets().add(url.toString());
-        }
+        assert themeStyleSheet != null;
+        isolationGroup.getStylesheets().add(themeStyleSheet.toString());
         isolationGroup.applyCss();
     }
     
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/gridpane/GridPanePring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/gridpane/GridPanePring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -39,7 +39,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.layout.GridPane;
 import javafx.scene.paint.Color;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/handles/AbstractCurveHandles.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/handles/AbstractCurveHandles.java	Thu Aug 28 17:49:22 2014 -0700
@@ -36,7 +36,6 @@
 
 import javafx.beans.value.ChangeListener;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.transform.Transform;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/handles/AbstractNodeHandles.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/handles/AbstractNodeHandles.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,7 +34,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.transform.Transform;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/outline/NodeOutline.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/outline/NodeOutline.java	Thu Aug 28 17:49:22 2014 -0700
@@ -35,7 +35,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.transform.Transform;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/NodePring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/NodePring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -36,7 +36,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.SelectWithPringGesture;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.transform.Transform;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/TabPring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/TabPring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -38,7 +38,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.SelectWithPringGesture;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/TableColumnPring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/TableColumnPring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -37,7 +37,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.SelectWithPringGesture;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableView;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/TreeTableColumnPring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/pring/TreeTableColumnPring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -37,7 +37,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.SelectWithPringGesture;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.control.TreeTableColumn;
 import javafx.scene.control.TreeTableView;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/AbstractNodeTring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/AbstractNodeTring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -34,7 +34,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.transform.Transform;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/TabTring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/TabTring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -35,7 +35,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.TabOutline;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
 import javafx.scene.paint.Paint;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/TableColumnTring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/TableColumnTring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -35,7 +35,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.TableViewDesignInfoX;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableView;
 import javafx.scene.transform.Transform;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/TreeTableColumnTring.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/driver/tring/TreeTableColumnTring.java	Thu Aug 28 17:49:22 2014 -0700
@@ -35,7 +35,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.TreeTableViewDesignInfoX;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.control.TreeTableColumn;
 import javafx.scene.control.TreeTableView;
 import javafx.scene.transform.Transform;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/mode/HitNodeChrome.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/mode/HitNodeChrome.java	Thu Aug 28 17:49:22 2014 -0700
@@ -37,7 +37,6 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.util.RegionRectangle;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Node;
 import javafx.scene.transform.Transform;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/css/CssValueConverter.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/css/CssValueConverter.java	Thu Aug 28 17:49:22 2014 -0700
@@ -925,7 +925,7 @@
         }
     }
 
-    @SuppressWarnings({"BroadCatchBlock", "TooBroadCatch"}) //NOI18N
+//    @SuppressWarnings({"BroadCatchBlock", "TooBroadCatch"}) //NOI18N
     private static Effect getEffectInput(Effect effect) {
         Effect found = null;
         try {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java	Thu Aug 28 17:49:22 2014 -0700
@@ -1539,6 +1539,23 @@
         }
         return 0;
     }
+    
+    private boolean isMultiLinesSupported(Set<Class<?>> selectedClasses, ValuePropertyMetadata propMeta) {
+        String propertyNameStr = propMeta.getName().getName();
+        if (selectedClasses.contains(TextField.class) || selectedClasses.contains(PasswordField.class)) {
+            if (propertyNameStr.equalsIgnoreCase("text")) {
+                return false;
+            }
+        }
+        if (propertyNameStr.equalsIgnoreCase("promptText")) {
+            return false;
+        }
+
+        if (propertyNameStr.equalsIgnoreCase("ellipsisString")) {
+            return false;
+        }
+        return true;
+    }
 
     private int getSpanPropertyMaxIndex(String propNameStr) {
         assert propNameStr.contains("columnSpan") || propNameStr.contains("rowSpan");
@@ -1704,9 +1721,9 @@
         Set<Class<?>> selectedClasses = getSelectedClasses();
         if (editorClass == I18nStringEditor.class) {
             if (propertyEditor != null) {
-                ((I18nStringEditor) propertyEditor).reset(propMeta, selectedClasses);
+                ((I18nStringEditor) propertyEditor).reset(propMeta, selectedClasses, isMultiLinesSupported(selectedClasses, propMeta));
             } else {
-                propertyEditor = new I18nStringEditor(propMeta, selectedClasses);
+                propertyEditor = new I18nStringEditor(propMeta, selectedClasses, isMultiLinesSupported(selectedClasses, propMeta));
             }
         } else if (editorClass == StringEditor.class) {
             if (propertyEditor != null) {
@@ -1915,20 +1932,18 @@
         @FXML
         private Label titleLb;
 
-        private final Parent root;
+        private Parent root;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public SubSectionTitle(String title) {
-//            System.out.println("Loading new SubSection.fxml...");
-            URL fxmlURL = SubSectionTitle.class.getResource("SubSection.fxml");
-            root = EditorUtils.loadFxml(fxmlURL, this);
-
             initialize(title);
         }
 
         // Separate method to avoid FindBugs warning
         private void initialize(String title) {
-            titleLb.setText(title);
+//          System.out.println("Loading new SubSection.fxml...");
+          URL fxmlURL = SubSectionTitle.class.getResource("SubSection.fxml");
+          root = EditorUtils.loadFxml(fxmlURL, this);
+          titleLb.setText(title);
         }
 
         public void setTitle(String title) {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AnchorPaneConstraintsEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AnchorPaneConstraintsEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -80,34 +80,31 @@
     @FXML
     private TextField topTf;
 
-    private final Parent root;
+    private Parent root = null;
     private final ArrayList<ConstraintEditor> contraintEditors = new ArrayList<>();
-    private final ChangeListener<Object> constraintListener;
-    private Set<FXOMInstance> selectedInstances;
+    private ChangeListener<Object> constraintListener;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public AnchorPaneConstraintsEditor(String name, ValuePropertyMetadata topPropMeta,
             ValuePropertyMetadata rightPropMeta,
             ValuePropertyMetadata bottomPropMeta,
             ValuePropertyMetadata leftPropMeta,
             Set<FXOMInstance> selectedInstances) {
         super(name);
+        initialize(topPropMeta, rightPropMeta, bottomPropMeta, leftPropMeta, selectedInstances);
+        propertyChanged();
+        styleRegions();
+    }
+
+    // Method to please findBugs
+    private void initialize(ValuePropertyMetadata topPropMeta, ValuePropertyMetadata rightPropMeta,
+            ValuePropertyMetadata bottomPropMeta, ValuePropertyMetadata leftPropMeta, Set<FXOMInstance> selectedInstances) {
         root = EditorUtils.loadFxml("AnchorPaneConstraintsEditor.fxml", this);
-        this.selectedInstances = selectedInstances;
 
         constraintListener = (ov, prevValue, newValue) -> {
             propertyChanged();
             styleRegions();
         };
 
-        initialize(topPropMeta, rightPropMeta, bottomPropMeta, leftPropMeta);
-        propertyChanged();
-        styleRegions();
-    }
-
-    // Method to please findBugs
-    private void initialize(ValuePropertyMetadata topPropMeta, ValuePropertyMetadata rightPropMeta,
-            ValuePropertyMetadata bottomPropMeta, ValuePropertyMetadata leftPropMeta) {
         contraintEditors.add(
                 new ConstraintEditor(topTf, topTb, selectedInstances, topPropMeta, constraintListener));
         contraintEditors.add(
@@ -132,7 +129,6 @@
             ValuePropertyMetadata bottomPropMeta,
             ValuePropertyMetadata leftPropMeta,
             Set<FXOMInstance> selectedInstances) {
-        this.selectedInstances = selectedInstances;
         contraintEditors.get(0).reset(selectedInstances, topPropMeta);
         contraintEditors.get(1).reset(selectedInstances, rightPropMeta);
         contraintEditors.get(2).reset(selectedInstances, bottomPropMeta);
@@ -176,7 +172,6 @@
 
         private boolean updateFromTextField = false;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public ConstraintEditor(TextField textField, ToggleButton toggleButton, Set<FXOMInstance> selectedInstances,
                 ValuePropertyMetadata propMeta, ChangeListener<Object> listener) {
             super(propMeta, null);
@@ -185,7 +180,11 @@
             this.toggleButton = toggleButton;
             this.selectedInstances = selectedInstances;
             this.propMeta = propMeta;
-
+            
+            initialize();
+        }
+        
+        private void initialize() {
             //
             // Text field
             //
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AutoSuggestEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AutoSuggestEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -251,6 +251,7 @@
         if (event.getCode() == KeyCode.DOWN) {
             // 'Down' key shows the popup even if popup has been disabled
             suggest = true;
+            suggestedLv.requestFocus();
         }
         handleSuggestedPopup();
     }
@@ -325,8 +326,6 @@
             suggestedLv.getSelectionModel().clearSelection();
             // popup x coordinate need to be slightly moved, so that the popup is centered 
             entryField.getContextMenu().show(entryField, Side.BOTTOM, 0, 0);
-
-            suggestedLv.requestFocus();
         }
     }
 
@@ -342,7 +341,10 @@
             String selected = suggestedLv.getSelectionModel().getSelectedItem();
             entryField.setText(selected);
             entryField.requestFocus();
-            entryField.selectEnd();
+            entryField.selectAll();
+            if (AutoSuggestEditor.this.getCommitListener() != null) {
+                AutoSuggestEditor.this.getCommitListener().handle(null);
+            }
         }
         hidePopup();
     }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ControllerClassEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ControllerClassEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -46,10 +46,12 @@
     private static final String PROPERTY_NAME = "Controller class"; //NOI18N
     private static final String DEFAULT_VALUE = null;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public ControllerClassEditor(List<String> suggestedClasses) {
         super(PROPERTY_NAME, DEFAULT_VALUE, suggestedClasses);
-
+        initialize();
+    }
+    
+    private void initialize() {
         // text field events handling
         EventHandler<ActionEvent> onActionListener = event -> {
             if (isHandlingError()) {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/CursorEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/CursorEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -56,7 +56,7 @@
  */
 public class CursorEditor extends PropertyEditor {
 
-    private final Parent root;
+    private Parent root;
 
     @FXML
     private MenuButton cursorMb;
@@ -68,15 +68,14 @@
     private Cursor cursor = Cursor.DEFAULT;
     private String inheritedText, inheritedParentText;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public CursorEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
-        root = EditorUtils.loadFxml("CursorEditor.fxml", this); //NOI18N
         initialize();
     }
 
     // Separate method to please FindBugs
     private void initialize() {
+        root = EditorUtils.loadFxml("CursorEditor.fxml", this); //NOI18N
         int index = 0;
         Map<Cursor, String> predefinedCursors = CursorPropertyMetadata.getCursorMap();
         // Order the cursors
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/DividerPositionsEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/DividerPositionsEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -50,7 +50,6 @@
 
     private final VBox vbox = new VBox(5);
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public DividerPositionsEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
         setLayoutFormat(PropertyEditor.LayoutFormat.SIMPLE_LINE_TOP);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/DoubleAutoSuggestEditor.fxml	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/DoubleAutoSuggestEditor.fxml	Thu Aug 28 17:49:22 2014 -0700
@@ -43,7 +43,7 @@
 <children>
     <DoubleField fx:id="doubleField" onKeyReleased="#textFieldKeyReleased" onMouseClicked="#textFieldMouseClicked">
       <contextMenu>
-        <ContextMenu maxHeight="-1.0" styleClass="auto-suggest-popup">
+        <ContextMenu maxHeight="-1.0">
           <items>
             <CustomMenuItem mnemonicParsing="false">
               <content>
@@ -51,6 +51,11 @@
               </content>
             </CustomMenuItem>
           </items>
+               <styleClass>
+                  <String fx:value="theme-presets" />
+                  <String fx:value="property-sheet" />
+                  <String fx:value="auto-suggest-popup" />
+               </styleClass>
         </ContextMenu>
       </contextMenu>
 <HBox.margin>
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/DoubleEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/DoubleEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -51,9 +51,12 @@
 
     private Map<String, Object> constants;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public DoubleEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, Map<String, Object> constants) {
         super(propMeta, selectedClasses, new ArrayList<>(constants.keySet()), AutoSuggestEditor.Type.DOUBLE);
+        initialize(constants);
+    }
+    
+    private void initialize(Map<String, Object> constants) {
         this.constants = constants;
 
         EventHandler<ActionEvent> onActionListener = event -> {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EditorUtils.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EditorUtils.java	Thu Aug 28 17:49:22 2014 -0700
@@ -514,7 +514,7 @@
     }
     
     // Get the URL corresponding to a PrefixedValue string
-    @SuppressWarnings("UseSpecificCatch")
+//    @SuppressWarnings("UseSpecificCatch")
     public static URL getUrl(String prefixedString, URL fxmlFileLocation) {
         PrefixedValue prefixedValue = new PrefixedValue(prefixedString);
         URL url = null;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EventHandlerEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EventHandlerEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -63,9 +63,12 @@
     private HBox hbox = null;
     private List<String> suggestedMethods;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public EventHandlerEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, List<String> suggestedMethods) {
         super(propMeta, selectedClasses, suggestedMethods); //NOI18N
+        initialize(suggestedMethods);
+    }
+
+    private void initialize(List<String> suggestedMethods) {
         this.suggestedMethods = suggestedMethods;
 
         // text field events handling
@@ -106,7 +109,7 @@
         // methodeName mode by default
         switchToMethodNameMode();
     }
-
+    
     @Override
     public Object getValue() {
         String valueTf = getTextField().getText();
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/FxIdEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/FxIdEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -50,9 +50,12 @@
     private static final String DEFAULT_VALUE = null;
     private EditorController editorController;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public FxIdEditor(List<String> suggestedFxIds, EditorController editorController) {
         super(PROPERTY_NAME, DEFAULT_VALUE, suggestedFxIds); //NOI18N
+        initialize(editorController);
+    }
+    
+    private void initialize(EditorController editorController) {
         this.editorController = editorController;
 
         // text field events handling
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/GenericEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/GenericEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -45,11 +45,14 @@
  */
 public class GenericEditor extends PropertyEditor {
 
-    private final TextField textField;
+    private TextField textField;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public GenericEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
+        initialize();
+    }
+    
+    private void initialize() {
         textField = new TextField();
         EventHandler<ActionEvent> onActionListener = event -> userUpdateValueProperty(getValue());
         setTextEditorBehavior(this, textField, onActionListener);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/I18nStringEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/I18nStringEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -57,21 +57,25 @@
     private static final String PERCENT_STR = "%"; //NOI18N
     private TextInputControl textNode = new TextField();
     private HBox i18nHBox = null;
-    final EventHandler<ActionEvent> valueListener;
+    private EventHandler<ActionEvent> valueListener;
     private final MenuItem i18nMenuItem = new MenuItem();
     private final String I18N_ON = I18N.getString("inspector.i18n.on");
     private final String I18N_OFF = I18N.getString("inspector.i18n.off");
     private final MenuItem multilineMenuItem = new MenuItem();
     private final String MULTI_LINE = I18N.getString("inspector.i18n.multiline");
     private final String SINGLE_LINE = I18N.getString("inspector.i18n.singleline");
+    private boolean multiLineSupported = false;
     // Specific states
     private boolean i18nMode = false;
     private boolean multiLineMode = false;
 
-    @SuppressWarnings("LeakingThisInConstructor")
-    public I18nStringEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
+    public I18nStringEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, boolean multiLineSupported) {
         super(propMeta, selectedClasses);
-
+        initialize(multiLineSupported);
+    }
+    
+    private void initialize(boolean multiLineSupported) {
+        this.multiLineSupported = multiLineSupported;
         valueListener = event -> {
             userUpdateValueProperty(getValue());
             textNode.selectAll();
@@ -169,9 +173,9 @@
         updateMenuItems();
     }
 
-    @Override
-    public void reset(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
+    public void reset(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, boolean multiLineSupported) {
         super.reset(propMeta, selectedClasses);
+        this.multiLineSupported = multiLineSupported;
         textNode.setPromptText(null);
     }
 
@@ -269,5 +273,9 @@
             multilineMenuItem.setText(MULTI_LINE);
             i18nMenuItem.setDisable(false);
         }
+        
+        if (!multiLineSupported) {
+            multilineMenuItem.setDisable(true);
+        }
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ImageEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ImageEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -65,7 +65,7 @@
     @FXML
     private TextField imagePathTf;
 
-    private final Parent root;
+    private Parent root;
     private DesignImage image = null;
 
     private final MenuItem documentRelativeMenuItem
@@ -78,9 +78,13 @@
     private PrefixedValue.Type type = PrefixedValue.Type.PLAIN_STRING;
     private URL fxmlFileLocation;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public ImageEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, URL fxmlFileLocation) {
         super(propMeta, selectedClasses);
+        initialize(fxmlFileLocation);
+    }
+    
+    // Separate method to please FindBugs
+    private void initialize(URL fxmlFileLocation) {
         this.fxmlFileLocation = fxmlFileLocation;
         root = EditorUtils.loadFxml("ImageEditor.fxml", this); //NOI18N
 
@@ -107,11 +111,6 @@
             image = new DesignImage(imageObj, prefixedValue);
             userUpdateValueProperty(image);
         };
-        initialize(valueListener);
-    }
-
-    // Separate method to please FindBugs
-    private void initialize(EventHandler<ActionEvent> valueListener) {
         setTextEditorBehavior(this, imagePathTf, valueListener);
 
         documentRelativeMenuItem.setOnAction(e -> switchType(PrefixedValue.Type.DOCUMENT_RELATIVE_PATH));
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/InlineListEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/InlineListEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -49,7 +49,6 @@
     private final VBox vbox = new VBox(1);
     private final List<EditorItem> editorItems = new ArrayList<>();
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public InlineListEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
         setLayoutFormat(PropertyEditor.LayoutFormat.DOUBLE_LINE);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/InsetsEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/InsetsEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -51,7 +51,7 @@
  */
 public class InsetsEditor extends PropertyEditor {
 
-    private final Parent root;
+    private Parent root;
     @FXML
     private Button linkBt;
     @FXML
@@ -65,17 +65,14 @@
     TextField[] textFields = new TextField[4];
     TextField errorTf;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public InsetsEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
-        root = EditorUtils.loadFxml("InsetsEditor.fxml", this);
-
         initialize();
-        setLayoutFormat(LayoutFormat.SIMPLE_LINE_BOTTOM);
     }
 
     //Method to please FindBugs
     private void initialize() {
+        root = EditorUtils.loadFxml("InsetsEditor.fxml", this);
         textFields[0] = topTf;
         textFields[1] = rightTf;
         textFields[2] = bottomTf;
@@ -92,6 +89,7 @@
             setNumericEditorBehavior(this, tf, valueListener, false);
         }
         linkBt.disableProperty().bind(disableProperty());
+        setLayoutFormat(LayoutFormat.SIMPLE_LINE_BOTTOM);
     }
 
     @Override
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/IntegerAutoSuggestEditor.fxml	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/IntegerAutoSuggestEditor.fxml	Thu Aug 28 17:49:22 2014 -0700
@@ -43,7 +43,7 @@
 <children>
     <IntegerField fx:id="integerField" onKeyReleased="#textFieldKeyReleased" onMouseClicked="#textFieldMouseClicked">
       <contextMenu>
-        <ContextMenu maxHeight="-1.0" styleClass="auto-suggest-popup">
+        <ContextMenu maxHeight="-1.0">
           <items>
             <CustomMenuItem mnemonicParsing="false">
               <content>
@@ -51,6 +51,11 @@
               </content>
             </CustomMenuItem>
           </items>
+               <styleClass>
+                  <String fx:value="theme-presets" />
+                  <String fx:value="property-sheet" />
+                  <String fx:value="auto-suggest-popup" />
+               </styleClass>
         </ContextMenu>
       </contextMenu>
 <HBox.margin>
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/IntegerEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/IntegerEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -53,10 +53,13 @@
     private int min;
     private int max;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public IntegerEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses,
             Map<String, Object> constants, int minVal, int maxVal) {
         super(propMeta, selectedClasses, new ArrayList<>(constants.keySet()), AutoSuggestEditor.Type.INTEGER);
+        initialize(constants, minVal, maxVal);
+    }
+    
+    private void initialize(Map<String, Object> constants, int minVal, int maxVal) {
         this.constants = constants;
         this.min = minVal;
         this.max = maxVal;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/Point3DEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/Point3DEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -47,7 +47,7 @@
  */
 public class Point3DEditor extends PropertyEditor {
 
-    private final Parent root;
+    private Parent root;
     @FXML
     private DoubleField xDf;
     @FXML
@@ -56,17 +56,15 @@
     private DoubleField zDf;
     DoubleField[] doubleFields = new DoubleField[3];
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public Point3DEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
-        root = EditorUtils.loadFxml("Point3DEditor.fxml", this);//NOI18N
-
         initialize();
-        setLayoutFormat(PropertyEditor.LayoutFormat.SIMPLE_LINE_BOTTOM);
     }
 
     //Method to please FindBugs
     private void initialize() {
+        root = EditorUtils.loadFxml("Point3DEditor.fxml", this);//NOI18N
+
         doubleFields[0] = xDf;
         doubleFields[1] = yDf;
         doubleFields[2] = zDf;
@@ -74,6 +72,7 @@
             EventHandler<ActionEvent> valueListener = event -> userUpdateValueProperty(getValue());
             setNumericEditorBehavior(this, doubleField, valueListener, false);
         }
+        setLayoutFormat(PropertyEditor.LayoutFormat.SIMPLE_LINE_BOTTOM);
     }
 
     @Override
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/RotateEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/RotateEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -61,13 +61,17 @@
     @FXML
     private Button rotatorHandle;
 
-    private final Parent root;
+    private Parent root;
     private int roundingFactor = 10; // 1 decimal
     private boolean updateFromRotator = false;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public RotateEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
+        initialize();
+    }
+    
+    // Method to please FindBugs
+    private void initialize() {
         root = EditorUtils.loadFxml("RotateEditor.fxml", this);
 
         //
@@ -95,11 +99,6 @@
             userUpdateValueProperty(valDouble);
 
         };
-        initialize(valueListener);
-    }
-    
-    // Method to please FindBugs
-    private void initialize(EventHandler<ActionEvent> valueListener) {
         setNumericEditorBehavior(this, rotateTf, valueListener, false);
     }
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StringAutoSuggestEditor.fxml	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StringAutoSuggestEditor.fxml	Thu Aug 28 17:49:22 2014 -0700
@@ -42,7 +42,7 @@
 <children>
     <TextField fx:id="textField" onKeyReleased="#textFieldKeyReleased" onMouseClicked="#textFieldMouseClicked" prefWidth="-1.0">
       <contextMenu>
-        <ContextMenu maxHeight="-1.0" styleClass="auto-suggest-popup">
+        <ContextMenu maxHeight="-1.0">
           <items>
             <CustomMenuItem mnemonicParsing="false">
               <content>
@@ -50,6 +50,11 @@
               </content>
             </CustomMenuItem>
           </items>
+               <styleClass>
+                  <String fx:value="theme-presets" />
+                  <String fx:value="property-sheet" />
+                  <String fx:value="auto-suggest-popup" />
+               </styleClass>
         </ContextMenu>
       </contextMenu>
 <HBox.margin>
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StringEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StringEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -47,12 +47,14 @@
 public class StringEditor extends PropertyEditor {
 
     private TextInputControl textField = new TextField();
-    final EventHandler<ActionEvent> valueListener;
+    private EventHandler<ActionEvent> valueListener;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public StringEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
+        initialize();
+    }
 
+    private void initialize() {
         valueListener = event -> {
             userUpdateValueProperty(getValue());
             textField.selectAll();
@@ -62,7 +64,7 @@
         // Double line editor by default
         setLayoutFormat(LayoutFormat.DOUBLE_LINE);
     }
-
+    
     @Override
     public Object getValue() {
         return EditorUtils.getPlainString(textField.getText());
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleClassEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleClassEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -78,10 +78,13 @@
     private List<String> themeClasses;
     private EditorController editorController;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public StyleClassEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses,
             Set<FXOMInstance> selectedInstances, EditorController editorController) {
         super(propMeta, selectedClasses);
+        initialize(selectedInstances, editorController);
+    }
+    
+    private void initialize(Set<FXOMInstance> selectedInstances, EditorController editorController) {
         this.selectedInstances = selectedInstances;
         this.editorController = editorController;
         setLayoutFormat(PropertyEditor.LayoutFormat.DOUBLE_LINE);
@@ -214,26 +217,25 @@
         @FXML
         private StackPane styleClassSp;
 
-        private final Parent root;
+        private Parent root;
         private TextField styleClassTf;
         private String currentValue;
-        private final Map<String, String> cssClassesMap;
-        private final EditorItemDelegate editor;
+        private Map<String, String> cssClassesMap;
+        private EditorItemDelegate editor;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public StyleClassItem(EditorItemDelegate editor, Map<String, String> cssClassesMap) {
 //            System.out.println("New StyleClassItem.");
             // It is an AutoSuggestEditor without MenuButton
             super("", "", new ArrayList<>(cssClassesMap.keySet()), false); //NOI18N
+            initialize(editor, cssClassesMap);
+        }
+
+        // Method to please FindBugs
+        private void initialize(EditorItemDelegate editor, Map<String, String> cssClassesMap) {
             this.editor = editor;
             this.cssClassesMap = cssClassesMap;
             root = EditorUtils.loadFxml("StyleClassEditorItem.fxml", this);//NOI18N
 
-            initialize();
-        }
-
-        // Method to please FindBugs
-        private void initialize() {
             // Add the AutoSuggest text field in the scene graph
             styleClassSp.getChildren().add(super.getRoot());
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -77,9 +77,12 @@
     private Set<Class<?>> selectedClasses;
     private EditorController editorController;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public StyleEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, EditorController editorController) {
         super(propMeta, selectedClasses);
+        initialize(selectedClasses, editorController);
+    }
+    
+    private void initialize(Set<Class<?>> selectedClasses, EditorController editorController) {
         this.selectedClasses = selectedClasses;
         this.editorController = editorController;
         setLayoutFormat(LayoutFormat.DOUBLE_LINE);
@@ -227,26 +230,25 @@
         @FXML
         private StackPane propertySp;
 
-        private final Parent root;
+        private Parent root;
         private TextField propertyTf;
         private String currentValue;
-        private final EditorItemDelegate editor;
+        private EditorItemDelegate editor;
         private boolean parsingError = false;
         private ListChangeListener<CssError> errorListener;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public StyleItem(EditorItemDelegate editor, List<String> suggestedList) {
 //            System.out.println("New StyleItem.");
             // It is an AutoSuggestEditor without MenuButton
             super("", "", suggestedList, false);
+            initialize(editor);
+        }
+
+        // Method to please FindBugs
+        private void initialize(EditorItemDelegate editor) {
             this.editor = editor;
             root = EditorUtils.loadFxml("StyleEditorItem.fxml", this);
 
-            initialize();
-        }
-
-        // Method to please FindBugs
-        private void initialize() {
             // Add the AutoSuggest text field in the scene graph
             propertySp.getChildren().add(super.getRoot());
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StylesheetEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StylesheetEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -78,7 +78,7 @@
 public class StylesheetEditor extends InlineListEditor {
 
     private final StackPane root = new StackPane();
-    private final Parent rootInitialBt;
+    private Parent rootInitialBt;
 
     private final MenuItem documentRelativeMenuItem
             = new MenuItem(I18N.getString("inspector.resource.documentrelative"));
@@ -90,9 +90,12 @@
     private Type type;
     private URL fxmlFileLocation;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public StylesheetEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, URL fxmlFileLocation) {
         super(propMeta, selectedClasses);
+        initialize(fxmlFileLocation);
+    }
+    
+    private void initialize(URL fxmlFileLocation) {
         this.fxmlFileLocation = fxmlFileLocation;
         setLayoutFormat(PropertyEditor.LayoutFormat.DOUBLE_LINE);
         // Add initial button
@@ -404,24 +407,23 @@
         @FXML
         private TextField stylesheetTf;
 
-        private final Pane root;
+        private Pane root;
         private String currentValue;
-        private final EditorItemDelegate editor;
+        private EditorItemDelegate editor;
         private Type itemType = Type.PLAIN_STRING;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public StylesheetItem(EditorItemDelegate editor, String url) {
 //            System.out.println("New StylesheetItem.");
+            initialize(editor, url);
+        }
+
+        // Method to please FindBugs
+        private void initialize(EditorItemDelegate editor, String url) {
             this.editor = editor;
             Parent parentRoot = EditorUtils.loadFxml("StylesheetEditorItem.fxml", this);
             assert parentRoot instanceof Pane;
             root = (Pane) parentRoot;
 
-            initialize(url);
-        }
-
-        // Method to please FindBugs
-        private void initialize(String url) {
             setValue(url);
             EventHandler<ActionEvent> onActionListener = event -> {
 //                    System.out.println("StylesheetItem : onActionListener");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/TextAlignmentEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/TextAlignmentEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -48,7 +48,7 @@
  */
 public class TextAlignmentEditor extends PropertyEditor {
 
-    private final Parent root;
+    private Parent root;
     @FXML
     private ToggleButton leftTb;
     @FXML
@@ -60,17 +60,15 @@
 
     private final ToggleButton[] toggleButtons = new ToggleButton[4];
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public TextAlignmentEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
-        root = EditorUtils.loadFxml("TextAlignmentEditor.fxml", this); //NOI18N
-
         initialize();
-        setLayoutFormat(LayoutFormat.SIMPLE_LINE_BOTTOM);
     }
 
     //Method to please FindBugs
     private void initialize() {
+        root = EditorUtils.loadFxml("TextAlignmentEditor.fxml", this); //NOI18N
+
         toggleButtons[0] = leftTb;
         toggleButtons[1] = centerTb;
         toggleButtons[2] = rightTb;
@@ -79,6 +77,7 @@
             tb.setOnAction(t -> userUpdateValueProperty(getValue()));
             tb.disableProperty().bind(disableProperty());
         }
+        setLayoutFormat(LayoutFormat.SIMPLE_LINE_BOTTOM);
     }
 
     @Override
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ToggleGroupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ToggleGroupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -47,9 +47,12 @@
 
     List<String> suggestedTgs;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public ToggleGroupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, List<String> suggestedTgs) {
         super(propMeta, selectedClasses, suggestedTgs);
+        initialize(suggestedTgs);
+    }
+    
+    private void initialize(List<String> suggestedTgs) {
         this.suggestedTgs = suggestedTgs;
 
         // text field events handling
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/BoundsPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/BoundsPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -67,7 +67,6 @@
     private Parent root;
     private Bounds bounds;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public BoundsPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
     }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/EffectPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/EffectPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -52,7 +52,7 @@
 
     private EffectPicker effectPicker;
     private List<MenuItem> effectMenuItems;
-    private final EditorController editorController;
+    private EditorController editorController;
 
     private final ChangeListener<Number> effectRevisionChangeListener = (ov, t, t1) -> {
         final Effect rootEffect = effectPicker.getRootEffectProperty();
@@ -79,9 +79,12 @@
         }
     };
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public EffectPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, EditorController editorController) {
         super(propMeta, selectedClasses);
+        initialize(editorController);
+    }
+    
+    private void initialize(EditorController editorController) {
         this.editorController = editorController;
     }
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/FontPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/FontPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -79,12 +79,15 @@
     private BoundedDoubleEditor sizeEditor;
     private EditorController editorController;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public FontPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, EditorController editorController) {
         super(propMeta, selectedClasses);
+        initialize(editorController);
+    }
+
+    private void initialize(EditorController editorController) {
         this.editorController = editorController;
     }
-
+    
     private void setStyle() {
         styleEditor.reset("", "", new ArrayList<>(getStyles(familyEditor.getValue(), false, editorController)));//NOI18N
         styleEditor.setUpdateFromModel(true);
@@ -206,9 +209,12 @@
         private List<String> families;
         private String family = null;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public FamilyEditor(String name, String defaultValue, List<String> families, EditorController editorController) {
             super(name, defaultValue, families);
+            initialize(families, editorController);
+        }
+        
+        private void initialize(List<String> families, EditorController editorController) {
             this.families = families;
             EventHandler<ActionEvent> onActionListener = event -> {
                 if (Objects.equals(family, getTextField().getText())) {
@@ -244,9 +250,12 @@
         
         private String style = null;
 
-        @SuppressWarnings("LeakingThisInConstructor")
         public StyleEditor(String name, String defaultValue, List<String> suggestedList, EditorController editorController) {
             super(name, defaultValue, suggestedList);
+            initialize(editorController);
+        }
+        
+        private void initialize(EditorController editorController) {
             EventHandler<ActionEvent> onActionListener = event -> {
                 if (Objects.equals(style, getTextField().getText())) {
                     // no change
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/KeyCombinationPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/KeyCombinationPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -93,10 +93,13 @@
         KeyCombination.SHIFT_ANY, KeyCombination.SHIFT_DOWN,
         KeyCombination.SHORTCUT_ANY, KeyCombination.SHORTCUT_DOWN};
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public KeyCombinationPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses,
             EditorController editorController) {
         super(propMeta, selectedClasses);
+        initialize(editorController);
+    }
+    
+    private void initialize(EditorController editorController) {
         this.editorController = editorController;
     }
 
@@ -406,14 +409,17 @@
         return row;
     }
 
-    @SuppressWarnings("LeakingThisInConstructor")
     private class MainKey extends AutoSuggestEditor {
 
-        private final EditorController editorController;
+        private EditorController editorController;
         String mainKey = null;
 
         public MainKey(List<String> suggestedKeys, EditorController editorController) {
             super("", null, suggestedKeys); //NOI18N
+            initialize(editorController);
+        }
+        
+        private void initialize(EditorController editorController) {
             this.editorController = editorController;
             EventHandler<ActionEvent> onActionListener = t -> {
                 if (Objects.equals(mainKey, getTextField().getText())) {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PaintPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PaintPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -54,7 +54,7 @@
 
     private PaintPicker paintPicker;
     private final Rectangle graphic = new Rectangle(20, 10);
-    private final EditorController editorController;
+    private EditorController editorController;
 
     private final ChangeListener<Paint> paintChangeListener = (ov, oldValue, newValue) -> {
         // If live update, do not commit the value
@@ -73,9 +73,12 @@
         }
     };
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public PaintPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, EditorController editorController) {
         super(propMeta, selectedClasses);
+        initialize(editorController);
+    }
+    
+    private void initialize(EditorController editorController) {
         this.editorController = editorController;
     }
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -62,17 +62,14 @@
     private Object value;
     private boolean initialized = false;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public PopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
-
-        EditorUtils.loadPopupFxml("PopupEditor.fxml", this);
-        
         initializeEditor();
     }
     
     // Separate method to please FindBugs
     private void initializeEditor() {
+        EditorUtils.loadPopupFxml("PopupEditor.fxml", this);
         // Lazy initialization of the editor,
         // the first time the popup is opened.
         popupMb.showingProperty().addListener((ChangeListener<Boolean>) (ov, previousVal, newVal) -> {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/Rectangle2DPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/Rectangle2DPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -61,7 +61,6 @@
     private Parent root;
     private Rectangle2D rectangle2D;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public Rectangle2DPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
     }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/StringPopupEditor.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/StringPopupEditor.java	Thu Aug 28 17:49:22 2014 -0700
@@ -51,7 +51,6 @@
 
     private Parent root;
 
-    @SuppressWarnings("LeakingThisInConstructor")
     public StringPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
         super(propMeta, selectedClasses);
     }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMArchive.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMArchive.java	Thu Aug 28 17:49:22 2014 -0700
@@ -36,7 +36,6 @@
 import java.io.Serializable;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 /**
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMCloner.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMCloner.java	Thu Aug 28 17:49:22 2014 -0700
@@ -36,7 +36,6 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.PriorityQueue;
 import java.util.Set;
 
 /**
@@ -308,7 +307,9 @@
             fxIds.remove(clonee.getFxId());
         }
         
-        for (String candidateFxId : new PriorityQueue<>(fxIds.keySet())) {
+        for (Map.Entry<String, FXOMObject> e : fxIds.entrySet()) {
+            final String candidateFxId = e.getKey();
+            final FXOMObject declarer = e.getValue();
             
             final String renamedFxId = fxIdCollector.importFxId(candidateFxId);
             
@@ -322,7 +323,6 @@
                  */
                 
                 // 1)
-                final FXOMObject declarer = fxIds.get(candidateFxId);
                 declarer.setFxId(renamedFxId);
 
                 // 2)
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMInstance.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMInstance.java	Thu Aug 28 17:49:22 2014 -0700
@@ -38,10 +38,10 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 import javafx.fxml.FXMLLoader;
 
 /**
@@ -50,7 +50,7 @@
  */
 public class FXOMInstance extends FXOMObject {
     
-    private final Map<PropertyName, FXOMProperty> properties = new TreeMap<>();
+    private final Map<PropertyName, FXOMProperty> properties = new LinkedHashMap<>();
     private Class<?> declaredClass;
     
     
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMIntrinsic.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMIntrinsic.java	Thu Aug 28 17:49:22 2014 -0700
@@ -35,10 +35,10 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
 import java.net.URL;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 
 /**
  *
@@ -53,7 +53,7 @@
         UNDEFINED
     }
     
-    private final Map<PropertyName, FXOMProperty> properties = new TreeMap<>();
+    private final Map<PropertyName, FXOMProperty> properties = new LinkedHashMap<>();
     private Object sourceSceneGraphObject;
 
     
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMObject.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMObject.java	Thu Aug 28 17:49:22 2014 -0700
@@ -37,8 +37,8 @@
 import com.oracle.javafx.scenebuilder.kit.util.JavaLanguage;
 import com.oracle.javafx.scenebuilder.kit.util.URLUtils;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -405,7 +405,7 @@
     protected abstract void collectIncludes(String source, List<FXOMIntrinsic> result);
 
     public Map<String, FXOMObject> collectFxIds() {
-        final Map<String, FXOMObject> result = new HashMap<>();
+        final Map<String, FXOMObject> result = new LinkedHashMap<>();
         
         collectFxIds(result);
         
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FxIdCollector.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FxIdCollector.java	Thu Aug 28 17:49:22 2014 -0700
@@ -35,7 +35,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.PriorityQueue;
 import java.util.Set;
 
 /**
@@ -88,7 +87,7 @@
     private void createNextIndexes() {
         nextIndexes = new HashMap<>();
         
-        for (String fxId : new PriorityQueue<>(fxIds)) {
+        for (String fxId : fxIds) {
             updateNextIndexes(fxId);
         }
     }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/library/BuiltinLibrary.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/library/BuiltinLibrary.java	Thu Aug 28 17:49:22 2014 -0700
@@ -154,6 +154,7 @@
         addDefaultItem(javafx.scene.control.ColorPicker.class, TAG_CONTROLS);
         addCustomizedItem(javafx.scene.control.ComboBox.class, TAG_CONTROLS);
         addDefaultItem(javafx.scene.control.DatePicker.class, TAG_CONTROLS, FX8_QUALIFIER);
+        addDefaultItem(javafx.scene.control.DialogPane.class, TAG_CONTROLS, FX8_QUALIFIER);
         addCustomizedItem(javafx.scene.web.HTMLEditor.class, TAG_CONTROLS);
         addCustomizedItem(javafx.scene.control.Hyperlink.class, TAG_CONTROLS);
         addCustomizedItem(javafx.scene.image.ImageView.class, TAG_CONTROLS);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java	Thu Aug 28 17:49:22 2014 -0700
@@ -350,6 +350,8 @@
             new ComponentClassMetadata(javafx.scene.control.CustomMenuItem.class, MenuItemMetadata);
     private final ComponentClassMetadata DatePickerMetadata = 
             new ComponentClassMetadata(javafx.scene.control.DatePicker.class, ComboBoxBaseMetadata);
+    private final ComponentClassMetadata DialogPaneMetadata = 
+            new ComponentClassMetadata(javafx.scene.control.DialogPane.class, PaneMetadata);
     private final ComponentClassMetadata HyperlinkMetadata = 
             new ComponentClassMetadata(javafx.scene.control.Hyperlink.class, ButtonBaseMetadata);
     private final ComponentClassMetadata LabelMetadata = 
@@ -398,6 +400,8 @@
             new ComponentClassMetadata(javafx.scene.control.TableView.class, ControlMetadata);
     private final ComponentClassMetadata TextAreaMetadata = 
             new ComponentClassMetadata(javafx.scene.control.TextArea.class, TextInputControlMetadata);
+    private final ComponentClassMetadata TextFormatterMetadata = 
+            new ComponentClassMetadata(javafx.scene.control.TextFormatter.class, null);
     private final ComponentClassMetadata TitledPaneMetadata = 
             new ComponentClassMetadata(javafx.scene.control.TitledPane.class, LabeledMetadata);
     private final ComponentClassMetadata ToolBarMetadata = 
@@ -596,6 +600,8 @@
             new PropertyName("contentBias");
     private final PropertyName contentDisplayName = 
             new PropertyName("contentDisplay");
+    private final PropertyName contentTextName = 
+            new PropertyName("contentText");
     private final PropertyName contextMenuName = 
             new PropertyName("contextMenu");
     private final PropertyName contextMenuEnabledName = 
@@ -700,6 +706,10 @@
             new PropertyName("halignment");
     private final PropertyName hbarPolicyName = 
             new PropertyName("hbarPolicy");
+    private final PropertyName headerName = 
+            new PropertyName("header");
+    private final PropertyName headerTextName = 
+            new PropertyName("headerText");
     private final PropertyName heightName = 
             new PropertyName("height");
     private final PropertyName hgapName = 
@@ -1056,8 +1066,6 @@
             new PropertyName("strikethrough");
     private final PropertyName strokeName = 
             new PropertyName("stroke");
-    private final PropertyName strokeDashArrayName = 
-            new PropertyName("strokeDashArray");
     private final PropertyName strokeDashOffsetName = 
             new PropertyName("strokeDashOffset");
     private final PropertyName strokeLineCapName = 
@@ -1098,6 +1106,8 @@
             new PropertyName("textAlignment");
     private final PropertyName textFillName = 
             new PropertyName("textFill");
+    private final PropertyName textFormatterName = 
+            new PropertyName("textFormatter");
     private final PropertyName textOriginName = 
             new PropertyName("textOrigin");
     private final PropertyName textOverrunName = 
@@ -1526,7 +1536,12 @@
                 true, /* readWrite */
                 0.0, /* defaultValue */
                 new InspectorPath("Layout", "Position", 1));
-    private final ComponentPropertyMetadata childrenPropertyMetadata =
+    private final ComponentPropertyMetadata children_c1_PropertyMetadata =
+            new ComponentPropertyMetadata(
+                childrenName,
+                NodeMetadata,
+                true); /* collection */
+    private final ComponentPropertyMetadata children_empty_PropertyMetadata =
             new ComponentPropertyMetadata(
                 childrenName,
                 NodeMetadata,
@@ -1630,6 +1645,12 @@
                 true, /* readWrite */
                 javafx.scene.control.ContentDisplay.LEFT, /* defaultValue */
                 new InspectorPath("Properties", "Graphic", 1));
+    private final ValuePropertyMetadata contentTextPropertyMetadata =
+            new StringPropertyMetadata(
+                contentTextName,
+                true, /* readWrite */
+                "", /* defaultValue */
+                new InspectorPath("Properties", "Text", 2));
     private final ComponentPropertyMetadata contextMenuPropertyMetadata =
             new ComponentPropertyMetadata(
                 contextMenuName,
@@ -1794,7 +1815,7 @@
                 ellipsisStringName,
                 true, /* readWrite */
                 "...", /* defaultValue */
-                new InspectorPath("Properties", "Text", 10));
+                new InspectorPath("Properties", "Text", 12));
     private final ValuePropertyMetadata endMarginPropertyMetadata =
             new DoublePropertyMetadata(
                 endMarginName,
@@ -1816,7 +1837,13 @@
                 true, /* readWrite */
                 0.0, /* defaultValue */
                 new InspectorPath("Layout", "Position", 8));
-    private final ValuePropertyMetadata expandedPropertyMetadata =
+    private final ValuePropertyMetadata expanded_false_PropertyMetadata =
+            new BooleanPropertyMetadata(
+                expandedName,
+                true, /* readWrite */
+                false, /* defaultValue */
+                new InspectorPath("Properties", "Specific", 16));
+    private final ValuePropertyMetadata expanded_true_PropertyMetadata =
             new BooleanPropertyMetadata(
                 expandedName,
                 true, /* readWrite */
@@ -1905,7 +1932,7 @@
                 com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata.DoubleKind.COORDINATE,
                 true, /* readWrite */
                 -1.0, /* defaultValue */
-                new InspectorPath("Properties", "Specific", 127));
+                new InspectorPath("Properties", "Specific", 126));
     private final ValuePropertyMetadata fixedEyeAtCameraZeroPropertyMetadata =
             new BooleanPropertyMetadata(
                 fixedEyeAtCameraZeroName,
@@ -1929,7 +1956,7 @@
                 fontName,
                 true, /* readWrite */
                 javafx.scene.text.Font.getDefault(), /* defaultValue */
-                new InspectorPath("Properties", "Text", 3));
+                new InspectorPath("Properties", "Text", 5));
     private final ValuePropertyMetadata fontScalePropertyMetadata =
             new DoublePropertyMetadata(
                 fontScaleName,
@@ -1943,14 +1970,14 @@
                 javafx.scene.text.FontSmoothingType.class,
                 true, /* readWrite */
                 javafx.scene.text.FontSmoothingType.GRAY, /* defaultValue */
-                new InspectorPath("Properties", "Text", 4));
+                new InspectorPath("Properties", "Text", 6));
     private final ValuePropertyMetadata fontSmoothingType_LCD_PropertyMetadata =
             new EnumerationPropertyMetadata(
                 fontSmoothingTypeName,
                 javafx.scene.text.FontSmoothingType.class,
                 true, /* readWrite */
                 javafx.scene.text.FontSmoothingType.LCD, /* defaultValue */
-                new InspectorPath("Properties", "Text", 4));
+                new InspectorPath("Properties", "Text", 6));
     private final ValuePropertyMetadata forceZeroInRangePropertyMetadata =
             new BooleanPropertyMetadata(
                 forceZeroInRangeName,
@@ -2002,6 +2029,17 @@
                 true, /* readWrite */
                 javafx.scene.control.ScrollPane.ScrollBarPolicy.AS_NEEDED, /* defaultValue */
                 new InspectorPath("Properties", "Specific", 46));
+    private final ComponentPropertyMetadata headerPropertyMetadata =
+            new ComponentPropertyMetadata(
+                headerName,
+                NodeMetadata,
+                false); /* collection */
+    private final ValuePropertyMetadata headerTextPropertyMetadata =
+            new StringPropertyMetadata(
+                headerTextName,
+                true, /* readWrite */
+                "", /* defaultValue */
+                new InspectorPath("Properties", "Text", 1));
     private final ValuePropertyMetadata height_Double_200_PropertyMetadata =
             new DoublePropertyMetadata(
                 heightName,
@@ -2175,7 +2213,7 @@
                 largeArcFlagName,
                 true, /* readWrite */
                 false, /* defaultValue */
-                new InspectorPath("Properties", "Specific", 125));
+                new InspectorPath("Properties", "Specific", 124));
     private final ValuePropertyMetadata layoutBoundsPropertyMetadata =
             new BoundsPropertyMetadata(
                 layoutBoundsName,
@@ -2239,7 +2277,7 @@
                 com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata.DoubleKind.SIZE,
                 true, /* readWrite */
                 0.0, /* defaultValue */
-                new InspectorPath("Properties", "Text", 13));
+                new InspectorPath("Properties", "Text", 15));
     private final ValuePropertyMetadata lowerBoundPropertyMetadata =
             new DoublePropertyMetadata(
                 lowerBoundName,
@@ -2993,7 +3031,7 @@
                 promptTextName,
                 true, /* readWrite */
                 "", /* defaultValue */
-                new InspectorPath("Properties", "Text", 1));
+                new InspectorPath("Properties", "Text", 3));
     private final ValuePropertyMetadata radius_0_PropertyMetadata =
             new DoublePropertyMetadata(
                 radiusName,
@@ -3053,12 +3091,12 @@
                 true, /* readWrite */
                 javafx.scene.AccessibleRole.BUTTON, /* defaultValue */
                 new InspectorPath("Properties", "Accessibility", 2));
-    private final ValuePropertyMetadata role_TOGGLE_BUTTON_PropertyMetadata =
+    private final ValuePropertyMetadata role_MENU_BUTTON_PropertyMetadata =
             new EnumerationPropertyMetadata(
                 roleName,
                 javafx.scene.AccessibleRole.class,
                 true, /* readWrite */
-                javafx.scene.AccessibleRole.TOGGLE_BUTTON, /* defaultValue */
+                javafx.scene.AccessibleRole.MENU_BUTTON, /* defaultValue */
                 new InspectorPath("Properties", "Accessibility", 2));
     private final ValuePropertyMetadata role_CHECK_BOX_PropertyMetadata =
             new EnumerationPropertyMetadata(
@@ -3116,13 +3154,6 @@
                 true, /* readWrite */
                 javafx.scene.AccessibleRole.MENU_BAR, /* defaultValue */
                 new InspectorPath("Properties", "Accessibility", 2));
-    private final ValuePropertyMetadata role_MENU_BUTTON_PropertyMetadata =
-            new EnumerationPropertyMetadata(
-                roleName,
-                javafx.scene.AccessibleRole.class,
-                true, /* readWrite */
-                javafx.scene.AccessibleRole.MENU_BUTTON, /* defaultValue */
-                new InspectorPath("Properties", "Accessibility", 2));
     private final ValuePropertyMetadata role_PARENT_PropertyMetadata =
             new EnumerationPropertyMetadata(
                 roleName,
@@ -3228,6 +3259,13 @@
                 true, /* readWrite */
                 javafx.scene.AccessibleRole.TITLED_PANE, /* defaultValue */
                 new InspectorPath("Properties", "Accessibility", 2));
+    private final ValuePropertyMetadata role_TOGGLE_BUTTON_PropertyMetadata =
+            new EnumerationPropertyMetadata(
+                roleName,
+                javafx.scene.AccessibleRole.class,
+                true, /* readWrite */
+                javafx.scene.AccessibleRole.TOGGLE_BUTTON, /* defaultValue */
+                new InspectorPath("Properties", "Accessibility", 2));
     private final ValuePropertyMetadata role_TOOL_BAR_PropertyMetadata =
             new EnumerationPropertyMetadata(
                 roleName,
@@ -3331,14 +3369,14 @@
                 com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata.DoubleKind.COORDINATE,
                 true, /* readWrite */
                 0.0, /* defaultValue */
-                new InspectorPath("Properties", "Text", 14));
+                new InspectorPath("Properties", "Text", 16));
     private final ValuePropertyMetadata scrollTopPropertyMetadata =
             new DoublePropertyMetadata(
                 scrollTopName,
                 com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata.DoubleKind.COORDINATE,
                 true, /* readWrite */
                 0.0, /* defaultValue */
-                new InspectorPath("Properties", "Text", 15));
+                new InspectorPath("Properties", "Text", 17));
     private final ValuePropertyMetadata selected_Boolean_PropertyMetadata =
             new BooleanPropertyMetadata(
                 selectedName,
@@ -3379,7 +3417,7 @@
                 showWeekNumbersName,
                 true, /* readWrite */
                 true, /* defaultValue */
-                new InspectorPath("Properties", "Specific", 126));
+                new InspectorPath("Properties", "Specific", 125));
     private final ValuePropertyMetadata side_NULL_PropertyMetadata =
             new EnumerationPropertyMetadata(
                 sideName,
@@ -3482,7 +3520,7 @@
                 strikethroughName,
                 true, /* readWrite */
                 false, /* defaultValue */
-                new InspectorPath("Properties", "Text", 11));
+                new InspectorPath("Properties", "Text", 13));
     private final ValuePropertyMetadata stroke_BLACK_PropertyMetadata =
             new PaintPropertyMetadata(
                 strokeName,
@@ -3495,12 +3533,6 @@
                 true, /* readWrite */
                 null, /* defaultValue */
                 new InspectorPath("Properties", "Stroke", 0));
-    private final ValuePropertyMetadata strokeDashArrayPropertyMetadata =
-            new DoubleListPropertyMetadata(
-                strokeDashArrayName,
-                true, /* readWrite */
-                Collections.emptyList(), /* defaultValue */
-                new InspectorPath("Properties", "Specific", 122));
     private final ValuePropertyMetadata strokeDashOffsetPropertyMetadata =
             new DoublePropertyMetadata(
                 strokeDashOffsetName,
@@ -3555,13 +3587,13 @@
                 true, /* readWrite */
                 Arrays.asList("accordion"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c35_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c36_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("chart"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c43_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c44_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3579,7 +3611,7 @@
                 true, /* readWrite */
                 Arrays.asList("button"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c39_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c40_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3597,7 +3629,7 @@
                 true, /* readWrite */
                 Arrays.asList("menu-item","check-menu-item"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c41_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c42_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3639,6 +3671,12 @@
                 true, /* readWrite */
                 Arrays.asList("combo-box-base","date-picker"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
+    private final ValuePropertyMetadata styleClass_c30_PropertyMetadata =
+            new StringListPropertyMetadata(
+                styleClassName,
+                true, /* readWrite */
+                Arrays.asList("dialog-pane"), /* defaultValue */
+                new InspectorPath("Properties", "JavaFX CSS", 1));
     private final ValuePropertyMetadata styleClass_c21_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
@@ -3657,13 +3695,13 @@
                 true, /* readWrite */
                 Arrays.asList("label"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c33_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c34_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("list-view"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c44_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c45_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3681,13 +3719,13 @@
                 true, /* readWrite */
                 Arrays.asList("menu-bar"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c50_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c51_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("menu-button"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c34_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c35_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3699,13 +3737,13 @@
                 true, /* readWrite */
                 Collections.emptyList(), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c37_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c38_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("pagination"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c51_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c52_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3717,7 +3755,7 @@
                 true, /* readWrite */
                 Arrays.asList("progress-bar"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c48_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c49_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3729,19 +3767,19 @@
                 true, /* readWrite */
                 Arrays.asList("menu-item","radio-menu-item"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c32_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c33_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("scroll-bar"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c36_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c37_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("scroll-pane"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c30_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c31_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3753,7 +3791,7 @@
                 true, /* readWrite */
                 Arrays.asList("menu-item","custom-menu-item","separator-menu-item"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c38_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c39_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3795,25 +3833,25 @@
                 true, /* readWrite */
                 Arrays.asList("tab-pane"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c40_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c41_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("table-column"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c47_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c48_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("table-view"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c49_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c50_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
                 Arrays.asList("text-input","text-area"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c45_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c46_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3825,7 +3863,7 @@
                 true, /* readWrite */
                 Arrays.asList("titled-pane"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c42_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c43_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3843,7 +3881,7 @@
                 true, /* readWrite */
                 Arrays.asList("tooltip"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c31_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c32_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3855,7 +3893,7 @@
                 true, /* readWrite */
                 Arrays.asList("tree-view"), /* defaultValue */
                 new InspectorPath("Properties", "JavaFX CSS", 1));
-    private final ValuePropertyMetadata styleClass_c46_PropertyMetadata =
+    private final ValuePropertyMetadata styleClass_c47_PropertyMetadata =
             new StringListPropertyMetadata(
                 styleClassName,
                 true, /* readWrite */
@@ -3872,7 +3910,7 @@
                 sweepFlagName,
                 true, /* readWrite */
                 false, /* defaultValue */
-                new InspectorPath("Properties", "Specific", 123));
+                new InspectorPath("Properties", "Specific", 122));
     private final ValuePropertyMetadata tabClosingPolicyPropertyMetadata =
             new EnumerationPropertyMetadata(
                 tabClosingPolicyName,
@@ -3924,20 +3962,25 @@
                 textName,
                 true, /* readWrite */
                 "", /* defaultValue */
-                new InspectorPath("Properties", "Text", 2));
+                new InspectorPath("Properties", "Text", 4));
     private final ValuePropertyMetadata textAlignmentPropertyMetadata =
             new EnumerationPropertyMetadata(
                 textAlignmentName,
                 javafx.scene.text.TextAlignment.class,
                 true, /* readWrite */
                 javafx.scene.text.TextAlignment.LEFT, /* defaultValue */
-                new InspectorPath("Properties", "Text", 7));
+                new InspectorPath("Properties", "Text", 9));
     private final ValuePropertyMetadata textFillPropertyMetadata =
             new PaintPropertyMetadata(
                 textFillName,
                 true, /* readWrite */
                 javafx.scene.paint.Color.BLACK, /* defaultValue */
-                new InspectorPath("Properties", "Text", 5));
+                new InspectorPath("Properties", "Text", 7));
+    private final ComponentPropertyMetadata textFormatterPropertyMetadata =
+            new ComponentPropertyMetadata(
+                textFormatterName,
+                TextFormatterMetadata,
+                false); /* collection */
     private final ValuePropertyMetadata textOriginPropertyMetadata =
             new EnumerationPropertyMetadata(
                 textOriginName,
@@ -3951,7 +3994,7 @@
                 javafx.scene.control.OverrunStyle.class,
                 true, /* readWrite */
                 javafx.scene.control.OverrunStyle.ELLIPSIS, /* defaultValue */
-                new InspectorPath("Properties", "Text", 9));
+                new InspectorPath("Properties", "Text", 11));
     private final ValuePropertyMetadata tickLabelFillPropertyMetadata =
             new PaintPropertyMetadata(
                 tickLabelFillName,
@@ -4104,7 +4147,7 @@
                 underlineName,
                 true, /* readWrite */
                 false, /* defaultValue */
-                new InspectorPath("Properties", "Text", 12));
+                new InspectorPath("Properties", "Text", 14));
     private final ValuePropertyMetadata unitIncrementPropertyMetadata =
             new DoublePropertyMetadata(
                 unitIncrementName,
@@ -4124,7 +4167,7 @@
                 userAgentStylesheetName,
                 true, /* readWrite */
                 "", /* defaultValue */
-                new InspectorPath("Properties", "Specific", 128));
+                new InspectorPath("Properties", "Specific", 127));
     private final ValuePropertyMetadata valignment_NULL_PropertyMetadata =
             new EnumerationPropertyMetadata(
                 valignmentName,
@@ -4288,13 +4331,13 @@
                 com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata.DoubleKind.SIZE,
                 true, /* readWrite */
                 0.0, /* defaultValue */
-                new InspectorPath("Properties", "Text", 8));
+                new InspectorPath("Properties", "Text", 10));
     private final ValuePropertyMetadata wrapTextPropertyMetadata =
             new BooleanPropertyMetadata(
                 wrapTextName,
                 true, /* readWrite */
                 false, /* defaultValue */
-                new InspectorPath("Properties", "Text", 6));
+                new InspectorPath("Properties", "Text", 8));
     private final ValuePropertyMetadata x_0_PropertyMetadata =
             new DoublePropertyMetadata(
                 xName,
@@ -4320,7 +4363,7 @@
                 com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata.DoubleKind.ANGLE,
                 true, /* readWrite */
                 0.0, /* defaultValue */
-                new InspectorPath("Properties", "Specific", 124));
+                new InspectorPath("Properties", "Specific", 123));
     private final ValuePropertyMetadata y_0_PropertyMetadata =
             new DoublePropertyMetadata(
                 yName,
@@ -4556,6 +4599,7 @@
         componentClassMap.put(CustomMenuItemMetadata.getKlass(), CustomMenuItemMetadata);
         componentClassMap.put(CylinderMetadata.getKlass(), CylinderMetadata);
         componentClassMap.put(DatePickerMetadata.getKlass(), DatePickerMetadata);
+        componentClassMap.put(DialogPaneMetadata.getKlass(), DialogPaneMetadata);
         componentClassMap.put(EllipseMetadata.getKlass(), EllipseMetadata);
         componentClassMap.put(FlowPaneMetadata.getKlass(), FlowPaneMetadata);
         componentClassMap.put(GridPaneMetadata.getKlass(), GridPaneMetadata);
@@ -4631,6 +4675,7 @@
         componentClassMap.put(TextAreaMetadata.getKlass(), TextAreaMetadata);
         componentClassMap.put(TextFieldMetadata.getKlass(), TextFieldMetadata);
         componentClassMap.put(TextFlowMetadata.getKlass(), TextFlowMetadata);
+        componentClassMap.put(TextFormatterMetadata.getKlass(), TextFormatterMetadata);
         componentClassMap.put(TextInputControlMetadata.getKlass(), TextInputControlMetadata);
         componentClassMap.put(TilePaneMetadata.getKlass(), TilePaneMetadata);
         componentClassMap.put(TitledPaneMetadata.getKlass(), TitledPaneMetadata);
@@ -4672,13 +4717,13 @@
         ArcToMetadata.getProperties().add(y_0_PropertyMetadata);
 
         AreaChartMetadata.getProperties().add(createSymbolsPropertyMetadata);
-        AreaChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        AreaChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
 
         AxisMetadata.getProperties().add(animatedPropertyMetadata);
         AxisMetadata.getProperties().add(autoRangingPropertyMetadata);
         AxisMetadata.getProperties().add(labelPropertyMetadata);
         AxisMetadata.getProperties().add(side_NULL_PropertyMetadata);
-        AxisMetadata.getProperties().add(styleClass_c43_PropertyMetadata);
+        AxisMetadata.getProperties().add(styleClass_c44_PropertyMetadata);
         AxisMetadata.getProperties().add(tickLabelFillPropertyMetadata);
         AxisMetadata.getProperties().add(tickLabelFontPropertyMetadata);
         AxisMetadata.getProperties().add(tickLabelGapPropertyMetadata);
@@ -4706,7 +4751,7 @@
         BoxMetadata.getProperties().add(role_NODE_PropertyMetadata);
         BoxMetadata.getProperties().add(width_Double_200_PropertyMetadata);
 
-        BubbleChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        BubbleChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
 
         ButtonMetadata.getProperties().add(cancelButtonPropertyMetadata);
         ButtonMetadata.getProperties().add(defaultButtonPropertyMetadata);
@@ -4716,8 +4761,8 @@
 
         ButtonBaseMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         ButtonBaseMetadata.getProperties().add(onActionPropertyMetadata);
-        ButtonBaseMetadata.getProperties().add(role_TOGGLE_BUTTON_PropertyMetadata);
-        ButtonBaseMetadata.getProperties().add(styleClass_c39_PropertyMetadata);
+        ButtonBaseMetadata.getProperties().add(role_MENU_BUTTON_PropertyMetadata);
+        ButtonBaseMetadata.getProperties().add(styleClass_c40_PropertyMetadata);
 
         CameraMetadata.getProperties().add(farClipPropertyMetadata);
         CameraMetadata.getProperties().add(nearClipPropertyMetadata);
@@ -4735,13 +4780,13 @@
         CategoryAxisMetadata.getProperties().add(endMarginPropertyMetadata);
         CategoryAxisMetadata.getProperties().add(gapStartAndEndPropertyMetadata);
         CategoryAxisMetadata.getProperties().add(startMarginPropertyMetadata);
-        CategoryAxisMetadata.getProperties().add(styleClass_c43_PropertyMetadata);
+        CategoryAxisMetadata.getProperties().add(styleClass_c44_PropertyMetadata);
         CategoryAxisMetadata.getProperties().add(zeroPositionPropertyMetadata);
 
         ChartMetadata.getProperties().add(animatedPropertyMetadata);
         ChartMetadata.getProperties().add(legendSidePropertyMetadata);
         ChartMetadata.getProperties().add(legendVisiblePropertyMetadata);
-        ChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        ChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
         ChartMetadata.getProperties().add(titlePropertyMetadata);
         ChartMetadata.getProperties().add(titleSidePropertyMetadata);
 
@@ -4757,7 +4802,7 @@
 
         ChoiceBoxMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         ChoiceBoxMetadata.getProperties().add(role_COMBO_BOX_PropertyMetadata);
-        ChoiceBoxMetadata.getProperties().add(styleClass_c41_PropertyMetadata);
+        ChoiceBoxMetadata.getProperties().add(styleClass_c42_PropertyMetadata);
         ChoiceBoxMetadata.getProperties().add(value_Object_PropertyMetadata);
 
         CircleMetadata.getProperties().add(centerXPropertyMetadata);
@@ -4793,7 +4838,6 @@
         ComboBoxBaseMetadata.getProperties().add(onShowingPropertyMetadata);
         ComboBoxBaseMetadata.getProperties().add(onShownPropertyMetadata);
         ComboBoxBaseMetadata.getProperties().add(promptTextPropertyMetadata);
-        ComboBoxBaseMetadata.getProperties().add(role_DATE_PICKER_PropertyMetadata);
         ComboBoxBaseMetadata.getProperties().add(styleClass_c5_PropertyMetadata);
         ComboBoxBaseMetadata.getProperties().add(value_Object_PropertyMetadata);
 
@@ -4853,6 +4897,15 @@
         DatePickerMetadata.getProperties().add(showWeekNumbersPropertyMetadata);
         DatePickerMetadata.getProperties().add(styleClass_c9_PropertyMetadata);
 
+        DialogPaneMetadata.getProperties().add(children_c1_PropertyMetadata);
+        DialogPaneMetadata.getProperties().add(content_Node_NULL_PropertyMetadata);
+        DialogPaneMetadata.getProperties().add(contentTextPropertyMetadata);
+        DialogPaneMetadata.getProperties().add(expanded_false_PropertyMetadata);
+        DialogPaneMetadata.getProperties().add(graphicPropertyMetadata);
+        DialogPaneMetadata.getProperties().add(headerPropertyMetadata);
+        DialogPaneMetadata.getProperties().add(headerTextPropertyMetadata);
+        DialogPaneMetadata.getProperties().add(styleClass_c30_PropertyMetadata);
+
         EllipseMetadata.getProperties().add(centerXPropertyMetadata);
         EllipseMetadata.getProperties().add(centerYPropertyMetadata);
         EllipseMetadata.getProperties().add(pickOnBounds_false_PropertyMetadata);
@@ -4878,7 +4931,7 @@
         GridPaneMetadata.getProperties().add(vgapPropertyMetadata);
 
         GroupMetadata.getProperties().add(autoSizeChildrenPropertyMetadata);
-        GroupMetadata.getProperties().add(childrenPropertyMetadata);
+        GroupMetadata.getProperties().add(children_empty_PropertyMetadata);
         GroupMetadata.getProperties().add(pickOnBounds_false_PropertyMetadata);
 
         HBoxMetadata.getProperties().add(alignment_TOP_LEFT_PropertyMetadata);
@@ -4929,8 +4982,8 @@
         LabeledMetadata.getProperties().add(labelPaddingPropertyMetadata);
         LabeledMetadata.getProperties().add(lineSpacingPropertyMetadata);
         LabeledMetadata.getProperties().add(mnemonicParsing_true_PropertyMetadata);
-        LabeledMetadata.getProperties().add(role_TOGGLE_BUTTON_PropertyMetadata);
-        LabeledMetadata.getProperties().add(styleClass_c39_PropertyMetadata);
+        LabeledMetadata.getProperties().add(role_TEXT_PropertyMetadata);
+        LabeledMetadata.getProperties().add(styleClass_c40_PropertyMetadata);
         LabeledMetadata.getProperties().add(textPropertyMetadata);
         LabeledMetadata.getProperties().add(textAlignmentPropertyMetadata);
         LabeledMetadata.getProperties().add(textFillPropertyMetadata);
@@ -4954,7 +5007,7 @@
         LineMetadata.getProperties().add(stroke_BLACK_PropertyMetadata);
 
         LineChartMetadata.getProperties().add(createSymbolsPropertyMetadata);
-        LineChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        LineChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
 
         LineToMetadata.getProperties().add(x_0_PropertyMetadata);
         LineToMetadata.getProperties().add(y_0_PropertyMetadata);
@@ -4969,7 +5022,7 @@
         ListViewMetadata.getProperties().add(orientation_VERTICAL_PropertyMetadata);
         ListViewMetadata.getProperties().add(placeholderPropertyMetadata);
         ListViewMetadata.getProperties().add(role_LIST_VIEW_PropertyMetadata);
-        ListViewMetadata.getProperties().add(styleClass_c33_PropertyMetadata);
+        ListViewMetadata.getProperties().add(styleClass_c34_PropertyMetadata);
 
         MediaViewMetadata.getProperties().add(fitHeightPropertyMetadata);
         MediaViewMetadata.getProperties().add(fitWidthPropertyMetadata);
@@ -4979,7 +5032,7 @@
         MediaViewMetadata.getProperties().add(preserveRatio_true_PropertyMetadata);
         MediaViewMetadata.getProperties().add(role_NODE_PropertyMetadata);
         MediaViewMetadata.getProperties().add(smoothPropertyMetadata);
-        MediaViewMetadata.getProperties().add(styleClass_c44_PropertyMetadata);
+        MediaViewMetadata.getProperties().add(styleClass_c45_PropertyMetadata);
         MediaViewMetadata.getProperties().add(viewportPropertyMetadata);
         MediaViewMetadata.getProperties().add(x_0_PropertyMetadata);
         MediaViewMetadata.getProperties().add(y_0_PropertyMetadata);
@@ -4999,7 +5052,7 @@
         MenuButtonMetadata.getProperties().add(items_MenuItem_PropertyMetadata);
         MenuButtonMetadata.getProperties().add(popupSidePropertyMetadata);
         MenuButtonMetadata.getProperties().add(role_MENU_BUTTON_PropertyMetadata);
-        MenuButtonMetadata.getProperties().add(styleClass_c50_PropertyMetadata);
+        MenuButtonMetadata.getProperties().add(styleClass_c51_PropertyMetadata);
 
         MenuItemMetadata.getProperties().add(acceleratorPropertyMetadata);
         MenuItemMetadata.getProperties().add(disablePropertyMetadata);
@@ -5009,7 +5062,7 @@
         MenuItemMetadata.getProperties().add(onActionPropertyMetadata);
         MenuItemMetadata.getProperties().add(onMenuValidationPropertyMetadata);
         MenuItemMetadata.getProperties().add(stylePropertyMetadata);
-        MenuItemMetadata.getProperties().add(styleClass_c34_PropertyMetadata);
+        MenuItemMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
         MenuItemMetadata.getProperties().add(textPropertyMetadata);
         MenuItemMetadata.getProperties().add(visiblePropertyMetadata);
 
@@ -5124,7 +5177,7 @@
         NodeMetadata.getProperties().add(VBox_vgrowPropertyMetadata);
 
         NumberAxisMetadata.getProperties().add(forceZeroInRangePropertyMetadata);
-        NumberAxisMetadata.getProperties().add(styleClass_c43_PropertyMetadata);
+        NumberAxisMetadata.getProperties().add(styleClass_c44_PropertyMetadata);
         NumberAxisMetadata.getProperties().add(tickUnitPropertyMetadata);
 
         PaginationMetadata.getProperties().add(currentPageIndexPropertyMetadata);
@@ -5132,9 +5185,9 @@
         PaginationMetadata.getProperties().add(maxPageIndicatorCountPropertyMetadata);
         PaginationMetadata.getProperties().add(pageCountPropertyMetadata);
         PaginationMetadata.getProperties().add(role_PAGINATION_PropertyMetadata);
-        PaginationMetadata.getProperties().add(styleClass_c37_PropertyMetadata);
+        PaginationMetadata.getProperties().add(styleClass_c38_PropertyMetadata);
 
-        PaneMetadata.getProperties().add(childrenPropertyMetadata);
+        PaneMetadata.getProperties().add(children_empty_PropertyMetadata);
 
         ParallelCameraMetadata.getProperties().add(pickOnBounds_false_PropertyMetadata);
         ParallelCameraMetadata.getProperties().add(role_NODE_PropertyMetadata);
@@ -5144,7 +5197,7 @@
 
         PasswordFieldMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         PasswordFieldMetadata.getProperties().add(role_PASSWORD_FIELD_PropertyMetadata);
-        PasswordFieldMetadata.getProperties().add(styleClass_c51_PropertyMetadata);
+        PasswordFieldMetadata.getProperties().add(styleClass_c52_PropertyMetadata);
 
         PathMetadata.getProperties().add(elementsPropertyMetadata);
         PathMetadata.getProperties().add(fill_NULL_PropertyMetadata);
@@ -5165,7 +5218,7 @@
         PieChartMetadata.getProperties().add(labelLineLengthPropertyMetadata);
         PieChartMetadata.getProperties().add(labelsVisiblePropertyMetadata);
         PieChartMetadata.getProperties().add(startAnglePropertyMetadata);
-        PieChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        PieChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
 
         PointLightMetadata.getProperties().add(pickOnBounds_false_PropertyMetadata);
         PointLightMetadata.getProperties().add(role_NODE_PropertyMetadata);
@@ -5225,7 +5278,7 @@
         ProgressIndicatorMetadata.getProperties().add(indeterminate_Boolean_ro_PropertyMetadata);
         ProgressIndicatorMetadata.getProperties().add(progressPropertyMetadata);
         ProgressIndicatorMetadata.getProperties().add(role_PROGRESS_INDICATOR_PropertyMetadata);
-        ProgressIndicatorMetadata.getProperties().add(styleClass_c48_PropertyMetadata);
+        ProgressIndicatorMetadata.getProperties().add(styleClass_c49_PropertyMetadata);
 
         QuadCurveMetadata.getProperties().add(controlXPropertyMetadata);
         QuadCurveMetadata.getProperties().add(controlYPropertyMetadata);
@@ -5243,7 +5296,7 @@
 
         RadioButtonMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         RadioButtonMetadata.getProperties().add(role_RADIO_BUTTON_PropertyMetadata);
-        RadioButtonMetadata.getProperties().add(styleClass_c39_PropertyMetadata);
+        RadioButtonMetadata.getProperties().add(styleClass_c40_PropertyMetadata);
 
         RadioMenuItemMetadata.getProperties().add(selected_Boolean_PropertyMetadata);
         RadioMenuItemMetadata.getProperties().add(styleClass_c7_PropertyMetadata);
@@ -5289,14 +5342,14 @@
         SVGPathMetadata.getProperties().add(pickOnBounds_false_PropertyMetadata);
         SVGPathMetadata.getProperties().add(role_NODE_PropertyMetadata);
 
-        ScatterChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        ScatterChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
 
         ScrollBarMetadata.getProperties().add(blockIncrementPropertyMetadata);
         ScrollBarMetadata.getProperties().add(maxPropertyMetadata);
         ScrollBarMetadata.getProperties().add(minPropertyMetadata);
         ScrollBarMetadata.getProperties().add(orientation_HORIZONTAL_PropertyMetadata);
         ScrollBarMetadata.getProperties().add(role_SCROLL_BAR_PropertyMetadata);
-        ScrollBarMetadata.getProperties().add(styleClass_c32_PropertyMetadata);
+        ScrollBarMetadata.getProperties().add(styleClass_c33_PropertyMetadata);
         ScrollBarMetadata.getProperties().add(unitIncrementPropertyMetadata);
         ScrollBarMetadata.getProperties().add(value_Double_PropertyMetadata);
         ScrollBarMetadata.getProperties().add(visibleAmountPropertyMetadata);
@@ -5314,7 +5367,7 @@
         ScrollPaneMetadata.getProperties().add(prefViewportHeightPropertyMetadata);
         ScrollPaneMetadata.getProperties().add(prefViewportWidthPropertyMetadata);
         ScrollPaneMetadata.getProperties().add(role_SCROLL_PANE_PropertyMetadata);
-        ScrollPaneMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
+        ScrollPaneMetadata.getProperties().add(styleClass_c37_PropertyMetadata);
         ScrollPaneMetadata.getProperties().add(vbarPolicyPropertyMetadata);
         ScrollPaneMetadata.getProperties().add(viewportBoundsPropertyMetadata);
         ScrollPaneMetadata.getProperties().add(vmaxPropertyMetadata);
@@ -5323,7 +5376,7 @@
 
         SeparatorMetadata.getProperties().add(halignment_CENTER_PropertyMetadata);
         SeparatorMetadata.getProperties().add(orientation_HORIZONTAL_PropertyMetadata);
-        SeparatorMetadata.getProperties().add(styleClass_c30_PropertyMetadata);
+        SeparatorMetadata.getProperties().add(styleClass_c31_PropertyMetadata);
         SeparatorMetadata.getProperties().add(valignment_CENTER_PropertyMetadata);
 
         SeparatorMenuItemMetadata.getProperties().add(content_Node_SEPARATOR_PropertyMetadata);
@@ -5335,7 +5388,6 @@
         ShapeMetadata.getProperties().add(role_NODE_PropertyMetadata);
         ShapeMetadata.getProperties().add(smoothPropertyMetadata);
         ShapeMetadata.getProperties().add(stroke_NULL_PropertyMetadata);
-        ShapeMetadata.getProperties().add(strokeDashArrayPropertyMetadata);
         ShapeMetadata.getProperties().add(strokeDashOffsetPropertyMetadata);
         ShapeMetadata.getProperties().add(strokeLineCapPropertyMetadata);
         ShapeMetadata.getProperties().add(strokeLineJoinPropertyMetadata);
@@ -5361,7 +5413,7 @@
         SliderMetadata.getProperties().add(showTickLabelsPropertyMetadata);
         SliderMetadata.getProperties().add(showTickMarksPropertyMetadata);
         SliderMetadata.getProperties().add(snapToTicksPropertyMetadata);
-        SliderMetadata.getProperties().add(styleClass_c38_PropertyMetadata);
+        SliderMetadata.getProperties().add(styleClass_c39_PropertyMetadata);
         SliderMetadata.getProperties().add(value_Double_PropertyMetadata);
 
         SphereMetadata.getProperties().add(divisionsPropertyMetadata);
@@ -5388,7 +5440,7 @@
         StackPaneMetadata.getProperties().add(contentBiasPropertyMetadata);
 
         StackedAreaChartMetadata.getProperties().add(createSymbolsPropertyMetadata);
-        StackedAreaChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        StackedAreaChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
 
         StackedBarChartMetadata.getProperties().add(categoryGapPropertyMetadata);
         StackedBarChartMetadata.getProperties().add(styleClass_c12_PropertyMetadata);
@@ -5449,7 +5501,7 @@
         TableColumnBaseMetadata.getProperties().add(sortablePropertyMetadata);
         TableColumnBaseMetadata.getProperties().add(sortNodePropertyMetadata);
         TableColumnBaseMetadata.getProperties().add(stylePropertyMetadata);
-        TableColumnBaseMetadata.getProperties().add(styleClass_c40_PropertyMetadata);
+        TableColumnBaseMetadata.getProperties().add(styleClass_c41_PropertyMetadata);
         TableColumnBaseMetadata.getProperties().add(textPropertyMetadata);
         TableColumnBaseMetadata.getProperties().add(visiblePropertyMetadata);
         TableColumnBaseMetadata.getProperties().add(width_Double_ro_PropertyMetadata);
@@ -5465,7 +5517,7 @@
         TableViewMetadata.getProperties().add(placeholderPropertyMetadata);
         TableViewMetadata.getProperties().add(role_TABLE_VIEW_PropertyMetadata);
         TableViewMetadata.getProperties().add(sortOrderPropertyMetadata);
-        TableViewMetadata.getProperties().add(styleClass_c47_PropertyMetadata);
+        TableViewMetadata.getProperties().add(styleClass_c48_PropertyMetadata);
         TableViewMetadata.getProperties().add(tableMenuButtonVisiblePropertyMetadata);
 
         TextMetadata.getProperties().add(baselineOffsetPropertyMetadata);
@@ -5489,7 +5541,7 @@
         TextAreaMetadata.getProperties().add(role_TEXT_AREA_PropertyMetadata);
         TextAreaMetadata.getProperties().add(scrollLeftPropertyMetadata);
         TextAreaMetadata.getProperties().add(scrollTopPropertyMetadata);
-        TextAreaMetadata.getProperties().add(styleClass_c49_PropertyMetadata);
+        TextAreaMetadata.getProperties().add(styleClass_c50_PropertyMetadata);
         TextAreaMetadata.getProperties().add(wrapTextPropertyMetadata);
 
         TextFieldMetadata.getProperties().add(alignment_CENTER_LEFT_PropertyMetadata);
@@ -5497,7 +5549,7 @@
         TextFieldMetadata.getProperties().add(onActionPropertyMetadata);
         TextFieldMetadata.getProperties().add(prefColumnCount_12_PropertyMetadata);
         TextFieldMetadata.getProperties().add(role_TEXT_FIELD_PropertyMetadata);
-        TextFieldMetadata.getProperties().add(styleClass_c45_PropertyMetadata);
+        TextFieldMetadata.getProperties().add(styleClass_c46_PropertyMetadata);
 
         TextFlowMetadata.getProperties().add(baselineOffsetPropertyMetadata);
         TextFlowMetadata.getProperties().add(contentBiasPropertyMetadata);
@@ -5505,14 +5557,17 @@
         TextFlowMetadata.getProperties().add(role_TEXT_PropertyMetadata);
         TextFlowMetadata.getProperties().add(textAlignmentPropertyMetadata);
 
+        TextFormatterMetadata.getProperties().add(value_Object_PropertyMetadata);
+
         TextInputControlMetadata.getProperties().add(editable_true_PropertyMetadata);
         TextInputControlMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         TextInputControlMetadata.getProperties().add(fontPropertyMetadata);
         TextInputControlMetadata.getProperties().add(length_Integer_ro_PropertyMetadata);
         TextInputControlMetadata.getProperties().add(promptTextPropertyMetadata);
-        TextInputControlMetadata.getProperties().add(role_TEXT_FIELD_PropertyMetadata);
-        TextInputControlMetadata.getProperties().add(styleClass_c49_PropertyMetadata);
+        TextInputControlMetadata.getProperties().add(role_PASSWORD_FIELD_PropertyMetadata);
+        TextInputControlMetadata.getProperties().add(styleClass_c50_PropertyMetadata);
         TextInputControlMetadata.getProperties().add(textPropertyMetadata);
+        TextInputControlMetadata.getProperties().add(textFormatterPropertyMetadata);
 
         TilePaneMetadata.getProperties().add(alignment_TOP_LEFT_PropertyMetadata);
         TilePaneMetadata.getProperties().add(contentBiasPropertyMetadata);
@@ -5531,7 +5586,7 @@
         TitledPaneMetadata.getProperties().add(collapsiblePropertyMetadata);
         TitledPaneMetadata.getProperties().add(content_Node_NULL_PropertyMetadata);
         TitledPaneMetadata.getProperties().add(contentBiasPropertyMetadata);
-        TitledPaneMetadata.getProperties().add(expandedPropertyMetadata);
+        TitledPaneMetadata.getProperties().add(expanded_true_PropertyMetadata);
         TitledPaneMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         TitledPaneMetadata.getProperties().add(mnemonicParsing_false_PropertyMetadata);
         TitledPaneMetadata.getProperties().add(role_TITLED_PANE_PropertyMetadata);
@@ -5541,7 +5596,7 @@
         ToggleButtonMetadata.getProperties().add(focusTraversable_true_PropertyMetadata);
         ToggleButtonMetadata.getProperties().add(role_TOGGLE_BUTTON_PropertyMetadata);
         ToggleButtonMetadata.getProperties().add(selected_Boolean_PropertyMetadata);
-        ToggleButtonMetadata.getProperties().add(styleClass_c42_PropertyMetadata);
+        ToggleButtonMetadata.getProperties().add(styleClass_c43_PropertyMetadata);
         ToggleButtonMetadata.getProperties().add(toggleGroupPropertyMetadata);
 
         ToolBarMetadata.getProperties().add(items_Node_PropertyMetadata);
@@ -5589,7 +5644,7 @@
         TreeTableViewMetadata.getProperties().add(showRootPropertyMetadata);
         TreeTableViewMetadata.getProperties().add(sortModePropertyMetadata);
         TreeTableViewMetadata.getProperties().add(sortOrderPropertyMetadata);
-        TreeTableViewMetadata.getProperties().add(styleClass_c31_PropertyMetadata);
+        TreeTableViewMetadata.getProperties().add(styleClass_c32_PropertyMetadata);
         TreeTableViewMetadata.getProperties().add(tableMenuButtonVisiblePropertyMetadata);
         TreeTableViewMetadata.getProperties().add(treeColumnPropertyMetadata);
 
@@ -5617,7 +5672,7 @@
         ValueAxisMetadata.getProperties().add(minorTickLengthPropertyMetadata);
         ValueAxisMetadata.getProperties().add(minorTickVisiblePropertyMetadata);
         ValueAxisMetadata.getProperties().add(scalePropertyMetadata);
-        ValueAxisMetadata.getProperties().add(styleClass_c43_PropertyMetadata);
+        ValueAxisMetadata.getProperties().add(styleClass_c44_PropertyMetadata);
         ValueAxisMetadata.getProperties().add(tickLabelFormatterPropertyMetadata);
         ValueAxisMetadata.getProperties().add(upperBoundPropertyMetadata);
         ValueAxisMetadata.getProperties().add(zeroPositionPropertyMetadata);
@@ -5636,7 +5691,7 @@
         WebViewMetadata.getProperties().add(prefHeight_60000_PropertyMetadata);
         WebViewMetadata.getProperties().add(prefWidth_80000_PropertyMetadata);
         WebViewMetadata.getProperties().add(resizable_Boolean_ro_PropertyMetadata);
-        WebViewMetadata.getProperties().add(styleClass_c46_PropertyMetadata);
+        WebViewMetadata.getProperties().add(styleClass_c47_PropertyMetadata);
         WebViewMetadata.getProperties().add(width_Double_ro_PropertyMetadata);
         WebViewMetadata.getProperties().add(zoomPropertyMetadata);
 
@@ -5644,7 +5699,7 @@
         XYChartMetadata.getProperties().add(alternativeRowFillVisiblePropertyMetadata);
         XYChartMetadata.getProperties().add(horizontalGridLinesVisiblePropertyMetadata);
         XYChartMetadata.getProperties().add(horizontalZeroLineVisiblePropertyMetadata);
-        XYChartMetadata.getProperties().add(styleClass_c35_PropertyMetadata);
+        XYChartMetadata.getProperties().add(styleClass_c36_PropertyMetadata);
         XYChartMetadata.getProperties().add(verticalGridLinesVisiblePropertyMetadata);
         XYChartMetadata.getProperties().add(verticalZeroLineVisiblePropertyMetadata);
         XYChartMetadata.getProperties().add(XAxisPropertyMetadata);
@@ -5684,6 +5739,7 @@
         hiddenProperties.add(new PropertyName("engine"));
         hiddenProperties.add(new PropertyName("eventDispatcher"));
         hiddenProperties.add(new PropertyName("expandedPane"));
+        hiddenProperties.add(new PropertyName("filter"));
         hiddenProperties.add(new PropertyName("focused"));
         hiddenProperties.add(new PropertyName("focusModel"));
         hiddenProperties.add(new PropertyName("graphicsContext2D"));
@@ -5731,6 +5787,7 @@
         hiddenProperties.add(new PropertyName("showing"));
         hiddenProperties.add(new PropertyName("sortPolicy"));
         hiddenProperties.add(new PropertyName("skin"));
+        hiddenProperties.add(new PropertyName("strokeDashArray"));
         hiddenProperties.add(new PropertyName("styleableParent"));
         hiddenProperties.add(new PropertyName("tableView"));
         hiddenProperties.add(new PropertyName("tabPane"));
@@ -5741,6 +5798,7 @@
         hiddenProperties.add(new PropertyName("userData"));
         hiddenProperties.add(new PropertyName("useSystemMenuBar"));
         hiddenProperties.add(new PropertyName("valueChanging"));
+        hiddenProperties.add(new PropertyName("valueConverter"));
         hiddenProperties.add(new PropertyName("valueFactory"));
         hiddenProperties.add(new PropertyName("visibleLeafColumns"));
 
@@ -5819,7 +5877,12 @@
     //     javafx.scene.control.TableView -> items : Property items has no section/subsection assigned
 
 
-    // No uncertified properties have been found
+    // The following properties are uncertified:
+    //     axisSortingPolicy
+    //     buttonTypes
+    //     expandableContent
+    //     redoable
+    //     undoable
 
 }
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/CssInternal.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/CssInternal.java	Thu Aug 28 17:49:22 2014 -0700
@@ -78,16 +78,25 @@
     private final static URL caspianThemeUrl = Deprecation.getCaspianStylesheetURL();
     private final static URL caspianHighContrastThemeUrl = Deprecation.getCaspianHighContrastStylesheetURL();
     private final static URL caspianEmbeddedThemeUrl = Deprecation.getCaspianEmbeddedStylesheetURL();
+    private final static URL caspianEmbeddedHighContrastThemeUrl = Deprecation.getCaspianEmbeddedHighContrastStylesheetURL();
     private final static URL caspianEmbeddedQVGAThemeUrl = Deprecation.getCaspianEmbeddedQVGAStylesheetURL();
+    private final static URL caspianEmbeddedQVGAHighContrastThemeUrl = Deprecation.getCaspianEmbeddedQVGAHighContrastStylesheetURL();
     private final static URL modenaThemeUrl = Deprecation.getModenaStylesheetURL();
     private final static URL modenaTouchThemeUrl = Deprecation.getModenaTouchStylesheetURL();
     private final static URL modenaHighContrastBlackonwhiteThemeUrl = Deprecation.getModenaHighContrastBlackonwhiteStylesheetURL();
     private final static URL modenaHighContrastWhiteonblackThemeUrl = Deprecation.getModenaHighContrastWhiteonblackStylesheetURL();
     private final static URL modenaHighContrastYellowonblackThemeUrl = Deprecation.getModenaHighContrastYellowonblackStylesheetURL();
+    private final static URL modenaTouchHighContrastBlackonwhiteThemeUrl = Deprecation.getModenaTouchHighContrastBlackonwhiteStylesheetURL();
+    private final static URL modenaTouchHighContrastWhiteonblackThemeUrl = Deprecation.getModenaTouchHighContrastWhiteonblackStylesheetURL();
+    private final static URL modenaTouchHighContrastYellowonblackThemeUrl = Deprecation.getModenaTouchHighContrastYellowonblackStylesheetURL();
     private final static URL[] themeUrls = {
-        caspianThemeUrl, caspianHighContrastThemeUrl, caspianEmbeddedThemeUrl, caspianEmbeddedQVGAThemeUrl,
+        caspianThemeUrl, caspianHighContrastThemeUrl, caspianEmbeddedThemeUrl,
+        caspianEmbeddedHighContrastThemeUrl, caspianEmbeddedQVGAThemeUrl,
+        caspianEmbeddedQVGAHighContrastThemeUrl,
         modenaThemeUrl, modenaTouchThemeUrl, modenaHighContrastBlackonwhiteThemeUrl,
-        modenaHighContrastWhiteonblackThemeUrl, modenaHighContrastYellowonblackThemeUrl
+        modenaHighContrastWhiteonblackThemeUrl, modenaHighContrastYellowonblackThemeUrl,
+        modenaTouchHighContrastBlackonwhiteThemeUrl, modenaTouchHighContrastWhiteonblackThemeUrl,
+        modenaTouchHighContrastYellowonblackThemeUrl
     };
 
     /**
@@ -148,15 +157,11 @@
     }
 
     public static List<String> getThemeStyleClasses(Theme theme) {
-        List<URL> themeStyleSheets = EditorPlatform.getThemeStylesheetURLs(theme);
-        // Add the Modena css, which is not added in the list
-        themeStyleSheets.add(EditorPlatform.getPlatformThemeStylesheetURL());
+        URL themeStyleSheet = EditorPlatform.getThemeStylesheetURL(theme);
         Set<String> themeClasses = new HashSet<>();
-        for (URL themeStyleSheet : themeStyleSheets) {
-            // For Theme css, we need to get the text css (.css) to be able to parse it.
-            // (instead of the default binary format .bss)
-            themeClasses.addAll(getStyleClasses(Deprecation.getThemeTextStylesheet(themeStyleSheet)));
-        }
+        // For Theme css, we need to get the text css (.css) to be able to parse it.
+        // (instead of the default binary format .bss)
+        themeClasses.addAll(getStyleClasses(Deprecation.getThemeTextStylesheet(themeStyleSheet)));
         return new ArrayList<>(themeClasses);
     }
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java	Thu Aug 28 17:49:22 2014 -0700
@@ -232,17 +232,27 @@
     }
 
     public static URL getCaspianHighContrastStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/caspian/highcontrast.bss"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-highContrast.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
     public static URL getCaspianEmbeddedStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/caspian/embedded.bss"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    public static URL getCaspianEmbeddedHighContrastStylesheetURL() {
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded-highContrast.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
     public static URL getCaspianEmbeddedQVGAStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/caspian/embedded-qvga.bss"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded-qvga.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    public static URL getCaspianEmbeddedQVGAHighContrastStylesheetURL() {
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded-qvga-highContrast.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
@@ -252,22 +262,37 @@
     }
 
     public static URL getModenaTouchStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/modena/touch.bss"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-touch.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
     public static URL getModenaHighContrastBlackonwhiteStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/modena/blackOnWhite.css"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-highContrast-blackOnWhite.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
     public static URL getModenaHighContrastWhiteonblackStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/modena/whiteOnBlack.css"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-highContrast-whiteOnBlack.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
     public static URL getModenaHighContrastYellowonblackStylesheetURL() {
-        final String resourceName = "com/sun/javafx/scene/control/skin/modena/yellowOnBlack.css"; //NOI18N
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-highContrast-yellowOnBlack.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    public static URL getModenaTouchHighContrastBlackonwhiteStylesheetURL() {
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-touch-highContrast-blackOnWhite.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    public static URL getModenaTouchHighContrastWhiteonblackStylesheetURL() {
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-touch-highContrast-whiteOnBlack.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    public static URL getModenaTouchHighContrastYellowonblackStylesheetURL() {
+        final String resourceName = "com/oracle/javafx/scenebuilder/kit/util/css/modena/modena-touch-highContrast-yellowOnBlack.css"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/paintpicker/gradientpicker/GradientPicker.java	Wed Aug 27 07:55:19 2014 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/paintpicker/gradientpicker/GradientPicker.java	Thu Aug 28 17:49:22 2014 -0700
@@ -57,8 +57,6 @@
 import javafx.collections.FXCollections;
 import javafx.event.ActionEvent;
 import javafx.event.Event;
-import javafx.event.EventHandler;
-import javafx.event.EventType;
 import javafx.scene.control.CheckBox;
 import javafx.scene.control.ChoiceBox;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded-highContrast.css	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+/* Once RT-38395 is fixed paths below might start with com/sun/javafx/scene/control/skin/caspian/ */
+@import "caspian.css";
+@import "embedded.css";
+@import "highcontrast.css";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded-qvga-highContrast.css	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+/* Once RT-38395 is fixed paths below might start with com/sun/javafx/scene/control/skin/caspian/ */
+@import "caspian.css";
+@import "embedded.css";
+@import "embedded-qvga.css";
+@import "highcontrast.css";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded-qvga.css	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+/* Once RT-38395 is fixed paths below might start with com/sun/javafx/scene/control/skin/caspian/ */
+@import "caspian.css";
+@import "embedded.css";
+@import "embedded-qvga.css";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-embedded.css	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+/* Once RT-38395 is fixed paths below might start with com/sun/javafx/scene/control/skin/caspian/ */
+@import "caspian.css";
+@import "embedded.css";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian-highContrast.css	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+/* Once RT-38395 is fixed paths below might start with com/sun/javafx/scene/control/skin/caspian/ */
+@import "caspian.css";
+@import "highcontrast.css";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/css/caspian/caspian.css	Thu Aug 28 17:49:22 2014 -0700
@@ -0,0 +1,4163 @@
+/*
+ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 
+ *  
+ * This code is free software; you can redistribute it and/or modify it 
+ * under the terms of the GNU General Public License version 2 only, as 
+ * published by the Free Software Foundation.  Oracle designates this 
+ * particular file as subject to the "Classpath" exception as provided 
+ * by Oracle in the LICENSE file that accompanied this code. 
+ *  
+ * This code is distributed in the hope that it will be useful, but WITHOUT 
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
+ * version 2 for more details (a copy is included in the LICENSE file that 
+ * accompanied this code). 
+ *  
+ * You should have received a copy of the GNU General Public License version 
+ * 2 along with this work; if not, write to the Free Software Foundation, 
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 
+ *  
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 
+ * or visit www.oracle.com if you need additional information or have any 
+ * questions.
+ */
+
+/*******************************************************************************
+ *                                                                             *
+ * CSS Styles for core infrastructure bits.  The .root section provides the   *
+ * overall default font and colors used by the rest of the sections.           *
+ *                                                                             *
+ ******************************************************************************/
+
+.root {
+    /***************************************************************************
+     *                                                                         *
+     * The main color palette from which the rest of the colors are derived.   *
+     *                                                                         *
+     **************************************************************************/
+
+    /* A light grey that is the base color for objects.  Instead of using
+     * -fx-base directly, the sections in this file will typically use -fx-color.
+     */
+    -fx-base: #d0d0d0;
+
+    /* A very light grey used for the background of windows.  See also
+     * -fx-text-background-color, which should be used as the -fx-text-fill
+     * value for text painted on top of backgrounds colored with -fx-background.
+     */
+    -fx-background: #f4f4f4;
+
+    /* Used for the inside of text boxes, password boxes, lists, trees, and
+     * tables.  See also -fx-text-inner-color, which should be used as the
+     * -fx-text-fill value for text painted on top of backgrounds colored
+     * with -fx-control-inner-background.
+     */
+    -fx-control-inner-background: white;
+
+    /* One of these colors will be chosen based upon a ladder calculation
+     * that uses the brightness of a background color.  Instead of using these
+     * colors directly as -fx-text-fill values, the sections in this file should
+     * use a derived color to match the background in use.  See also:
+     *
+     * -fx-text-base-color for text on top of -fx-base, -fx-color, and -fx-body-color
+     * -fx-text-background-color for text on top of -fx-background
+     * -fx-text-inner-color for text on top of -fx-control-inner-color
+     * -fx-selection-bar-text for text on top of -fx-selection-bar
+     */
+    -fx-dark-text-color: black;
+    -fx-mid-text-color: #292929;
+    -fx-light-text-color: white;
+
+    /* A bright blue for highlighting/accenting objects.  For example: selected
+     * text; selected items in menus, lists, trees, and tables; progress bars;
+     * default buttons.
+     */
+    -fx-accent: #0093ff;
+
+    /* A bright blue for the focus indicator of objects. Typically used as the
+     * first color in -fx-background-color for the "focused" pseudo-class. Also
+     * typically used with insets of -1.4 to provide a glowing effect.
+     *
+     * TODO: should this be derived from -fx-accent?
+     */
+    -fx-focus-color: #0093ff;
+
+    /* The color that is used in styling controls. The default value is based
+     * on -fx-base, but is changed by pseudoclasses to change the base color.
+     * For example, the "hover" pseudoclass will typically set -fx-color to
+     * -fx-hover-base (see below) and the "armed" pseudoclass will typically
+     * set -fx-color to -fx-pressed-base.
+     */
+    -fx-color: -fx-base;
+
+    /* The opacity level to use for the "disabled" pseudoclass.
+     */
+    -fx-disabled-opacity: 0.4;
+
+    /***************************************************************************
+     *                                                                         *
+     * Colors that are derived from the main color palette.                    *
+     *                                                                         *
+     **************************************************************************/
+
+    /* A little lighter than -fx-base and used as the -fx-color for the
+     * "hovered" pseudoclass state.
+     */
+    -fx-hover-base: ladder(
+        -fx-base,
+        derive(-fx-base,20%) 20%,
+        derive(-fx-base,30%) 35%,
+        derive(-fx-base,40%) 50%
+     );
+
+    /* A little darker than -fx-base and used as the -fx-color for the
+     * "armed" pseudoclass state.
+     *
+     * TODO: should this be renamed to -fx-armed-base?
+     */
+    -fx-pressed-base: derive(-fx-base,-20%);
+
+    /* Used to specify the body color for focused objects.  By default, it's
+     * the same as -fx-base (i.e., the body color doesn't change when a control
+     * gets focus).
+     */
+    -fx-focused-base: -fx-base;
+
+    /* The color to use for -fx-text-fill when text is to be painted on top of
+     * a background filled with the -fx-background color.
+     */
+    -fx-text-background-color: ladder(
+        -fx-background,
+        -fx-light-text-color 45%,
+        -fx-dark-text-color  46%,
+        -fx-dark-text-color  59%,
+        -fx-mid-text-color   60%
+     );
+
+    /* The default color for all text.  Sections should change the -fx-text-fill
+     * property if change the background color to something else.  See also:
+     *
+     * -fx-text-base-color for text on top of -fx-base, -fx-color, and -fx-body-color
+     * -fx-text-background-color for text on top of -fx-background
+     * -fx-text-inner-color for text on top of -fx-control-inner-color
+     * -fx-selection-bar-text for text on top of -fx-selection-bar
+     */
+    -fx-text-fill: -fx-text-background-color;
+
+    /* A little darker than -fx-color and used to draw boxes around objects such
+     * as progress bars, scroll bars, scroll panes, trees, tables, and lists.
+     */
+    -fx-box-border: ladder(
+        -fx-color,
+        black 20%,
+        derive(-fx-color,-30%) 30%
+    );
+
+    /* Darker than -fx-background and used to draw boxes around text boxes and
+     * password boxes.
+     */
+    -fx-text-box-border: ladder(
+        -fx-background,
+        black 10%,
+        derive(-fx-background, -15%) 30%
+    );
+
+    /* Typically lighter than -fx-background and used to provide a small
+     * highlight under controls and tick marks for checkboxes and radio buttons.
+     * Often used with an insets of 0 0 -1 0, and is also often the first
+     * color in a -fx-background-color list.  Also is typically replaced by
+     * -fx-focus-color with an insets of -1.4 in the "focused" pseudoclass.
+     */
+    -fx-shadow-highlight-color: ladder(
+        -fx-background,
+        transparent 0%,
+        derive(-fx-background,40%)   5%,
+        derive(-fx-background,60%)  70%,
+        derive(-fx-background,100%) 85%,
+        derive(-fx-background,100%) 97%,
+        derive(-fx-background,-10%) 97.5%
+      );
+
+    /* A gradient that goes from a little darker than -fx-color on the top to
+     * even more darker than -fx-color on the bottom.  Typically is the second
+     * color in the -fx-background-color list as the small thin border around
+     * a control. It is typically the same size as the control (i.e., insets
+     * are 0).
+     */
+    -fx-outer-border: linear-gradient(
+        to bottom,
+        derive(-fx-color,-9%) 0%, 
+        derive(-fx-color,-33%) 100%
+    );
+
+    /* A gradient that goes from a bit lighter than -fx-color on the top to
+     * a little darker at the bottom.  Typically is the third color in the
+     * -fx-background-color list as a thin highlight inside the outer border.
+     * Insets are typically 1.
+     */
+    -fx-inner-border: linear-gradient(
+        to bottom,
+        ladder(-fx-color, 
+               derive(-fx-color,80%) 60%, 
+               white 82%) 0%,
+        ladder(-fx-color, 
+               derive(-fx-color,20%) 10%, 
+               derive(-fx-color,-10%) 80%) 100%
+    );
+
+    -fx-inner-border-horizontal: linear-gradient(
+        to right,
+        ladder(-fx-color, 
+               derive(-fx-color,80%) 60%, 
+               white 82%) 0%,
+        ladder(-fx-color, 
+               derive(-fx-color,20%) 10%, 
+               derive(-fx-color,-10%) 80%) 100%
+    );
+
+    -fx-inner-border-bottomup: linear-gradient(
+        to top,
+        ladder(-fx-color, 
+               derive(-fx-color,80%) 60%, 
+               white 82%) 0%,
+        ladder(-fx-color, 
+               derive(-fx-color,20%) 10%, 
+               derive(-fx-color,-10%) 80%) 100%);
+
+    /* A gradient that goes from a little lighter than -fx-color at the top to
+     * a little darker than -fx-color at the bottom and is used to fill the
+     * body of many controls such as buttons.  Typically is the fourth color
+     * in the -fx-background-color list and represents main body of the control.
+     * Insets are typically 2.
+     */
+    -fx-body-color: linear-gradient(
+        to bottom,
+        derive(-fx-color,34%) 0%,
+        derive(-fx-color,-18%) 100%
+    );
+        
+    -fx-body-color-bottomup:  linear-gradient(
+        to top,
+        derive(-fx-color,34%) 0%,
+        derive(-fx-color,-18%) 100%
+    );
+
+    /* The color to use as -fx-text-fill when painting text on top of
+     * backgrounds filled with -fx-base, -fx-color, and -fx-body-color.
+     */
+    -fx-text-base-color: ladder(
+        -fx-color,
+        -fx-light-text-color 45%,
+        -fx-dark-text-color  46%,
+        -fx-dark-text-color  59%,
+        -fx-mid-text-color   60%
+    );
+
+    /* The color to use as -fx-text-fill when painting text on top of
+     * backgrounds filled with -fx-control-inner-background.
+     */
+    -fx-text-inner-color: ladder(
+        -fx-control-inner-background,
+        -fx-light-text-color 45%,
+        -fx-dark-text-color  46%,
+        -fx-dark-text-color  59%,
+        -fx-mid-text-color   60%
+    );
+
+    /* The color to use for small mark-like objects such as checks on check
+     * boxes, filled in circles in radio buttons, arrows on scroll bars, etc.
+     */
+    -fx-mark-color: ladder(
+        -fx-color,
+        white 30%,
+        derive(-fx-color,-63%) 31%
+    );
+
+    /* The small thin light "shadow" for mark-like objects. Typically used in
+     * conjunction with -fx-mark-color with an insets of 1 0 -1 0.
+     */
+    -fx-mark-highlight-color: ladder(
+        -fx-color,
+        derive(-fx-color,80%) 60%,
+        white 70%
+    );
+
+    /* Background for items in list like things such as menus, lists, trees,
+     * and tables.
+     *
+     * TODO: it seems like this should be based upon -fx-accent and we should
+     * remove the setting -fx-background in all the sections that use
+     * -fx-selection-bar.
+     */
+    -fx-selection-bar: linear-gradient(
+        to bottom,
+        derive(-fx-background,-7%) 0%,
+        derive(-fx-background,-34%) 100%
+    );
+
+    /* The color to use as -fx-text-fill when painting text on top of
+     * backgrounds filled with -fx-selection-bar.
+     *
+     * TODO: it seems like this should be derived from -fx-selection-bar.
+     */
+    -fx-selection-bar-text: ladder(
+        -fx-background,
+        -fx-light-text-color 50%,
+        -fx-mid-text-color   51%
+    );
+
+    /* The default border color for a tab.
+     *
+     * TODO: should this be -fx-box-border or derived from some other color?
+     */
+    -fx-tab-border-color: -fx-box-border;
+
+    /* These are needed for Popup */
+    -fx-background-color: inherit;
+    -fx-background-radius: inherit;
+    -fx-background-insets: inherit;
+    -fx-padding: inherit;
+    
+    /* The color to use in ListView/TreeView/TableView to indicate hover. */
+    -fx-cell-hover-color: #cce3f4;
+    
+    -fx-cell-focus-inner-border: #85b9de;
+    
+    /* The colors to use in Pagination */
+    -fx-page-bullet-border: #acacac;    
+    -fx-page-indicator-hover-border: #accee5;
+    
+    
+}
+
+.mnemonic-underline {
+    -fx-stroke: transparent;
+}
+
+.text {
+    -fx-font-smoothing-type: lcd;
+}
+
+
+/*******************************************************************************
+ *******************************************************************************
+ **                                                                           **
+ ** CSS Sections for each control.  In general, each control will have a main **
+ ** section that defines the following:                                       **
+ **                                                                           **
+ ** .control-name {                                                           **
+ **     -fx-background-color: a, b, c, d                                      **
+ **     -fx-background-insets: e, f, g, h                                     **
+ **     -fx-background-radius: i, j, k, l                                     **
+ **     -fx-padding: m                                                        **
+ **     -fx-text-fill: n                                                      **
+ ** }                                                                         **
+ **                                                                           **
+ ** where:                                                                    **
+ **                                                                           **
+ ** -fx-background-color, -fx-background-insets, and -fx-background-radius    **
+ ** are parallel arrays that specify background colors for the control.       **
+ **                                                                           **
+ ** -fx-background represents a sequence of colors for regions that will be   **
+ ** drawn, one on top of the other.                                           **
+ **                                                                           **
+ ** -fx-background-insets is a comma separated list of insets that represent  **
+ ** the top right bottom left insets from the edge of the control for each    **
+ ** color specified in the -fx-background-color list.  A single size for      **
+ ** an inset means the same inset will be used for the top right bottom left  **
+ ** values.  A negative inset will draw outside the bounds of the control.    **
+ **                                                                           **
+ ** -fx-background-radius is a comma separated list of values that represent  **
+ ** the radii of the top right, bottom right, bottom left, and top left       **
+ ** corners of the rectangle associated with the rectangle from the           **
+ ** -fx-background-color list.  As with insets, a single size for a radius    **
+ ** means the same radius will be used for all corners.                       **
+ **                                                                           **
+ ** Typically, the following values will be used:                             **
+ **                                                                           **
+ **    a/e/i = -fx-shadow-highlight-color, 0 0 -1 0, 5                        **
+ **            Draws a background highlight dropped 1 pixel down with         **
+ **            corners with a 5 pixel radius.                                 **
+ **    b/f/j = -fx-outer-border, 0, 5                                         **
+ **            Draws an outer border the size of the control (insets = 0) and **
+ **            with corners with a 5 pixel radius.                            **
+ **    c/g/k = -fx-inner-border, 1, 4                                         **
+ **            Draws an inner border inset 1 pixel from the control edge and  **
+ **            with corners with a smaller radius (radius = 4).               **
+ **    d/h/l = -fx-body-color, 2, 3                                           **
+ **            Draws the body last, inset 2 pixels from the control edge and  **
+ **            with corners with an even smaller radius (radius = 3).         **
+ **    m     = Padding from the edge of the control to the outer edge of the  **
+ **            skin content.                                                  **
+ **    n     = If specified, the color chosen for -fx-text-fill should match  **
+ **            the innermost color from -fx-background-colors (e.g., 'd').    **
+ **            See the -fx-text-fill entry in .scene for more information.    **
+ **                                                                           **
+ ** The control will also typically define pseudoclass sections for when it   **
+ ** is focused, when the mouse is hovering over it ("hover") and when the     **
+ ** mouse button is being held down on it (e.g., "armed").                    **
+ **                                                                           **
+ ** For example, in the "focused" pseudoclass, -fx-focus-color will typically **
+ ** just replace -fx-shadow-highlight-color and will be drawn so it extents   **
+ ** outside the control with a glowing effect.  The glowing effect is         **
+ ** achieved by using a non-integer insets value of -1.4 and the radius       **
+ ** is adjusted accordingly.                                                  **
+ **                                                                           **
+ ** .control-name:focused {                                                   **
+ **     -fx-background-color: -fx-focus-color, b, c, d                        **
+ **     -fx-background-insets: -1.4, f, g, h                                  **
+ **     -fx-background-radius: 6.4, j, k, l                                   **
+ **  }                                                                        **
+ **                                                                           **
+ ** In the "hover" pseudoclass, the -fx-color is replaced with -fx-hover-base **
+ ** which will result in a re-derivation of the other colors in               **
+ ** -fx-background-colors:                                                    **
+ **                                                                           **
+ ** .control-name:hover {                                                     **
+ **     -fx-color: -fx-hover-base;                                            **
+ ** }                                                                         **
+ **                                                                           **
+ ** In the "armed" pseudoclass, the -fx-color is replaced with                **
+ ** -fx-pressed-base, which will result in a rederivation of the other colors **
+ ** in -fx-background-colors:                                                 **
+ **                                                                           **
+ ** .control-name:armed {                                                     **
+ **     -fx-color: -fx-pressed-base;                                          **
+ ** }                                                                         **
+ **                                                                           **
+ ** The control will also typically include a  "disabled" pseudoclass which   **
+ ** makes the component transparent:                                          **
+ **                                                                           **
+ ** .control-name:disabled {                                                  **
+ **     -fx-opacity: -fx-disabled-opacity;                                    **
+ ** }                                                                         **
+ **                                                                           **
+ *******************************************************************************
+ ******************************************************************************/
+
+/*******************************************************************************
+ *******************************************************************************
+ **                                                                           **
+ ** NOTE on em values:  em values are used for padding and other sizing       **
+ ** throughout this file.  Size values in ems represent fraction of the       **
+ ** font size in use.  As used in this file, each 1/12th represents a pixel   **
+ ** based upon the default size of 12px.  Here's a table for quick reference: **
+ **                                                                           **
+ ** 1px:    0.083333em                                                       **
+ ** 2px:    0.166667em                                                        **
+ ** 3px:    0.25em                                                            **
+ ** 4px:    0.333333em                                                        **
+ ** 5px:    0.416667em                                                        **
+ ** 6px:    0.5em                                                             **
+ ** 7px:    0.583333em                                                        **
+ ** 8px:    0.666667em                                                        **
+ ** 9px:    0.75em                                                            **
+ ** 10px:   0.833333em                                                        **
+ ** 11px:   0.916667em                                                        **
+ ** 12px:   1.0em                                                             **
+ **                                                                           **
+ *******************************************************************************
+ ******************************************************************************/
+
+/*******************************************************************************
+ *                                                                             *
+ * Label                                                                       *
+ *                                                                             *
+ ******************************************************************************/
+
+.label {
+    -fx-text-fill: -fx-text-background-color;
+}
+
+.label:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.label:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+} 
+
+/* The opacity of the parent is applied to the children.  So we make the
+ * opacity 1.0 here to avoid double translucency.
+ */
+/*:disabled > * > .label {
+    -fx-opacity: 1.0;
+}*/
+
+/*******************************************************************************
+ *                                                                             *
+ * Button                                                                      *
+ *                                                                             *
+ ******************************************************************************/
+
+.button {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
+    -fx-background-radius: 5, 5, 4, 3;
+    -fx-padding: 0.166667em 0.833333em 0.25em 0.833333em; /* 2 10 3 10 */
+    -fx-text-fill: -fx-text-base-color;
+    -fx-alignment: CENTER;
+    -fx-content-display: LEFT;
+}
+
+.button:focused {
+    -fx-color: -fx-focused-base;
+    -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: -1.4, 0, 1, 2;
+    -fx-background-radius:  6.4, 5, 4, 3;
+}
+
+.button:hover {
+    -fx-color: -fx-hover-base;
+}
+
+.button:armed {
+    -fx-color: -fx-pressed-base;
+}
+ 
+.button:default {
+    -fx-base: -fx-accent;
+}
+
+.button:cancel {
+}
+
+.button:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.button:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+}
+/*******************************************************************************
+ *                                                                             *
+ * ToggleButton                                                                *
+ *                                                                             *
+ ******************************************************************************/
+
+.toggle-button {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
+    -fx-background-radius: 5, 5, 4, 3;
+    -fx-padding: 0.166667em 0.833333em 0.25em 0.833333em; /* 2 10 3 10 */
+    -fx-text-fill: -fx-text-base-color;
+    -fx-alignment: CENTER;
+    -fx-content-display: LEFT;
+}
+
+.toggle-button:focused {
+    -fx-color: -fx-focused-base;
+    -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: -1.4, 0, 1, 2;
+    -fx-background-radius: 6.4, 5, 4, 3;
+}
+
+.toggle-button:hover {
+    -fx-color: -fx-hover-base;
+}
+
+.toggle-button:armed {
+    -fx-color: -fx-pressed-base;
+}
+
+.toggle-button:selected {
+    -fx-background-color:
+        -fx-shadow-highlight-color,
+        linear-gradient(to bottom, derive(-fx-color,-90%) 0%, derive(-fx-color,-60%) 100%),
+        linear-gradient(to bottom, derive(-fx-color,-60%) 0%, derive(-fx-color,-35%) 50%, derive(-fx-color,-30%) 98%, derive(-fx-color,-50%) 100%),
+        linear-gradient(to right, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 10%, rgba(0,0,0,0) 90%, rgba(0,0,0,0.3) 100%);
+    -fx-background-insets: 0 0 -1 0, 0, 1, 1;
+    /* TODO: -fx-text-fill should be derived */
+    -fx-text-fill: -fx-light-text-color;
+}
+
+.toggle-button:selected:focused {
+    -fx-color: -fx-focused-base;
+    -fx-background-color:
+        -fx-focus-color,
+        linear-gradient(to bottom, derive(-fx-color,-90%) 0%, derive(-fx-color,-60%) 100%),
+        linear-gradient(to bottom, derive(-fx-color,-60%) 0%, derive(-fx-color,-35%) 50%, derive(-fx-color,-30%) 98%, derive(-fx-color,-50%) 100%),
+        linear-gradient(to right, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 10%, rgba(0,0,0,0) 90%, rgba(0,0,0,0.3) 100%);
+    -fx-background-insets: -1.4, 0, 1, 1;
+}
+
+.toggle-button:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.toggle-button:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+} 
+
+/*******************************************************************************
+ *                                                                             *
+ * RadioButton                                                                 *
+ *                                                                             *
+ ******************************************************************************/
+
+.radio-button {
+    -fx-label-padding: 0.0em 0.0em 0.0em 0.416667em; /* 0 0 0 5 */
+    -fx-text-fill: -fx-text-background-color;
+}
+
+.radio-button:focused {
+    -fx-color: -fx-focused-base;
+}
+
+.radio-button > .radio  {
+   -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+   -fx-background-insets: 0 0 -1 0,  0,  1,  2;
+   -fx-background-radius: 1.0em; /* large value to make sure this remains circular */
+   -fx-padding: 0.333333em; /* 4 -- padding from outside edge to the inner black dot */
+}
+
+.radio-button:focused > .radio {
+    -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-radius: 1.0em; /* large value to make sure this remains circular */
+    -fx-background-insets: -1.4, 0, 1, 2;
+}
+
+.radio-button:hover > .radio {
+    -fx-color: -fx-hover-base;
+}
+.radio-button:armed > .radio {
+    -fx-color: -fx-pressed-base;
+}
+
+.radio-button > .radio > .dot {
+   -fx-background-color: transparent;
+   -fx-background-insets: 0;
+   -fx-background-radius: 1.0em; /* large value to make sure this remains circular */
+   -fx-padding: 0.25em; /* 3 -- radius of the inner black dot when selected */
+}
+
+.radio-button:selected > .radio > .dot {
+   -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+   -fx-background-insets: 0 0 -1 0, 0;
+}
+
+.radio-button:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.radio-button:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+} 
+
+/*******************************************************************************
+ *                                                                             *
+ * CheckBox                                                                    *
+ *                                                                             *
+ ******************************************************************************/
+
+.check-box {
+    -fx-label-padding: 0.0em 0.0em 0.0em 0.416667em; /* 0 0 0 5 */
+    -fx-text-fill: -fx-text-background-color;
+}
+
+.check-box:focused {
+    -fx-color: -fx-focused-base;
+}
+
+.check-box > .box {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
+    -fx-background-radius: 2, 2, 1, 1;
+    -fx-padding: 0.25em; /* 3 -- padding from the outside edge to the mark */
+}
+
+.check-box:focused > .box {
+    -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: -1.4, 0, 1, 2;
+    -fx-background-radius: 3.4, 2, 1, 1;
+}
+
+.check-box:hover > .box {
+    -fx-color: -fx-hover-base;
+}
+
+.check-box:armed > .box {
+    -fx-color: -fx-pressed-base;
+}
+
+.check-box > .box > .mark {
+    -fx-background-color: transparent;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-padding: 0.333333em; /* 4 -- this is half the size of the mark */
+    -fx-shape: "M0,4H2L3,6L6,0H8L4,8H2Z";
+}
+
+/* TODO: scale the shape - the problem is that it is not within a square
+ * boundary.
+ */
+.check-box:indeterminate > .box > .mark {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+    -fx-shape: "M0,0H8V2H0Z";
+    -fx-scale-shape: false;
+}
+
+.check-box:selected > .box > .mark {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+}
+
+.check-box:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.check-box:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+} 
+
+/*******************************************************************************
+ *                                                                             *
+ * Hyperlink                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.hyperlink {
+    -fx-padding: 0.166667em; /* 2 */
+    -fx-cursor: hand;
+    -fx-content-display: LEFT;
+    -fx-text-fill: -fx-text-background-color;
+    -fx-border-color: transparent;
+    -fx-border-width: 1px;
+}
+
+.hyperlink:visited {
+    -fx-text-fill: -fx-accent;
+}
+
+.hyperlink:focused {
+    -fx-color: -fx-focused-base;
+    -fx-border-color: -fx-focus-color;
+    -fx-border-style: segments(0.166667em, 0.166667em);
+    -fx-border-width: 1px;
+}
+
+.hyperlink:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.hyperlink:hover {
+    -fx-underline: true;
+}
+
+.hyperlink:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+} 
+
+
+/*******************************************************************************
+ *                                                                             *
+ * PopupMenu                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.context-menu {
+    -fx-color: -fx-base;
+    -fx-background-color:
+        derive(-fx-color,-40%),
+        derive(-fx-color,100%),
+        linear-gradient(to bottom, derive(-fx-color,100%) 0%, derive(-fx-color,50%) 12%, derive(-fx-color,65%) 88%, derive(-fx-color,23%) 100%);
+    -fx-background-insets: 0, 1, 2;
+    -fx-background-radius: 0 6 6 6, 0 5 5 5, 0 4 4 4;
+/*    -fx-padding: 0.666667em 0.083333em 0.666667em 0.083333em;  8 1 8 1 */
+    -fx-padding: 0.333333em 0.083333em 0.666667em 0.083333em; /* 4 1 8 1 */
+}
+
+.context-menu > .separator {
+    -fx-padding: 0.0em 0.333333em 0.0em 0.333333em; /* 0 4 0 4 */
+}
+
+.context-menu > .scroll-arrow {
+    -fx-padding: 0.416667em 0.416667em 0.416667em 0.416667em; /* 5 */
+    -fx-background-color: transparent;
+}
+
+.context-menu > .scroll-arrow:hover {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-selection-bar;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.context-menu:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+}
+
+/*
+ * RT-33312 - if the context-menu is belongs to a menu-button, then set the context-menu's -fx-color to -fx-base
+ * effectively overriding the menu-button:armed, menu-button:hover styling of -fx-color
+ */
+.menu-button > * > .context-menu {
+    -fx-color: -fx-base;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * Menu                                                                        *
+ *                                                                             *
+ ******************************************************************************/
+
+.menu {
+    -fx-background-color: transparent;
+    -fx-padding: 0.333333em 0.666667em 0.333333em 0.666667em; /* 4 8 4 8 */
+}
+
+.menu:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.menu:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+}
+.menu > .right-container > .arrow {
+    -fx-padding: 0.458em 0.167em 0.458em 0.167em; /* 4.5 2 4.5 2 */
+    -fx-background-color: -fx-mark-color;
+    -fx-shape: "M0,-4L4,0L0,4Z";
+    -fx-scale-shape: false;
+}
+
+.menu:focused > .right-container > .arrow {
+    -fx-background-color: white;
+}
+
+/* This hides the down arrow that would show on a menu placed in a menubar */
+.menu-bar > .container > .menu > .arrow-button > .arrow {
+    -fx-padding: 0;
+    -fx-background-color: transparent;
+    -fx-shape: null;
+}
+
+.menu-bar > .container > .menu > .arrow-button {
+    -fx-padding: 0;
+}
+
+.menu-up-arrow {
+    -fx-padding: 0.666667em 0.416667em 0.0em 0.416667em;  /* 8 5 0 5 */
+    -fx-background-color: derive(-fx-color,-2%);
+    -fx-shape: "M0 1 L1 1 L.5 0 Z";
+    -fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.6) , 4, 0.0 , 0 , 1 );
+}
+
+.menu-down-arrow {
+    -fx-background-color: derive(-fx-color,-2%);
+    -fx-padding: 0.666667em 0.416667em 0.0em 0.416667em;  /* 8 5 0 5 */
+    -fx-shape: "M0 0 L1 0 L.5 1 Z";
+    -fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.6) , 4, 0.0 , 0 , 1 );
+}
+
+
+/*******************************************************************************
+ *                                                                             *
+ * MenuBar                                                                     *
+ *                                                                             *
+ ******************************************************************************/
+
+/* Corresponding hex values for the color derivations used below are: *
+ * derive(-fx-base,-30%); #929292                                     *
+ * derive(-fx-base,-50%); #686868                                     *
+ * derive(-fx-base,-70%); #3e3e3e                                     */
+
+.menu-bar {
+    -fx-padding: 0.0em 0.666667em 0.0em 0.666667em; /* 0 8 0 8 */
+    -fx-spacing: 0.166667em; /* 2 */
+    -fx-base: derive(#d0d0d0,-70%);
+    -fx-background-color: linear-gradient(to bottom, derive(-fx-color,50%), derive(-fx-color,-30%)), -fx-body-color;
+    -fx-background-insets: 0, 1 0 1 0;
+    -fx-background-radius: 0, 0 ;
+}
+
+/* Show nothing for background of normal menu button in a menu bar */
+.menu-bar > .container > .menu-button {
+    -fx-background-radius: 0;
+    -fx-background-color: transparent;
+    -fx-background-insets: 0; 
+}
+/* Change padding of menu buttons when in menu bar */
+.menu-bar > .container > .menu-button > .label {
+    -fx-padding: 0.333em 0.5em 0.333em 0.5em; /* 4 6 4 6*/
+}
+
+.menu-bar > .container > .menu-button:hover, .menu-bar > .container > .menu-button:focused, .menu-bar > .container > .menu-button:showing {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-selection-bar;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+/*.menu-bar .menu:focused:showing, .menu-bar .menu:showing, .menu-bar .menu:focused, .menu:focused:showing, .menu:showing, .menu:focused {*/
+/*.menu-bar .menu-button:showing, .menu-button:showing {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-selection-bar;
+    -fx-text-fill: -fx-selection-bar-text;
+}*/
+
+.menu-bar > .container > .menu-button:hover {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-selection-bar;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.menu-bar:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * MenuItem                                                                    *
+ *                                                                             *
+ ******************************************************************************/
+
+.menu-item {
+    -fx-background-color: transparent;
+    -fx-padding: 0.333333em 0.41777em 0.333333em 0.41777em;  /* 4 5 4 5 */
+}
+
+.menu-item > .left-container {
+    -fx-padding: 0.458em 0.791em 0.458em 0.458em;
+}
+
+.menu-item > .graphic-container {
+    -fx-padding: 0em 0.333em 0em 0em;
+}
+
+.menu-item >.label {
+    -fx-padding: 0em 0.5em 0em 0em;
+    -fx-text-fill: -fx-text-base-color;
+}
+
+.menu-item:disabled > .label {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.menu-item:focused {
+     -fx-background: -fx-accent;
+     -fx-background-color: -fx-selection-bar;
+     -fx-text-fill: -fx-selection-bar-text;
+}
+
+.menu-item:focused > .label {
+    -fx-text-fill: white;
+}
+.menu-item > .right-container {
+    -fx-padding: 0em 0em 0em 0.5em;
+}
+
+.menu-item:show-mnemonics > .mnemonic-underline {
+    -fx-stroke: -fx-text-fill;
+} 
+
+.radio-menu-item:checked > .left-container > .radio {
+    -fx-background-color: -fx-mark-color;
+    -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z";
+    -fx-scale-shape: false;
+}
+
+.radio-menu-item:focused:checked > .left-container > .radio {
+    -fx-background-color: white;
+}
+
+.check-menu-item:checked > .left-container > .check {
+    -fx-background-color: -fx-mark-color;
+    -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z";
+    -fx-scale-shape: false;
+}
+
+.check-menu-item:focused:checked > .left-container > .check {
+    -fx-background-color: white;
+}
+
+/*.radio.selected {
+    -fx-background-color: -fx-mark-color;
+    -fx-padding: 0.666667em;  8
+    -fx-shape: "M7,3.5C7,5.433,5.433,7,3.5,7C1.567,7,0,5.433,0,3.5C0,1.567,1.63,0,3.5,0C5.433,0,7,1.567,7,3.5z";
+    -fx-scale-shape: false; 
+}*/
+
+/*.check.checked {
+    -fx-background-color: -fx-mark-color;
+    -fx-padding: 0.666667em;  8
+    -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z";
+    -fx-scale-shape: false;
+}*/
+
+/*
+.menu-item:hover:selected .menu-item-check, .menu-item:focused:selected .menu-item-check,.menu-item:hover:selected .menu-item-radio, .menu-item:focused:selected .menu-item-radio {
+    -fx-background-color: -fx-selection-bar-text;
+}
+*/
+.menu-item:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * ChoiceBox                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.choice-box {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
+    -fx-background-radius: 5, 5, 4, 3;
+    -fx-padding: 0;
+    -fx-alignment: CENTER;
+    -fx-content-display: LEFT;
+}
+
+.choice-box:focused {
+    -fx-color: -fx-focused-base;
+    -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: -1.4, 0, 1, 2;
+    -fx-background-radius: 6.4, 5, 4, 3;
+}
+
+.choice-box:hover {
+    -fx-color: -fx-hover-base;
+}
+
+.choice-box:showing {
+    -fx-color: -fx-pressed-base;
+}
+
+.choice-box > .label {
+    -fx-padding: 0.166667em 0.333333em 0.25em 0.5em; /* 2 4 3 6 */
+    -fx-text-fill: -fx-text-base-color;
+}
+
+.choice-box > .open-button {
+    -fx-background-color: null;
+    -fx-padding: 0.083333em 0.666667em 0 0; /* 1 0 0 8 */
+}
+
+.choice-box > .open-button > .arrow {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+    -fx-background-insets: 1 0 -1 0, 0;
+    /* padding determines the size of the arrow;
+       this should match the design size in the SVG */
+    -fx-padding: 0.166667em 0.333333em 0.166667em 0.333333em; /* 2 3.5 2 3.5 */
+    -fx-shape: "M 0 0 h 7 l -3.5 4 z";
+}
+
+.choice-box > .context-menu {
+    -fx-background-radius: 6, 5, 4;
+}
+
+/*.choice-box > .context-menu > .menu-item {
+    -fx-accelerator-gutter: 0;
+}*/
+
+/* TODO: need to use the ID here.  For some reason, the other form does not
+ * work.  This might be related to popup issues.
+ */
+/*.choice-box > * > .menu-item-radio {*/
+#choice-box-menu-item > * > .menu-item-radio {
+    /* When we show RadioMenuItems in ChoiceBox, we replace the radio shape with
+       a check mark, which looks much better */
+    -fx-shape: "M0,5H2L4,8L8,0H10L5,10H3Z";
+    -fx-scale-shape: false;
+}
+
+.choice-box:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+
+/*******************************************************************************
+ *                                                                             *
+ * Slider                                                                      *
+ *                                                                             *
+ ******************************************************************************/
+
+.slider > .thumb {
+    -fx-background-color:
+        derive(-fx-color,-36%),
+        derive(-fx-color,73%),
+        linear-gradient(to bottom, derive(-fx-color,-19%),derive(-fx-color,61%));
+    -fx-background-insets: 0, 1, 2;
+    -fx-background-radius: 1.0em; /* makes sure this remains circular */
+    -fx-padding: 0.583333em; /* 7 */
+}
+
+.slider:focused > .thumb {
+    -fx-color: -fx-focused-base;
+    -fx-background-color:
+        -fx-focus-color,
+        derive(-fx-color,-36%),
+        derive(-fx-color,73%),
+        linear-gradient(to bottom, derive(-fx-color,-19%),derive(-fx-color,61%));
+    -fx-background-insets: -1.4, 0, 1, 2;
+    -fx-background-radius: 1.0em; /* makes sure this remains circular */
+}
+
+.slider > .thumb:hover {
+    -fx-color: -fx-hover-base;
+}
+
+/* Uncomment when RT-10521 is fixed.
+.slider .thumb:pressed {
+    -fx-color: -fx-pressed-base;
+}
+*/
+
+.slider > .track {
+    -fx-background-color:
+        -fx-shadow-highlight-color,
+        derive(-fx-color,-22%),
+        linear-gradient(to bottom, derive(-fx-color,-15.5%), derive(-fx-color,34%) 30%, derive(-fx-color,68%));
+    -fx-background-insets: 1 0 -1 0, 0, 1;
+    -fx-background-radius: 2.5, 2.5, 1.5;
+    -fx-padding: 0.208333em; /* 2.5 */
+}
+
+.slider:vertical > .track {
+    -fx-background-color:
+        -fx-shadow-highlight-color,
+        derive(-fx-color,-22%),
+        linear-gradient(to right, derive(-fx-color,-15.5%), derive(-fx-color,34%) 30%, derive(-fx-color,68%));
+    -fx-background-insets: 0 -1 0 1, 0, 1;
+}
+
+.slider > .axis {
+    -fx-tick-mark-stroke: ladder(-fx-background, derive(-fx-background,30%) 40%, derive(-fx-background,-30%) 41%);
+    -fx-tick-label-font-size: 0.833333em; 
+    -fx-tick-label-fill: -fx-text-background-color;
+}
+
+.slider:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * ScrollBar                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.scroll-bar:horizontal {
+    -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to bottom, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%);
+    -fx-background-insets: 0, 1;
+}
+
+.scroll-bar:horizontal:focused {
+    -fx-background-color:
+        -fx-focus-color,
+        -fx-box-border,
+        linear-gradient(to bottom, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%);
+    -fx-background-insets: -1.4, 0, 1;
+}
+
+.scroll-bar:vertical {
+    -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to top, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%);
+    -fx-background-insets: 0, 1;
+}
+
+.scroll-bar:vertical:focused {
+    -fx-background-color:
+        -fx-focus-color,
+        -fx-box-border,
+        linear-gradient(to top, derive(-fx-color,30%) 5%, derive(-fx-color,-17%) 100%);
+    -fx-background-insets: -1.4, 0, 1;
+}
+
+.scroll-bar:horizontal > .thumb {
+    -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to bottom, derive(-fx-color,95%), derive(-fx-color,10%)),
+        linear-gradient(to bottom, derive(-fx-color,38%), derive(-fx-color,-16%));
+    -fx-background-insets: 0, 1, 2;
+    -fx-background-radius: 0.5em; /* makes sure this remains circular */
+}
+
+.scroll-bar:vertical > .thumb {
+    -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to right, derive(-fx-color,95%), derive(-fx-color,10%)),
+        linear-gradient(to right, derive(-fx-color,38%), derive(-fx-color,-16%));
+    -fx-background-insets: 0, 1, 2;
+    -fx-background-radius: 0.5em; /* makes sure this remains circular */
+}
+
+.scroll-bar:focused > .thumb {
+    -fx-color: -fx-focused-base;
+}
+
+.scroll-bar > .thumb:hover {
+    -fx-color: -fx-hover-base;
+}
+
+/* Uncomment when RT-10521 is fixed.
+.scroll-bar .thumb:pressed {
+    -fx-color: -fx-pressed-base;
+}
+*/
+
+.scroll-bar:horizontal > .track {
+     -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to bottom, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%));
+    -fx-background-insets:  0, 1;
+    -fx-background-radius: 0.5em; /* makes sure this remains circular */
+}
+.scroll-bar:horizontal > .track-background {
+     -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to top, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%));
+    -fx-background-insets:  0, 1;
+}
+
+.scroll-bar:vertical > .track {
+     -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to right, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%));
+    -fx-background-insets:  0, 1;
+    -fx-background-radius: 0.5em; /* makes sure this remains circular */
+}
+
+.scroll-bar:vertical > .track-background {
+     -fx-background-color:
+        -fx-box-border,
+        linear-gradient(to left, derive(-fx-color,-15%), derive(-fx-color,2.2%) 20%, derive(-fx-color,60%));
+    -fx-background-insets:  0, 1;
+}
+
+.scroll-bar > .increment-button {
+    -fx-background-color: transparent;
+    -fx-background-insets:  0;
+    -fx-padding: 0.25em; /* 3 */
+}
+
+.scroll-bar > .decrement-button {
+    -fx-background-color: transparent;
+    -fx-background-insets:  0;
+    -fx-padding: 0.25em; /* 3 */
+}
+
+.scroll-bar:horizontal > .increment-button > .increment-arrow {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-padding: 0.5em 0.333333em 0.0em 0.0em; /* 6 4 0 0 */
+    -fx-shape: "M 4 0 L 0 -3 L 0 3 z";
+}
+
+.scroll-bar:vertical > .increment-button > .increment-arrow {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-padding: 0.333333em 0.5em 0.0em 0.0em; /* 4 6 0 0 */
+    -fx-shape: "M -3 0 L 0 4 L 3 0 z";
+}
+
+.scroll-bar:horizontal > .decrement-button > .decrement-arrow {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-padding: 0.5em 0.333333em 0.0em 0.0em; /* 6 4 0 0 */
+    -fx-shape: "M 0 0 L 4 -3 L 4 3 z";
+}
+
+.scroll-bar:vertical > .decrement-button > .decrement-arrow {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-padding: 0.333333em 0.5em 0.0em 0.0em; /* 4 6 0 0 */
+    -fx-shape: "M -3 0 L 0 -4 L 3 0 z";
+}
+
+.scroll-bar:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+/* The opacity of the parent is applied to the children.  So we make the
+ * opacity 1.0 here to avoid double translucency.
+ */
+/*:disabled > * > .scroll-bar {
+    -fx-opacity: 1.0;
+}*/
+
+/*******************************************************************************
+ *                                                                             *
+ * ScrollPane                                                                  *
+ *                                                                             *
+ ******************************************************************************/
+
+.scroll-pane {
+    -fx-background-color: -fx-box-border,-fx-background;
+    -fx-background-insets: 0, 1;
+    -fx-padding: 1.0;
+}
+
+.scroll-pane:focused {
+    -fx-background-color: -fx-focus-color, -fx-box-border, -fx-background;
+    -fx-background-insets: -1.4, 0, 1;
+}
+
+.scroll-pane > * > .scroll-bar:horizontal {
+    -fx-background-insets: 0, 1 0 0 0;
+    -fx-padding: 0.0 0.0 0.0 0.0;
+}
+
+.scroll-pane > * > .scroll-bar:vertical {
+    -fx-background-insets: 0, 0 0 0 1;
+    -fx-padding: 0.0 0.0 0.0 0.0;
+}
+
+.scroll-pane > .corner {
+    -fx-background-color: -fx-box-border, -fx-base;
+    -fx-background-insets: 0, 1 0 0 1;
+}
+
+.scroll-pane:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * Separator                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.separator > .line {
+    -fx-border-style: segments(0.166667em, 0.166667em);
+    -fx-border-width: 0.083333em; /* 1 */
+}
+
+.separator:horizontal > .line {
+    -fx-background-color: null;
+    -fx-padding: 0.083333em 0.0em 0.0em 0.0em; /* 1 0 0 0 */
+    -fx-border-color: derive(-fx-background,-20%) transparent transparent transparent;
+}
+
+.separator:vertical > .line {
+    -fx-background-color: null;
+    -fx-padding: 0.0em 0.083333em 0.0em 0.0em; /* 0 1 0 0 */
+    -fx-border-color:  transparent derive(-fx-background,-20%) transparent transparent;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * TextInput                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.text-input {
+    -fx-text-fill: -fx-text-inner-color;
+    -fx-highlight-fill: derive(-fx-control-inner-background,-20%);
+    -fx-highlight-text-fill: -fx-text-inner-color;
+}
+
+.text-input:focused {
+    -fx-highlight-fill: -fx-accent;
+    -fx-highlight-text-fill: white;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * TextField                                                                   *
+ *                                                                             *
+ ******************************************************************************/
+
+.text-field {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-text-box-border, -fx-control-inner-background;
+    -fx-background-insets: 0, 1, 2;
+    -fx-background-radius: 3, 2, 2;
+    -fx-padding: 0.25em 0.416667em  0.333333em 0.416667em; /* 3 5 4 5 */
+    -fx-text-fill: -fx-text-inner-color;
+    -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
+    -fx-cursor: text;
+}
+
+.text-field:focused {
+    -fx-background-color: -fx-focus-color, -fx-text-box-border, -fx-control-inner-background;
+    -fx-background-insets: -0.4, 1, 2;
+    -fx-background-radius: 3.4, 2, 2;
+    -fx-prompt-text-fill: transparent;
+}
+
+.text-field:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * PasswordField                                                               *
+ *                                                                             *
+ ******************************************************************************/
+
+.password-field {
+    -fx-text-fill: -fx-text-inner-color;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * TextArea                                                                    *
+ *                                                                             *
+ ******************************************************************************/
+
+.text-area {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-text-box-border, -fx-control-inner-background;
+    -fx-background-insets: 0, 1, 2;
+    -fx-background-radius: 3, 2, 2;
+    -fx-padding: 1;
+    -fx-prompt-text-fill: derive(-fx-control-inner-background,-30%);
+}
+
+.text-area > .scroll-pane {
+    -fx-background-color: transparent;
+}
+
+.text-area .content {
+    -fx-padding: 3 5 3 5; 
+    -fx-cursor: text;
+}
+
+.text-area:focused {
+    -fx-background-color: -fx-focus-color, -fx-text-box-border, -fx-control-inner-background;
+    -fx-background-insets: -0.4, 1, 2;
+    -fx-background-radius: 3.4, 2, 2;
+    -fx-prompt-text-fill: transparent;
+}
+
+.text-area:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * Customised CSS for controls placed directly within cells                    *
+ *                                                                             *
+ ******************************************************************************/
+
+.cell > .choice-box {
+    -fx-background-color: transparent;
+    -fx-background-insets: 0;
+    -fx-background-radius: 0;
+    -fx-padding: 0.0em 0.5em 0.0em 0.0em; /* 0 6 0 0 */
+    -fx-alignment: CENTER_LEFT;
+    -fx-content-display: LEFT;
+}
+
+.cell > .choice-box > .label {
+    -fx-padding: 0em 0.333333em 0.0em 0.333333; /* 2 4 3 6 */
+}
+
+.cell:focused:selected > .choice-box > .label {
+    -fx-text-fill: white;
+}
+
+.cell:focused:selected > .choice-box > .open-button > .arrow {
+    -fx-background-color: -fx-mark-highlight-color, white;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * ListView and ListCell                                                       *
+ *                                                                             *
+ ******************************************************************************/
+
+.list-view {
+    -fx-background-color: -fx-box-border, -fx-control-inner-background;
+    -fx-background-insets: 0, 1;
+
+     /* There is some oddness if padding is in em values rather than pixels,
+        in particular, the left border of the control doesn't show. */
+    -fx-padding: 1; /* 0.083333em; */
+}
+
+.list-view:focused {
+    -fx-background-color: -fx-focus-color,-fx-box-border,-fx-control-inner-background;
+    -fx-background-insets: -1.4, 0, 1;
+    -fx-background-radius: 1.4, 0, 0;
+
+    /* There is some oddness if padding is in em values rather than pixels,
+       in particular, the left border of the control doesn't show. */
+    -fx-padding: 1; /* 0.083333em; */
+}
+
+.list-view > .virtual-flow > .scroll-bar:vertical{
+    -fx-background-insets: 0, 0 0 0 1;
+    -fx-padding: -1 -1 -1 0;
+}
+
+.list-view > .virtual-flow > .scroll-bar:horizontal{
+    -fx-background-insets: 0, 1 0 0 0;
+    -fx-padding: 0 -1 -1 -1;
+}
+
+.list-view:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.list-view > .virtual-flow > .corner {
+    -fx-background-color: -fx-box-border, -fx-base;
+    -fx-background-insets: 0, 1 0 0 1;
+}
+
+.list-cell {
+    -fx-background-color: -fx-control-inner-background;
+    -fx-padding: 0.25em; /* 3 */
+    -fx-text-fill: -fx-text-inner-color;
+    -fx-opacity: 1;
+}
+
+.list-cell:odd {
+    -fx-background-color: derive(-fx-control-inner-background,-5%);
+}
+
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:focused {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-control-inner-background;
+    -fx-background-insets: 0, 1, 2;
+}
+
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:focused:odd {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, derive(-fx-control-inner-background,-5%);
+    -fx-background-insets: 0, 1, 2;
+}
+
+/* When the list-cell is selected and focused */
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:focused:selected {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar;
+    -fx-background-insets: 0, 1, 2;
+    -fx-background: -fx-accent;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected, 
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected:hover {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-selection-bar;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:focused:selected:hover {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar;
+    -fx-background-insets: 0, 1, 2;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+/* When the ListView is _not_ focused, we show alternate selection colors */
+.list-cell:filled:selected:focused,
+.list-cell:filled:selected,
+.list-view:horizontal > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected {
+    -fx-background-color: lightgray;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.list-cell:filled:selected:focused:disabled, 
+.list-cell:filled:selected:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.list-cell:filled:hover {
+    -fx-background-color: -fx-cell-hover-color;
+    -fx-text-fill: -fx-text-inner-color;
+}
+
+.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:focused:hover {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color;
+    -fx-background-insets: 0, 1, 2;
+    -fx-text-fill: -fx-text-inner-color;
+}
+
+.list-view:horizontal > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected,
+.list-view:horizontal > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected:hover {
+    -fx-background-color: linear-gradient(to right, derive(-fx-accent,-7%), derive(-fx-accent,-25%));
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * TreeView and TreeCell                                                       *
+ *                                                                             *
+ ******************************************************************************/
+
+.tree-view {
+    -fx-background-color: -fx-box-border, -fx-control-inner-background;
+    -fx-background-insets: 0, 1;
+
+    /* There is some oddness if padding is in em values rather than pixels,
+       in particular, the left border of the control doesn't show. */
+    -fx-padding: 1; /* 0.083333em; */
+}
+
+.tree-view:focused {
+    -fx-background-color: -fx-focus-color,-fx-box-border,-fx-control-inner-background;
+    -fx-background-insets: -1.4, 0, 1;
+    -fx-background-radius: 1.4, 0, 0;
+
+    /* There is some oddness if padding is in em values rather than pixels,
+       in particular, the left border of the control doesn't show. */
+    -fx-padding: 1; /* 0.083333em; */
+}
+
+.tree-view > .virtual-flow > .scroll-bar:vertical{
+    -fx-background-insets: 0, 0 0 0 1;
+    -fx-padding: -1 -1 -1 0;
+}
+
+.tree-view > .virtual-flow > .scroll-bar:horizontal{
+    -fx-background-insets: 0, 1 0 0 0;
+    -fx-padding: 0 -1 -1 -1;
+}
+
+.tree-view:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.tree-view > .virtual-flow > .corner {
+    -fx-background-color: -fx-box-border, -fx-base;
+    -fx-background-insets: 0, 1 0 0 1;
+}
+
+.tree-cell {
+    -fx-background-color: -fx-control-inner-background;
+    -fx-padding: 0.25em; /* 3 */
+    -fx-text-fill: -fx-text-inner-color;
+    -fx-indent: 10;
+}
+
+.tree-cell .label {
+    -fx-padding: 0.0em 0.0em 0.0em 0.25em; /* 0 0 0 3 */
+}
+
+.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:focused {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-control-inner-background;
+    -fx-background-insets: 0, 1, 2;
+}
+
+.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:focused:selected {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar;
+    -fx-background-insets: 0, 1, 2;
+    -fx-background: -fx-accent;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:selected, 
+.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:selected:hover {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-selection-bar;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:focused:selected:hover {
+    -fx-background: -fx-accent;
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar;
+    -fx-background-insets: 0, 1, 2;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+/* When the TreeView is _not_ focused, we show alternate selection colors */
+.tree-cell:filled:selected:focused, 
+.tree-cell:filled:selected {
+    -fx-background-color: lightgray;
+    -fx-text-fill: -fx-selection-bar-text;
+}
+
+.tree-cell:filled:selected:focused:disabled, 
+.tree-cell:filled:selected:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.tree-cell > .tree-disclosure-node,
+.tree-table-row-cell > .tree-disclosure-node {
+    -fx-padding: 4 2 4 8;
+    -fx-background-color: transparent;
+}
+
+.tree-cell > .tree-disclosure-node:disabled,
+.tree-table-row-cell > .tree-disclosure-node:disabled {
+    -fx-opacity: -fx-disabled-opacity;
+}
+
+.tree-cell > .tree-disclosure-node > .arrow,
+.tree-table-row-cell > .tree-disclosure-node > .arrow {
+    -fx-background-color: -fx-mark-color;
+    -fx-padding: 0.333333em; /* 4 */
+    -fx-shape: "M 0 -4 L 8 0 L 0 4 z";
+}
+
+.tree-cell:expanded > .tree-disclosure-node > .arrow,
+.tree-table-row-cell:expanded > .tree-disclosure-node > .arrow {
+    -fx-rotate: 90;
+}
+
+.tree-cell:filled:selected > .tree-disclosure-node > .arrow,
+.tree-table-row-cell:filled:selected > .tree-disclosure-node > .arrow {
+    -fx-background-color: -fx-selection-bar-text;
+}
+
+.tree-cell:filled:hover,
+.tree-table-row-cell:filled:hover {
+    -fx-background-color: -fx-cell-hover-color;
+    -fx-text-fill: -fx-text-inner-color;
+}
+
+.tree-cell:filled:hover > .tree-disclosure-node > .arrow,
+.tree-table-row-cell:filled:hover > .tree-disclosure-node > .arrow {
+    -fx-background-color: -fx-mark-color;
+}
+
+.tree-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:focused:hover,
+.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:focused:hover {
+    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-cell-hover-color;
+    -fx-background-insets: 0, 1, 2;
+    -fx-text-fill: -fx-text-inner-color;
+}
+
+.tree-cell:filled:selected:hover > .tree-disclosure-node > .arrow,
+.tree-table-row-cell:filled:selected:hover > .tree-disclosure-node > .arrow {
+    -fx-background-color: -fx-selection-bar-text;
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * MenuButton                                                                  *
+ *                                                                             *
+ ******************************************************************************/
+
+.menu-button {
+    -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2;
+    -fx-background-radius: 5, 5, 4, 3;
+    -fx-padding: 0.0em; /* 0 */
+    -fx-text-fill: -fx-text-base-color;
+}
+
+.menu-button > .label { 
+    /* TODO workaround for RT-19062 */
+    -fx-text-fill: -fx-text-base-color; 
+    
+    /* The MenuButton skin uses an inner Label part */
+    -fx-padding: 0.166667em 0.667em 0.25em 0.833333em; /* 2 8 3 10 */
+}
+
+.menu-button:focused {
+    -fx-color: -fx-focused-base;
+    -fx-background-color: -fx-focus-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+    -fx-background-insets: -1.4, 0, 1, 2;
+    -fx-background-radius: 6.4, 4, 5, 3;
+}
+
+.menu-button:hover {
+    -fx-color: -fx-hover-base;
+}
+
+.menu-button:armed {
+    -fx-color: -fx-pressed-base;
+}
+
+.menu-button > .arrow-button {
+    -fx-background-insets: 0;
+    -fx-background-radius: 0;
+    -fx-padding: 0.5em 0.667em 0.5em 0.0em; /* 6 8 6 0 */
+}
+
+.menu-button > .arrow