Index: oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java	(revision 1446171)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java	(revision )
@@ -209,6 +209,11 @@
     }
 
     @Override
+    public void setHasOrderableChildren(boolean enable) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public boolean remove() {
         throw new UnsupportedOperationException();
     }
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java	(revision 1446171)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java	(revision )
@@ -299,6 +299,15 @@
     }
 
     @Override
+    public void setHasOrderableChildren(boolean enable) {
+        if (enable) {
+            ensureChildOrderProperty();
+        } else {
+            nodeBuilder.removeProperty(OAK_CHILD_ORDER);
+        }
+    }
+
+    @Override
     public boolean remove() {
         root.checkLive();
         if (isDisconnected()) {
@@ -571,7 +580,7 @@
      * the property if it doesn't exist and initialize the value with the names
      * of the children as returned by {@link NodeBuilder#getChildNodeNames()}.
      */
-    public void ensureChildOrderProperty() {
+    private void ensureChildOrderProperty() {
         PropertyState childOrder = nodeBuilder.getProperty(OAK_CHILD_ORDER);
         if (childOrder == null) {
             nodeBuilder.setProperty(
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/util/TreeUtil.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/util/TreeUtil.java	(revision 1446171)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/util/TreeUtil.java	(revision )
@@ -79,16 +79,4 @@
         PropertyState property = tree.getProperty(propertyName);
         return property != null && !property.isArray() && property.getValue(BOOLEAN);
     }
-
-    /**
-     * Utility method that assert that children of a tree keep the order such
-     * as defined by the insertion and any subsequent
-     * {@link Tree#orderBefore(String) reordering}.
-     *
-     * @param tree The parent tree whose children are mandated to be orderable.
-     */
-    public static void ensureOrderableChildren(Tree tree) {
-        checkArgument(tree instanceof TreeImpl);
-        ((TreeImpl) tree).ensureChildOrderProperty();
-    }
+}
\ No newline at end of file
-}
\ No newline at end of file
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java	(revision 1446171)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java	(revision )
@@ -228,6 +228,32 @@
     Tree addChild(String name);
 
     /**
+     * Changes the nature of this tree such that the order of the children
+     * is kept stable. The expected behavior is as follows:
+     *
+     * <ol>
+     *     <li>Calling {@code setHasOrderableChildren(true)} on a tree
+     *     the first time will stabilize the order of existing children. Any
+     *     subsequent {@link #addChild(String)} call is guaranteed to insert
+     *     the new tree and the end of the child list.</li>
+     *     <li>Calling {@code setHasOrderableChildren(true)} on a tree
+     *     that already has a it's children ordered has no effect.</li>
+     *     <li>Calling {@code setHasOrderableChildren(false)} on a tree that
+     *     doesn't have ordered children has not effect</li>
+     *     <li>Calling {@code setHasOrderableChildren(false)} on a tree
+     *     with ordered children will remove the necessity to keep the child
+     *     list stable. The order of children upon {@link #getChildren()} is
+     *     subsequently undefined.</li>
+     * </ol>
+     *
+     * Once the list of child tree has been marked as being orderable the child
+     * trees can be reordered by calling {@link #orderBefore(String)}.
+     *
+     * @param enable Enable (or disable) orderable children for this tree.
+     */
+    void setHasOrderableChildren(boolean enable);
+
+    /**
      * Orders this {@code Tree} before the sibling tree with the given
      * {@code name}. Calling this method for the first time on this
      * {@code Tree} or any of its siblings will persist the current order
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlManagerImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlManagerImpl.java	(revision 1446198)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlManagerImpl.java	(revision )
@@ -219,7 +219,7 @@
             } else {
                 aclNode = createAclNode(oakPath, tree);
             }
-            TreeUtil.ensureOrderableChildren(aclNode.getTree());
+            aclNode.getTree().setHasOrderableChildren(true);
 
             ACL acl = (ACL) policy;
             for (JackrabbitAccessControlEntry ace : acl.getEntries()) {
