GERONIMO-6581 Bean Validation 2.0 API

Based on patch from mbenson

git-svn-id: https://svn.apache.org/repos/asf/geronimo/specs/trunk@1807299 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-validation_2.0_spec/NOTICE b/geronimo-validation_2.0_spec/NOTICE
index edde817..53b0f1c 100644
--- a/geronimo-validation_2.0_spec/NOTICE
+++ b/geronimo-validation_2.0_spec/NOTICE
@@ -1,5 +1,5 @@
-Apache Geronimo JSR-349 Bean Validation Spec API
-Copyright 2009-2016 The Apache Software Foundation
+Apache Geronimo JSR-380 Bean Validation Spec API
+Copyright 2009-2017 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/geronimo-validation_2.0_spec/pom.xml b/geronimo-validation_2.0_spec/pom.xml
index 06ee99f..775d0c0 100644
--- a/geronimo-validation_2.0_spec/pom.xml
+++ b/geronimo-validation_2.0_spec/pom.xml
@@ -20,22 +20,23 @@
 
 <!-- $Rev: 759182 $ $Date: 2009-03-27 11:48:31 -0400 (Fri, 27 Mar 2009) $ -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
         <groupId>org.apache.geronimo.genesis</groupId>
-        <artifactId>genesis-java6-flava</artifactId>
-        <version>2.2</version>
+        <artifactId>genesis-java8-flava</artifactId>
+        <version>2.3</version>
     </parent>
 
     <groupId>org.apache.geronimo.specs</groupId>
-    <artifactId>geronimo-validation_1.1_spec</artifactId>
-    <version>1.1-SNAPSHOT</version>
+    <artifactId>geronimo-validation_2.0_spec</artifactId>
+    <version>1.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
-    <name>Apache Geronimo Bean Validation Spec 1.1</name>
-    <description>Apache Geronimo implementation of the JSR-349 Bean Validation Spec API</description>
+    <name>Apache Geronimo Bean Validation Spec 2.0</name>
+    <description>Apache Geronimo implementation of the JSR-380 Bean Validation Spec API</description>
 
     <url>http://geronimo.apache.org/maven/${siteId}/${project.version}</url>
     <distributionManagement>
@@ -50,8 +51,11 @@
     </properties>
 
     <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/geronimo/specs/trunk/geronimo-validation_1.1_spec/</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/geronimo/specs/trunk/geronimo-validation_1.1_spec/</developerConnection>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/geronimo/specs/trunk/geronimo-validation_1.1_spec/
+        </connection>
+        <developerConnection>
+            scm:svn:https://svn.apache.org/repos/asf/geronimo/specs/trunk/geronimo-validation_1.1_spec/
+        </developerConnection>
         <url>http://svn.apache.org/viewcvs.cgi/geronimo/specs/trunk/geronimo-validation_1.1_spec/</url>
     </scm>
 
@@ -80,7 +84,6 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-antrun-plugin</artifactId>
-                <version>1.7</version>
                 <executions>
                     <execution>
                         <id>delete-DEPENDENCIES</id>
@@ -90,7 +93,7 @@
                         </goals>
                         <configuration>
                             <target>
-                                <delete dir="${project.build.directory}" includes="**/DEPENDENCIES" />
+                                <delete dir="${project.build.directory}" includes="**/DEPENDENCIES"/>
                             </target>
                         </configuration>
                     </execution>
@@ -99,17 +102,18 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>2.0.1</version>
                 <configuration>
                     <instructions>
-                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId};singleton=true</Bundle-SymbolicName>
-                        <Specification-Title>JSR-349 Bean Validation API</Specification-Title>
+                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId};singleton=true
+                        </Bundle-SymbolicName>
+                        <Specification-Title>JSR-380 Bean Validation API</Specification-Title>
                         <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
-                        <Specification-Version>1.1</Specification-Version>
-                        <Export-Package>javax.validation*;version=1.1</Export-Package>
+                        <Specification-Version>2.0</Specification-Version>
+                        <Export-Package>javax.validation*;version=2.0</Export-Package>
                         <Import-Package>org.apache.geronimo.osgi.registry.api;resolution:=optional,*</Import-Package>
                         <Private-Package>org.apache.geronimo.osgi.locator</Private-Package>
                         <Bundle-Activator>org.apache.geronimo.osgi.locator.Activator</Bundle-Activator>
+                        <Automatic-Module-Name>java.validation</Automatic-Module-Name>
                     </instructions>
                 </configuration>
             </plugin>
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/BootstrapConfiguration.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/BootstrapConfiguration.java
index 7e057a4..94142e9 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/BootstrapConfiguration.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/BootstrapConfiguration.java
@@ -31,4 +31,10 @@
 	boolean isExecutableValidationEnabled();
 	Set<ExecutableType> getDefaultValidatedExecutableTypes();
 	Map<String, String> getProperties();
+
+	/** @since 2.0 */
+	String getClockProviderClassName();
+
+	/** @since 2.0 */
+	Set<String> getValueExtractorClassNames();
 }
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ClockProvider.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ClockProvider.java
new file mode 100644
index 0000000..830d8a3
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ClockProvider.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation;
+
+import java.time.Clock;
+
+/**
+ * @since 2.0
+ */
+public interface ClockProvider {
+
+    Clock getClock();
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Configuration.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Configuration.java
index 74b639d..def3fd1 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Configuration.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Configuration.java
@@ -18,6 +18,8 @@
 
 import java.io.InputStream;
 
+import javax.validation.valueextraction.ValueExtractor;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -43,11 +45,21 @@
 
     ValidatorFactory buildValidatorFactory();
 
-    // @since 1.1
-
+    /** @since 1.1 */
     T parameterNameProvider(ParameterNameProvider parameterNameProvider);
+
+    /** @since 1.1 */
     ParameterNameProvider getDefaultParameterNameProvider();
 
+    /** @since 1.1 */
     BootstrapConfiguration getBootstrapConfiguration();
-}
 
