diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfo.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfo.java
index f67d1ab..6dfc84a 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfo.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidationInfo.java
@@ -30,10 +30,10 @@
     public String parameterNameProviderClass;
     public String version;
     public final Properties propertyTypes = new Properties();
-    public final List<String> constraintMappings = new ArrayList<String>();
+    public final List<String> constraintMappings = new ArrayList<>();
     public boolean executableValidationEnabled;
-    public final List<String> validatedTypes = new ArrayList<String>();
+    public final List<String> validatedTypes = new ArrayList<>();
     public String clockProviderClassName;
-    public Set<String> valueExtractorClassNames;
+    public List<String> valueExtractorClassNames;
 
 }
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidatorBuilder.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidatorBuilder.java
index 4999c05..0b4c40d 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidatorBuilder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ValidatorBuilder.java
@@ -52,8 +52,11 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
 public final class ValidatorBuilder {
@@ -78,6 +81,8 @@
             info.traversableResolverClass = config.getTraversableResolver();
             info.messageInterpolatorClass = config.getMessageInterpolator();
             info.parameterNameProviderClass = config.getParameterNameProvider();
+            info.valueExtractorClassNames = config.getValueExtractor();
+            info.clockProviderClassName = config.getClockProvider();
 
             final ExecutableValidationType executableValidation = config.getExecutableValidation();
             if (executableValidation != null) {
@@ -179,8 +184,9 @@
 
         final OpenEjbBootstrapConfig bootstrapConfig = new OpenEjbBootstrapConfig(
             providerClassName, info.constraintFactoryClass, info.messageInterpolatorClass, info.traversableResolverClass,
-            info.parameterNameProviderClass, new HashSet<>(info.constraintMappings), info.executableValidationEnabled,
-            types, props, info.clockProviderClassName, info.valueExtractorClassNames);
+            info.parameterNameProviderClass, new LinkedHashSet<>(info.constraintMappings), info.executableValidationEnabled,
+            types, props, info.clockProviderClassName,
+            info.valueExtractorClassNames == null ? null : new LinkedHashSet<>(info.valueExtractorClassNames));
         final OpenEjbConfig config = new OpenEjbConfig(bootstrapConfig, target);
 
         target.ignoreXmlConfiguration();
@@ -191,10 +197,10 @@
                 @SuppressWarnings("unchecked") final
                 Class<MessageInterpolator> clazz = (Class<MessageInterpolator>) classLoader.loadClass(messageInterpolatorClass);
                 target.messageInterpolator(newInstance(config, clazz));
+                logger.info("Using " + messageInterpolatorClass + " as message interpolator.");
             } catch (final Exception e) {
                 logger.warning("Unable to set " + messageInterpolatorClass + " as message interpolator.", e);
             }
-            logger.info("Using " + messageInterpolatorClass + " as message interpolator.");
         }
         final String traversableResolverClass = info.traversableResolverClass;
         if (traversableResolverClass != null) {
@@ -202,10 +208,10 @@
                 @SuppressWarnings("unchecked") final
                 Class<TraversableResolver> clazz = (Class<TraversableResolver>) classLoader.loadClass(traversableResolverClass);
                 target.traversableResolver(newInstance(config, clazz));
+                logger.info("Using " + traversableResolverClass + " as traversable resolver.");
             } catch (final Exception e) {
                 logger.warning("Unable to set " + traversableResolverClass + " as traversable resolver.", e);
             }
