diff --git a/samples/validation/src/com/google/gwt/sample/validation/client/ValidationView.java b/samples/validation/src/com/google/gwt/sample/validation/client/ValidationView.java
index 1383761..090ecf8 100644
--- a/samples/validation/src/com/google/gwt/sample/validation/client/ValidationView.java
+++ b/samples/validation/src/com/google/gwt/sample/validation/client/ValidationView.java
@@ -21,6 +21,7 @@
 import com.google.gwt.event.dom.client.KeyUpEvent;
 import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.sample.validation.shared.ClientGroup;
 import com.google.gwt.sample.validation.shared.Person;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
@@ -39,6 +40,7 @@
 import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
 import javax.validation.Validator;
+import javax.validation.groups.Default;
 
 /**
  * Display the Validation sample.
@@ -126,7 +128,8 @@
     person.setName(nameField.getText());
 
     Validator validator = GWT.create(SampleValidator.class);
-    Set<ConstraintViolation<Person>> violations = validator.validate(person);
+    Set<ConstraintViolation<Person>> violations = validator.validate(person,
+        Default.class, ClientGroup.class);
     if (!violations.isEmpty()) {
       StringBuffer errorMessage = new StringBuffer();
       for (ConstraintViolation<Person> constraintViolation : violations) {
diff --git a/samples/validation/src/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java b/samples/validation/src/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java
index 330d8ad..c633d58 100644
--- a/samples/validation/src/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java
+++ b/samples/validation/src/com/google/gwt/sample/validation/super/com/google/gwt/sample/validation/shared/ServerValidator.java
@@ -15,23 +15,13 @@
  */
 package com.google.gwt.sample.validation.shared;
 
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
+import com.google.gwt.validation.client.constraints.NotGwtCompatibleValidator;
 
 /**
- * Always passes.
+ * Always invalid.
  * <p>
- * TODO(nchalko) change this to extend
- * {@link com.google.gwt.validation.client.constraints.NotGwtCompatibleValidator}
- * when groups are properly handled.
+ * Server validator is overriden so it compiles, but it is always invalid.
  */
-public class ServerValidator implements
-    ConstraintValidator<ServerConstraint, Person> {
-
-  public void initialize(ServerConstraint constraintAnnotation) {
-  }
-
-  public boolean isValid(Person person, ConstraintValidatorContext context) {
-    return true;
-  }
+public class ServerValidator extends
+   NotGwtCompatibleValidator<ServerConstraint, Person> {
 }
\ No newline at end of file
diff --git a/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/application/TckTestValidator.java b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/application/TckTestValidator.java
index d9e7e23..f562b34 100644
--- a/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/application/TckTestValidator.java
+++ b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/application/TckTestValidator.java
@@ -21,7 +21,6 @@
 
 import org.hibernate.jsr303.tck.tests.constraints.application.Building;
 import org.hibernate.jsr303.tck.tests.constraints.application.SuperWoman;
-import org.hibernate.jsr303.tck.tests.constraints.application.Visibility;
 import org.hibernate.jsr303.tck.tests.constraints.application.Woman;
 
 import javax.validation.Validator;
@@ -35,7 +34,7 @@
    * Marker Interface for {@link GWT#create(Class)}.
    */
   @GwtValidation(value = {
-      Building.class, SuperWoman.class, Visibility.class, Woman.class})
+      Building.class, SuperWoman.class, Woman.class})
   public static interface GwtValidator extends Validator {
   }
 
diff --git a/samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ConstraintApplicationGwtSuite.java b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/ConstraintsGroupsGwtSuite.java
similarity index 72%
copy from samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ConstraintApplicationGwtSuite.java
copy to samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/ConstraintsGroupsGwtSuite.java
index 590a1bb..7f55804 100644
--- a/samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ConstraintApplicationGwtSuite.java
+++ b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/ConstraintsGroupsGwtSuite.java
@@ -13,20 +13,20 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.sample.validationtck.validatorfactory;
+package com.google.gwt.sample.validationtck.constraints.groups;
 
 import com.google.gwt.junit.tools.GWTTestSuite;
 
 import junit.framework.Test;
 
 /**
- * Tck Tests for the {@code validatorfactory} package.
+ * Tck Tests for the {@code constraints groups} package.
  */
-public class ConstraintApplicationGwtSuite {
+public class ConstraintsGroupsGwtSuite {
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite(
-        "TCK for GWT Validation, validatorfactory package");
-    suite.addTestSuite(CustomConstraintValidatorTest.class);
+        "TCK for GWT Validation, constraints groups package");
+    suite.addTestSuite(GroupTest.class);
     return suite;
   }
 }