+    /** @since 2.0 */
+    T clockProvider(ClockProvider clockProvider);
+
+    /** @since 2.0 */
+    T addValueExtractor(ValueExtractor<?> extractor);
+
+    /** @since 2.0 */
+    ClockProvider getDefaultClockProvider();
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Constraint.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Constraint.java
index 3225023..c694d5b 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Constraint.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Constraint.java
@@ -50,4 +50,3 @@
      */
     Class<? extends ConstraintValidator<?,?>>[] validatedBy();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDeclarationException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDeclarationException.java
index 9a7cddf..d7cb21c 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDeclarationException.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDeclarationException.java
@@ -19,7 +19,9 @@
 /**
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("serial")
 public class ConstraintDeclarationException extends ValidationException {
+
     public ConstraintDeclarationException(String message) {
         super(message);
     }
@@ -36,4 +38,3 @@
         super(cause);
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDefinitionException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDefinitionException.java
index a98a689..f9b9d12 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDefinitionException.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintDefinitionException.java
@@ -19,7 +19,9 @@
 /**
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("serial")
 public class ConstraintDefinitionException extends ValidationException {
+
     public ConstraintDefinitionException(String message) {
         super(message);
     }
@@ -36,4 +38,3 @@
         super(cause);
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidator.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidator.java
index 799cb76..98be78f 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidator.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidator.java
@@ -22,8 +22,8 @@
  * @version $Rev$ $Date$
  */
 public interface ConstraintValidator<A extends Annotation, T> {
-    void initialize(A constraintAnnotation);
+    default void initialize(A constraintAnnotation) {
+    }
 
     boolean isValid(T value, ConstraintValidatorContext context);
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorContext.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorContext.java
index 7ec6c00..da61bbc 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorContext.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorContext.java
@@ -26,29 +26,57 @@
 
     ConstraintViolationBuilder buildConstraintViolationWithTemplate(String messageTemplate);
 
+    /** @since 2.0 */
+    ClockProvider getClockProvider();
+
     /** @since 1.1 */
     <T> T unwrap(Class<T> type);
 
     interface ConstraintViolationBuilder {
+        /**
+         * @deprecated since 1.1
+         * @see #addBeanNode()
+         * @see #addPropertyNode(String)
+         * @see #addParameterNode(int)
+         */
+        @Deprecated
         NodeBuilderDefinedContext addNode(String name);
 
         ConstraintValidatorContext addConstraintViolation();
 
-        // @since 1.1
-
+        /** @since 1.1 */
         NodeBuilderCustomizableContext addPropertyNode(String name);
+
+        /** @since 1.1 */
         LeafNodeBuilderCustomizableContext addBeanNode();
+
+        /** @since 1.1 */
         NodeBuilderDefinedContext addParameterNode(int index);
 
+        /** @since 2.0 */
+        ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+            Integer typeArgumentIndex);
+
         interface NodeBuilderDefinedContext {
+            /**
+             * @deprecated since 1.1
+             * @see #addPropertyNode(String)
+             * @see #addBeanNode()
+             */
+            @Deprecated
             NodeBuilderCustomizableContext addNode(String name);
 
             ConstraintValidatorContext addConstraintViolation();
 
-            // @since 1.1
-
+            /** @since 1.1 */
             NodeBuilderCustomizableContext addPropertyNode(String name);
+
+            /** @since 1.1 */
             LeafNodeBuilderCustomizableContext addBeanNode();
+
+            /** @since 2.0 */
+            ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+                Integer typeArgumentIndex);
         }
 
         interface NodeBuilderCustomizableContext {
@@ -59,10 +87,18 @@
 
             ConstraintValidatorContext addConstraintViolation();
 
-            // @since 1.1
-
+            /** @since 1.1 */
             NodeBuilderCustomizableContext addPropertyNode(String name);
+
+            /** @since 1.1 */
             LeafNodeBuilderCustomizableContext addBeanNode();
+
+            /** @since 2.0 */
+            NodeBuilderCustomizableContext inContainer(Class<?> containerClass, Integer typeArgumentIndex);
+
+            /** @since 2.0 */
+            ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+                Integer typeArgumentIndex);
         }
 
         interface NodeContextBuilder {
@@ -75,10 +111,15 @@
 
             ConstraintValidatorContext addConstraintViolation();
 
-            // @since 1.1
-
+            /** @since 1.1 */
             NodeBuilderCustomizableContext addPropertyNode(String name);
+
+            /** @since 1.1 */
             LeafNodeBuilderCustomizableContext addBeanNode();
+
+            /** @since 2.0 */
+            ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+                Integer typeArgumentIndex);
         }
 
         /** @since 1.1 */
@@ -90,6 +131,9 @@
         interface LeafNodeBuilderCustomizableContext {
             LeafNodeContextBuilder inIterable();
             ConstraintValidatorContext addConstraintViolation();
+
+            /** @since 2.0 */
+            LeafNodeBuilderCustomizableContext inContainer(Class<?> containerClass, Integer typeArgumentIndex);
         }
 
         /** @since 1.1 */
@@ -98,6 +142,35 @@
             LeafNodeBuilderDefinedContext atIndex(Integer index);
             ConstraintValidatorContext addConstraintViolation();
         }
