diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
index ddb16e7..b054b33 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -201,11 +201,8 @@
             if (type != XmlPullParser.START_TAG) {
                 throw new XmlPullParserException("No start tag found");
             }
-
-            final AnimatedVectorDrawableCompat drawable = new AnimatedVectorDrawableCompat(context);
-            drawable.inflate(resources, parser, attrs, context.getTheme());
-
-            return drawable;
+            return createFromXmlInner(context, context.getResources(), parser, attrs,
+                    context.getTheme());
         } catch (XmlPullParserException e) {
             Log.e(LOGTAG, "parser error", e);
         } catch (IOException e) {
@@ -215,6 +212,20 @@
     }
 
     /**
+     * Create a AnimatedVectorDrawableCompat from inside an XML document using an optional
+     * {@link Theme}. Called on a parser positioned at a tag in an XML
+     * document, tries to create a Drawable from that tag. Returns {@code null}
+     * if the tag is not a valid drawable.
+     */
+    public static AnimatedVectorDrawableCompat createFromXmlInner(Context context, Resources r,
+            XmlPullParser parser, AttributeSet attrs, Theme theme)
+            throws XmlPullParserException, IOException {
+        final AnimatedVectorDrawableCompat drawable = new AnimatedVectorDrawableCompat(context);
+        drawable.inflate(r, parser, attrs, theme);
+        return drawable;
+    }
+
+    /**
      * {@inheritDoc}
      * <strong>Note</strong> that we don't support constant state when SDK < 21.
      * Make sure you check the return value before using it.
diff --git a/v7/appcompat/Android.mk b/v7/appcompat/Android.mk
index 0eb6a7b..49f3ba2 100644
--- a/v7/appcompat/Android.mk
+++ b/v7/appcompat/Android.mk
@@ -23,7 +23,8 @@
 LOCAL_SDK_VERSION := current
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-vectordrawable
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-vectordrawable \
+        android-support-animatedvectordrawable
 LOCAL_JAVA_LIBRARIES := android-support-v4
 LOCAL_AAPT_FLAGS += --auto-add-overlay \
         --no-version-vectors
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 7687733..98d5f82 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -5,6 +5,8 @@
 dependencies {
     compile project(':support-v4')
     compile project(':support-vector-drawable')
+    compile project(':support-animated-vector-drawable')
+
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
     }
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
index 6b38482..1c7dd75 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
@@ -36,6 +36,7 @@
 import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
 import android.support.graphics.drawable.VectorDrawableCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.graphics.ColorUtils;
@@ -63,7 +64,7 @@
 public final class AppCompatDrawableManager {
 
     private interface InflateDelegate {
-        Drawable createFromXmlInner(@NonNull Resources r, @NonNull XmlPullParser parser,
+        Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
                 @NonNull AttributeSet attrs, @Nullable Resources.Theme theme);
     }
 
@@ -77,16 +78,25 @@
     public static AppCompatDrawableManager get() {
         if (INSTANCE == null) {
             INSTANCE = new AppCompatDrawableManager();
-
-            if (Build.VERSION.SDK_INT < 21) {
-                // We only want to use the automatic VectorDrawableCompat handling where it's
-                // needed: on devices running before Lollipop
-                INSTANCE.addDelegate("vector", new VdcInflateDelegate());
-            }
+            installDefaultInflateDelegates(INSTANCE);
         }
         return INSTANCE;
     }
 
+    private static void installDefaultInflateDelegates(@NonNull AppCompatDrawableManager manager) {
+        final int sdk = Build.VERSION.SDK_INT;
+        if (sdk < 21) {
+            // We only want to use the automatic VectorDrawableCompat handling where it's
+            // needed: on devices running before Lollipop
+            manager.addDelegate("vector", new VdcInflateDelegate());
+
+            if (sdk >= 11) {
+                // AnimatedVectorDrawableCompat only works on API v11+
+                manager.addDelegate("animated-vector", new AvdcInflateDelegate());
+            }
+        }
+    }
+
     private static final ColorFilterLruCache COLOR_FILTER_CACHE = new ColorFilterLruCache(6);
 
     /**
@@ -290,7 +300,8 @@
                     // Now try and find a delegate for the tag name and inflate if found
                     final InflateDelegate delegate = mDelegates.get(tagName);
                     if (delegate != null) {
-                        dr = delegate.createFromXmlInner(res, parser, attrs, context.getTheme());
+                        dr = delegate.createFromXmlInner(context, parser, attrs,
+                                context.getTheme());
                     }
                     if (dr != null) {
                         // Add it to the drawable cache
@@ -812,14 +823,29 @@
 
     private static class VdcInflateDelegate implements InflateDelegate {
         @Override
-        public Drawable createFromXmlInner(@NonNull Resources r, @NonNull XmlPullParser parser,
+        public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
                 @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
             try {
-                return VectorDrawableCompat.createFromXmlInner(r, parser, attrs, theme);
+                return VectorDrawableCompat
+                        .createFromXmlInner(context.getResources(), parser, attrs, theme);
             } catch (Exception e) {
                 Log.e("VdcInflateDelegate", "Exception while inflating <vector>", e);
                 return null;
             }
         }
     }
+
+    private static class AvdcInflateDelegate implements InflateDelegate {
+        @Override
+        public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
+                @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
+            try {
+                return AnimatedVectorDrawableCompat
+                        .createFromXmlInner(context, context.getResources(), parser, attrs, theme);
+            } catch (Exception e) {
+                Log.e("AvdcInflateDelegate", "Exception while inflating <animated-vector>", e);
+                return null;
+            }
+        }
+    }
 }