diff --git a/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/GroupTest.java b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/GroupTest.java
new file mode 100644
index 0000000..c40ceeb
--- /dev/null
+++ b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/GroupTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2010 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.sample.validationtck.constraints.groups;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Test wrapper for
+ * {@link org.hibernate.jsr303.tck.tests.constraints.groups.GroupTest}.
+ */
+public class GroupTest extends GWTTestCase {
+  private final org.hibernate.jsr303.tck.tests.constraints.groups.GroupTest delegate = 
+      new org.hibernate.jsr303.tck.tests.constraints.groups.GroupTest();
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.sample.validationtck.constraints.groups.TckTest";
+  }
+
+  public void testConstraintCanBelongToMoreThanOneGroup() {
+    delegate.testConstraintCanBelongToMoreThanOneGroup();
+  }
+
+  public void testConstraintWithNoExplicitlySpecifiedGroupBelongsToDefault() {
+    delegate.testConstraintWithNoExplicitlySpecifiedGroupBelongsToDefault();
+  }
+
+  public void testCyclicGroupSequence() {
+    delegate.testCyclicGroupSequence();
+  }
+
+  public void testGroups() {
+    delegate.testGroups();
+  }
+
+  public void testGroupSequence() {
+    delegate.testGroupSequence();
+  }
+
+  public void testGroupSequenceFollowedByGroup() {
+    delegate.testGroupSequenceFollowedByGroup();
+  }
+
+  public void testImplicitGrouping() {
+    delegate.testImplicitGrouping();
+  }
+
+  public void testValidateAgainstDifferentGroups() {
+    delegate.testValidateAgainstDifferentGroups();
+  }
+
+  public void testValidationFailureInMultipleGroups() {
+    delegate.testValidationFailureInMultipleGroups();
+  }
+
+}
diff --git a/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/TckTest.gwt.xml b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/TckTest.gwt.xml
new file mode 100644
index 0000000..c12157b
--- /dev/null
+++ b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/TckTest.gwt.xml
@@ -0,0 +1,27 @@
+<?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 2010 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="com.google.gwt.sample.validationtck.ValidationTck" />
+  <source path="">
+    <include name="*.java" />
+    <exclude name="super" />
+  </source>
+  <replace-with class="com.google.gwt.sample.validationtck.constraints.groups.TckTestValidator">
+    <when-type-is class="javax.validation.Validator"/>
+  </replace-with>
+</module>
\ No newline at end of file
diff --git a/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/TckTestValidator.java b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/TckTestValidator.java
new file mode 100644
index 0000000..c1f014a
--- /dev/null
+++ b/samples/validationtck/test/com/google/gwt/sample/validationtck/constraints/groups/TckTestValidator.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2010 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.sample.validationtck.constraints.groups;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.validation.client.AbstractValidator;
+import com.google.gwt.validation.client.GwtValidation;
+
+import org.hibernate.jsr303.tck.tests.constraints.groups.Animal;
+import org.hibernate.jsr303.tck.tests.constraints.groups.Book;
+import org.hibernate.jsr303.tck.tests.constraints.groups.Order;
+import org.hibernate.jsr303.tck.tests.constraints.groups.User;
+
+import javax.validation.Validator;
+
+/**
+ * Validator implementation that uses
+ * {@link com.google.gwt.validation.client.GwtValidation GwtValidation}.
+ */
+public final class TckTestValidator extends AbstractValidator {
+  /**
+   * Marker Interface to {@link GWT#create(Class)}.
+   */
+  @GwtValidation(value = {Animal.class, Book.class, Order.class, User.class})
+  public static interface GwtValidator extends Validator {
+  }
+
+  public TckTestValidator() {
+    super((Validator) GWT.create(GwtValidator.class));
+  }
+}
diff --git a/samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ConstraintApplicationGwtSuite.java b/samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ValidatorFactoryGwtSuite.java
similarity index 95%
rename from samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ConstraintApplicationGwtSuite.java
rename to samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ValidatorFactoryGwtSuite.java
index 590a1bb..ddb8abf 100644
--- a/samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ConstraintApplicationGwtSuite.java
+++ b/samples/validationtck/test/com/google/gwt/sample/validationtck/validatorfactory/ValidatorFactoryGwtSuite.java
@@ -22,7 +22,7 @@
 /**
  * Tck Tests for the {@code validatorfactory} package.
  */
