diff --git a/user/build.xml b/user/build.xml
index f1f1c1a..fa0903b 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -853,7 +853,7 @@
           excludes="${gwt.tck.testcase.dev.excludes}" />
       <gwt.junit test.name="test.dev.htmlunit"
           test.args="${test.args} -standardsMode "
-          test.jvmargs="-ea -Dcom.google.gwt.sample.validationtck.util.Failing.include=true  -Dcom.google.gwt.sample.validationtck.util.NonTckTest.exclude=true"
+          test.jvmargs="-ea -Dcom.google.gwt.sample.validationtck.util.Failing.include=true"     
           test.out="${junit.out}/tck-dev-htmlunit"
           test.cases="tck.dev.htmlunit.tests"
           haltonfailure="false"
diff --git a/user/style/html/junit-noframes.xsl b/user/style/html/junit-noframes.xsl
index e316ce4..1e2f8ed 100644
--- a/user/style/html/junit-noframes.xsl
+++ b/user/style/html/junit-noframes.xsl
@@ -261,7 +261,7 @@
           grep -r \@Test org/hibernate/jsr303/tck/tests/| grep -v "enabled = false"  | wc -l
         -->
         <xsl:variable name="testCount" select="($rawTestCount - $markedNotSupported - $markedTestNotCompatible)"/>
-        <xsl:variable name="testExecutedCount" select="sum(testsuite/@tests)"/>
+        <xsl:variable name="testExecutedCount" select="sum(testsuite/@tests) - $markedNonTckTest"/>
         <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
         <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
         <xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
diff --git a/user/style/text/junit-noframes.xsl b/user/style/text/junit-noframes.xsl
index 10865fc..89b49c8 100644
--- a/user/style/text/junit-noframes.xsl
+++ b/user/style/text/junit-noframes.xsl
@@ -44,7 +44,7 @@
       grep -r \@Test org/hibernate/jsr303/tck/tests/| grep -v "enabled = false"  | wc -l
     -->
     <xsl:variable name="testCount" select="($rawTestCount - $markedNotSupported -$markedTestNotCompatible)"/>
-    <xsl:variable name="testExecutedCount" select="sum(testsuite/@tests)"/>
+    <xsl:variable name="testExecutedCount" select="sum(testsuite/@tests) - $markedNonTckTest"/>
     <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
     <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
     <xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
diff --git a/user/test/com/google/gwt/validation/tck/BootstrapGwtSuite.java b/user/test/com/google/gwt/validation/tck/BootstrapGwtSuite.java
index d7262cc..1c13ab1 100644
--- a/user/test/com/google/gwt/validation/tck/BootstrapGwtSuite.java
+++ b/user/test/com/google/gwt/validation/tck/BootstrapGwtSuite.java
@@ -21,6 +21,9 @@
 import org.hibernate.jsr303.tck.tests.bootstrap.CustomMessageInterpolatorGwtTest;
 import org.hibernate.jsr303.tck.tests.bootstrap.ValidationProviderGwtTest;
 import org.hibernate.jsr303.tck.tests.bootstrap.ValidationProviderResolverGwtTest;