+
+        /** @since 2.0 */
+        interface ContainerElementNodeBuilderDefinedContext {
+            NodeBuilderCustomizableContext addPropertyNode(String name);
+            LeafNodeBuilderCustomizableContext addBeanNode();
+            ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+                Integer typeArgumentIndex);
+            ConstraintValidatorContext addConstraintViolation();
+        }
+
+        /** @since 2.0 */
+        interface ContainerElementNodeBuilderCustomizableContext {
+            ContainerElementNodeContextBuilder inIterable();
+            NodeBuilderCustomizableContext addPropertyNode(String name);
+            LeafNodeBuilderCustomizableContext addBeanNode();
+            ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+                Integer typeArgumentIndex);
+            ConstraintValidatorContext addConstraintViolation();
+        }
+
+        /** @since 2.0 */
+        interface ContainerElementNodeContextBuilder {
+            ContainerElementNodeBuilderDefinedContext atKey(Object key);
+            ContainerElementNodeBuilderDefinedContext atIndex(Integer index);
+            NodeBuilderCustomizableContext addPropertyNode(String name);
+            LeafNodeBuilderCustomizableContext addBeanNode();
+            ContainerElementNodeBuilderCustomizableContext addContainerElementNode(String name, Class<?> containerType,
+                Integer typeArgumentIndex);
+            ConstraintValidatorContext addConstraintViolation();
+        }
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorFactory.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorFactory.java
index 48a4c02..29e839d 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorFactory.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintValidatorFactory.java
@@ -26,4 +26,3 @@
     /** @since 1.1 */
     void releaseInstance(ConstraintValidator<?, ?> instance);
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolation.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolation.java
index 4105a19..d356e46 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolation.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolation.java
@@ -45,4 +45,3 @@
     Object getExecutableReturnValue();
     <U> U unwrap(Class<U> type);
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolationException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolationException.java
index 1588980..c2741a8 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolationException.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ConstraintViolationException.java
@@ -22,7 +22,9 @@
 /**
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("serial")
 public class ConstraintViolationException extends ValidationException {
+
     private final Set<ConstraintViolation<?>> constraintViolations;
 
     public ConstraintViolationException(String message,
@@ -39,4 +41,3 @@
         return constraintViolations;
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ElementKind.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ElementKind.java
index ea21c9b..a1241fd 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ElementKind.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ElementKind.java
@@ -18,5 +18,7 @@
 
 /** @since 1.1 */
 public enum ElementKind {
-	BEAN, PROPERTY, METHOD, CONSTRUCTOR, PARAMETER, CROSS_PARAMETER, RETURN_VALUE
+    BEAN, PROPERTY, METHOD, CONSTRUCTOR, PARAMETER, CROSS_PARAMETER, RETURN_VALUE,
+    /** @since 2.0 */
+    CONTAINER_ELEMENT;
 }
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupDefinitionException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupDefinitionException.java
index 0f2553d..a0c5f93 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupDefinitionException.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupDefinitionException.java
@@ -19,7 +19,9 @@
 /**
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("serial")
 public class GroupDefinitionException extends ValidationException {
+
     public GroupDefinitionException(String message) {
         super(message);
     }
@@ -36,4 +38,3 @@
         super(cause);
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupSequence.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupSequence.java
index 3b8f06b..1c82a8a 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupSequence.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/GroupSequence.java
@@ -22,12 +22,14 @@
 import static java.lang.annotation.ElementType.TYPE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
+import java.lang.annotation.Documented;
+
 /**
  * @version $Rev$ $Date$
  */
 @Target({ TYPE })
 @Retention(RUNTIME)
