diff --git a/runsuite.c b/runsuite.c
index bab8735..f2d9a57 100644
--- a/runsuite.c
+++ b/runsuite.c
@@ -1,5 +1,5 @@
 /*
- * runsuite.c: C program to run libxml2 againts external published testsuites 
+ * runsuite.c: C program to run libxml2 againts published testsuites 
  *
  * See Copyright for the status of this software.
  *
@@ -131,9 +131,11 @@
 	ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
 	extraMemoryFromResolver += xmlMemUsed() - memused;
     }
+#if 0
     if (ret == NULL) {
         fprintf(stderr, "Failed to find resource %s\n", URL);
     }
+#endif
       
     return(ret);
 }
@@ -166,6 +168,9 @@
     }
     testErrors[testErrorsSize] = 0;
 }
+
+xmlXPathContextPtr ctxtXPath;
+
 static void
 initializeLibxml2(void) {
     xmlGetWarningsDefaultValue = 0;
@@ -174,6 +179,12 @@
     xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
     xmlInitParser();
     xmlSetExternalEntityLoader(testExternalEntityLoader);
+    ctxtXPath = xmlXPathNewContext(NULL);
+    /* used as default nanemspace in xstc tests */
+    xmlXPathRegisterNs(ctxtXPath, BAD_CAST "ts", BAD_CAST "TestSuite");
+    xmlXPathRegisterNs(ctxtXPath, BAD_CAST "xlink",
+                       BAD_CAST "http://www.w3.org/1999/xlink");
+    xmlSetGenericErrorFunc(NULL, testErrorHandler);
 #ifdef LIBXML_SCHEMAS_ENABLED
     xmlSchemaInitTypes();
     xmlRelaxNGInitTypes();
