diff --git a/contrib/xml2/xml2--unpackaged--1.0.sql b/contrib/xml2/xml2--unpackaged--1.0.sql
index 2cd40d7960a0b0ea0631f4ccacb8740e2a05e0d5..1aa894a61927e4e6619b5eaa031e6b7bfe5d5822 100644
--- a/contrib/xml2/xml2--unpackaged--1.0.sql
+++ b/contrib/xml2/xml2--unpackaged--1.0.sql
@@ -13,3 +13,14 @@ ALTER EXTENSION xml2 ADD function xpath_nodeset(text,text,text,text);
 ALTER EXTENSION xml2 ADD function xpath_string(text,text);
 ALTER EXTENSION xml2 ADD function xml_encode_special_chars(text);
 ALTER EXTENSION xml2 ADD function xml_valid(text);
+
+-- xml_valid is now an alias for core xml_is_well_formed()
+
+CREATE OR REPLACE FUNCTION xml_valid(text) RETURNS bool
+AS 'xml_is_well_formed'
+LANGUAGE INTERNAL STRICT STABLE;
+
+-- xml_is_well_formed is now in core, not needed in extension.
+-- be careful to drop extension's copy not core's.
+
+DROP FUNCTION @extschema@.xml_is_well_formed(text);
diff --git a/contrib/xml2/xml2.control b/contrib/xml2/xml2.control
index 004649d652032d258acd138318a868c8ee36dc67..51de678d5fbb693bfc9fc3cf7da05c04219c506f 100644
--- a/contrib/xml2/xml2.control
+++ b/contrib/xml2/xml2.control
@@ -2,4 +2,5 @@
 comment = 'XPath querying and XSLT'
 default_version = '1.0'
 module_pathname = '$libdir/pgxml'
-relocatable = true
+# non-relocatable because xml2--unpackaged--1.0.sql needs to use @extschema@
+relocatable = false