-            logger.info("Using " + traversableResolverClass + " as traversable resolver.");
         }
         final String constraintFactoryClass = info.constraintFactoryClass;
         if (constraintFactoryClass != null) {
@@ -233,10 +239,37 @@
             try {
                 final Class<ParameterNameProvider> clazz = (Class<ParameterNameProvider>) classLoader.loadClass(info.parameterNameProviderClass);
                 target.parameterNameProvider(newInstance(config, clazz));
+                logger.info("Using " + info.parameterNameProviderClass + " as parameter name provider.");
             } catch (final Exception e) {
                 logger.warning("Unable to set " + info.parameterNameProviderClass + " as parameter name provider.", e);
             }
-            logger.info("Using " + info.parameterNameProviderClass + " as parameter name provider.");
+        }
+        if (info.valueExtractorClassNames != null) {
+            try {
+                info.valueExtractorClassNames.stream()
+                     .map(it -> {
+                         try {
+                             return (ValueExtractor<?>) newInstance(config, classLoader.loadClass(it));
+                         } catch (final Exception e) {
+                             logger.warning("Unable to load " + it, e);
+                             return null;
+                         }
+                     })
+                     .filter(Objects::nonNull)
+                     .forEach(target::addValueExtractor);
+                logger.info("Using " + info.valueExtractorClassNames + " value extractors.");
+            } catch (final Exception e) {
+                logger.warning("Unable to set " + info.valueExtractorClassNames + " as parameter name provider.", e);
+            }
+        }
+        if (info.clockProviderClassName != null) {
+            try {
+                final Class<ClockProvider> clazz = (Class<ClockProvider>) classLoader.loadClass(info.clockProviderClassName);
+                target.clockProvider(newInstance(config, clazz));
+                logger.info("Using " + info.clockProviderClassName + " as clock provider.");
+            } catch (final Exception e) {
+                logger.warning("Unable to set " + info.clockProviderClassName + " as clock provider.", e);
+            }
         }
 
         return config;
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
index e8aad41..814ebf1 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
@@ -309,7 +309,10 @@
         final Source value = getSource(module.getAltDDs().get("validation.xml"));
         if (value != null) {
             try {
-                final ValidationConfigType validationConfigType = JaxbOpenejb.unmarshal(ValidationConfigType.class, value.get(), false);
+                final ValidationConfigType validationConfigType = JaxbOpenejb.unmarshal(
+                        ValidationConfigType.class, value.get(), false,
+                        "http://xmlns.jcp.org/xml/ns/validation/configuration",
+                        "http://jboss.org/xml/ns/javax/validation/configuration");
                 module.setValidationConfig(validationConfigType);
             } catch (final Exception e) {
                 logger.warning("can't read validation.xml to construct a validation factory, it will be ignored");
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java b/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
index 026cbaa..6562b67 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
@@ -17,6 +17,8 @@
 
 package org.apache.openejb.config.sys;
 
+import static java.util.Arrays.asList;
+
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.config.SystemProperty;
 import org.apache.openejb.jee.JAXBContextFactory;
@@ -36,8 +38,6 @@
 import javax.xml.bind.MarshalException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.ValidationEvent;
-import javax.xml.bind.ValidationEventHandler;
 import javax.xml.bind.ValidationException;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
@@ -54,6 +54,7 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -310,30 +311,31 @@
         return jaxbContext;
     }
 
-    public static <T> T unmarshal(final Class<T> type, final InputStream in, final boolean filter) throws ParserConfigurationException, SAXException, JAXBException {
+    public static <T> T unmarshal(final Class<T> type, final InputStream in, final boolean filter,
+                                  final String expectedNamespace, final String... aliasNamespaces)
+            throws ParserConfigurationException, SAXException, JAXBException {
         final InputSource inputSource = new InputSource(in);
 
         final SAXParser parser = Saxs.namespaceAwareFactory().newSAXParser();
 
         final JAXBContext ctx = getContext(type);
         final Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        unmarshaller.setEventHandler(new ValidationEventHandler() {
-            public boolean handleEvent(final ValidationEvent validationEvent) {
-                System.out.println(validationEvent);
-                return false;
-            }
-        });
+        unmarshaller.setEventHandler(validationEvent -> false);
 
         final SAXSource source;
         if (filter) {
             final NamespaceFilter xmlFilter = new NamespaceFilter(parser.getXMLReader());
             xmlFilter.setContentHandler(unmarshaller.getUnmarshallerHandler());
             source = new SAXSource(xmlFilter, inputSource);
+        } else if (expectedNamespace != null) {
+            final WhitelistFilter xmlFilter = new WhitelistFilter(parser.getXMLReader(), expectedNamespace, aliasNamespaces);
+            xmlFilter.setContentHandler(unmarshaller.getUnmarshallerHandler());
+            source = new SAXSource(xmlFilter, inputSource);
         } else {
             source = new SAXSource(inputSource);
         }
 
-        currentPublicId.set(new TreeSet<String>());
+        currentPublicId.set(new TreeSet<>());
         try {
             return unmarshaller.unmarshal(source, type).getValue();
         } finally {
@@ -341,11 +343,40 @@
         }
     }
 
+    public static <T> T unmarshal(final Class<T> type, final InputStream in, final boolean filter) throws ParserConfigurationException, SAXException, JAXBException {
+        return unmarshal(type, in, filter, null);
+    }
+
     @SuppressWarnings({"unchecked"})
     public static <T> T unmarshal(final Class<T> type, final InputStream in) throws ParserConfigurationException, SAXException, JAXBException {
         return unmarshal(type, in, true);
     }
 
+    public static class WhitelistFilter extends XMLFilterImpl {
+
+        private final Set<String> aliases;
+        private final String forcedNamespace;
+
+        public WhitelistFilter(final XMLReader xmlReader, final String forcedNamespace, final String[] aliases) {
+            super(xmlReader);
+            this.forcedNamespace = forcedNamespace;
+            this.aliases = new HashSet<>(asList(aliases));
+        }
+
+        public InputSource resolveEntity(final String publicId, final String systemId) throws SAXException, IOException {
+            final Set<String> publicIds = currentPublicId.get();
+            if (publicIds != null) {
+                publicIds.add(publicId);
+            }
+            return super.resolveEntity(publicId, systemId);
+        }
+
+        @Override
+        public void startElement(final String inputUri, final String localName, final String qname, final Attributes atts) throws SAXException {
+            super.startElement(aliases.contains(inputUri) ? forcedNamespace : inputUri, localName, qname, atts);
+        }
+    }
+
     public static class NamespaceFilter extends XMLFilterImpl {
 
         public NamespaceFilter(final XMLReader xmlReader) {
diff --git a/container/openejb-jee/src/main/java/org/apache/openejb/jee/bval/ValidationConfigType.java b/container/openejb-jee/src/main/java/org/apache/openejb/jee/bval/ValidationConfigType.java
index 417db50..8ace720 100644
--- a/container/openejb-jee/src/main/java/org/apache/openejb/jee/bval/ValidationConfigType.java
+++ b/container/openejb-jee/src/main/java/org/apache/openejb/jee/bval/ValidationConfigType.java
@@ -27,42 +27,46 @@
 
 
 /**
- * <p>Java class for validation-configType complex type.
- * 
- * <p>The following schema fragment specifies the expected content contained within this class.
- * 
+ * <p>Classe Java pour validation-configType complex type.
+ *
+ * <p>Le fragment de schéma suivant indique le contenu attendu figurant dans cette classe.
+ *
  * <pre>
- * &lt;complexType name="validation-configType">
- *   &lt;complexContent>
- *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       &lt;sequence>
- *         &lt;element name="default-provider" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="message-interpolator" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="traversable-resolver" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="constraint-validator-factory" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="parameter-name-provider" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *         &lt;element name="executable-validation" type="{http://jboss.org/xml/ns/javax/validation/configuration}executable-validationType" minOccurs="0"/>
- *         &lt;element name="constraint-mapping" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *         &lt;element name="property" type="{http://jboss.org/xml/ns/javax/validation/configuration}propertyType" maxOccurs="unbounded" minOccurs="0"/>
- *       &lt;/sequence>
- *       &lt;attribute name="version" type="{http://jboss.org/xml/ns/javax/validation/configuration}versionType" fixed="1.1" />
- *     &lt;/restriction>
- *   &lt;/complexContent>
- * &lt;/complexType>
+ * &lt;complexType name="validation-configType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="default-provider" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="message-interpolator" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="traversable-resolver" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="constraint-validator-factory" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="parameter-name-provider" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="clock-provider" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="value-extractor" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *         &lt;element name="executable-validation" type="{http://xmlns.jcp.org/xml/ns/validation/configuration}executable-validationType" minOccurs="0"/&gt;
+ *         &lt;element name="constraint-mapping" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *         &lt;element name="property" type="{http://xmlns.jcp.org/xml/ns/validation/configuration}propertyType" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="version" type="{http://xmlns.jcp.org/xml/ns/validation/configuration}versionType" fixed="2.0" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
  * </pre>
- * 
- * 
+ *
+ *
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "validation-configType", namespace = "http://jboss.org/xml/ns/javax/validation/configuration", propOrder = {
-    "defaultProvider",
-    "messageInterpolator",
-    "traversableResolver",
-    "constraintValidatorFactory",
-    "parameterNameProvider",
-    "executableValidation",
-    "constraintMapping",
-    "property"
+@XmlType(name = "validation-configType", namespace = "http://xmlns.jcp.org/xml/ns/validation/configuration", propOrder = {
+        "defaultProvider",
+        "messageInterpolator",
+        "traversableResolver",
+        "constraintValidatorFactory",
+        "parameterNameProvider",
+        "clockProvider",
+        "valueExtractor",
+        "executableValidation",
+        "constraintMapping",
+        "property"
 })
 public class ValidationConfigType {
 
@@ -81,6 +85,12 @@
     @XmlElement(name = "parameter-name-provider")
     @XmlJavaTypeAdapter(javax.xml.bind.annotation.adapters.CollapsedStringAdapter.class)
     protected String parameterNameProvider;
+    @XmlElement(name = "clock-provider")
+    @XmlJavaTypeAdapter(javax.xml.bind.annotation.adapters.CollapsedStringAdapter.class)
+    protected String clockProvider;
+    @XmlElement(name = "value-extractor")
+    @XmlJavaTypeAdapter(javax.xml.bind.annotation.adapters.CollapsedStringAdapter.class)
+    protected List<String> valueExtractor;
     @XmlElement(name = "executable-validation")
     protected ExecutableValidationType executableValidation;
     @XmlElement(name = "constraint-mapping")
@@ -91,147 +101,198 @@
     @XmlJavaTypeAdapter(javax.xml.bind.annotation.adapters.CollapsedStringAdapter.class)
     protected String version;
 
-    //X TODO add new fields from beanvalidation 2.0: clockProviderClassName and valueExtractorClassNames
-
     /**
-     * Gets the value of the defaultProvider property.
-     * 
+     * Obtient la valeur de la propriété defaultProvider.
+     *
      * @return
      *     possible object is
      *     {@link String }
-     *     
+     *
      */
     public String getDefaultProvider() {
         return defaultProvider;
     }
 
     /**
-     * Sets the value of the defaultProvider property.
-     * 
+     * Définit la valeur de la propriété defaultProvider.
+     *
      * @param value
      *     allowed object is
      *     {@link String }
-     *     
+     *
      */
     public void setDefaultProvider(String value) {
         this.defaultProvider = value;
     }
 
     /**
-     * Gets the value of the messageInterpolator property.
-     * 
+     * Obtient la valeur de la propriété messageInterpolator.
+     *
      * @return
      *     possible object is
      *     {@link String }
-     *     
+     *
      */
     public String getMessageInterpolator() {
         return messageInterpolator;
     }
 
     /**
-     * Sets the value of the messageInterpolator property.
-     * 
+     * Définit la valeur de la propriété messageInterpolator.
+     *
      * @param value
      *     allowed object is
      *     {@link String }
-     *     
+     *
      */
     public void setMessageInterpolator(String value) {
         this.messageInterpolator = value;
     }
 
     /**
-     * Gets the value of the traversableResolver property.
-     * 
+     * Obtient la valeur de la propriété traversableResolver.
+     *
      * @return
      *     possible object is
      *     {@link String }
-     *     
+     *
      */
     public String getTraversableResolver() {
         return traversableResolver;
     }
 
     /**
-     * Sets the value of the traversableResolver property.
-     * 
+     * Définit la valeur de la propriété traversableResolver.
+     *
      * @param value
      *     allowed object is
      *     {@link String }
-     *     
+     *
      */
     public void setTraversableResolver(String value) {
         this.traversableResolver = value;
     }
 
     /**
-     * Gets the value of the constraintValidatorFactory property.
-     * 
+     * Obtient la valeur de la propriété constraintValidatorFactory.
+     *
      * @return
      *     possible object is
      *     {@link String }
-     *     
+     *
      */
     public String getConstraintValidatorFactory() {
         return constraintValidatorFactory;
     }
 
     /**
-     * Sets the value of the constraintValidatorFactory property.
-     * 
+     * Définit la valeur de la propriété constraintValidatorFactory.
+     *
      * @param value
      *     allowed object is
      *     {@link String }
-     *     
+     *
      */
     public void setConstraintValidatorFactory(String value) {
         this.constraintValidatorFactory = value;
     }
 
     /**
-     * Gets the value of the parameterNameProvider property.
-     * 
+     * Obtient la valeur de la propriété parameterNameProvider.
+     *
      * @return
      *     possible object is
      *     {@link String }
-     *     
+     *
      */
     public String getParameterNameProvider() {
         return parameterNameProvider;
     }
 
     /**
-     * Sets the value of the parameterNameProvider property.
-     * 
+     * Définit la valeur de la propriété parameterNameProvider.
+     *
      * @param value
      *     allowed object is
      *     {@link String }
-     *     
+     *
      */
     public void setParameterNameProvider(String value) {
         this.parameterNameProvider = value;
     }
 
     /**
-     * Gets the value of the executableValidation property.
-     * 
+     * Obtient la valeur de la propriété clockProvider.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getClockProvider() {
+        return clockProvider;
+    }
+
+    /**
+     * Définit la valeur de la propriété clockProvider.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setClockProvider(String value) {
+        this.clockProvider = value;
+    }
+
+    /**
+     * Gets the value of the valueExtractor property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the valueExtractor property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getValueExtractor().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     *
+     *
+     */
+    public List<String> getValueExtractor() {
+        if (valueExtractor == null) {
+            valueExtractor = new ArrayList<String>();
+        }
+        return this.valueExtractor;
+    }
+
+    /**
+     * Obtient la valeur de la propriété executableValidation.
+     *
      * @return
      *     possible object is
      *     {@link ExecutableValidationType }
-     *     
+     *
      */
     public ExecutableValidationType getExecutableValidation() {
         return executableValidation;
     }
 
     /**
-     * Sets the value of the executableValidation property.
-     * 
+     * Définit la valeur de la propriété executableValidation.
+     *
      * @param value
      *     allowed object is
      *     {@link ExecutableValidationType }
-     *     
+     *
      */
     public void setExecutableValidation(ExecutableValidationType value) {
         this.executableValidation = value;
@@ -239,25 +300,25 @@
 
     /**
      * Gets the value of the constraintMapping property.
-     * 
+     *
      * <p>
      * This accessor method returns a reference to the live list,
      * not a snapshot. Therefore any modification you make to the
      * returned list will be present inside the JAXB object.
      * This is why there is not a <CODE>set</CODE> method for the constraintMapping property.
-     * 
+     *
      * <p>
      * For example, to add a new item, do as follows:
      * <pre>
      *    getConstraintMapping().add(newItem);
      * </pre>
-     * 
-     * 
+     *
+     *
      * <p>
      * Objects of the following type(s) are allowed in the list
      * {@link String }
-     * 
-     * 
+     *
+     *
      */
     public List<String> getConstraintMapping() {
         if (constraintMapping == null) {
@@ -268,25 +329,25 @@
 
     /**
      * Gets the value of the property property.
-     * 
+     *
      * <p>
      * This accessor method returns a reference to the live list,
      * not a snapshot. Therefore any modification you make to the
      * returned list will be present inside the JAXB object.
      * This is why there is not a <CODE>set</CODE> method for the property property.
-     * 
+     *
      * <p>
      * For example, to add a new item, do as follows:
      * <pre>
      *    getProperty().add(newItem);
      * </pre>
-     * 
-     * 
+     *
+     *
      * <p>
      * Objects of the following type(s) are allowed in the list
      * {@link PropertyType }
-     * 
-     * 
+     *
+     *
      */
     public List<PropertyType> getProperty() {
         if (property == null) {
@@ -296,28 +357,28 @@
     }
 
     /**
-     * Gets the value of the version property.
-     * 
+     * Obtient la valeur de la propriété version.
+     *
      * @return
      *     possible object is
      *     {@link String }
-     *     
+     *
      */
     public String getVersion() {
         if (version == null) {
-            return "1.1";
+            return "2.0";
         } else {
             return version;
         }
     }
 
     /**
-     * Sets the value of the version property.
-     * 
+     * Définit la valeur de la propriété version.
+     *
      * @param value
      *     allowed object is
      *     {@link String }
-     *     
+     *
      */
     public void setVersion(String value) {
         this.version = value;
diff --git a/tck/bval-embedded/src/test/resources/dev.xml b/tck/bval-embedded/src/test/resources/dev.xml
index 5c3e646..b2ec173 100644
--- a/tck/bval-embedded/src/test/resources/dev.xml
+++ b/tck/bval-embedded/src/test/resources/dev.xml
@@ -19,8 +19,7 @@
 <suite name="BVAL-TCK" verbose="1">
     <test name="BVAL-TCK">
       <classes>
-        <class name="org.hibernate.beanvalidation.tck.tests.integration.ee.cdi.ConstraintValidatorInjectionTest" />
-        <class name="org.hibernate.beanvalidation.tck.tests.integration.cdi.factory.ConstraintValidatorInjectionTest" />
+        <class name="org.hibernate.beanvalidation.tck.tests.integration.ee.JndiRetrievalTest" />
       </classes>
     </test>
 </suite>
diff --git a/tck/bval-tomee/src/test/resources/dev.xml b/tck/bval-tomee/src/test/resources/dev.xml
index 694abaf..7cdc1e8 100644
--- a/tck/bval-tomee/src/test/resources/dev.xml
+++ b/tck/bval-tomee/src/test/resources/dev.xml
@@ -19,8 +19,11 @@
 <suite name="BVal-TCK" verbose="1">
     <test name="BVal-TCK">
       <classes>
-        <class name="org.hibernate.beanvalidation.tck.tests.integration.ee.cdi.ConstraintValidatorInjectionTest" />
-        <class name="org.hibernate.beanvalidation.tck.tests.integration.cdi.factory.ConstraintValidatorInjectionTest" />
+        <class name="org.hibernate.beanvalidation.tck.tests.valueextraction.declaration.ValueExtractorsPrecedenceTest" />
+        <!--
+        <class name="org.hibernate.beanvalidation.tck.tests.integration.cdi.managedobjects.ManagedValueExtractorsTest" />
+        <class name="org.hibernate.beanvalidation.tck.tests.valueextraction.declaration.MultipleValueExtractorsInValidationXmlForSameTypeAndTypeArgumentTest" />
+        -->
       </classes>
     </test>
 </suite>
