diff --git a/tests/test_xpath_paths_abbrev_w3c.cpp b/tests/test_xpath_paths_abbrev_w3c.cpp
new file mode 100644
index 0000000..9d4e810
--- /dev/null
+++ b/tests/test_xpath_paths_abbrev_w3c.cpp
@@ -0,0 +1,263 @@
+#ifndef PUGIXML_NO_XPATH
+
+#include "common.hpp"
+
+TEST_XML(xpath_paths_abbrev_w3c_1, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para");
+ CHECK_XPATH_NODESET(n, "para") % 3 % 5;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_2, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "*");
+ CHECK_XPATH_NODESET(n, "*") % 3 % 4 % 5;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_3, "pcdata")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "text()");
+ CHECK_XPATH_NODESET(n, "text()") % 3 % 5;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_4, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "@name");
+ CHECK_XPATH_NODESET(n, "@name") % 3;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_5, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "@*");
+ CHECK_XPATH_NODESET(n, "@*") % 3 % 4;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_6, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para[1]");
+ CHECK_XPATH_NODESET(n, "para[1]") % 3;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_7, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para[last()]");
+ CHECK_XPATH_NODESET(n, "para[last()]") % 6;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_8, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+
+ CHECK_XPATH_NODESET(c, "*/para");
+ CHECK_XPATH_NODESET(doc, "*/para") % 3 % 9;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_9, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("doc").child("chapter");
+
+ CHECK_XPATH_NODESET(c, "/doc/chapter[5]/section[2]");
+ CHECK_XPATH_NODESET(n, "/doc/chapter[5]/section[2]") % 9;
+ CHECK_XPATH_NODESET(doc, "/doc/chapter[5]/section[2]") % 9;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_10, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+
+ CHECK_XPATH_NODESET(c, "chapter//para");
+ CHECK_XPATH_NODESET(doc, "chapter//para") % 3 % 4 % 5 % 7 % 9;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_11, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "//para");
+ CHECK_XPATH_NODESET(n, "//para") % 3 % 4 % 5 % 7 % 9;
+ CHECK_XPATH_NODESET(n.child("para"), "//para") % 3 % 4 % 5 % 7 % 9;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_12, " ")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "//olist/item");
+ CHECK_XPATH_NODESET(n, "//olist/item") % 4 % 8 % 9;
+ CHECK_XPATH_NODESET(n.child("olist"), "//olist/item") % 4 % 8 % 9;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_13, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, ".");
+ CHECK_XPATH_NODESET(n, ".") % 2;
+ CHECK_XPATH_NODESET(n.child("child"), ".") % 3;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_14, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, ".//para");
+ CHECK_XPATH_NODESET(n, ".//para") % 3 % 4 % 5 % 7 % 9;
+ CHECK_XPATH_NODESET(n.child("para"), ".//para") % 4 % 5 % 7;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_15, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "..");
+ CHECK_XPATH_NODESET(n, "..") % 1;
+ CHECK_XPATH_NODESET(n.child("child"), "..") % 2;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_16, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "../@lang");
+ CHECK_XPATH_NODESET(n, "../@lang");
+ CHECK_XPATH_NODESET(n.child("child"), "../@lang") % 3;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_17, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para[@type=\"warning\"]");
+ CHECK_XPATH_NODESET(n, "para[@type=\"warning\"]") % 4 % 6 % 11 % 13 % 15;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_18, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para[@type=\"warning\"][5]");
+ CHECK_XPATH_NODESET(n, "para[@type=\"warning\"][5]") % 15;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_19a, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para[5][@type=\"warning\"]");
+ CHECK_XPATH_NODESET(n, "para[5][@type=\"warning\"]");
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_19b, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "para[5][@type=\"warning\"]");
+ CHECK_XPATH_NODESET(n, "para[5][@type=\"warning\"]") % 9;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_20, "fooIntroductionintroductionIntroductionfoo")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "chapter[title=\"Introduction\"]");
+ CHECK_XPATH_NODESET(n, "chapter[title=\"Introduction\"]") % 6 % 13;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_21, "fooIntroductionintroductionIntroductionfoo")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "chapter[title]");
+ CHECK_XPATH_NODESET(n, "chapter[title]") % 3 % 6 % 9 % 13;
+}
+
+TEST_XML(xpath_paths_abbrev_w3c_22, "")
+{
+ doc.precompute_document_order();
+
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(c, "employee[@secretary and @assistant]");
+ CHECK_XPATH_NODESET(n, "employee[@secretary and @assistant]") % 8 % 11;
+}
+
+#endif