diff --git a/javafx-sg-common/src/com/sun/javafx/sg/PGRegion.java b/javafx-sg-common/src/com/sun/javafx/sg/PGRegion.java
--- a/javafx-sg-common/src/com/sun/javafx/sg/PGRegion.java
+++ b/javafx-sg-common/src/com/sun/javafx/sg/PGRegion.java
@@ -58,8 +58,9 @@
      * @param shape    The shape, may be null.
      * @param scaleShape whether to scale the shape
      * @param positionShape whether to center the shape
+     * @param cacheShape whether to attempt region caching for the shape-based region
      */
-    public void updateShape(Object shape, boolean scaleShape, boolean positionShape);
+    public void updateShape(Object shape, boolean scaleShape, boolean positionShape, boolean cacheShape);
 
     /**
      * The opaque insets as specified either by the user, or as determined by
diff --git a/javafx-sg-prism/src/com/sun/javafx/sg/prism/NGRegion.java b/javafx-sg-prism/src/com/sun/javafx/sg/prism/NGRegion.java
--- a/javafx-sg-prism/src/com/sun/javafx/sg/prism/NGRegion.java
+++ b/javafx-sg-prism/src/com/sun/javafx/sg/prism/NGRegion.java
@@ -130,6 +130,11 @@
     private boolean centerShape = true;
 
     /**
+     * Whether we should attempt to use region caching for a region with a shape.
+     */
+    private boolean cacheShape = false;
+
+    /**
      * A cached set of the opaque insets as given to us during synchronization. We hold
      * on to this so that we can determine the opaque insets in the computeOpaqueRegion method.
      */
@@ -172,10 +177,11 @@
      * @param scaleShape whether to scale the shape
      * @param positionShape whether to center the shape
      */
