diff --git a/javafx-ui-common/src/com/sun/javafx/css/converters/InsetsConverter.java b/javafx-ui-common/src/com/sun/javafx/css/converters/InsetsConverter.java
--- a/javafx-ui-common/src/com/sun/javafx/css/converters/InsetsConverter.java
+++ b/javafx-ui-common/src/com/sun/javafx/css/converters/InsetsConverter.java
@@ -24,12 +24,11 @@
  */
 package com.sun.javafx.css.converters;
 
+import javafx.css.ParsedValue;
 import javafx.geometry.Insets;
 import javafx.scene.text.Font;
-
 import com.sun.javafx.css.Size;
 import com.sun.javafx.css.StyleConverterImpl;
-import javafx.css.ParsedValue;
 
 /**
  * Convert <size>{1,4} to Insets. The size values are interpreted as
@@ -40,7 +39,7 @@
  */
 public final class InsetsConverter extends StyleConverterImpl<ParsedValue<?, Size>[], Insets> {
 
-    // lazy, thread-safe instatiation
+    // lazy, thread-safe instantiation
     private static class Holder {
         static InsetsConverter INSTANCE = new InsetsConverter();
         static SequenceConverter SEQUENCE_INSTANCE = new SequenceConverter();
diff --git a/javafx-ui-common/src/com/sun/javafx/css/parser/CSSParser.java b/javafx-ui-common/src/com/sun/javafx/css/parser/CSSParser.java
--- a/javafx-ui-common/src/com/sun/javafx/css/parser/CSSParser.java
+++ b/javafx-ui-common/src/com/sun/javafx/css/parser/CSSParser.java
@@ -36,6 +36,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import javafx.css.ParsedValue;
 import javafx.geometry.Insets;
 import javafx.scene.effect.BlurType;
 import javafx.scene.effect.Effect;
@@ -61,7 +62,6 @@
 import com.sun.javafx.css.Declaration;
 import com.sun.javafx.css.FontFace;
 import com.sun.javafx.css.FontUnits;
-import javafx.css.ParsedValue;
 import com.sun.javafx.css.ParsedValueImpl;
 import com.sun.javafx.css.Rule;
 import com.sun.javafx.css.Selector;
@@ -81,7 +81,6 @@
 import com.sun.javafx.css.converters.SizeConverter.SequenceConverter;
 import com.sun.javafx.css.converters.StringConverter;
 import com.sun.javafx.css.converters.URLConverter;
-import sun.util.logging.PlatformLogger;
 import com.sun.javafx.scene.layout.region.BackgroundPositionConverter;
 import com.sun.javafx.scene.layout.region.BackgroundSizeConverter;
 import com.sun.javafx.scene.layout.region.BorderImageSliceConverter;
@@ -99,6 +98,7 @@
 import com.sun.javafx.scene.layout.region.RepeatStructConverter;
 import com.sun.javafx.scene.layout.region.SliceSequenceConverter;
 import com.sun.javafx.scene.layout.region.StrokeBorderPaintConverter;
+import sun.util.logging.PlatformLogger;
 
 final public class CSSParser {
     static boolean EXIT_ON_ERROR = false;
@@ -743,6 +743,8 @@
              return parseURILayers(root);
         } else if ("-fx-border-image-width".equals(prop)) {
              return parseBorderImageWidthLayers(root);
+        } else if ("-fx-margin".equals(prop)) {
+             return parseInsetsLayer(root);
         } else if ("-fx-padding".equals(prop)) {
             ParsedValueImpl<?,Size>[] sides = parseSizeSeries(root);
             return new ParsedValueImpl<ParsedValue<?,Size>[],Insets>(sides, InsetsConverter.getInstance());
diff --git a/javafx-ui-common/src/javafx/scene/Node.java b/javafx-ui-common/src/javafx/scene/Node.java
--- a/javafx-ui-common/src/javafx/scene/Node.java
+++ b/javafx-ui-common/src/javafx/scene/Node.java
@@ -29,7 +29,6 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -61,6 +60,15 @@
 import javafx.collections.MapChangeListener;
 import javafx.collections.ObservableList;
 import javafx.collections.ObservableMap;
+import javafx.css.CssMetaData;
+import javafx.css.ParsedValue;
+import javafx.css.PseudoClass;
+import javafx.css.StyleConverter;
+import javafx.css.StyleOrigin;
+import javafx.css.StyleableBooleanProperty;
+import javafx.css.StyleableDoubleProperty;
+import javafx.css.StyleableObjectProperty;
+import javafx.css.StyleableProperty;
 import javafx.event.Event;
 import javafx.event.EventDispatchChain;
 import javafx.event.EventDispatcher;
@@ -69,6 +77,8 @@
 import javafx.event.EventType;
 import javafx.geometry.BoundingBox;
 import javafx.geometry.Bounds;
+import javafx.geometry.Insets;
+import javafx.geometry.NodeOrientation;
 import javafx.geometry.Orientation;
 import javafx.geometry.Point2D;
 import javafx.geometry.Point3D;
@@ -95,6 +105,7 @@
 import javafx.scene.text.Font;
 import javafx.scene.transform.Rotate;
 import javafx.scene.transform.Transform;
+import javafx.stage.Window;
 import javafx.util.Callback;
 import com.sun.javafx.Logging;
 import com.sun.javafx.TempState;
@@ -104,20 +115,11 @@
 import com.sun.javafx.binding.ExpressionHelper;
 import com.sun.javafx.collections.TrackableObservableList;
 import com.sun.javafx.collections.UnmodifiableListSet;
-//import com.sun.javafx.css.PseudoClassSet;
-import javafx.css.ParsedValue;
 import com.sun.javafx.css.Selector;
 import com.sun.javafx.css.Style;
-import javafx.css.StyleConverter;
 import com.sun.javafx.css.StyleHelper;
 import com.sun.javafx.css.StyleManager;
 import com.sun.javafx.css.Styleable;
-import javafx.css.StyleableBooleanProperty;
-import javafx.css.StyleableDoubleProperty;
-import javafx.css.StyleableObjectProperty;
-import javafx.css.CssMetaData;
-import javafx.css.StyleOrigin;
-import javafx.css.PseudoClass;
 import com.sun.javafx.css.converters.BooleanConverter;
 import com.sun.javafx.css.converters.CursorConverter;
 import com.sun.javafx.css.converters.EffectConverter;
@@ -132,7 +134,6 @@
 import com.sun.javafx.geom.transform.NoninvertibleTransformException;
 import com.sun.javafx.jmx.MXNodeAlgorithm;
 import com.sun.javafx.jmx.MXNodeAlgorithmContext;
-import sun.util.logging.PlatformLogger;
 import com.sun.javafx.perf.PerformanceTracker;
 import com.sun.javafx.print.NodeAccess;
 import com.sun.javafx.scene.BoundsAccessor;
@@ -144,12 +145,9 @@
 import com.sun.javafx.scene.traversal.Direction;
 import com.sun.javafx.sg.PGNode;
 import com.sun.javafx.tk.Toolkit;
-import javafx.css.StyleableProperty;
-import javafx.scene.transform.Affine;
-import javafx.scene.transform.NonInvertibleTransformException;
-import javafx.geometry.NodeOrientation;
-import javafx.stage.Stage;
-import javafx.stage.Window;
+import sun.util.logging.PlatformLogger;
+
+//import com.sun.javafx.css.PseudoClassSet;
 
 /**
  * Base class for scene graph nodes. A scene graph is a set of tree data structures
@@ -1185,6 +1183,30 @@
         return blendMode;
     }
     
+    /**
+     * Specifies the margin around this node that may be used by a layout {@link javafx.scene.layout.Pane}
+     * when laying out this node. The margin is the space outside the bounds of this node which is typically
+     * used to give extra space between this node and some others. Some layout panes might have complex
+     * rules dictating how the margins are used (or not used in some circumstances such as HTML box model
+     * style layouts which may collapse vertical margins), or they may simply use the margin as defined.
+     * Check the documentation for your layout pane to see how the margin is intended to be used.
+     *
+     * <p>A null margin is interpreted the same as an empty margin.</p>
+     *
+     * @defaultValue Insets.EMPTY
+     */
+    public final ObjectProperty<Insets> marginProperty() {
+        return getMiscProperties().marginProperty();
+    }
+    public final void setMargin(Insets value) {
+        marginProperty().set(value);
+    }
+
+    public final Insets getMargin() {
+        return (miscProperties == null) ? Insets.EMPTY
+                                        : miscProperties.getMargin();
+    }
+
     public final void setClip(Node value) {
         clipProperty().set(value);
     }
@@ -5461,6 +5483,7 @@
         private LazyBoundsProperty boundsInLocal;
         private BooleanProperty cache;
         private ObjectProperty<CacheHint> cacheHint;
+        private ObjectProperty<Insets> margin;
         private ObjectProperty<Node> clip;
         private ObjectProperty<Cursor> cursor;
         private ObjectProperty<DepthTest> depthTest;
@@ -5614,6 +5637,29 @@
             return cacheHint;
         }
 
+        public final Insets getMargin() {
+            return (margin == null) ? Insets.EMPTY : margin.get();
+        }
+
+        public final ObjectProperty<Insets> marginProperty() {
+            if (margin == null) {
+                margin = new StyleableObjectProperty<Insets>(Insets.EMPTY) {
+                    @Override public Object getBean() {
+                        return Node.this;
+                    }
+
+                    @Override public String getName() {
+                        return "margin";
+                    }
+
+                    @Override public CssMetaData getCssMetaData() {
+                        return StyleableProperties.MARGIN;
+                    }
+                };
+            }
+            return margin;
+        }
+
         public final Node getClip() {
             return (clip == null) ? DEFAULT_CLIP : clip.get();
         }
@@ -5885,6 +5931,10 @@
             return mouseTransparent;
         }
 
+        public boolean canSetMargin() {
+            return (margin == null) || !margin.isBound();
+        }
+
         public boolean canSetCursor() {
             return (cursor == null) || !cursor.isBound();
         }
@@ -7490,12 +7540,12 @@
         return null;
     }
     