+@Documented
 public @interface GroupSequence {
     Class<?>[] value();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/MessageInterpolator.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/MessageInterpolator.java
index d4a6d33..2ad2b32 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/MessageInterpolator.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/MessageInterpolator.java
@@ -36,4 +36,3 @@
         <T> T unwrap(Class<T> type);
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/NoProviderFoundException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/NoProviderFoundException.java
new file mode 100644
index 0000000..ffac061
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/NoProviderFoundException.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation;
+
+/**
+ * @since 2.0
+ */
+@SuppressWarnings("serial")
+public class NoProviderFoundException extends ValidationException {
+
+    public NoProviderFoundException(String message) {
+        super(message);
+    }
+
+    public NoProviderFoundException() {
+        super();
+    }
+
+    public NoProviderFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public NoProviderFoundException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/OverridesAttribute.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/OverridesAttribute.java
index 9fd5f56..35a6d06 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/OverridesAttribute.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/OverridesAttribute.java
@@ -18,6 +18,7 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -29,10 +30,12 @@
  */
 @Retention(RUNTIME)
 @Target({ METHOD })
+@Documented
+@Repeatable(OverridesAttribute.List.class)
 public @interface OverridesAttribute {
     Class<? extends Annotation> constraint();
 
-    String name();
+    String name() default "";
 
     int constraintIndex() default -1;
 
@@ -43,4 +46,3 @@
         OverridesAttribute[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Path.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Path.java
index 6c2b55a..adce7db 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Path.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Path.java
@@ -23,6 +23,10 @@
  */
 public interface Path extends Iterable<Path.Node> {
 
+    /** @since 2.0 */
+    @Override
+    String toString();
+
     interface Node {
         String getName();
 
@@ -32,37 +36,65 @@
 
         Object getKey();
 
-        // @since 1.1
-
+        /** @since 1.1 */
         ElementKind getKind();
 
+        /** @since 1.1 */
         <T extends Node> T as(Class<T> nodeType);
+
+        /** @since 2.0 */
+        @Override
+        String toString();
     }
 
-    // @since 1.1
-
+    /** @since 1.1 */
     interface MethodNode extends Node {
         List<Class<?>> getParameterTypes();
     }
 
+    /** @since 1.1 */
     interface ConstructorNode extends Node {
         List<Class<?>> getParameterTypes();
     }
 
+    /** @since 1.1 */
     interface ReturnValueNode extends Node {
     }
 
+    /** @since 1.1 */
     interface ParameterNode extends Node {
         int getParameterIndex();
     }
 
+    /** @since 1.1 */
     interface CrossParameterNode extends Node {
     }
 
+    /** @since 1.1 */
     interface BeanNode extends Node {
+
+        /** @since 2.0 */
+        Class<?> getContainerClass();
+
+        /** @since 2.0 */
+        Integer getTypeArgumentIndex();
     }
 
+    /** @since 1.1 */
     interface PropertyNode extends Node {
+
+        /** @since 2.0 */
+        Class<?> getContainerClass();
+
+        /** @since 2.0 */
+        Integer getTypeArgumentIndex();
+    }
+    
+    /** @since 2.0 */
+    interface ContainerElementNode extends Node {
+
+        Class<?> getContainerClass();
+
+        Integer getTypeArgumentIndex();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Payload.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Payload.java
index 1917db4..7846500 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Payload.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Payload.java
@@ -26,4 +26,3 @@
  */
 public interface Payload {
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ReportAsSingleViolation.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ReportAsSingleViolation.java
index b8d407a..e357676 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ReportAsSingleViolation.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ReportAsSingleViolation.java
@@ -22,11 +22,13 @@
 import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
+import java.lang.annotation.Documented;
+
 /**
  * @version $Rev$ $Date$
  */
 @Target({ ANNOTATION_TYPE })
 @Retention(RUNTIME)
+@Documented
 public @interface ReportAsSingleViolation {
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/TraversableResolver.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/TraversableResolver.java
index 7e6beb5..42ead4b 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/TraversableResolver.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/TraversableResolver.java
@@ -34,4 +34,3 @@
         Path pathToTraversableObject,
         ElementType elementType);
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/UnexpectedTypeException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/UnexpectedTypeException.java
index 6c97ac5..04a7b80 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/UnexpectedTypeException.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/UnexpectedTypeException.java
@@ -21,7 +21,9 @@
  * 
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("serial")
 public class UnexpectedTypeException extends ConstraintDeclarationException {
+
     public UnexpectedTypeException(String message) {
         super(message);
     }
@@ -38,4 +40,3 @@
         super(cause);
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Valid.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Valid.java
index 1fa9f92..4100c7c 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Valid.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Valid.java
@@ -23,13 +23,13 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 public @interface Valid {
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java
index 7fde8b8..a73bea6 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validation.java
@@ -47,7 +47,7 @@
 
     public static <T extends Configuration<T>, U extends ValidationProvider<T>>
             ProviderSpecificBootstrap<T> byProvider(Class<U> providerType) {
-        return new ProviderSpecificBootstrapImpl<T, U>(providerType);
+        return new ProviderSpecificBootstrapImpl<>(providerType);
     }
 
     /*
@@ -87,15 +87,17 @@
          * @see javax.validation.bootstrap.ProviderSpecificBootstrap#configure()
          */
         public T configure() {
-            if (providerClass == null)
+            if (providerClass == null) {
                 throw new ValidationException("No resolver provided");
+            }
 
             // create a default resolver if not supplied by providerResolver()
             GenericBootstrapImpl impl = new GenericBootstrapImpl();
-            if ( vpResolver == null )
+            if ( vpResolver == null ) {
                 vpResolver = impl.getDefaultValidationProviderResolver();
-            else
+            } else {
                 impl.providerResolver(vpResolver);
+            }
 
             // check each provider discovered by the resolver
             for (ValidationProvider<?> vProvider : vpResolver.getValidationProviders()) {
@@ -146,8 +148,9 @@
          * @see javax.validation.spi.BootstrapState#getDefaultValidationProviderResolver()
          */
         public ValidationProviderResolver getDefaultValidationProviderResolver() {
-            if (vpDefaultResolver == null)
+            if (vpDefaultResolver == null) {
                 vpDefaultResolver = new DefaultValidationProviderResolver();
+            }
             return vpDefaultResolver;
         }
 
@@ -159,8 +162,9 @@
         public Configuration<?> configure() {
             ValidationProviderResolver resolv = vpResolver;
             try {
-                if (resolv == null)
+                if (resolv == null) {
                     resolv = getDefaultValidationProviderResolver();
+                }
                 return resolv.getValidationProviders().get(0).createGenericConfiguration(this);
             } catch (Exception e) {
                 throw new ValidationException("Could not create Configuration.", e);
@@ -175,8 +179,7 @@
      */
     private static class DefaultValidationProviderResolver implements ValidationProviderResolver {
         // cache of providers per class loader
-        private volatile WeakHashMap<ClassLoader, List<ValidationProvider<?>>> providerCache =
-            new WeakHashMap<ClassLoader, List<ValidationProvider<?>>>();
+        private volatile WeakHashMap<ClassLoader, List<ValidationProvider<?>>> providerCache = new WeakHashMap<>();
 
         /*
          * (non-Javadoc)
@@ -188,14 +191,15 @@
 
             // get our class loader
             ClassLoader cl = PrivClassLoader.get(null);
-            if (cl == null)
+            if (cl == null) {
                 cl = PrivClassLoader.get(DefaultValidationProviderResolver.class);
+            }
 
             // use any previously cached providers
             providers = providerCache.get(cl);
             if (providers == null) {
                 // need to discover and load them for this class loader
-                providers = new ArrayList<ValidationProvider<?>>();
+                providers = new ArrayList<>();
                 try {
                     List<Object> serviceProviders = ProviderLocator.getServices(ValidationProvider.class.getName(), this.getClass(), cl);
                     for (Object provider : serviceProviders) {
@@ -227,10 +231,10 @@
 
             public static ClassLoader get(Class<?> c) {
                 final PrivClassLoader action = new PrivClassLoader(c);
-                if (System.getSecurityManager() != null)
-                    return AccessController.doPrivileged(action);
-                else
+                if (System.getSecurityManager() == null) {
                     return action.run();
+                }
+                return AccessController.doPrivileged(action);
             }
 
             private PrivClassLoader(Class<?> c) {
@@ -238,12 +242,11 @@
             }
 
             public ClassLoader run() {
-                if (c != null)
-                    return c.getClassLoader();
-                else
+                if (c == null) {
                     return Thread.currentThread().getContextClassLoader();
+                }
+                return c.getClassLoader();
             }
         }
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationException.java
index d123e7a..ec6f71f 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationException.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationException.java
@@ -19,7 +19,9 @@
 /**
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("serial")
 public class ValidationException extends RuntimeException {
+
     public ValidationException(String message) {
         super(message);
     }
@@ -36,4 +38,3 @@
         super(cause);
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationProviderResolver.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationProviderResolver.java
index 618f729..794b482 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationProviderResolver.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidationProviderResolver.java
@@ -25,4 +25,3 @@
 public interface ValidationProviderResolver {
     List<ValidationProvider<?>> getValidationProviders();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validator.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validator.java
index bff321c..56fab4f 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validator.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/Validator.java
@@ -42,4 +42,3 @@
     /** @since 1.1 */
     ExecutableValidator forExecutables();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorContext.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorContext.java
index ead288e..3ffc2fd 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorContext.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorContext.java
@@ -16,6 +16,8 @@
  */
 package javax.validation;
 
+import javax.validation.valueextraction.ValueExtractor;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -30,5 +32,10 @@
 
     /** @since 1.1 */
     ValidatorContext parameterNameProvider(ParameterNameProvider parameterNameProvider);
-}
 
+    /** @since 2.0 */
+    ValidatorContext clockProvider(ClockProvider clockProvider);
+
+    /** @since 2.0 */
+    ValidatorContext addValueExtractor(ValueExtractor<?> extractor);
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorFactory.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorFactory.java
index fb02a46..7674f14 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorFactory.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/ValidatorFactory.java
@@ -19,7 +19,7 @@
 /**
  * @version $Rev$ $Date$
  */
-public interface ValidatorFactory {
+public interface ValidatorFactory extends AutoCloseable {
     Validator getValidator();
 
     ValidatorContext usingContext();
@@ -35,6 +35,10 @@
     /** @since 1.1 */
     ParameterNameProvider getParameterNameProvider();
 
+    /** @since 1.1 */
+    @Override
     void close();
-}
 
+    /** @since 2.0 */
+    ClockProvider getClockProvider();
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/GenericBootstrap.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/GenericBootstrap.java
index 07eaa58..09e35e2 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/GenericBootstrap.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/GenericBootstrap.java
@@ -27,4 +27,3 @@
 
     Configuration<?> configure();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/ProviderSpecificBootstrap.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/ProviderSpecificBootstrap.java
index eb87882..4b32922 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/ProviderSpecificBootstrap.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/bootstrap/ProviderSpecificBootstrap.java
@@ -25,4 +25,3 @@
 
     T configure();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertFalse.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertFalse.java
index e01d69b..db9cc38 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertFalse.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertFalse.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -35,10 +37,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(AssertFalse.List.class)
 public @interface AssertFalse {
     String message() default "{javax.validation.constraints.AssertFalse.message}";
 
@@ -46,11 +49,10 @@
 
     Class<? extends Payload>[] payload() default {};
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         AssertFalse[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertTrue.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertTrue.java
index b880d05..08dc1bd 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertTrue.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/AssertTrue.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -35,10 +37,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(AssertTrue.List.class)
 public @interface AssertTrue {
     String message() default "{javax.validation.constraints.AssertTrue.message}";
 
@@ -46,11 +49,10 @@
 
     Class<? extends Payload>[] payload() default {};
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         AssertTrue[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMax.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMax.java
index 6ebc01b..ce59872 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMax.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMax.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -40,10 +42,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(DecimalMax.List.class)
 public @interface DecimalMax {
     String message() default "{javax.validation.constraints.DecimalMax.message}";
 
@@ -56,11 +59,10 @@
     /** @since 1.1 */
     boolean inclusive() default true;
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         DecimalMax[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMin.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMin.java
index a59ed2f..4c5c017 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMin.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/DecimalMin.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -40,10 +42,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(DecimalMin.List.class)
 public @interface DecimalMin {
     String message() default "{javax.validation.constraints.DecimalMin.message}";
 
@@ -56,11 +59,10 @@
     /** @since 1.1 */
     boolean inclusive() default true;
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         DecimalMin[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Digits.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Digits.java
index ef90287..80a0311 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Digits.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Digits.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -46,10 +48,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Digits.List.class)
 public @interface Digits {
     String message() default "{javax.validation.constraints.Digits.message}";
 
@@ -67,11 +70,10 @@
      */
     int fraction();
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Digits[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Email.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Email.java
new file mode 100644
index 0000000..0912649
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Email.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(Email.List.class)
+public @interface Email {
+    String message() default "{javax.validation.constraints.Email.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    String regexp() default ".*";
+
+    Pattern.Flag[] flags() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        Email[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Future.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Future.java
index c25ba6d..1c6c0f1 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Future.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Future.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,20 +28,44 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
+ * <p>
  * Verify that the annotated value of the annotated element is in the future or {@code null}.
- * Supported types are {@link java.util.Calendar} and {@link java.util.Date}
+ * </p>
+ * <p>
+ * Supports:
+ * <ul>
+ * <li>{@code java.util.Date}</li>
+ * <li>{@code java.util.Calendar}</li>
+ * <li>{@code java.time.Instant}</li>
+ * <li>{@code java.time.LocalDate}</li>
+ * <li>{@code java.time.LocalDateTime}</li>
+ * <li>{@code java.time.LocalTime}</li>
+ * <li>{@code java.time.MonthDay}</li>
+ * <li>{@code java.time.OffsetDateTime}</li>
+ * <li>{@code java.time.OffsetTime}</li>
+ * <li>{@code java.time.Year}</li>
+ * <li>{@code java.time.YearMonth}</li>
+ * <li>{@code java.time.ZonedDateTime}</li>
+ * <li>{@code java.time.chrono.HijrahDate}</li>
+ * <li>{@code java.time.chrono.JapaneseDate}</li>
+ * <li>{@code java.time.chrono.MinguoDate}</li>
+ * <li>{@code java.time.chrono.ThaiBuddhistDate}</li>
+ * </ul>
+ * </p>
  *
  * Other types might be supported in a non-portable manner.
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Future.List.class)
 public @interface Future {
     String message() default "{javax.validation.constraints.Future.message}";
 
@@ -48,11 +73,10 @@
 
     Class<? extends Payload>[] payload() default {};
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Future[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/FutureOrPresent.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/FutureOrPresent.java
new file mode 100644
index 0000000..50dbf65
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/FutureOrPresent.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * <p>
+ * Verify that the value of the annotated element is in the future, present or {@code null}.
+ * </p>
+ * <p>
+ * Supports:
+ * <ul>
+ * <li>{@code java.util.Date}</li>
+ * <li>{@code java.util.Calendar}</li>
+ * <li>{@code java.time.Instant}</li>
+ * <li>{@code java.time.LocalDate}</li>
+ * <li>{@code java.time.LocalDateTime}</li>
+ * <li>{@code java.time.LocalTime}</li>
+ * <li>{@code java.time.MonthDay}</li>
+ * <li>{@code java.time.OffsetDateTime}</li>
+ * <li>{@code java.time.OffsetTime}</li>
+ * <li>{@code java.time.Year}</li>
+ * <li>{@code java.time.YearMonth}</li>
+ * <li>{@code java.time.ZonedDateTime}</li>
+ * <li>{@code java.time.chrono.HijrahDate}</li>
+ * <li>{@code java.time.chrono.JapaneseDate}</li>
+ * <li>{@code java.time.chrono.MinguoDate}</li>
+ * <li>{@code java.time.chrono.ThaiBuddhistDate}</li>
+ * </ul>
+ * </p>
+ *
+ * Other types might be supported in a non-portable manner.
+ *
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(FutureOrPresent.List.class)
+public @interface FutureOrPresent {
+    String message() default "{javax.validation.constraints.FutureOrPresent.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        FutureOrPresent[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Max.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Max.java
index f94688f..f8afcaf 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Max.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Max.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -40,10 +42,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Max.List.class)
 public @interface Max {
     String message() default "{javax.validation.constraints.Max.message}";
 
@@ -53,11 +56,10 @@
 
     long value();
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Max[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Min.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Min.java
index c933b51..262a06b 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Min.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Min.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -40,10 +42,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Min.List.class)
 public @interface Min {
     String message() default "{javax.validation.constraints.Min.message}";
 
@@ -53,11 +56,10 @@
 
     long value();
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Min[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Negative.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Negative.java
new file mode 100644
index 0000000..57337b7
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Negative.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(Negative.List.class)
+public @interface Negative {
+    String message() default "{javax.validation.constraints.Negative.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        Negative[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NegativeOrZero.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NegativeOrZero.java
new file mode 100644
index 0000000..3489780
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NegativeOrZero.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(NegativeOrZero.List.class)
+public @interface NegativeOrZero {
+    String message() default "{javax.validation.constraints.NegativeOrZero.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        NegativeOrZero[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotBlank.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotBlank.java
new file mode 100644
index 0000000..1a6f15c
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotBlank.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(NotBlank.List.class)
+public @interface NotBlank {
+    String message() default "{javax.validation.constraints.NotBlank.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        NotBlank[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotEmpty.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotEmpty.java
new file mode 100644
index 0000000..ea1c4ac
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotEmpty.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(NotEmpty.List.class)
+public @interface NotEmpty {
+    String message() default "{javax.validation.constraints.NotEmpty.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        NotEmpty[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotNull.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotNull.java
index 5e9e101..71b45cf 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotNull.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/NotNull.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -34,10 +36,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(NotNull.List.class)
 public @interface NotNull {
     String message() default "{javax.validation.constraints.NotNull.message}";
 
@@ -45,11 +48,10 @@
 
     Class<? extends Payload>[] payload() default {};
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         NotNull[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Null.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Null.java
index f6c792b..0e4b32e 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Null.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Null.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -34,10 +36,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Null.List.class)
 public @interface Null {
     String message() default "{javax.validation.constraints.Null.message}";
 
@@ -45,11 +48,10 @@
 
     Class<? extends Payload>[] payload() default {};
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Null[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Past.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Past.java
index 85824f3..2444082 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Past.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Past.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,20 +28,44 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
+ * <p>
  * Verify that the annotated value of the annotated element is in the past or {@code null}.
- * Supported types are {@link java.util.Calendar} and {@link java.util.Date}
+ * </p>
+ * <p>
+ * Supports:
+ * <ul>
+ * <li>{@code java.util.Date}</li>
+ * <li>{@code java.util.Calendar}</li>
+ * <li>{@code java.time.Instant}</li>
+ * <li>{@code java.time.LocalDate}</li>
+ * <li>{@code java.time.LocalDateTime}</li>
+ * <li>{@code java.time.LocalTime}</li>
+ * <li>{@code java.time.MonthDay}</li>
+ * <li>{@code java.time.OffsetDateTime}</li>
+ * <li>{@code java.time.OffsetTime}</li>
+ * <li>{@code java.time.Year}</li>
+ * <li>{@code java.time.YearMonth}</li>
+ * <li>{@code java.time.ZonedDateTime}</li>
+ * <li>{@code java.time.chrono.HijrahDate}</li>
+ * <li>{@code java.time.chrono.JapaneseDate}</li>
+ * <li>{@code java.time.chrono.MinguoDate}</li>
+ * <li>{@code java.time.chrono.ThaiBuddhistDate}</li>
+ * </ul>
+ * </p>
  *
  * Other types might be supported in a non-portable manner.
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Past.List.class)
 public @interface Past {
     String message() default "{javax.validation.constraints.Past.message}";
 
@@ -48,11 +73,10 @@
 
     Class<? extends Payload>[] payload() default {};
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Past[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/PastOrPresent.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/PastOrPresent.java
new file mode 100644
index 0000000..501e2f9
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/PastOrPresent.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * <p>
+ * Verify that the value of the annotated element is in the past, present or {@code null}.
+ * </p>
+ * <p>
+ * Supports:
+ * <ul>
+ * <li>{@code java.util.Date}</li>
+ * <li>{@code java.util.Calendar}</li>
+ * <li>{@code java.time.Instant}</li>
+ * <li>{@code java.time.LocalDate}</li>
+ * <li>{@code java.time.LocalDateTime}</li>
+ * <li>{@code java.time.LocalTime}</li>
+ * <li>{@code java.time.MonthDay}</li>
+ * <li>{@code java.time.OffsetDateTime}</li>
+ * <li>{@code java.time.OffsetTime}</li>
+ * <li>{@code java.time.Year}</li>
+ * <li>{@code java.time.YearMonth}</li>
+ * <li>{@code java.time.ZonedDateTime}</li>
+ * <li>{@code java.time.chrono.HijrahDate}</li>
+ * <li>{@code java.time.chrono.JapaneseDate}</li>
+ * <li>{@code java.time.chrono.MinguoDate}</li>
+ * <li>{@code java.time.chrono.ThaiBuddhistDate}</li>
+ * </ul>
+ * </p>
+ *
+ * Other types might be supported in a non-portable manner.
+ *
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(PastOrPresent.List.class)
+public @interface PastOrPresent {
+    String message() default "{javax.validation.constraints.PastOrPresent.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        PastOrPresent[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Pattern.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Pattern.java
index 419e871..68da77b 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Pattern.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Pattern.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -35,10 +37,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Pattern.List.class)
 public @interface Pattern {
     
     String regexp();
@@ -78,11 +81,10 @@
         }
     }
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Pattern[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Positive.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Positive.java
new file mode 100644
index 0000000..e75a0f5
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Positive.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(Positive.List.class)
+public @interface Positive {
+    String message() default "{javax.validation.constraints.Positive.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        Positive[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/PositiveOrZero.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/PositiveOrZero.java
new file mode 100644
index 0000000..b52616f
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/PositiveOrZero.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.constraints;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @since 2.0
+ */
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = {})
+@Repeatable(PositiveOrZero.List.class)
+public @interface PositiveOrZero {
+    String message() default "{javax.validation.constraints.PositiveOrZero.message}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+    @Retention(RUNTIME)
+    @Documented
+    @interface List {
+        PositiveOrZero[] value();
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Size.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Size.java
index 3a0d00d..4a22fd7 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Size.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/constraints/Size.java
@@ -19,6 +19,7 @@
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -27,6 +28,7 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /**
@@ -36,10 +38,11 @@
  *
  * @version $Rev$ $Date$
  */
-@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
 @Constraint(validatedBy = {})
+@Repeatable(Size.List.class)
 public @interface Size {
     String message() default "{javax.validation.constraints.Size.message}";
 
@@ -51,11 +54,10 @@
 
     int max() default Integer.MAX_VALUE;
 
-    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
         Size[] value();
     }
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableType.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableType.java
index 119b14a..a6d295e 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableType.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableType.java
@@ -20,4 +20,3 @@
 public enum ExecutableType {
     IMPLICIT, NONE, CONSTRUCTORS, NON_GETTER_METHODS, GETTER_METHODS, ALL
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableValidator.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableValidator.java
index 9230f6c..5b022bd 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableValidator.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ExecutableValidator.java
@@ -36,4 +36,3 @@
                                                                    T createdObject,
                                                                    Class<?>... groups);
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ValidateOnExecution.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ValidateOnExecution.java
index ac7c6c6..d6567d8 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ValidateOnExecution.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/executable/ValidateOnExecution.java
@@ -25,10 +25,12 @@
 import static java.lang.annotation.ElementType.TYPE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
+import java.lang.annotation.Documented;
+
 /** @since 1.1 */
 @Target({ CONSTRUCTOR, METHOD, TYPE, PACKAGE })
 @Retention(RUNTIME)
+@Documented
 public @interface ValidateOnExecution {
     ExecutableType[] type() default { ExecutableType.IMPLICIT };
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/ConvertGroup.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/ConvertGroup.java
index 2979f01..858aa93 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/ConvertGroup.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/ConvertGroup.java
@@ -17,6 +17,7 @@
 package javax.validation.groups;
 
 import java.lang.annotation.Documented;
+import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 
@@ -24,18 +25,19 @@
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.TYPE_USE;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 /** @since 1.1 */
-@Target({ TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER })
+@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 @Documented
+@Repeatable(ConvertGroup.List.class)
 public @interface ConvertGroup {
-    Class<?> from();
+    Class<?> from() default Default.class;
     Class<?> to();
 
-    @Target({ TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER })
+    @Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
     @Retention(RUNTIME)
     @Documented
     @interface List {
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/Default.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/Default.java
index 9010e40..2e60842 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/Default.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/groups/Default.java
@@ -23,4 +23,3 @@
  */
 public interface Default {
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/BeanDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/BeanDescriptor.java
index 6f6997b..9e5f89c 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/BeanDescriptor.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/BeanDescriptor.java
@@ -33,4 +33,3 @@
     ConstructorDescriptor getConstraintsForConstructor(Class<?>... parameterTypes);
     Set<ConstructorDescriptor> getConstrainedConstructors();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ConstraintDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ConstraintDescriptor.java
index 65eaa2f..a1a2878 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ConstraintDescriptor.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ConstraintDescriptor.java
@@ -43,9 +43,15 @@
 
     boolean isReportAsSingleViolation();
 
-    // @since 1.1
-
+    /** @since 1.1 */
     String getMessageTemplate();
-    ConstraintTarget getValidationAppliesTo();
-}
 
+    /** @since 1.1 */
+    ConstraintTarget getValidationAppliesTo();
+
+    /** @since 2.0 */
+    ValidateUnwrappedValue getValueUnwrapping();
+
+    /** @since 2.0 */
+    <U> U unwrap(Class<U> type);
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ContainerDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ContainerDescriptor.java
new file mode 100644
index 0000000..db04098
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ContainerDescriptor.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.metadata;
+
+import java.util.Set;
+
+/**
+ * @since 2.0
+ */
+public interface ContainerDescriptor {
+
+    Set<ContainerElementTypeDescriptor> getConstrainedContainerElementTypes();
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ContainerElementTypeDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ContainerElementTypeDescriptor.java
new file mode 100644
index 0000000..6242157
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ContainerElementTypeDescriptor.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.metadata;
+
+/**
+ * @since 2.0
+ */
+public interface ContainerElementTypeDescriptor extends ElementDescriptor, CascadableDescriptor, ContainerDescriptor {
+
+    Class<?> getContainerClass();
+
+    Integer getTypeArgumentIndex();
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ExecutableDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ExecutableDescriptor.java
index 1543fb9..fe1f990 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ExecutableDescriptor.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ExecutableDescriptor.java
@@ -27,4 +27,3 @@
     boolean hasConstrainedParameters();
     boolean hasConstrainedReturnValue();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ParameterDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ParameterDescriptor.java
index ddf26b7..66fb1ff 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ParameterDescriptor.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ParameterDescriptor.java
@@ -17,7 +17,7 @@
 package javax.validation.metadata;
 
 /** @since 1.1 */
-public interface ParameterDescriptor extends ElementDescriptor, CascadableDescriptor {
+public interface ParameterDescriptor extends ElementDescriptor, CascadableDescriptor, ContainerDescriptor {
     int getIndex();
     String getName();
 }
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/PropertyDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/PropertyDescriptor.java
index f30f31b..e090539 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/PropertyDescriptor.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/PropertyDescriptor.java
@@ -19,7 +19,6 @@
 /**
  * @version $Rev$ $Date$
  */
-public interface PropertyDescriptor extends ElementDescriptor, CascadableDescriptor {
+public interface PropertyDescriptor extends ElementDescriptor, CascadableDescriptor, ContainerDescriptor {
     String getPropertyName();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ReturnValueDescriptor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ReturnValueDescriptor.java
index d973390..4cdd849 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ReturnValueDescriptor.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ReturnValueDescriptor.java
@@ -17,5 +17,5 @@
 package javax.validation.metadata;
 
 /** @since 1.1 */
-public interface ReturnValueDescriptor extends ElementDescriptor, CascadableDescriptor {
+public interface ReturnValueDescriptor extends ElementDescriptor, CascadableDescriptor, ContainerDescriptor {
 }
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/Scope.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/Scope.java
index e8e3a83..3c548f5 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/Scope.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/Scope.java
@@ -23,4 +23,3 @@
 	LOCAL_ELEMENT,
 	HIERARCHY
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ValidateUnwrappedValue.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ValidateUnwrappedValue.java
new file mode 100644
index 0000000..a981b1b
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/metadata/ValidateUnwrappedValue.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.metadata;
+
+/**
+ * @since 2.0
+ */
+public enum ValidateUnwrappedValue {
+    DEFAULT, UNWRAP, SKIP;
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/BootstrapState.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/BootstrapState.java
index 659234f..2d4cf73 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/BootstrapState.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/BootstrapState.java
@@ -26,4 +26,3 @@
 
     ValidationProviderResolver getDefaultValidationProviderResolver();
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ConfigurationState.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ConfigurationState.java
index cacf85e..e4ce98d 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ConfigurationState.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ConfigurationState.java
@@ -16,10 +16,13 @@
  */
 package javax.validation.spi;
 
+import javax.validation.ClockProvider;
 import javax.validation.ConstraintValidatorFactory;
 import javax.validation.MessageInterpolator;
 import javax.validation.ParameterNameProvider;
 import javax.validation.TraversableResolver;
+import javax.validation.valueextraction.ValueExtractor;
+
 import java.io.InputStream;
 import java.util.Map;
 import java.util.Set;
@@ -43,5 +46,10 @@
 
     /** @since 1.1 */
     ParameterNameProvider getParameterNameProvider();
-}
 
+    /** @since 2.0 */
+    Set<ValueExtractor<?>> getValueExtractors();
+
+    /** @since 2.0 */
+    ClockProvider getClockProvider();
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ValidationProvider.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ValidationProvider.java
index 3ca2795..3de71ab 100644
--- a/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ValidationProvider.java
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/spi/ValidationProvider.java
@@ -30,4 +30,3 @@
 
     ValidatorFactory buildValidatorFactory(ConfigurationState configurationState);
 }
-
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ExtractedValue.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ExtractedValue.java
new file mode 100644
index 0000000..f5ad305
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ExtractedValue.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.valueextraction;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE_USE)
+@Documented
+public @interface ExtractedValue {
+
+    Class<?> type() default void.class;
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/UnwrapByDefault.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/UnwrapByDefault.java
new file mode 100644
index 0000000..3a1417d
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/UnwrapByDefault.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.valueextraction;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Documented
+public @interface UnwrapByDefault {
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/Unwrapping.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/Unwrapping.java
new file mode 100644
index 0000000..351ab5d
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/Unwrapping.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.valueextraction;
+
+import javax.validation.Payload;
+
+/**
+ * @since 2.0
+ */
+public interface Unwrapping {
+
+    interface Unwrap extends Payload {
+    }
+
+    interface Skip extends Payload {
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractor.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractor.java
new file mode 100644
index 0000000..96ba783
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractor.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.valueextraction;
+
+/**
+ * @since 2.0
+ */
+public interface ValueExtractor<T> {
+    void extractValues(T originalValue, ValueReceiver receiver);
+
+    interface ValueReceiver {
+        void value(String nodeName, Object object);
+
+        void iterableValue(String nodeName, Object object);
+
+        void indexedValue(String nodeName, int i, Object object);
+
+        void keyedValue(String nodeName, Object key, Object object);
+    }
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractorDeclarationException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractorDeclarationException.java
new file mode 100644
index 0000000..51d015e
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractorDeclarationException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.valueextraction;
+
+import javax.validation.ValidationException;
+
+/**
+ * @since 2.0
+ */
+@SuppressWarnings("serial")
+public class ValueExtractorDeclarationException extends ValidationException {
+
+    public ValueExtractorDeclarationException() {
+        super();
+    }
+
+    public ValueExtractorDeclarationException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ValueExtractorDeclarationException(String message) {
+        super(message);
+    }
+
+    public ValueExtractorDeclarationException(Throwable cause) {
+        super(cause);
+    }
+
+}
diff --git a/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractorDefinitionException.java b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractorDefinitionException.java
new file mode 100644
index 0000000..ab5cb60
--- /dev/null
+++ b/geronimo-validation_2.0_spec/src/main/java/javax/validation/valueextraction/ValueExtractorDefinitionException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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 javax.validation.valueextraction;
+
+import javax.validation.ValidationException;
+
+/**
+ * @since 2.0
+ */
+@SuppressWarnings("serial")
+public class ValueExtractorDefinitionException extends ValidationException {
+
+    public ValueExtractorDefinitionException() {
+        super();
+    }
+
+    public ValueExtractorDefinitionException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ValueExtractorDefinitionException(String message) {
+        super(message);
+    }
+
+    public ValueExtractorDefinitionException(Throwable cause) {
+        super(cause);
+    }
+
+}