diff --git a/meta-phosphor/classes/obmc-xmlpatch.bbclass b/meta-phosphor/classes/obmc-xmlpatch.bbclass
new file mode 100644
index 0000000..9dc3750
--- /dev/null
+++ b/meta-phosphor/classes/obmc-xmlpatch.bbclass
@@ -0,0 +1,74 @@
+#This class applies patches to an XML file during do_patch().  The
+#patches themselves are specified in XML in a separate file that must
+#be in SRC_URI and end in .patch.xml.  The patch XML file must also
+#have a <targetFile> element that specifies the base name of the file
+#that needs to be patched.
+#
+#See patchxml.py for details on the XML patch format.
+#
+
+inherit pythonnative
+inherit obmc-phosphor-utils
+do_patch[depends] = "mrw-patch-native:do_populate_sysroot"
+
+
+def find_patch_files(d):
+    all_patches = listvar_to_list(d, 'SRC_URI')
+    xml_patches = filter(lambda x: x.endswith('.patch.xml') and
+                         x.startswith('file://'), all_patches)
+
+    return [x.lstrip('file://') for x in xml_patches]
+
+
+def apply_xml_patch(base_patch_name, d):
+    import xml.etree.ElementTree as et
+    import subprocess
+
+    patch_file = os.path.join(d.getVar("WORKDIR", True), base_patch_name)
+
+    if not os.path.exists(patch_file):
+        bb.fatal("Could not find patch file " + patch_file +
+                 " specified in SRC_URI")
+
+    patch_tree = et.parse(patch_file)
+    patch_root = patch_tree.getroot()
+    target_file_element = patch_root.find("targetFile")
+
+    if target_file_element is None:
+        bb.fatal("Could not find <targetFile> element in patch file "
+                 + patch_file)
+    else:
+        xml = target_file_element.text
+
+    xml = os.path.join(d.getVar("S", True), xml)
+
+    if not os.path.exists(xml):
+        bb.fatal("Could not find XML file to patch: " + xml)
+
+    print("Applying XML fixes found in " + patch_file + " to " + xml)
+
+    cmd = []
+    cmd.append(os.path.join(d.getVar("bindir", True), "obmc-mrw/patchxml.py"))
+    cmd.append("-x")
+    cmd.append(xml)
+    cmd.append("-p")
+    cmd.append(patch_file)
+    cmd.append("-o")
+    cmd.append(xml + ".patched")
+
+    try:
+        subprocess.check_call(cmd)
+    except subprocess.CalledProcessError as e:
+        bb.fatal("Failed patching XML:\n%s" % e.output)
+
+    os.rename(xml, xml + ".orig")
+    os.rename(xml + ".patched", xml)
+
+
+python xmlpatch_do_patch() {
+
+    for patch in find_patch_files(d):
+        apply_xml_patch(patch, d)
+}
+
+do_patch[postfuncs] += "xmlpatch_do_patch"
