diff --git a/cts/schemas/test-3/ref.err/id-ref.ref.err-0 b/cts/schemas/test-3/ref.err/id-ref.ref.err-0
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/cts/schemas/test-3/ref/id-ref.ref-0 b/cts/schemas/test-3/ref/id-ref.ref-0
new file mode 100644
index 0000000000..56992f0101
--- /dev/null
+++ b/cts/schemas/test-3/ref/id-ref.ref-0
@@ -0,0 +1,66 @@
+<cib crm_feature_set="3.19.7" validate-with="pacemaker-3.10" epoch="16" num_updates="0" admin_epoch="0">
+  <configuration>
+    <!-- The essential elements of this test are:
+         * There is a cluster_properties_set element with an id attribute (set
+           to cluster-properties1) and a set of nvpair children.
+         * There are two cluster_properties_set elements with an id-ref
+           attribute (set to cluster-properties1): one before and one after the
+           original.
+         * There is a primitive resource (rsc1) with a meta_attributes element
+           containing nvpair children.
+           * The first nvpair is a definition (has an id attribute).
+           * The second has an id-ref attribute with no name attribute.
+           * The third has id-ref="cluster-properties1-option1" and
+             name="option3". Setting both id-ref and name is an undocumented
+             feature that allows the same nvpair value to be used with multiple
+             names (see commit 3912538 and associated pull request).
+
+         In this situation:
+         * In the first step of the upgrade transformation pipeline:
+           * Each element with an id-ref attribute without a name attribute
+             should be replaced by a copy of the element whose id attribute is
+             set to the same value, but with the "original" attribute set to 1.
+           * Each element with an id-ref attribute and a name attribute should
+             be replaced by a copy of the element whose id attribute is set to
+             the original id-ref value, except that in the copy:
+             * The id attribute begins with $upgrade_prefix and ends with the
+               value of @name.
+             * The name attribute is overridden by the reference's @name value.
+         * In the final step:
+           * Resolved references that did not have name attributes should be
+             converted back to references.
+           * For resolved references that did have name attributes, such that
+             the id of the resolved element differs from the original id-ref
+             value:
+             * The first element with the new id value remains expanded as a
+               definition.
+             * Any subsequent elements with the new id value are converted to
+               references to the first one.
+      -->
+    <crm_config>
+      <cluster_property_set id-ref="cluster-properties1"/>
+      <cluster_property_set id="cluster-properties1">
+        <nvpair id="cluster-properties1-option1" name="option1" value="value1"/>
+        <nvpair id="cluster-properties1-option2" name="option2" value="value2"/>
+      </cluster_property_set>
+      <cluster_property_set id-ref="cluster-properties1"/>
+    </crm_config>
+    <nodes/>
+    <resources>
+      <primitive id="rsc1" class="ocf" provider="pacemaker" type="Dummy">
+        <meta_attributes id="rsc1-meta_attributes">
+          <nvpair id="rsc1-meta_attributes-option1" name="option1" value="valueX"/>
+          <nvpair id-ref="cluster-properties1-option1"/>
+          <nvpair id-ref="cluster-properties1-option1" name="option3"/>
+        </meta_attributes>
+      </primitive>
+      <primitive id="rsc2" class="ocf" provider="pacemaker" type="Dummy">
+        <meta_attributes id="rsc2-meta_attributes">
+          <nvpair id-ref="cluster-properties1-option1" name="option3"/>
+        </meta_attributes>
+      </primitive>
+    </resources>
+    <constraints/>
+  </configuration>
+  <status/>
+</cib>
diff --git a/cts/schemas/test-3/xml/id-ref.xml b/cts/schemas/test-3/xml/id-ref.xml
new file mode 100644
index 0000000000..56992f0101
--- /dev/null
+++ b/cts/schemas/test-3/xml/id-ref.xml
@@ -0,0 +1,66 @@
+<cib crm_feature_set="3.19.7" validate-with="pacemaker-3.10" epoch="16" num_updates="0" admin_epoch="0">
+  <configuration>
+    <!-- The essential elements of this test are:
+         * There is a cluster_properties_set element with an id attribute (set
+           to cluster-properties1) and a set of nvpair children.
+         * There are two cluster_properties_set elements with an id-ref
+           attribute (set to cluster-properties1): one before and one after the
+           original.
+         * There is a primitive resource (rsc1) with a meta_attributes element
+           containing nvpair children.
+           * The first nvpair is a definition (has an id attribute).
+           * The second has an id-ref attribute with no name attribute.
+           * The third has id-ref="cluster-properties1-option1" and
+             name="option3". Setting both id-ref and name is an undocumented
+             feature that allows the same nvpair value to be used with multiple
+             names (see commit 3912538 and associated pull request).
+
+         In this situation:
+         * In the first step of the upgrade transformation pipeline:
+           * Each element with an id-ref attribute without a name attribute
+             should be replaced by a copy of the element whose id attribute is
+             set to the same value, but with the "original" attribute set to 1.
+           * Each element with an id-ref attribute and a name attribute should
+             be replaced by a copy of the element whose id attribute is set to
+             the original id-ref value, except that in the copy:
+             * The id attribute begins with $upgrade_prefix and ends with the
+               value of @name.
+             * The name attribute is overridden by the reference's @name value.
+         * In the final step:
+           * Resolved references that did not have name attributes should be
+             converted back to references.
+           * For resolved references that did have name attributes, such that
+             the id of the resolved element differs from the original id-ref
+             value:
+             * The first element with the new id value remains expanded as a
+               definition.
+             * Any subsequent elements with the new id value are converted to
+               references to the first one.
+      -->
+    <crm_config>
+      <cluster_property_set id-ref="cluster-properties1"/>
+      <cluster_property_set id="cluster-properties1">
+        <nvpair id="cluster-properties1-option1" name="option1" value="value1"/>
+        <nvpair id="cluster-properties1-option2" name="option2" value="value2"/>
+      </cluster_property_set>
+      <cluster_property_set id-ref="cluster-properties1"/>
+    </crm_config>
+    <nodes/>
+    <resources>
+      <primitive id="rsc1" class="ocf" provider="pacemaker" type="Dummy">
+        <meta_attributes id="rsc1-meta_attributes">
+          <nvpair id="rsc1-meta_attributes-option1" name="option1" value="valueX"/>
+          <nvpair id-ref="cluster-properties1-option1"/>
+          <nvpair id-ref="cluster-properties1-option1" name="option3"/>
+        </meta_attributes>
+      </primitive>
+      <primitive id="rsc2" class="ocf" provider="pacemaker" type="Dummy">
+        <meta_attributes id="rsc2-meta_attributes">
+          <nvpair id-ref="cluster-properties1-option1" name="option3"/>
+        </meta_attributes>
+      </primitive>
+    </resources>
+    <constraints/>
+  </configuration>
+  <status/>
+</cib>