diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
index b894ad8..5bd94e4 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -609,6 +609,10 @@
         public void setDismissable(Object info, boolean dismissable);
         public boolean isEditable(Object info);
         public void setEditable(Object info, boolean editable);
+        public int getDrawingOrder(Object info);
+        public void setDrawingOrder(Object info, int drawingOrderInParent);
+        public boolean isImportantForAccessibility(Object info);
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility);
         public boolean isMultiLine(Object info);
         public void setMultiLine(Object info, boolean multiLine);
         public boolean refresh(Object info);
@@ -1227,6 +1231,24 @@
         @Override
         public void setRoleDescription(Object info, CharSequence roleDescription) {
         }
+
+        @Override
+        public int getDrawingOrder(Object info) {
+            return 0;
+        }
+
+        @Override
+        public void setDrawingOrder(Object info, int drawingOrderInParent) {
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(Object info) {
+            return true;
+        }
+
+        @Override
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
+        }
     }
 
     static class AccessibilityNodeInfoIcsImpl extends AccessibilityNodeInfoStubImpl {
@@ -1895,8 +1917,34 @@
         }
     }
 
+    static class AccessibilityNodeInfoApi24Impl extends AccessibilityNodeInfoApi22Impl {
+        @Override
+        public int getDrawingOrder(Object info) {
+            return AccessibilityNodeInfoCompatApi24.getDrawingOrder(info);
+        }
+
+        @Override
+        public void setDrawingOrder(Object info, int drawingOrderInParent) {
+            AccessibilityNodeInfoCompatApi24.setDrawingOrder(info, drawingOrderInParent);
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(Object info) {
+            return AccessibilityNodeInfoCompatApi24.isImportantForAccessibility(info);
+        }
+
+        @Override
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
+            AccessibilityNodeInfoCompatApi24.setImportantForAccessibility(
+                    info, importantForAccessibility);
+        }
+
+    }
+
     static {
-        if (Build.VERSION.SDK_INT >= 22) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            IMPL = new AccessibilityNodeInfoApi24Impl();
+        } else if (Build.VERSION.SDK_INT >= 22) {
             IMPL = new AccessibilityNodeInfoApi22Impl();
         } else if (Build.VERSION.SDK_INT >= 21) {
             IMPL = new AccessibilityNodeInfoApi21Impl();
@@ -3025,6 +3073,33 @@
     }
 
     /**
+     * Returns whether the node originates from a view considered important for accessibility.
+     *
+     * @return {@code true} if the node originates from a view considered important for
+     *         accessibility, {@code false} otherwise
+     *
+     * @see View#isImportantForAccessibility()
+     */
+    public boolean isImportantForAccessibility() {
+        return IMPL.isImportantForAccessibility(mInfo);
+    }
+
+    /**
+     * Sets whether the node is considered important for accessibility.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param important {@code true} if the node is considered important for accessibility,
+     *                  {@code false} otherwise
+     */
+    public void setImportantForAccessibility(boolean important) {
+        IMPL.setImportantForAccessibility(mInfo, important);
+    }
+
+    /**
      * Gets the package this node comes from.
      *
      * @return The package name.
@@ -3201,6 +3276,36 @@
     }
 
     /**
+     * Get the drawing order of the view corresponding it this node.
+     * <p>
+     * Drawing order is determined only within the node's parent, so this index is only relative
+     * to its siblings.
+     * <p>
+     * In some cases, the drawing order is essentially simultaneous, so it is possible for two
+     * siblings to return the same value. It is also possible that values will be skipped.
+     *
+     * @return The drawing position of the view corresponding to this node relative to its siblings.
+     */
+    public int getDrawingOrder() {
+        return IMPL.getDrawingOrder(mInfo);
+    }
+
+    /**
+     * Set the drawing order of the view corresponding it this node.
+     *
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     * @param drawingOrderInParent
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setDrawingOrder(int drawingOrderInParent) {
+        IMPL.setDrawingOrder(mInfo, drawingOrderInParent);
+    }
+
+    /**
      * Gets the collection info if the node is a collection. A collection
      * child is always a collection item.
      *
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
index 3197bb1..738924c 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
@@ -39,10 +39,12 @@
         public boolean isAccessibilityFocused(Object info);
         public int getChildCount(Object info);
         public Object getChild(Object info, int index);
+        public CharSequence getTitle(Object info);
+        public Object getAnchor(Object info);
         public void recycle(Object info);
     }
 
-    private static class AccessibilityWindowInfoStubImpl implements  AccessibilityWindowInfoImpl {
+    private static class AccessibilityWindowInfoStubImpl implements AccessibilityWindowInfoImpl {
 
         @Override
         public Object obtain() {
@@ -111,6 +113,16 @@
         @Override
         public void recycle(Object info) {
         }
+
+        @Override
+        public CharSequence getTitle(Object info) {
+            return null;
+        }
+
+        @Override
+        public Object getAnchor(Object info) {
+            return null;
+        }
     }
 
     private static class AccessibilityWindowInfoApi21Impl extends AccessibilityWindowInfoStubImpl {
@@ -185,8 +197,22 @@
         }
     }
 
+    private static class AccessibilityWindowInfoApi24Impl extends AccessibilityWindowInfoApi21Impl {
+        @Override
+        public CharSequence getTitle(Object info) {
+            return AccessibilityWindowInfoCompatApi24.getTitle(info);
+        }
+
+        @Override
+        public Object getAnchor(Object info) {
+            return AccessibilityWindowInfoCompatApi24.getAnchor(info);
+        }
+    }
+
     static {
-        if (Build.VERSION.SDK_INT >= 21) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            IMPL = new AccessibilityWindowInfoApi24Impl();
+        } else  if (Build.VERSION.SDK_INT >= 21) {
             IMPL = new AccessibilityWindowInfoApi21Impl();
         } else {
             IMPL = new AccessibilityWindowInfoStubImpl();
@@ -355,6 +381,25 @@
     }
 
     /**
+     * Gets the title of the window.
+     *
+     * @return The title of the window, or the application label for the window if no title was
+     * explicitly set, or {@code null} if neither is available.
+     */
+    public CharSequence getTitle() {
+        return IMPL.getTitle(mInfo);
+    }
+
+    /**
+     * Gets the node that anchors this window to another.
+     *
+     * @return The anchor node, or {@code null} if none exists.
+     */
+    public AccessibilityNodeInfoCompat getAnchor() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getAnchor(mInfo));
+    }
+
+    /**
      * Returns a cached instance if such is available or a new one is
      * created.
      *
diff --git a/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java b/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
new file mode 100644
index 0000000..e9fcafb
--- /dev/null
+++ b/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.view.accessibility;
+
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Api24-specific AccessibilityNodeInfo API implementation.
+ */
+public class AccessibilityNodeInfoCompatApi24 {
+    public static int getDrawingOrder(Object info) {
+        return ((AccessibilityNodeInfo) info).getDrawingOrder();
+    }
+
+    public static void setDrawingOrder(Object info, int drawingOrderInParent) {
+        ((AccessibilityNodeInfo) info).setDrawingOrder(drawingOrderInParent);
+    }
+
+    public static boolean isImportantForAccessibility(Object info) {
+        return ((AccessibilityNodeInfo) info).isImportantForAccessibility();
+    }
+
+    public static void setImportantForAccessibility(Object info,
+            boolean importantForAccessibility) {
+        ((AccessibilityNodeInfo) info).setImportantForAccessibility(importantForAccessibility);
+    }
+}
diff --git a/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java b/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
new file mode 100644
index 0000000..635878f
--- /dev/null
+++ b/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.view.accessibility;
+
+import android.view.accessibility.AccessibilityWindowInfo;
+
+/**
+ * Api24-specific AccessibilityWindowInfo API implementation.
+ */
+public class AccessibilityWindowInfoCompatApi24 {
+    public static CharSequence getTitle(Object info) {
+        return ((AccessibilityWindowInfo) info).getTitle();
+    }
+
+    public static Object getAnchor(Object info) {
+        return ((AccessibilityWindowInfo) info).getAnchor();
+    }
+}