-     /**
-      * Super-lazy instantiation pattern from Bill Pugh.
-      * @treatAsPrivate implementation detail
-      */
-     private static class StyleableProperties {
-         
+    /**
+     * Super-lazy instantiation pattern from Bill Pugh.
+     * @treatAsPrivate implementation detail
+     */
+    private static class StyleableProperties {
+
         private static final CssMetaData<Node,Cursor> CURSOR =
             new CssMetaData<Node,Cursor>("-fx-cursor", CursorConverter.getInstance()) {
 
@@ -7508,14 +7558,31 @@
                 public StyleableProperty<Cursor> getStyleableProperty(Node node) {
                     return (StyleableProperty)node.cursorProperty();
                 }
-                
+
                 @Override
                 public Cursor getInitialValue(Node node) {
-                    // Most controls default focusTraversable to true. 
+                    // Most controls default focusTraversable to true.
                     // Give a way to have them return the correct default value.
                     return node.impl_cssGetCursorInitialValue();
                 }
+
+            };
+        private static final CssMetaData<Node,Insets> MARGIN =
+            new CssMetaData<Node,Insets>("-fx-margin", StyleConverter.getInsetsConverter(), Insets.EMPTY) {
+
+                @Override
+                public boolean isSettable(Node node) {
+                    return node.miscProperties == null || node.miscProperties.canSetMargin();
+                }
+
+                @Override
+                public StyleableProperty<Insets> getStyleableProperty(Node node) {
+                    return (StyleableProperty)node.marginProperty();
+                }
                 
+                @Override public void set(Node node, Insets value, StyleOrigin origin) {
+                    super.set(node, value, origin);
+                }
             };
         private static final CssMetaData<Node,Effect> EFFECT =
             new CssMetaData<Node,Effect>("-fx-effect", EffectConverter.getInstance()) {
@@ -7723,6 +7790,7 @@
              final List<CssMetaData> styleables = new ArrayList<CssMetaData>();
              Collections.addAll(styleables, 
                  CURSOR,
+                 MARGIN,
                  EFFECT,
                  FOCUS_TRAVERSABLE,
                  OPACITY,
@@ -7764,26 +7832,26 @@
     public List<CssMetaData> getCssMetaData() {
         return getClassCssMetaData();
     }
-     
-     /**
-      * RT-17293
-      * @treatAsPrivate implementation detail
-      * @deprecated This is an experimental API that is not intended for general use and is subject to change in future versions
-      */
-     @Deprecated // SB-dependency: RT-21096 has been filed to track this
-     public final ObservableMap<StyleableProperty, List<Style>> impl_getStyleMap() {
-         return impl_getStyleable().getStyleMap();
-     }
-
-     /**
-      * RT-17293
-      * @treatAsPrivate implementation detail
-      * @deprecated This is an experimental API that is not intended for general use and is subject to change in future versions
-      */
-     @Deprecated // SB-dependency: RT-21096 has been filed to track this
-     public final void impl_setStyleMap(ObservableMap<StyleableProperty, List<Style>> styleMap) {
-         impl_getStyleable().setStyleMap(styleMap);
-     }
+
+    /**
+     * RT-17293
+     * @treatAsPrivate implementation detail
+     * @deprecated This is an experimental API that is not intended for general use and is subject to change in future versions
+     */
+    @Deprecated // SB-dependency: RT-21096 has been filed to track this
+    public final ObservableMap<StyleableProperty, List<Style>> impl_getStyleMap() {
+        return impl_getStyleable().getStyleMap();
+    }
+
+    /**
+     * RT-17293
+     * @treatAsPrivate implementation detail
+     * @deprecated This is an experimental API that is not intended for general use and is subject to change in future versions
+     */
+    @Deprecated // SB-dependency: RT-21096 has been filed to track this
+    public final void impl_setStyleMap(ObservableMap<StyleableProperty, List<Style>> styleMap) {
+        impl_getStyleable().setStyleMap(styleMap);
+    }
           
     /**
      * Flags used to indicate in which way this node is dirty (or whether it
diff --git a/javafx-ui-common/src/javafx/scene/layout/BorderPane.java b/javafx-ui-common/src/javafx/scene/layout/BorderPane.java
--- a/javafx-ui-common/src/javafx/scene/layout/BorderPane.java
+++ b/javafx-ui-common/src/javafx/scene/layout/BorderPane.java
@@ -140,7 +140,6 @@
      *  BEGIN static methods
      ********************************************************************/
 
-    private static final String MARGIN = "borderpane-margin";
     private static final String ALIGNMENT = "borderpane-alignment";
 
     /**
@@ -171,7 +170,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node child, Insets value) {
-        setConstraint(child, MARGIN, value);
+        child.setMargin(value);
     }
 
     /**
@@ -180,12 +179,12 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node child) {
-        return (Insets)getConstraint(child, MARGIN);
+        return child.getMargin();
     }
 
     // convenience for handling null margins
     private static Insets getNodeMargin(Node child) {
-        Insets margin = getMargin(child);
+        Insets margin = child.getMargin();
         return margin != null ? margin : Insets.EMPTY;
     }
 
@@ -195,7 +194,9 @@
      */
     public static void clearConstraints(Node child) {
         setAlignment(child, null);
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
 
     /********************************************************************
@@ -380,11 +381,11 @@
             rightMinWidth = getAreaWidth(r, h[3], true);
             bottomMinWidth = getAreaWidth(b, h[4], true);
         } else {
-            topMinWidth = t != null? computeChildMinAreaWidth(t, getMargin(t)) : 0;
-            leftMinWidth = l != null? computeChildMinAreaWidth(l, getMargin(l)) : 0;
-            centerMinWidth = c != null? computeChildMinAreaWidth(c, getMargin(c)) : 0;
-            rightMinWidth = r != null? computeChildMinAreaWidth(r, getMargin(r)) : 0;
-            bottomMinWidth = b != null? computeChildMinAreaWidth(b, getMargin(b)) : 0;
+            topMinWidth = t != null? computeChildMinAreaWidth(t, t.getMargin()) : 0;
+            leftMinWidth = l != null? computeChildMinAreaWidth(l, l.getMargin()) : 0;
+            centerMinWidth = c != null? computeChildMinAreaWidth(c, c.getMargin()) : 0;
+            rightMinWidth = r != null? computeChildMinAreaWidth(r, r.getMargin()) : 0;
+            bottomMinWidth = b != null? computeChildMinAreaWidth(b, b.getMargin()) : 0;
         }
 
         final Insets insets = getInsets();
@@ -414,11 +415,11 @@
             rightMinHeight = getAreaHeight(r, w[2], true);
             bottomMinHeight = getAreaHeight(b, width, true);
         } else {
-            topMinHeight = t != null? computeChildMinAreaHeight(t, getMargin(t)) : 0;
-            leftMinHeight = l != null? computeChildMinAreaHeight(l, getMargin(l)) : 0;
-            centerMinHeight = c != null? computeChildMinAreaHeight(c, getMargin(c)) : 0;
-            rightMinHeight = r != null? computeChildMinAreaHeight(r, getMargin(r)) : 0;
-            bottomMinHeight = b != null? computeChildMinAreaHeight(b, getMargin(b)) : 0;
+            topMinHeight = t != null? computeChildMinAreaHeight(t, t.getMargin()) : 0;
+            leftMinHeight = l != null? computeChildMinAreaHeight(l, l.getMargin()) : 0;
+            centerMinHeight = c != null? computeChildMinAreaHeight(c, c.getMargin()) : 0;
+            rightMinHeight = r != null? computeChildMinAreaHeight(r, r.getMargin()) : 0;
+            bottomMinHeight = b != null? computeChildMinAreaHeight(b, b.getMargin()) : 0;
         }
 
         final Insets insets = getInsets();
@@ -448,15 +449,15 @@
             rightPrefWidth = getAreaWidth(r, h[3], false);
             bottomPrefWidth = getAreaWidth(b, h[4], false);
         } else {
-            double centerPrefHeight = c != null? computeChildPrefAreaHeight(c, getMargin(c)) : 0;
-            double leftPrefHeight = l != null? computeChildPrefAreaHeight(l, getMargin(l)) : 0;
-            double rightPrefHeight = r != null? computeChildPrefAreaHeight(r, getMargin(r)) : 0;
+            double centerPrefHeight = c != null? computeChildPrefAreaHeight(c, c.getMargin()) : 0;
+            double leftPrefHeight = l != null? computeChildPrefAreaHeight(l, l.getMargin()) : 0;
+            double rightPrefHeight = r != null? computeChildPrefAreaHeight(r, r.getMargin()) : 0;
             double maxHeight = Math.max(centerPrefHeight, Math.max(rightPrefHeight, leftPrefHeight));
-            leftPrefWidth = l != null? computeChildPrefAreaWidth(l, getMargin(l), maxHeight) : 0;
-            rightPrefWidth = r != null? computeChildPrefAreaWidth(r, getMargin(r), maxHeight) : 0;
-            centerPrefWidth = c != null? computeChildPrefAreaWidth(c, getMargin(c), maxHeight) : 0;
-            topPrefWidth = t != null? computeChildPrefAreaWidth(t, getMargin(t)) : 0;
-            bottomPrefWidth = b != null? computeChildPrefAreaWidth(b, getMargin(b)) : 0;
+            leftPrefWidth = l != null? computeChildPrefAreaWidth(l, l.getMargin(), maxHeight) : 0;
+            rightPrefWidth = r != null? computeChildPrefAreaWidth(r, r.getMargin(), maxHeight) : 0;
+            centerPrefWidth = c != null? computeChildPrefAreaWidth(c, c.getMargin(), maxHeight) : 0;
+            topPrefWidth = t != null? computeChildPrefAreaWidth(t, t.getMargin()) : 0;
+            bottomPrefWidth = b != null? computeChildPrefAreaWidth(b, b.getMargin()) : 0;
         }
 
         final Insets insets = getInsets();
@@ -489,11 +490,11 @@
             bottomPrefHeight = getAreaHeight(b, width, false);
             maxHeight = Math.max(centerPrefHeight, Math.max(rightPrefHeight, leftPrefHeight));
         } else {
-            final Insets centerMargin = c == null ? null : getMargin(c);
-            final Insets rightMargin = r == null ? null : getMargin(r);
-            final Insets bottomMargin = b == null ? null : getMargin(b);
-            final Insets leftMargin = l == null ? null : getMargin(l);
-            final Insets topMargin = t == null ? null : getMargin(t);
+            final Insets centerMargin = c == null ? null : c.getMargin();
+            final Insets rightMargin = r == null ? null : r.getMargin();
+            final Insets bottomMargin = b == null ? null : b.getMargin();
+            final Insets leftMargin = l == null ? null : l.getMargin();
+            final Insets topMargin = t == null ? null : t.getMargin();
             centerPrefHeight = c != null? computeChildPrefAreaHeight(c, centerMargin) : 0;
             leftPrefHeight = l != null? computeChildPrefAreaHeight(l, leftMargin) : 0;
             rightPrefHeight = r != null? computeChildPrefAreaHeight(r, rightMargin) : 0;
diff --git a/javafx-ui-common/src/javafx/scene/layout/FlowPane.java b/javafx-ui-common/src/javafx/scene/layout/FlowPane.java
--- a/javafx-ui-common/src/javafx/scene/layout/FlowPane.java
+++ b/javafx-ui-common/src/javafx/scene/layout/FlowPane.java
@@ -149,7 +149,6 @@
     /********************************************************************
      *  BEGIN static methods
      ********************************************************************/
-    private static final String MARGIN_CONSTRAINT = "flowpane-margin";
 
     /**
      * Sets the margin for the child when contained by a flowpane.
@@ -159,7 +158,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node child, Insets value) {
-        setConstraint(child, MARGIN_CONSTRAINT, value);
+        child.setMargin(value);
     }
 
     /**
@@ -168,7 +167,7 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node child) {
-        return (Insets)getConstraint(child, MARGIN_CONSTRAINT);
+        return child.getMargin();
     }
 
     /**
@@ -176,7 +175,9 @@
      * @param child the child node
      */
     public static void clearConstraints(Node child) {
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
 
     /********************************************************************
@@ -634,7 +635,7 @@
                 if (child.isManaged()) {
                     LayoutRect nodeRect = new LayoutRect();
                     nodeRect.node = child;
-                    Insets margin = getMargin(child);
+                    Insets margin = child.getMargin();
                     nodeRect.width = computeChildPrefAreaWidth(child, margin);
                     nodeRect.height = computeChildPrefAreaHeight(child, margin);
                     double nodeLength = getOrientation() == HORIZONTAL ? nodeRect.width : nodeRect.height;
@@ -681,7 +682,7 @@
             Insets margins[] = new Insets[run.rects.size()];
             for (int i=0, max=run.rects.size(); i<max; i++) {
                 LayoutRect lrect = run.rects.get(i);
-                margins[i] = getMargin(lrect.node);
+                margins[i] = lrect.node.getMargin();
                 rownodes.add(lrect.node);
                 run.width += lrect.width;
                 lrect.y = runOffset;
@@ -764,7 +765,7 @@
                 layoutInArea(lrect.node, x, y,
                            getOrientation() == HORIZONTAL? lrect.width : run.width,
                            getOrientation() == VERTICAL? lrect.height : run.height,
-                           run.baselineOffset, getMargin(lrect.node),
+                           run.baselineOffset, lrect.node.getMargin(),
                            // only fill height if we don't have baseline alignment
                            true, getOrientation() == VERTICAL || getRowValignment() != VPos.BASELINE,
                            getColumnHalignment(), getRowValignment());
diff --git a/javafx-ui-common/src/javafx/scene/layout/GridPane.java b/javafx-ui-common/src/javafx/scene/layout/GridPane.java
--- a/javafx-ui-common/src/javafx/scene/layout/GridPane.java
+++ b/javafx-ui-common/src/javafx/scene/layout/GridPane.java
@@ -32,10 +32,14 @@
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.ObjectProperty;
-import javafx.beans.value.WritableValue;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ListChangeListener.Change;
 import javafx.collections.ObservableList;
+import javafx.css.CssMetaData;
+import javafx.css.StyleableBooleanProperty;
+import javafx.css.StyleableDoubleProperty;
+import javafx.css.StyleableObjectProperty;
+import javafx.css.StyleableProperty;
 import javafx.geometry.HPos;
 import javafx.geometry.Insets;
 import javafx.geometry.Orientation;
@@ -46,14 +50,9 @@
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Line;
 import com.sun.javafx.collections.TrackableObservableList;
-import javafx.css.StyleableBooleanProperty;
-import javafx.css.StyleableDoubleProperty;
-import javafx.css.StyleableObjectProperty;
-import javafx.css.CssMetaData;
 import com.sun.javafx.css.converters.BooleanConverter;
 import com.sun.javafx.css.converters.EnumConverter;
 import com.sun.javafx.css.converters.SizeConverter;
-import javafx.css.StyleableProperty;
 
 
 
@@ -247,7 +246,6 @@
     /********************************************************************
      *  BEGIN static methods
      ********************************************************************/
-    private static final String MARGIN_CONSTRAINT = "gridpane-margin";
     private static final String HALIGNMENT_CONSTRAINT = "gridpane-halignment";
     private static final String VALIGNMENT_CONSTRAINT = "gridpane-valignment";
     private static final String HGROW_CONSTRAINT = "gridpane-hgrow";
@@ -369,7 +367,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node child, Insets value) {
-        setConstraint(child, MARGIN_CONSTRAINT, value);
+        child.setMargin(value);
     }
 
     /**
@@ -378,7 +376,7 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node child) {
-        return (Insets)getConstraint(child, MARGIN_CONSTRAINT);
+        return child.getMargin();
     }
 
     /**
@@ -558,7 +556,7 @@
         setValignment(child, valignment);
         setHgrow(child, hgrow);
         setVgrow(child, vgrow);
-        setMargin(child, margin);
+        child.setMargin(margin);
     }
 
     /**
@@ -574,7 +572,9 @@
         setValignment(child, null);
         setHgrow(child, null);
         setVgrow(child, null);
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
 
 
@@ -1189,7 +1189,7 @@
                 Node n = startNodes.get(j);
                 if (getValignment(n) == VPos.BASELINE) {
                     baselineNodes.add(n);
-                    margins[k++] = getMargin(n);
+                    margins[k++] = n.getMargin();
                 }
             }
             rowBaseline[i] = getMaxAreaBaselineOffset(baselineNodes, margins);
@@ -1199,7 +1199,7 @@
                 // compute from content
                 for (int j = 0, size = endNodes.size(); j < size; j++) {
                     Node child = endNodes.get(j);                    
-                    Insets margin = getMargin(child);
+                    Insets margin = child.getMargin();
                     double top = margin != null? margin.getTop() : 0;
                     int rowIndex = getNodeRowIndex(child);
                     int rowspan = getNodeRowSpan(child);                    
@@ -1359,7 +1359,7 @@
                 // compute from content                
                 for (int j = 0, size = endNodes.size(); j < size; j++) {
                     Node child = endNodes.get(j);
-                    Insets margin = getMargin(child);
+                    Insets margin = child.getMargin();
                     int columnIndex = getNodeColumnIndex(child);
                     int colspan = getNodeColumnSpan(child);
                     if (colspan == REMAINING) {
@@ -1553,7 +1553,7 @@
 
                 HPos halign = getHalignment(child);
                 VPos valign = getValignment(child);
-                Insets margin = getMargin(child);
+                Insets margin = child.getMargin();
                 if (margin != null && valign == VPos.BASELINE) {
                     // The top margin has already added to rowBaseline[] in computeRowMetric()
                     // we do not need to add it again in layoutInArea.
diff --git a/javafx-ui-common/src/javafx/scene/layout/HBox.java b/javafx-ui-common/src/javafx/scene/layout/HBox.java
--- a/javafx-ui-common/src/javafx/scene/layout/HBox.java
+++ b/javafx-ui-common/src/javafx/scene/layout/HBox.java
@@ -147,7 +147,6 @@
     /********************************************************************
      *  BEGIN static methods
      ********************************************************************/
-    private static final String MARGIN_CONSTRAINT = "hbox-margin";
     private static final String HGROW_CONSTRAINT = "hbox-hgrow";
 
     /**
@@ -183,7 +182,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node child, Insets value) {
-        setConstraint(child, MARGIN_CONSTRAINT, value);
+        child.setMargin(value);
     }
 
     /**
@@ -192,7 +191,7 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node child) {
-        return (Insets)getConstraint(child, MARGIN_CONSTRAINT);
+        return child.getMargin();
     }
 
     /**
@@ -201,7 +200,9 @@
      */
     public static void clearConstraints(Node child) {
         setHgrow(child, null);
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
 
     /********************************************************************
@@ -424,7 +425,7 @@
     private Insets[] getMargins(List<Node>managed) {
         Insets margins[] = new Insets[managed.size()];
         for(int i = 0; i < margins.length; i++) {
-            margins[i] = getMargin(managed.get(i));
+            margins[i] = managed.get(i).getMargin();
         }
         return margins;
     }
@@ -436,7 +437,7 @@
                                      snapSpace(getInsets().getTop()) - snapSpace(getInsets().getBottom());
         for (int i = 0, size = managed.size(); i < size; i++) {
             Node child = managed.get(i);
-            Insets margin = getMargin(child);
+            Insets margin = child.getMargin();
             prefAreaWidths[i] = minimum?
                                computeChildMinAreaWidth(child, margin,
                                    shouldFillHeight()? insideHeight : child.minHeight(-1)) :
@@ -481,7 +482,7 @@
         double[] areaLimitWidths = new double[adjustList.size()];
         for (int i = 0, size = adjustList.size(); i < size; i++) {
             final Node child = adjustList.get(i);
-            final Insets margin = getMargin(child);
+            final Insets margin = child.getMargin();
             areaLimitWidths[i] = shrinking?
                 computeChildMinAreaWidth(child, margin, height) : computeChildMaxAreaWidth(child, margin, height);
         }
@@ -547,7 +548,7 @@
 
         for (int i = 0, size = managed.size(); i < size; i++) {
             Node child = managed.get(i);
-            Insets margin = getMargin(child);
+            Insets margin = child.getMargin();
             layoutInArea(child, x, y, actualAreaWidths[i], contentHeight,
                     baselineOffset, margin, true, shouldFillHeight(),
                     getAlignment().getHpos(), getAlignment().getVpos());
diff --git a/javafx-ui-common/src/javafx/scene/layout/StackPane.java b/javafx-ui-common/src/javafx/scene/layout/StackPane.java
--- a/javafx-ui-common/src/javafx/scene/layout/StackPane.java
+++ b/javafx-ui-common/src/javafx/scene/layout/StackPane.java
@@ -130,10 +130,9 @@
      *  BEGIN static methods
      ********************************************************************/
 
-    private static final String MARGIN_CONSTRAINT = "stackpane-margin";
     private static final String ALIGNMENT_CONSTRAINT = "stackpane-alignment";
 
-   /**
+    /**
      * Sets the alignment for the child when contained by a stackpane.
      * If set, will override the stackpane's default alignment.
      * Setting the value to null will remove the constraint.
@@ -161,7 +160,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node child, Insets value) {
-        setConstraint(child, MARGIN_CONSTRAINT, value);
+        child.setMargin(value);
     }
 
     /**
@@ -170,7 +169,7 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node child) {
-        return (Insets)getConstraint(child, MARGIN_CONSTRAINT);
+        return child.getMargin();
     }
 
     /**
@@ -179,7 +178,9 @@
      */
     public static void clearConstraints(Node child) {
         setAlignment(child, null);
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
     /********************************************************************
      *  END static methods
@@ -316,7 +317,7 @@
     private Insets[] getMargins(List<Node>managed) {
         Insets margins[] = new Insets[managed.size()];
         for(int i = 0; i < margins.length; i++) {
-            margins[i] = getMargin(managed.get(i));
+            margins[i] = managed.get(i).getMargin();
         }
         return margins;
     }
@@ -336,7 +337,7 @@
             Pos childAlignment = StackPane.getAlignment(child);
             layoutInArea(child, left, top,
                            width - left - right, height - top - bottom,
-                           baselineOffset, getMargin(child),
+                           baselineOffset, child.getMargin(),
                            childAlignment != null? childAlignment.getHpos() : getAlignment().getHpos(),
                            childAlignment != null? childAlignment.getVpos() : getAlignment().getVpos());
         }
diff --git a/javafx-ui-common/src/javafx/scene/layout/TilePane.java b/javafx-ui-common/src/javafx/scene/layout/TilePane.java
--- a/javafx-ui-common/src/javafx/scene/layout/TilePane.java
+++ b/javafx-ui-common/src/javafx/scene/layout/TilePane.java
@@ -181,7 +181,6 @@
      *  BEGIN static methods
      ********************************************************************/
 
-    private static final String MARGIN_CONSTRAINT = "tilepane-margin";
     private static final String ALIGNMENT_CONSTRAINT = "tilepane-alignment";
 
     /**
@@ -213,7 +212,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node node, Insets value) {
-        setConstraint(node, MARGIN_CONSTRAINT, value);
+        node.setMargin(value);
     }
 
     /**
@@ -222,7 +221,7 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node node) {
-        return (Insets)getConstraint(node, MARGIN_CONSTRAINT);
+        return node.getMargin();
     }
 
     /**
@@ -231,7 +230,9 @@
      */
     public static void clearConstraints(Node child) {
         setAlignment(child, null);
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
 
     /********************************************************************
@@ -781,7 +782,7 @@
     private Insets[] getMargins(List<Node>managed) {
         Insets margins[] = new Insets[managed.size()];
         for(int i = 0; i < margins.length; i++) {
-            margins[i] = getMargin(managed.get(i));
+            margins[i] = managed.get(i).getMargin();
         }
         return margins;
     }
@@ -922,7 +923,7 @@
             Pos childAlignment = getAlignment(child);
             
             layoutInArea(child, tileX, tileY, getTileWidth(), getTileHeight(), baselineOffset,
-                    getMargin(child),
+                    child.getMargin(),
                     childAlignment != null? childAlignment.getHpos() : getTileAlignment().getHpos(),
                     childAlignment != null? childAlignment.getVpos() : getTileAlignment().getVpos());
 
diff --git a/javafx-ui-common/src/javafx/scene/layout/VBox.java b/javafx-ui-common/src/javafx/scene/layout/VBox.java
--- a/javafx-ui-common/src/javafx/scene/layout/VBox.java
+++ b/javafx-ui-common/src/javafx/scene/layout/VBox.java
@@ -138,7 +138,6 @@
 /********************************************************************
      *  BEGIN static methods
      ********************************************************************/
-    private static final String MARGIN_CONSTRAINT = "vbox-margin";
     private static final String VGROW_CONSTRAINT = "vbox-vgrow";
 
     /**
@@ -174,7 +173,7 @@
      * @param value the margin of space around the child
      */
     public static void setMargin(Node child, Insets value) {
-        setConstraint(child, MARGIN_CONSTRAINT, value);
+        child.setMargin(value);
     }
 
     /**
@@ -183,7 +182,7 @@
      * @return the margin for the child or null if no margin was set
      */
     public static Insets getMargin(Node child) {
-        return (Insets)getConstraint(child, MARGIN_CONSTRAINT);
+        return child.getMargin();
     }
 
     /**
@@ -192,7 +191,9 @@
      */
     public static void clearConstraints(Node child) {
         setVgrow(child, null);
-        setMargin(child, null);
+        if (!child.marginProperty().isBound()) {
+            child.setMargin(null);
+        }
     }
 
     /********************************************************************
@@ -400,7 +401,7 @@
     private Insets[] getMargins(List<Node>managed) {
         Insets margins[] = new Insets[managed.size()];
         for(int i = 0; i < margins.length; i++) {
-            margins[i] = getMargin(managed.get(i));
+            margins[i] = managed.get(i).getMargin();
         }
         return margins;
     }
@@ -411,7 +412,7 @@
                 snapSpace(getInsets().getLeft()) - snapSpace(getInsets().getRight());
         for (int i = 0, size = managed.size(); i < size; i++) {
             Node child = managed.get(i);
-            Insets margin = getMargin(child);
+            Insets margin = child.getMargin();
             prefAreaHeights[i] = minimum?
                                computeChildMinAreaHeight(child, margin,
                                    isFillWidth()? insideWidth : child.minWidth(-1)) :
@@ -457,7 +458,7 @@
         double[] areaLimitHeights = new double[adjustList.size()];
         for (int i = 0, size = adjustList.size(); i < size; i++) {        
             Node child = adjustList.get(i);
-            Insets margin  = getMargin(child);
+            Insets margin  = child.getMargin();
             areaLimitHeights[i] = shrinking?
                 computeChildMinAreaHeight(child, margin, width) : computeChildMaxAreaHeight(child, margin, width);
         }
@@ -521,7 +522,7 @@
             Node child = managed.get(i);            
             layoutInArea(child, x, y, contentWidth, actualAreaHeights[i],
                        /* baseline shouldn't matter */actualAreaHeights[i],
-                       getMargin(child), isFillWidth(), true,
+                       child.getMargin(), isFillWidth(), true,
                        hpos, vpos);
             y += actualAreaHeights[i] + space;
         }
diff --git a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ColorPickerSkin.java b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ColorPickerSkin.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ColorPickerSkin.java
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ColorPickerSkin.java
@@ -24,37 +24,36 @@
  */
 package com.sun.javafx.scene.control.skin;
 
-import javafx.beans.property.StringProperty;
-import javafx.css.StyleOrigin;
-import javafx.css.StyleableBooleanProperty;
-import javafx.css.CssMetaData;
-import com.sun.javafx.css.converters.BooleanConverter;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.StringProperty;
+import javafx.css.CssMetaData;
+import javafx.css.StyleOrigin;
+import javafx.css.StyleableBooleanProperty;
 import javafx.css.StyleableDoubleProperty;
+import javafx.css.StyleableProperty;
 import javafx.css.StyleableStringProperty;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
 import javafx.geometry.Pos;
-import javafx.geometry.VPos;
 import javafx.scene.Node;
-import javafx.event.EventHandler;
-import javafx.scene.control.*;
+import javafx.scene.control.ColorPicker;
+import javafx.scene.control.Label;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.StackPane;
+import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
+import com.sun.javafx.css.converters.BooleanConverter;
 import com.sun.javafx.css.converters.SizeConverter;
 import com.sun.javafx.css.converters.StringConverter;
 import com.sun.javafx.scene.control.behavior.ColorPickerBehavior;
-import javafx.scene.control.ColorPicker;
-import javafx.beans.property.BooleanProperty;
-import javafx.css.StyleableProperty;
-import javafx.event.ActionEvent;
-import javafx.scene.paint.Color;
 
 /**
  *
@@ -375,7 +374,7 @@
                 Pos childAlignment = StackPane.getAlignment(icon);
                 layoutInArea(icon, left, top,
                              width - left - right, height - top - bottom,
-                             0, getMargin(icon),
+                             0, icon.getMargin(),
                              childAlignment != null? childAlignment.getHpos() : getAlignment().getHpos(),
                              childAlignment != null? childAlignment.getVpos() : getAlignment().getVpos());
                 colorRect.setLayoutX(icon.getLayoutX());
@@ -384,7 +383,7 @@
                 Pos childAlignment = StackPane.getAlignment(colorRect);
                 layoutInArea(colorRect, left, top,
                              width - left - right, height - top - bottom,
-                             0, getMargin(colorRect),
+                             0, colorRect.getMargin(),
                              childAlignment != null? childAlignment.getHpos() : getAlignment().getHpos(),
                              childAlignment != null? childAlignment.getVpos() : getAlignment().getVpos());
             }
diff --git a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/PaginationSkin.java b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/PaginationSkin.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/PaginationSkin.java
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/PaginationSkin.java
@@ -44,16 +44,13 @@
 
 package com.sun.javafx.scene.control.skin;
 
-import javafx.css.StyleableBooleanProperty;
-import javafx.css.StyleableObjectProperty;
-import javafx.css.CssMetaData;
-import com.sun.javafx.css.converters.BooleanConverter;
-import com.sun.javafx.css.converters.EnumConverter;
-import com.sun.javafx.scene.control.behavior.PaginationBehavior;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import javafx.animation.*;
+import javafx.animation.Interpolator;
+import javafx.animation.KeyFrame;
+import javafx.animation.KeyValue;
+import javafx.animation.Timeline;
 import javafx.application.Platform;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
@@ -62,6 +59,9 @@
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 import javafx.collections.ListChangeListener;
+import javafx.css.CssMetaData;
+import javafx.css.StyleableBooleanProperty;
+import javafx.css.StyleableObjectProperty;
 import javafx.css.StyleableProperty;
 import javafx.event.ActionEvent;
 import javafx.event.EventHandler;
@@ -71,13 +71,23 @@
 import javafx.geometry.Side;
 import javafx.geometry.VPos;
 import javafx.scene.Node;
-import javafx.scene.control.*;
+import javafx.scene.control.Button;
+import javafx.scene.control.Control;
+import javafx.scene.control.Label;
+import javafx.scene.control.Pagination;
+import javafx.scene.control.SkinBase;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.control.Tooltip;
 import javafx.scene.input.TouchEvent;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.StackPane;
 import javafx.scene.shape.Rectangle;
 import javafx.scene.text.Font;
 import javafx.util.Duration;
+import com.sun.javafx.css.converters.BooleanConverter;
+import com.sun.javafx.css.converters.EnumConverter;
+import com.sun.javafx.scene.control.behavior.PaginationBehavior;
 
 public class PaginationSkin extends BehaviorSkinBase<Pagination, PaginationBehavior>  {
 
@@ -757,7 +767,7 @@
             leftArrowButton.setMinSize(minButtonSize, minButtonSize);
             leftArrowButton.getStyleClass().add("left-arrow-button");
             leftArrowButton.setFocusTraversable(false);
-            HBox.setMargin(leftArrowButton, new Insets(0, 4, 0, 0));
+            leftArrowButton.setMargin(new Insets(0, 4, 0, 0));
             leftArrow = new StackPane();
             leftArrow.setMaxSize(USE_PREF_SIZE, USE_PREF_SIZE);
             leftArrowButton.setGraphic(leftArrow);
@@ -767,7 +777,7 @@
             rightArrowButton.setMinSize(minButtonSize, minButtonSize);
             rightArrowButton.getStyleClass().add("right-arrow-button");
             rightArrowButton.setFocusTraversable(false);
-            HBox.setMargin(rightArrowButton, new Insets(0, 0, 0, 4));
+            rightArrowButton.setMargin(new Insets(0, 0, 0, 4));
             rightArrow = new StackPane();
             rightArrow.setMaxSize(USE_PREF_SIZE, USE_PREF_SIZE);
             rightArrowButton.setGraphic(rightArrow);