+import org.hibernate.jsr303.tck.tests.bootstrap.customprovider.BootstrapCustomProviderDefinedInServiceFileGwtTest;
+import org.hibernate.jsr303.tck.tests.bootstrap.customprovider.BootstrapCustomProviderDefinedInValidationXmlGwtTest;
+import org.hibernate.jsr303.tck.tests.bootstrap.customprovider.BootstrapUnknownCustomProviderGwtTest;
 import org.hibernate.jsr303.tck.util.TckTestSuiteWrapper;
 
 /**
@@ -34,6 +37,11 @@
     suite.addTestSuite(CustomMessageInterpolatorGwtTest.class);
     suite.addTestSuite(ValidationProviderGwtTest.class);
     suite.addTestSuite(ValidationProviderResolverGwtTest.class);
+    suite
+        .addTestSuite(BootstrapCustomProviderDefinedInServiceFileGwtTest.class);
+    suite
+        .addTestSuite(BootstrapCustomProviderDefinedInValidationXmlGwtTest.class);
+    suite.addTestSuite(BootstrapUnknownCustomProviderGwtTest.class);
     return suite;
   }
 }
diff --git a/user/test/com/google/gwt/validation/tck/XmlConfigurationGwtSuite.java b/user/test/com/google/gwt/validation/tck/XmlConfigurationGwtSuite.java
new file mode 100644
index 0000000..0418289
--- /dev/null
+++ b/user/test/com/google/gwt/validation/tck/XmlConfigurationGwtSuite.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.tck;
+
+import junit.framework.Test;
+
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.ConstraintValidatorFactorySpecifiedInValidationXmlGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.DefaultProviderSpecifiedInValidationXmlGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.DuplicateConfigurationGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.InvalidXmlConfigurationGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.MessageInterpolatorSpecifiedInValidationXmlGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.MissingClassNameOnBeanNodeGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.OptionalValidationXmlGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.TraversableResolverSpecifiedInValidationXmlGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorGwtTest;
+import org.hibernate.jsr303.tck.tests.xmlconfiguration.XmlConfigurationGwtTest;
+import org.hibernate.jsr303.tck.util.TckTestSuiteWrapper;
+
+/**
+ * Tck Tests for the {@code xml configuration} package.
+ */
+public class XmlConfigurationGwtSuite {
+  public static Test suite() {
+    TckTestSuiteWrapper suite = new TckTestSuiteWrapper(
+        "TCK for GWT Validation, xml configuration package");
+    suite
+        .addTestSuite(ConstraintValidatorFactorySpecifiedInValidationXmlGwtTest.class);
+    suite.addTestSuite(DefaultProviderSpecifiedInValidationXmlGwtTest.class);
+    suite.addTestSuite(DuplicateConfigurationGwtTest.class);
+    suite.addTestSuite(InvalidXmlConfigurationGwtTest.class);
+    suite
+        .addTestSuite(MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorGwtTest.class);
+    suite
+        .addTestSuite(MessageInterpolatorSpecifiedInValidationXmlGwtTest.class);
+    suite.addTestSuite(MissingClassNameOnBeanNodeGwtTest.class);
+    suite.addTestSuite(OptionalValidationXmlGwtTest.class);
+    suite
+        .addTestSuite(TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorGwtTest.class);
+    suite
+        .addTestSuite(TraversableResolverSpecifiedInValidationXmlGwtTest.class);
+    suite.addTestSuite(XmlConfigurationGwtTest.class);
+
+    return suite;
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java
new file mode 100644
index 0000000..14adb08
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInServiceFileGwtTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.bootstrap.customprovider;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.Failing;
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+
+/**
+ * Wraps {@link BootstrapCustomProviderDefinedInServiceFileTest} .
+ */
+public class BootstrapCustomProviderDefinedInServiceFileGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return "org.hibernate.jsr303.tck.tests.bootstrap.customprovider.TckTest";
+  }
+
+  @Failing(issue = 6663)
+  public void testGetFactoryByProviderSpecifiedProgrammatically() {
+    fail("TODO(nchalko) figure out how to test this in GWT");
+  }
+
+  @Failing(issue = 6663)
+  public void testProviderResolverReturnsListOfAvailableProviders() {
+    fail("TODO(nchalko) figure out how to test this in GWT");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInValidationXmlGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInValidationXmlGwtTest.java
new file mode 100644
index 0000000..56d8e3b
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapCustomProviderDefinedInValidationXmlGwtTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.bootstrap.customprovider;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link BootstrapCustomProviderDefinedInValidationXmlTest} .
+ */
+public class BootstrapCustomProviderDefinedInValidationXmlGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testWrongProviderConfiguredInValidationXml() {
+    fail("XML configuration is not supported");
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapUnknownCustomProviderGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapUnknownCustomProviderGwtTest.java
new file mode 100644
index 0000000..4697d6e
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/BootstrapUnknownCustomProviderGwtTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.bootstrap.customprovider;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link BootstrapCustomProviderDefinedInValidationXmlTest} .
+ */
+public class BootstrapUnknownCustomProviderGwtTest extends GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testGetFactoryByProviderSpecifiedInValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest(){}
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml
new file mode 100644
index 0000000..054e740
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTest.gwt.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+<!--
+  Copyright 2011 Google Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy of
+  the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+  License for the specific language governing permissions and limitations under
+  the License.
+-->
+<module>
+  <inherits name="org.hibernate.jsr303.tck.tests.ValidationTck" />
+  <source path="">
+    <include name="*.java" />
+  </source>
+  <replace-with class="org.hibernate.jsr303.tck.tests.bootstrap.customprovider.TckTestValidatorFactory">
+    <when-type-is class="javax.validation.ValidatorFactory"/>
+  </replace-with>
+</module>
diff --git a/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTestValidatorFactory.java
new file mode 100644
index 0000000..61b2ccd
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/bootstrap/customprovider/TckTestValidatorFactory.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.bootstrap.customprovider;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.validation.client.AbstractGwtValidatorFactory;
+import com.google.gwt.validation.client.GwtValidation;
+import com.google.gwt.validation.client.impl.AbstractGwtValidator;
+
+import org.hibernate.jsr303.tck.tests.bootstrap.CustomMessageInterpolatorTest.Person;
+
+import javax.validation.Validator;
+
+/**
+ * {@link AbstractGwtValidatorFactory} implementation that uses
+ * {@link com.google.gwt.validation.client.GwtValidation GwtValidation}.
+ */
+public final class TckTestValidatorFactory extends AbstractGwtValidatorFactory {
+  /**
+   * Marker Interface for {@link GWT#create(Class)}.
+   */
+  @GwtValidation(value = {Person.class})
+  public static interface GwtValidator extends Validator {
+  }
+
+  @Override
+  public AbstractGwtValidator createValidator() {
+    return GWT.create(GwtValidator.class);
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/ConstraintValidatorFactorySpecifiedInValidationXmlGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/ConstraintValidatorFactorySpecifiedInValidationXmlGwtTest.java
new file mode 100644
index 0000000..b893ea0
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/ConstraintValidatorFactorySpecifiedInValidationXmlGwtTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link ConstraintValidatorFactorySpecifiedInValidationXmlTest}.
+ */
+public class ConstraintValidatorFactorySpecifiedInValidationXmlGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testConstraintValidatorFactorySpecifiedInValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testConstraintValidatorFactorySpecifiedInValidationXmlCanBeOverridden() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/DefaultProviderSpecifiedInValidationXmlGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/DefaultProviderSpecifiedInValidationXmlGwtTest.java
new file mode 100644
index 0000000..05c20bd
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/DefaultProviderSpecifiedInValidationXmlGwtTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link DefaultProviderSpecifiedInValidationXmlTest}.
+ */
+public class DefaultProviderSpecifiedInValidationXmlGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testProviderSpecifiedInValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/DuplicateConfigurationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/DuplicateConfigurationGwtTest.java
new file mode 100644
index 0000000..9e02a38
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/DuplicateConfigurationGwtTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link DuplicateConfigurationTest}.
+ */
+public class DuplicateConfigurationGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testBeanCannotBeDescribedMoreThanOnce() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testFieldMappingCannotOccurMoreThanOnce() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testGetterMappingCannotOccurMoreThanOnce() {
+    fail("XML configuration is not supported");
+  }
+
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testXmlConfiguredConstraintExposesCorrespondingAnnotationViaMetadata() {
+    fail("XML configuration is not supported");
+  }
+
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/InvalidXmlConfigurationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/InvalidXmlConfigurationGwtTest.java
new file mode 100644
index 0000000..364411c
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/InvalidXmlConfigurationGwtTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link InvalidXmlConfigurationTest}.
+ */
+public class InvalidXmlConfigurationGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testInvalidValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MessageInterpolatorSpecifiedInValidationXmlGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MessageInterpolatorSpecifiedInValidationXmlGwtTest.java
new file mode 100644
index 0000000..cd58f0e
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MessageInterpolatorSpecifiedInValidationXmlGwtTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link MessageInterpolatorSpecifiedInValidationXmlTest}.
+ */
+public class MessageInterpolatorSpecifiedInValidationXmlGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testMessageInterpolatorSpecifiedInValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testMessageInterpolatorSpecifiedInValidationXmlCanBeOverridden() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorGwtTest.java
new file mode 100644
index 0000000..08c8e3c
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorGwtTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps
+ * {@link MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorTest}.
+ */
+public class MessageInterpolatorSpecifiedInValidationXmlNoDefaultConstructorGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testMessageInterpolatorSpecifiedInValidationXmlHasNoDefaultConstructor() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MissingClassNameOnBeanNodeGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MissingClassNameOnBeanNodeGwtTest.java
new file mode 100644
index 0000000..0995ec1
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/MissingClassNameOnBeanNodeGwtTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link MissingClassNameOnBeanNodeTest}.
+ */
+public class MissingClassNameOnBeanNodeGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testClassNameIsMandatory() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/OptionalValidationXmlGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/OptionalValidationXmlGwtTest.java
new file mode 100644
index 0000000..e3fa37c
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/OptionalValidationXmlGwtTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link OptionalValidationXmlTest}.
+ */
+public class OptionalValidationXmlGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testIgnoreValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml
new file mode 100644
index 0000000..1b9f361
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTest.gwt.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+<!--
+  Copyright 2011 Google Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy of
+  the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+  License for the specific language governing permissions and limitations under
+  the License.
+-->
+<module>
+  <inherits name="org.hibernate.jsr303.tck.tests.ValidationTck" />
+  <source path="">
+    <include name="*.java" />
+  </source>
+  <replace-with class="org.hibernate.jsr303.tck.tests.xmlconfiguration.TckTestValidatorFactory">
+    <when-type-is class="javax.validation.ValidatorFactory"/>
+  </replace-with>
+</module>
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTestValidatorFactory.java
new file mode 100644
index 0000000..2306b2e
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TckTestValidatorFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.validation.client.AbstractGwtValidatorFactory;
+import com.google.gwt.validation.client.GwtValidation;
+import com.google.gwt.validation.client.impl.AbstractGwtValidator;
+
+import javax.validation.Validator;
+
+/**
+ * {@link AbstractGwtValidatorFactory} implementation that uses
+ * {@link com.google.gwt.validation.client.GwtValidation GwtValidation}.
+ */
+public final class TckTestValidatorFactory extends AbstractGwtValidatorFactory {
+  /**
+   * Marker Interface for {@link GWT#create(Class)}.
+   */
+  @GwtValidation(value = {User.class})
+  public static interface GwtValidator extends Validator {
+  }
+
+  @Override
+  public AbstractGwtValidator createValidator() {
+    return GWT.create(GwtValidator.class);
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TraversableResolverSpecifiedInValidationXmlGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TraversableResolverSpecifiedInValidationXmlGwtTest.java
new file mode 100644
index 0000000..6e481d5
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TraversableResolverSpecifiedInValidationXmlGwtTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link TraversableResolverSpecifiedInValidationXmlTest}.
+ */
+public class TraversableResolverSpecifiedInValidationXmlGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testMessageInterpolatorSpecifiedInValidationXmlCanBeOverridden() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testTraversableResolverSpecifiedInValidationXml() {
+    fail("XML configuration is not supported");
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorGwtTest.java
new file mode 100644
index 0000000..8dcbbaf
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorGwtTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps
+ * {@link TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorTest}.
+ */
+public class TraversableResolverSpecifiedInValidationXmlNoDefaultConstructorGwtTest extends
+    GWTTestCase {
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testTraversableResolverSpecifiedInValidationXmlHasNoDefaultConstructor() {
+    fail("XML configuration is not supported");
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/XmlConfigurationGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/XmlConfigurationGwtTest.java
new file mode 100644
index 0000000..263ca62
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/XmlConfigurationGwtTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link XmlConfigurationTest}.
+ */
+public class XmlConfigurationGwtTest extends
+    GWTTestCase {
+  XmlConfigurationTest d = null;
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testAnnotationDefinedConstraintApplies() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testCascadingConfiguredInXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testClassConstraintDefinedInXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testElementConversionInXmlConfiguredConstraint() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testFieldConstraintDefinedInXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testIgnoreValidationXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testMappingFilesAddedViaConfigurationGetAddedToXmlConfiguredMappings() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testPropertyConstraintDefinedInXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/ConfigurationViaXmlAndAnnotationsGwtTest.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/ConfigurationViaXmlAndAnnotationsGwtTest.java
new file mode 100644
index 0000000..51ec544
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/ConfigurationViaXmlAndAnnotationsGwtTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration.constraintdeclaration;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+import org.hibernate.jsr303.tck.util.client.NonTckTest;
+import org.hibernate.jsr303.tck.util.client.NotSupported;
+import org.hibernate.jsr303.tck.util.client.NotSupported.Reason;
+
+/**
+ * Wraps {@link ConfigurationViaXmlAndAnnotationsTest}.
+ */
+public class ConfigurationViaXmlAndAnnotationsGwtTest extends
+    GWTTestCase {
+  ConfigurationViaXmlAndAnnotationsTest d = new ConfigurationViaXmlAndAnnotationsTest();
+
+  @Override
+  public String getModuleName() {
+    return null;
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testDefaultGroupDefinitionDefinedInEntityApplies() {
+    fail("XML configuration is not supported");
+  }
+
+  @NotSupported(reason = Reason.XML)
+  public void testEntityConfiguredViaAnnotationsAndXml() {
+    fail("XML configuration is not supported");
+  }
+
+  @NonTckTest
+  public void testThereMustBeOnePassingTest() {
+  }
+}
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml
new file mode 100644
index 0000000..579c66d
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTest.gwt.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
+<!--
+  Copyright 2011 Google Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License. You may obtain a copy of
+  the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+  License for the specific language governing permissions and limitations under
+  the License.
+-->
+<module>
+  <inherits name="org.hibernate.jsr303.tck.tests.ValidationTck" />
+  <source path="">
+    <include name="*.java" />
+  </source>
+  <replace-with class="org.hibernate.jsr303.tck.tests.xmlconfiguration.constraintdeclaration.TckTestValidatorFactory">
+    <when-type-is class="javax.validation.ValidatorFactory"/>
+  </replace-with>
+</module>
diff --git a/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTestValidatorFactory.java b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTestValidatorFactory.java
new file mode 100644
index 0000000..734fcc7
--- /dev/null
+++ b/user/test/org/hibernate/jsr303/tck/tests/xmlconfiguration/constraintdeclaration/TckTestValidatorFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.hibernate.jsr303.tck.tests.xmlconfiguration.constraintdeclaration;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.validation.client.AbstractGwtValidatorFactory;
+import com.google.gwt.validation.client.GwtValidation;
+import com.google.gwt.validation.client.impl.AbstractGwtValidator;
+
+import javax.validation.Validator;
+
+/**
+ * {@link AbstractGwtValidatorFactory} implementation that uses
+ * {@link com.google.gwt.validation.client.GwtValidation GwtValidation}.
+ */
+public final class TckTestValidatorFactory extends AbstractGwtValidatorFactory {
+  /**
+   * Marker Interface for {@link GWT#create(Class)}.
+   */
+  @GwtValidation(value = {User.class})
+  public static interface GwtValidator extends Validator {
+  }
+
+  @Override
+  public AbstractGwtValidator createValidator() {
+    return GWT.create(GwtValidator.class);
+  }
+}
