diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java
index 9c84f50..e759663 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/CompatChangeChecker.java
@@ -18,13 +18,13 @@
 
 import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
 import static com.google.errorprone.bugpatterns.android.TargetSdkChecker.binaryTreeExact;
-import static com.google.errorprone.matchers.FieldMatchers.anyFieldInClass;
-import static com.google.errorprone.matchers.FieldMatchers.staticField;
 import static com.google.errorprone.matchers.Matchers.allOf;
 import static com.google.errorprone.matchers.Matchers.anyOf;
 import static com.google.errorprone.matchers.Matchers.anything;
 import static com.google.errorprone.matchers.Matchers.kindIs;
 import static com.google.errorprone.matchers.Matchers.not;
+import static com.google.errorprone.matchers.android.FieldMatchers.anyFieldInClass;
+import static com.google.errorprone.matchers.android.FieldMatchers.staticField;
 
 import com.google.auto.service.AutoService;
 import com.google.errorprone.BugPattern;
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java
index 2561b41..e323a89 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/PendingIntentMutabilityChecker.java
@@ -17,12 +17,11 @@
 package com.google.errorprone.bugpatterns.android;
 
 import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
-import static com.google.errorprone.matchers.FieldMatchers.staticField;
 import static com.google.errorprone.matchers.Matchers.anyOf;
 import static com.google.errorprone.matchers.Matchers.contains;
 import static com.google.errorprone.matchers.Matchers.methodInvocation;
 import static com.google.errorprone.matchers.Matchers.staticMethod;
-
+import static com.google.errorprone.matchers.android.FieldMatchers.staticField;
 
 import com.google.auto.service.AutoService;
 import com.google.errorprone.BugPattern;
diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java
index e1ebf42..032ae00 100644
--- a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java
+++ b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java
@@ -28,8 +28,8 @@
 import com.google.errorprone.bugpatterns.BugChecker;
 import com.google.errorprone.bugpatterns.BugChecker.BinaryTreeMatcher;
 import com.google.errorprone.matchers.Description;
-import com.google.errorprone.matchers.FieldMatchers;
 import com.google.errorprone.matchers.Matcher;
+import com.google.errorprone.matchers.android.FieldMatchers;
 import com.sun.source.tree.BinaryTree;
 import com.sun.source.tree.ExpressionTree;
 import com.sun.source.tree.Tree.Kind;
diff --git a/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java b/errorprone/java/com/google/errorprone/matchers/android/FieldMatchers.java
similarity index 97%
rename from errorprone/java/com/google/errorprone/matchers/FieldMatchers.java
rename to errorprone/java/com/google/errorprone/matchers/android/FieldMatchers.java
index 08969d6..5d56e80 100644
--- a/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java
+++ b/errorprone/java/com/google/errorprone/matchers/android/FieldMatchers.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.google.errorprone.matchers;
+package com.google.errorprone.matchers.android;
 
 import com.google.errorprone.VisitorState;
+import com.google.errorprone.matchers.Matcher;
 import com.google.errorprone.util.ASTHelpers;
 import com.sun.source.tree.ExpressionTree;
 import com.sun.source.tree.ImportTree;