-public class ConstraintApplicationGwtSuite {
+public class ValidatorFactoryGwtSuite {
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite(
         "TCK for GWT Validation, validatorfactory package");
diff --git a/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java b/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
index 34a1a5e..05a949b 100644
--- a/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
+++ b/user/src/com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java
@@ -16,13 +16,16 @@
 package com.google.gwt.validation.client.impl;
 
 import java.lang.annotation.Annotation;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintViolation;
+import javax.validation.groups.Default;
 
 /**
  * Base methods for implementing a {@link GwtSpecificValidator}.
@@ -59,18 +62,6 @@
     return new AttributeBuilder();
   }
 
-  /**
-   * @param <A>
-   * @param <T>
-   * @param <V>
-   * @param context
-   * @param violations
-   * @param object
-   * @param value
-   * @param validator
-   * @param constraintDescriptor
-   * @param groups
-   */
   protected <A extends Annotation, T, V> void validate(
       GwtValidationContext<T> context, Set<ConstraintViolation<T>> violations,
       G object, V value, ConstraintValidator<A, ? super V> validator,
@@ -78,6 +69,22 @@
     validator.initialize(constraintDescriptor.getAnnotation());
     ConstraintValidatorContextImpl<A, V> constraintValidatorContext =
         context.createConstraintValidatorContext(constraintDescriptor);
+
+    // TODO(nchalko) set empties to Default earlier.
+    Set<Class<?>> constraintGroup = constraintDescriptor.getGroups();
+    if (groups.length == 0) {
+      groups = new Class<?>[]{Default.class};
+    }
+    if (constraintGroup.isEmpty()) {
+      constraintGroup = new HashSet<Class<?>>();
+      constraintGroup.add(Default.class);
+    }
+
+    // check group
+    if (!containsAny(groups, constraintGroup)) {
+      return;
+    }
+
     if (!validator.isValid(value, constraintValidatorContext)) {
       addViolations(//
           context, //
@@ -105,6 +112,15 @@
     }
   }
 
+  private <T> boolean containsAny(T[] left, Collection<T> right) {
+    for (T t : left) {
+      if (right.contains(t)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   private <T, V, A extends Annotation> ConstraintViolation<T> createConstraintViolation(
       GwtValidationContext<T> context, G object, V value,
       ConstraintDescriptorImpl<A> constraintDescriptor,
diff --git a/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
index e8e8e83..968c5a7 100644
--- a/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/ValidatorCreator.java
@@ -190,11 +190,25 @@
     }
   }
 
-  private void writeThrowIllegalArgumnet(SourceWriter sourceWriter) {
-    sourceWriter.print("throw new IllegalArgumentException(\""
-        + this.validatorType.getName() + " can only validate ");
-    sourceWriter.print(beansToValidate.toString());
+  private void writeThrowIllegalArgumnet(SourceWriter sourceWriter,
+      String getClassName) {
+    // throw new IllegalArgumentException("MyValidator can not validate ",
+    sourceWriter.print("throw new IllegalArgumentException(\"");
+    sourceWriter.print(this.validatorType.getName() + " can not  validate \"");
+    sourceWriter.indent();
+    sourceWriter.indent();
+
+    // + object.getClass().getName() +". "
+    sourceWriter.print("+ ");
+    sourceWriter.print(getClassName);
+    sourceWriter.println("+ \". \"");
+
+    // + "Valid values are {Foo.clas, Bar.class}
+    sourceWriter.print("+ \"Valid types are ");
+    sourceWriter.print(beansToValidate.entrySet().toString());
     sourceWriter.println("\");");
+    sourceWriter.outdent();
+    sourceWriter.outdent();
   }
 
   private void writeTypeSupport(SourceWriter sw) {
@@ -229,7 +243,7 @@
       writeValidate(sw, bean);
     }
 
-    writeThrowIllegalArgumnet(sw);
+    writeThrowIllegalArgumnet(sw, "object.getClass().getName()");
 
     sw.outdent();
     sw.println("}");
@@ -265,7 +279,7 @@
       writeValidateProperty(sw, bean);
     }
 
-    writeThrowIllegalArgumnet(sw);
+    writeThrowIllegalArgumnet(sw, "object.getClass().getName()");
 
     sw.outdent();
     sw.println("}");
@@ -296,7 +310,7 @@
       writeValidateValue(sw, bean);
     }
 
-    writeThrowIllegalArgumnet(sw);
+    writeThrowIllegalArgumnet(sw, "beanType.getName()");
 
     sw.outdent();
     sw.println("}");