-    @Override public void updateShape(Object shape, boolean scaleShape, boolean positionShape) {
+    @Override public void updateShape(Object shape, boolean scaleShape, boolean positionShape, boolean cacheShape) {
         this.shape = shape == null ? null : ((NGShape) ((javafx.scene.shape.Shape)shape).impl_getPGNode()).getShape();
         this.scaleShape = scaleShape;
         this.centerShape = positionShape;
+        this.cacheShape = cacheShape;
         invalidateOpaqueRegion();
     }
 
@@ -228,7 +234,7 @@
 
         float top=0, right=0, bottom=0, left=0;
         final List<BackgroundFill> fills = background.getFills();
-        backgroundCanBeCached = !PrismSettings.disableRegionCaching && !fills.isEmpty();
+        backgroundCanBeCached = !PrismSettings.disableRegionCaching && !fills.isEmpty() && (shape == null || cacheShape);
         if (backgroundCanBeCached) {
             for (int i = 0, max = fills.size(); i < max; i++) {
                 final BackgroundFill fill = fills.get(i);
diff --git a/javafx-ui-charts/src/javafx/scene/chart/BubbleChart.java b/javafx-ui-charts/src/javafx/scene/chart/BubbleChart.java
--- a/javafx-ui-charts/src/javafx/scene/chart/BubbleChart.java
+++ b/javafx-ui-charts/src/javafx/scene/chart/BubbleChart.java
@@ -108,7 +108,6 @@
                         StackPane region = (StackPane)item.getNode();
                         if (region.getShape() == null) {
                             ellipse = new Ellipse(getDoubleValue(item.getExtraValue(), 1), getDoubleValue(item.getExtraValue(), 1));
-                            region.setShape(ellipse);
                         } else if (region.getShape() instanceof Ellipse) {
                             ellipse = (Ellipse)region.getShape();
                         } else {
@@ -123,6 +122,7 @@
                         region.setShape(ellipse);
                         region.setScaleShape(false);
                         region.setCenterShape(false);
+                        region.setCacheShape(false);
                         // position the bubble
                         bubble.setLayoutX(x);
                         bubble.setLayoutY(y);
diff --git a/javafx-ui-charts/src/javafx/scene/chart/PieChart.java b/javafx-ui-charts/src/javafx/scene/chart/PieChart.java
--- a/javafx-ui-charts/src/javafx/scene/chart/PieChart.java
+++ b/javafx-ui-charts/src/javafx/scene/chart/PieChart.java
@@ -24,13 +24,15 @@
  */
 package javafx.scene.chart;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-
+import javafx.animation.Animation;
 import javafx.animation.FadeTransition;
 import javafx.animation.Interpolator;
 import javafx.animation.KeyFrame;
 import javafx.animation.KeyValue;
+import javafx.animation.Timeline;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.DoublePropertyBase;
@@ -51,21 +53,24 @@
 import javafx.geometry.Side;
 import javafx.scene.Node;
 import javafx.scene.layout.Region;
-import javafx.scene.shape.*;
+import javafx.scene.shape.Arc;
+import javafx.scene.shape.ArcTo;
+import javafx.scene.shape.ArcType;
+import javafx.scene.shape.ClosePath;
+import javafx.scene.shape.LineTo;
+import javafx.scene.shape.MoveTo;
+import javafx.scene.shape.Path;
 import javafx.scene.text.Text;
 import javafx.scene.transform.Scale;
 import javafx.util.Duration;
-
 import com.sun.javafx.charts.Legend;
 import com.sun.javafx.charts.Legend.LegendItem;
 import com.sun.javafx.collections.NonIterableChange;
+import com.sun.javafx.css.CssMetaData;
 import com.sun.javafx.css.StyleableBooleanProperty;
 import com.sun.javafx.css.StyleableDoubleProperty;
-import com.sun.javafx.css.CssMetaData;
 import com.sun.javafx.css.converters.BooleanConverter;
 import com.sun.javafx.css.converters.SizeConverter;
-import java.util.ArrayList;
-import javafx.animation.*;
 
 /**
  * Displays a PieChart. The chart content is populated by pie slices based on
@@ -334,7 +339,7 @@
         // check if symbol has already been created
         if (arcRegion == null) {
             arcRegion = new Region();
-            arcRegion.setPickOnBounds(false); 
+            arcRegion.setPickOnBounds(false);
             item.setNode(arcRegion);
         }
         // Note: not sure if we want to add or check, ie be more careful and efficient here
@@ -601,6 +606,7 @@
                         arcRegion.setShape(arc);
                         arcRegion.setScaleShape(false);
                         arcRegion.setCenterShape(false);
+                        arcRegion.setCacheShape(false);
                     }
                 }
                 double size = (isClockwise()) ? (-scale * Math.abs(item.getCurrentPieValue())) : (scale * Math.abs(item.getCurrentPieValue()));
diff --git a/javafx-ui-common/src/javafx/scene/layout/Region.java b/javafx-ui-common/src/javafx/scene/layout/Region.java
--- a/javafx-ui-common/src/javafx/scene/layout/Region.java
+++ b/javafx-ui-common/src/javafx/scene/layout/Region.java
@@ -1046,13 +1046,13 @@
         }
         return centerShape;
     }
+
     /**
-     * Defines whether the shape is centered within the Region's width or height.
-     * {@code true} means the shape centered within the Region's width and height,
-     * {@code false} means the shape is positioned at its source position.
+     * Defines a hint to the system indicating that the Shape used to define the region's
+     * background is stable and would benefit from caching.
      *
      * @default true
-     * @css position-shape      true | false
+     * @css -fx-cache-shape      true | false
      */
     private BooleanProperty cacheShape = null;
     public final void setCacheShape(boolean value) { cacheShapeProperty().set(value); }
@@ -1864,7 +1864,7 @@
         // the shape must be specified before the background which is before the border.
         final boolean shapeChanged = impl_isDirty(DirtyBits.REGION_SHAPE);
         if (shapeChanged) {
-            pg.updateShape(_shape, isScaleShape(), isCenterShape());
+            pg.updateShape(_shape, isScaleShape(), isCenterShape(), isCacheShape());
         }
 
         final boolean backgroundChanged = impl_isDirty(DirtyBits.SHAPE_FILL);
diff --git a/test-stub-toolkit/src/com/sun/javafx/pgstub/StubRegion.java b/test-stub-toolkit/src/com/sun/javafx/pgstub/StubRegion.java
--- a/test-stub-toolkit/src/com/sun/javafx/pgstub/StubRegion.java
+++ b/test-stub-toolkit/src/com/sun/javafx/pgstub/StubRegion.java
@@ -42,7 +42,7 @@
     }
     public void updateBackground(Object background) {
     }
-    public void updateShape(Object shape, boolean scale, boolean center) {
+    public void updateShape(Object shape, boolean scale, boolean center, boolean cacheShape) {
     }
     public void setSize(float width, float height) {
     }