diff --git a/errorprone/refaster/EfficientXml.java b/errorprone/refaster/EfficientXml.java
new file mode 100644
index 0000000..bd1ddfc
--- /dev/null
+++ b/errorprone/refaster/EfficientXml.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+import android.util.TypedXmlPullParser;
+import android.util.TypedXmlSerializer;
+
+import com.android.internal.util.XmlUtils;
+
+import com.google.errorprone.refaster.annotation.AfterTemplate;
+import com.google.errorprone.refaster.annotation.BeforeTemplate;
+
+/**
+ * Refaster templates that migrate callers to equivalent and more efficient
+ * {@link TypedXmlSerializer} and {@link TypedXmlPullParser} methods.
+ */
+public class EfficientXml {
+    class IntToString {
+        @BeforeTemplate
+        void beforeToString(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attribute(null, n, Integer.toString(v));
+        }
+
+        @BeforeTemplate
+        void beforeValueOf(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attribute(null, n, String.valueOf(v));
+        }
+
+        @BeforeTemplate
+        void beforeUtils(TypedXmlSerializer out, String n, int v) throws Exception {
+            XmlUtils.writeIntAttribute(out, n, v);
+        }
+
+        @BeforeTemplate
+        void beforeRadix(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attribute(null, n, Integer.toString(v, 10));
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attributeInt(null, n, v);
+        }
+    }
+
+    class IntToStringHex {
+        @BeforeTemplate
+        void beforeToHexString(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attribute(null, n, Integer.toHexString(v));
+        }
+
+        @BeforeTemplate
+        void beforeRadix(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attribute(null, n, Integer.toString(v, 16));
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, int v) throws Exception {
+            out.attributeIntHex(null, n, v);
+        }
+    }
+
+    class IntFromString {
+        @BeforeTemplate
+        int beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Integer.parseInt(in.getAttributeValue(null, n));
+        }
+
+        @BeforeTemplate
+        int beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+            return XmlUtils.readIntAttribute(in, n);
+        }
+
+        @BeforeTemplate
+        int beforeRadix(TypedXmlPullParser in, String n) throws Exception {
+            return Integer.parseInt(in.getAttributeValue(null, n), 10);
+        }
+
+        @AfterTemplate
+        int after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeInt(null, n);
+        }
+    }
+
+    class IntFromStringDefault {
+        @BeforeTemplate
+        int before(TypedXmlPullParser in, String n, int d) throws Exception {
+            return XmlUtils.readIntAttribute(in, n, d);
+        }
+
+        @AfterTemplate
+        int after(TypedXmlPullParser in, String n, int d) throws Exception {
+            return in.getAttributeInt(null, n, d);
+        }
+    }
+
+    class IntFromStringHex {
+        @BeforeTemplate
+        int beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Integer.parseInt(in.getAttributeValue(null, n), 16);
+        }
+
+        @AfterTemplate
+        int after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeIntHex(null, n);
+        }
+    }
+
+    class LongToString {
+        @BeforeTemplate
+        void beforeToString(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attribute(null, n, Long.toString(v));
+        }
+
+        @BeforeTemplate
+        void beforeValueOf(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attribute(null, n, String.valueOf(v));
+        }
+
+        @BeforeTemplate
+        void beforeUtils(TypedXmlSerializer out, String n, long v) throws Exception {
+            XmlUtils.writeLongAttribute(out, n, v);
+        }
+
+        @BeforeTemplate
+        void beforeRadix(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attribute(null, n, Long.toString(v, 10));
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attributeLong(null, n, v);
+        }
+    }
+
+    class LongToStringHex {
+        @BeforeTemplate
+        void beforeToHexString(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attribute(null, n, Long.toHexString(v));
+        }
+
+        @BeforeTemplate
+        void beforeRadix(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attribute(null, n, Long.toString(v, 16));
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, long v) throws Exception {
+            out.attributeLongHex(null, n, v);
+        }
+    }
+
+    class LongFromString {
+        @BeforeTemplate
+        long beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Long.parseLong(in.getAttributeValue(null, n));
+        }
+
+        @BeforeTemplate
+        long beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+            return XmlUtils.readLongAttribute(in, n);
+        }
+
+        @BeforeTemplate
+        long beforeRadix(TypedXmlPullParser in, String n) throws Exception {
+            return Long.parseLong(in.getAttributeValue(null, n), 10);
+        }
+
+        @AfterTemplate
+        long after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeLong(null, n);
+        }
+    }
+
+    class LongFromStringDefault {
+        @BeforeTemplate
+        long before(TypedXmlPullParser in, String n, long d) throws Exception {
+            return XmlUtils.readLongAttribute(in, n, d);
+        }
+
+        @AfterTemplate
+        long after(TypedXmlPullParser in, String n, long d) throws Exception {
+            return in.getAttributeLong(null, n, d);
+        }
+    }
+
+    class LongFromStringHex {
+        @BeforeTemplate
+        long beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Long.parseLong(in.getAttributeValue(null, n), 16);
+        }
+
+        @AfterTemplate
+        long after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeLongHex(null, n);
+        }
+    }
+
+    class FloatToString {
+        @BeforeTemplate
+        void beforeToString(TypedXmlSerializer out, String n, float v) throws Exception {
+            out.attribute(null, n, Float.toString(v));
+        }
+
+        @BeforeTemplate
+        void beforeValueOf(TypedXmlSerializer out, String n, float v) throws Exception {
+            out.attribute(null, n, String.valueOf(v));
+        }
+
+        @BeforeTemplate
+        void beforeUtils(TypedXmlSerializer out, String n, float v) throws Exception {
+            XmlUtils.writeFloatAttribute(out, n, v);
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, float v) throws Exception {
+            out.attributeFloat(null, n, v);
+        }
+    }
+
+    class FloatFromString {
+        @BeforeTemplate
+        float beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Float.parseFloat(in.getAttributeValue(null, n));
+        }
+
+        @BeforeTemplate
+        float beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+            return XmlUtils.readFloatAttribute(in, n);
+        }
+
+        @AfterTemplate
+        float after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeFloat(null, n);
+        }
+    }
+
+    class DoubleToString {
+        @BeforeTemplate
+        void beforeToString(TypedXmlSerializer out, String n, double v) throws Exception {
+            out.attribute(null, n, Double.toString(v));
+        }
+
+        @BeforeTemplate
+        void beforeValueOf(TypedXmlSerializer out, String n, double v) throws Exception {
+            out.attribute(null, n, String.valueOf(v));
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, double v) throws Exception {
+            out.attributeDouble(null, n, v);
+        }
+    }
+
+    class DoubleFromString {
+        @BeforeTemplate
+        double beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Double.parseDouble(in.getAttributeValue(null, n));
+        }
+
+        @AfterTemplate
+        double after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeDouble(null, n);
+        }
+    }
+
+    class BooleanToString {
+        @BeforeTemplate
+        void beforeToString(TypedXmlSerializer out, String n, boolean v) throws Exception {
+            out.attribute(null, n, Boolean.toString(v));
+        }
+
+        @BeforeTemplate
+        void beforeValueOf(TypedXmlSerializer out, String n, boolean v) throws Exception {
+            out.attribute(null, n, String.valueOf(v));
+        }
+
+        @AfterTemplate
+        void after(TypedXmlSerializer out, String n, boolean v) throws Exception {
+            out.attributeBoolean(null, n, v);
+        }
+    }
+
+    class BooleanFromString {
+        @BeforeTemplate
+        boolean beforeParse(TypedXmlPullParser in, String n) throws Exception {
+            return Boolean.parseBoolean(in.getAttributeValue(null, n));
+        }
+
+        @BeforeTemplate
+        boolean beforeUtils(TypedXmlPullParser in, String n) throws Exception {
+            return XmlUtils.readBooleanAttribute(in, n);
+        }
+
+        @AfterTemplate
+        boolean after(TypedXmlPullParser in, String n) throws Exception {
+            return in.getAttributeBoolean(null, n, false);
+        }
+    }
+
+    class BooleanFromStringDefault {
+        @BeforeTemplate
+        boolean before(TypedXmlPullParser in, String n, boolean d) throws Exception {
+            return XmlUtils.readBooleanAttribute(in, n, d);
+        }
+
+        @AfterTemplate
+        boolean after(TypedXmlPullParser in, String n, boolean d) throws Exception {
+            return in.getAttributeBoolean(null, n, d);
+        }
+    }
+}
diff --git a/errorprone/refaster/EfficientXml.java.refaster b/errorprone/refaster/EfficientXml.java.refaster
new file mode 100644
index 0000000..f2974ff
--- /dev/null
+++ b/errorprone/refaster/EfficientXml.java.refaster
Binary files differ
diff --git a/errorprone/refaster/refaster.sh b/errorprone/refaster/refaster.sh
new file mode 100755
index 0000000..67dc3e4
--- /dev/null
+++ b/errorprone/refaster/refaster.sh
@@ -0,0 +1,11 @@
+
+paths=(
+    $ANDROID_BUILD_TOP/out/soong/.intermediates/frameworks/base/framework/android_common/turbine-combined/framework.jar
+    $ANDROID_BUILD_TOP/out/soong/.intermediates/libcore/core-all/android_common/turbine-combined/core-all.jar
+    $ANDROID_BUILD_TOP/external/error_prone/error_prone/error_prone_refaster-2.4.0.jar
+)
+
+javac -cp "$(IFS=:; echo "${paths[*]}")" \
+    "-Xplugin:RefasterRuleCompiler --out $1.refaster" $1
+
+rm *.class