@@ -185,22 +196,19 @@
 getNext(xmlNodePtr cur, const char *xpath) {
     xmlNodePtr ret = NULL;
     xmlXPathObjectPtr res;
-    xmlXPathContextPtr ctxt;
     xmlXPathCompExprPtr comp;
 
     if ((cur == NULL)  || (cur->doc == NULL) || (xpath == NULL))
         return(NULL);
-    ctxt = xmlXPathNewContext(cur->doc);
-    ctxt->node = cur;
+    ctxtXPath->doc = cur->doc;
+    ctxtXPath->node = cur;
     comp = xmlXPathCompile(BAD_CAST xpath);
     if (comp == NULL) {
         fprintf(stderr, "Failed to compile %s\n", xpath);
-	xmlXPathFreeContext(ctxt);
 	return(NULL);
     }
-    res = xmlXPathCompiledEval(comp, ctxt);
+    res = xmlXPathCompiledEval(comp, ctxtXPath);
     xmlXPathFreeCompExpr(comp);
-    xmlXPathFreeContext(ctxt);
     if (res == NULL)
         return(NULL);
     if ((res->type == XPATH_NODESET) &&
@@ -216,21 +224,19 @@
 getString(xmlNodePtr cur, const char *xpath) {
     xmlChar *ret = NULL;
     xmlXPathObjectPtr res;
-    xmlXPathContextPtr ctxt;
     xmlXPathCompExprPtr comp;
 
     if ((cur == NULL)  || (cur->doc == NULL) || (xpath == NULL))
         return(NULL);
-    ctxt = xmlXPathNewContext(cur->doc);
-    ctxt->node = cur;
+    ctxtXPath->doc = cur->doc;
+    ctxtXPath->node = cur;
     comp = xmlXPathCompile(BAD_CAST xpath);
     if (comp == NULL) {
         fprintf(stderr, "Failed to compile %s\n", xpath);
 	return(NULL);
     }
-    res = xmlXPathCompiledEval(comp, ctxt);
+    res = xmlXPathCompiledEval(comp, ctxtXPath);
     xmlXPathFreeCompExpr(comp);
-    xmlXPathFreeContext(ctxt);
     if (res == NULL)
         return(NULL);
     if (res->type == XPATH_STRING) {
@@ -248,7 +254,7 @@
  ************************************************************************/
 
 static int 
-xsdIncorectTestCase(int verbose, xmlNodePtr cur) {
+xsdIncorectTestCase(xmlNodePtr cur) {
     xmlNodePtr test;
     xmlBufferPtr buf;
     xmlRelaxNGParserCtxtPtr pctxt;
@@ -363,10 +369,11 @@
         installDirs(test, res);
 	test = getNext(test, "following-sibling::dir[1]");
     }
+    xmlFree(res);
 }
 
 static int 
-xsdTestCase(int verbose, xmlNodePtr tst) {
+xsdTestCase(xmlNodePtr tst) {
     xmlNodePtr test, tmp, cur;
     xmlBufferPtr buf;
     xmlDocPtr doc = NULL;
@@ -389,7 +396,7 @@
 
     cur = getNext(tst, "./correct[1]");
     if (cur == NULL) {
-        return(xsdIncorectTestCase(verbose, tst));
+        return(xsdIncorectTestCase(tst));
     }
     
     test = getNext(cur, "./*");
@@ -575,7 +582,7 @@
     }
     cur = getNext(cur, "./testCase[1]");
     while (cur != NULL) {
-        xsdTestCase(verbose, cur);
+        xsdTestCase(cur);
 	cur = getNext(cur, "following-sibling::testCase[1]");
     }
         
@@ -723,7 +730,204 @@
 
 /************************************************************************
  *									*
- *		Libxml2 specific routines				*
+ *		Schemas test suites from W3C/NIST/MS/Sun		*
+ *									*
+ ************************************************************************/
+
+static int
+xstcTestInstance(int verbose, xmlNodePtr cur, xmlSchemaPtr schemas) {
+    xmlChar *href = NULL;
+    xmlChar *path = NULL;
+    int ret = 0;
+
+    href = getString(cur,
+                     "string(ts:schemaTest/ts:schemaDocument/@xlink:href)");
+    if ((href == NULL) || (href[0] == 0)) {
+        if (verbose)
+	    fprintf(stderr,
+	            "testGroup line %ld misses href for schemaDocument\n",
+		    xmlGetLineNo(cur));
+	ret = -1;
+	goto done;
+    }
+    path = xmlBuildURI(href, BAD_CAST "./xstc/Tests/");
+    if (path == NULL) {
+	fprintf(stderr,
+	        "Failed to build path to schemas testGroup line %ld : %s\n",
+		xmlGetLineNo(cur), href);
+	ret = -1;
+	goto done;
+    }
+    if (checkTestFile(path) <= 0) {
+	fprintf(stderr,
+	        "schemas for testGroup line %ld is missing: %s\n",
+		xmlGetLineNo(cur), path);
+	ret = -1;
+	goto done;
+    }
+    nb_tests++;
+
+done:
+    if (href != NULL) xmlFree(href);
+    if (path != NULL) xmlFree(path);
+    return(ret);
+}
+static int
+xstcTestGroup(int verbose, xmlNodePtr cur) {
+    xmlChar *href = NULL;
+    xmlChar *path = NULL;
+    xmlChar *validity = NULL;
+    xmlSchemaPtr schemas = NULL;
+    xmlSchemaParserCtxtPtr ctxt;
+    xmlNodePtr instance;
+    int ret = 0;
+
+    href = getString(cur,
+                     "string(ts:schemaTest/ts:schemaDocument/@xlink:href)");
+    if ((href == NULL) || (href[0] == 0)) {
+        if (verbose)
+	    fprintf(stderr,
+	            "testGroup line %ld misses href for schemaDocument\n",
+		    xmlGetLineNo(cur));
+	ret = -1;
+	goto done;
+    }
+    path = xmlBuildURI(href, BAD_CAST "./xstc/Tests/");
+    if (path == NULL) {
+	fprintf(stderr,
+	        "Failed to build path to schemas testGroup line %ld : %s\n",
+		xmlGetLineNo(cur), href);
+	ret = -1;
+	goto done;
+    }
+    if (checkTestFile(path) <= 0) {
+	fprintf(stderr,
+	        "schemas for testGroup line %ld is missing: %s\n",
+		xmlGetLineNo(cur), path);
+	ret = -1;
+	goto done;
+    }
+    validity = getString(cur,
+                         "string(ts:schemaTest/ts:expected/@validity)");
+    if (validity == NULL) {
+        fprintf(stderr, "testGroup line %ld misses expected validity\n",
+	        xmlGetLineNo(cur));
+	ret = -1;
+	goto done;
+    }
+    if (xmlStrEqual(validity, BAD_CAST "valid")) {
+	ctxt = xmlSchemaNewParserCtxt(path);
+	xmlSchemaSetParserErrors(ctxt,
+	     (xmlSchemaValidityErrorFunc) testErrorHandler,
+	     (xmlSchemaValidityWarningFunc) testErrorHandler,
+	     ctxt);
+	schemas = xmlSchemaParse(ctxt);
+	xmlSchemaFreeParserCtxt(ctxt);
+	if (schemas == NULL) {
+	    if (verbose)
+		fprintf(stderr, "valid schemas %s failed to parse\n",
+			path);
+	    nb_errors++;
+	}
+	instance = getNext(cur, "./ts:instanceTest[1]");
+	if (instance == NULL) {
+	    nb_tests++;
+	}
+	while (instance != NULL) {
+            xstcTestInstance(verbose, instance, schemas);
+	    instance = getNext(instance,
+	                       "following-sibling::ts:instanceTest[1]");
+	}
+    } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
+	ctxt = xmlSchemaNewParserCtxt(path);
+	xmlSchemaSetParserErrors(ctxt,
+	     (xmlSchemaValidityErrorFunc) testErrorHandler,
+	     (xmlSchemaValidityWarningFunc) testErrorHandler,
+	     ctxt);
+	schemas = xmlSchemaParse(ctxt);
+	xmlSchemaFreeParserCtxt(ctxt);
+	if (schemas == NULL) {
+	    if (verbose)
+		fprintf(stderr, "Failed to detect error in schemas %s\n",
+			path);
+	    nb_errors++;
+	}
+	nb_tests++;
+    } else {
+        fprintf(stderr,
+	        "testGroup line %ld misses unexpected validity value%s\n",
+	        xmlGetLineNo(cur), validity);
+	ret = -1;
+	goto done;
+    }
+
+done:
+    if (href != NULL) xmlFree(href);
+    if (path != NULL) xmlFree(path);
+    if (validity != NULL) xmlFree(validity);
+    if (schemas != NULL) xmlSchemaFree(schemas);
+    return(ret);
+}
+
+static int
+xstcMetadata(int verbose, const char *metadata) {
+    xmlDocPtr doc;
+    xmlNodePtr cur;
+    xmlChar *contributor;
+    xmlChar *name;
+    int ret;
+
+    doc = xmlReadFile(metadata, NULL, XML_PARSE_NOENT);
+    if (doc == NULL) {
+        fprintf(stderr, "Failed to parse %s\n", metadata);
+	return(-1);
+    }
+
+    cur = xmlDocGetRootElement(doc);
+    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSet"))) {
+        fprintf(stderr, "Unexpected format %s\n", metadata);
+	return(-1);
+    }
+    contributor = xmlGetProp(cur, BAD_CAST "contributor");
+    if (contributor == NULL) {
+        contributor = xmlStrdup(BAD_CAST "Unknown");
+    }
+    name = xmlGetProp(cur, BAD_CAST "name");
+    if (name == NULL) {
+        name = xmlStrdup(BAD_CAST "Unknown");
+    }
+    printf("## %s test suite for Schemas version %s\n", contributor, name);
+    xmlFree(contributor);
+    xmlFree(name);
+
+    cur = getNext(cur, "./ts:testGroup[1]");
+    if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testGroup"))) {
+        fprintf(stderr, "Unexpected format %s\n", metadata);
+	ret = -1;
+	goto done;
+    }
+    while (cur != NULL) {
+        xstcTestGroup(verbose, cur);
+	cur = getNext(cur, "following-sibling::ts:testGroup[1]");
+    }
+
+done:
+    xmlFreeDoc(doc);
+    return(ret);
+}
+
+static int
+xstcTests(int verbose) {
+    int ret;
+
+    ret = xstcMetadata(verbose,
+                 "xstc/Tests/Metadata/MSXMLSchema1-0-20020116.testSet");
+    return(ret);
+}
+
+/************************************************************************
+ *									*
+ *		The driver for the tests				*
  *									*
  ************************************************************************/
 
@@ -775,6 +979,14 @@
     old_errors = nb_errors;
     old_tests = nb_tests;
     old_leaks = nb_leaks;
+    res = xstcTests(verbose);
+    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
+	printf("Ran %d tests, no errors\n", nb_tests - old_tests);
+    else
+	printf("Ran %d tests, %d errors, %d leaks\n",
+	       nb_tests - old_tests,
+	       nb_errors - old_errors,
+	       nb_leaks - old_leaks);
 
     if ((nb_errors == 0) && (nb_leaks == 0)) {
         ret = 0;
@@ -785,6 +997,8 @@
 	printf("Total %d tests, %d errors, %d leaks\n",
 	       nb_tests, nb_errors, nb_leaks);
     }
+
+    xmlXPathFreeContext(ctxtXPath);
     xmlCleanupParser();
     xmlMemoryDump();
 
