Fix #31801: Support for multi-valued configuration properties

In PropertyOracle, this change deprecated the existing property access methods
in favor of two new methods that query configuration and selection (=
deferred-binding) properties.  Configuration properties may have multiple
values, using the syntax:

<define-configuration-property name="name" is-multi-valued="true|false"/>
<extend-configuration-property name="name" value="value"/>
<set-configuration-property name="name" value="value"/>
<clear-configuration-property name="name"/>

The following tag is still supported, but deprecated:

<append-configuration-property name="name" value="value"/>

Existing xml files using this tag have been modified to use the new tags.

Review by: spoon



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5321 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/ConfigurationProperty.java b/dev/core/src/com/google/gwt/core/ext/ConfigurationProperty.java
new file mode 100644
index 0000000..4967881
--- /dev/null
+++ b/dev/core/src/com/google/gwt/core/ext/ConfigurationProperty.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.core.ext;
+
+import java.util.List;
+
+/**
+ * A named configuration (property, values) pair.
+ */
+public interface ConfigurationProperty {
+  
+  /**
+   * The name of the property.
+   * 
+   * @return the property name as a String.
+   * */
+  String getName();
+
+  /**
+   * The values for the permutation currently being considered.
+   * 
+   * @return the property values as a List of Strings.
+   */
+  List<String> getValues();
+}
diff --git a/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java b/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java
index 314cd2e..4fb14c0 100644
--- a/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java
+++ b/dev/core/src/com/google/gwt/core/ext/PropertyOracle.java
@@ -21,6 +21,15 @@
 public interface PropertyOracle {
 
   /**
+   * Attempts to get a named configuration property. Throws
+   * <code>BadPropertyValueException</code> if the property is undefined. The
+   * result of invoking this method with the same <code>propertyName</code> must
+   * be stable.
+   */
+  ConfigurationProperty getConfigurationProperty(String propertyName)
+      throws BadPropertyValueException;
+
+  /**
    * Attempts to get a named deferred binding property or configuration
    * property. Throws <code>BadPropertyValueException</code> if the property is
    * either undefined or has a value that is unsupported. The result of invoking
@@ -30,6 +39,7 @@
    * @param propertyName the name of the property
    * @return a value for the property
    */
+  @Deprecated
   String getPropertyValue(TreeLogger logger, String propertyName)
       throws BadPropertyValueException;
 
@@ -44,6 +54,16 @@
    * @param propertyName the name of the property
    * @return the possible values for the property
    */
+  @Deprecated
   String[] getPropertyValueSet(TreeLogger logger, String propertyName)
       throws BadPropertyValueException;
+
+  /**
+   * Attempts to get a named deferred binding property. Throws
+   * <code>BadPropertyValueException</code> if the property is either undefined
+   * or has a value that is unsupported. The result of invoking this method with
+   * the same <code>propertyName</code> must be stable.
+   */
+  SelectionProperty getSelectionProperty(TreeLogger logger, String propertyName)
+      throws BadPropertyValueException;
 }
diff --git a/dev/core/src/com/google/gwt/core/ext/SelectionProperty.java b/dev/core/src/com/google/gwt/core/ext/SelectionProperty.java
new file mode 100644
index 0000000..fda8cfc
--- /dev/null
+++ b/dev/core/src/com/google/gwt/core/ext/SelectionProperty.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.core.ext;
+
+import java.util.SortedSet;
+
+/**
+ * A named deferred binding (property, value) pair.
+ */
+public interface SelectionProperty {
+  
+  /**
+   * The name of the property.
+   * 
+   * @return the property name as a String.
+   * */
+  String getName();
+
+  /**
+   * The value for the permutation currently being considered.
+   * 
+   * @return the property value as a String.
+   */
+  String getCurrentValue();
+
+  /**
+   * Returns the possible values for the property in sorted order.
+   * 
+   * @return a SortedSet of Strings containing the possible property values.
+   */
+  SortedSet<String> getPossibleValues(); 
+}
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java b/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java
index ca4faad..dfaf77a 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/ConfigurationProperty.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.core.ext.linker;
 
+import java.util.List;
+
 /**
  * Represents a configuration property. These properties do not affect
  * deferred-binding decisions, but may affect the behavior of Linkers and
@@ -31,9 +33,22 @@
    * Returns the name of the configuration property.
    */
   String getName();
+  
+  /**
+   * Returns the defined value for the configuration property.  If the property
+   * has multiple values, this returns the first value only.
+   */
+  @Deprecated
+  String getValue();
+  
+  /**
+   * Returns the defined values for the configuration property as a List
+   * of Strings.
+   */
+  List<String> getValues();
 
   /**
-   * Returns the defined value for the configuration property.
+   * Returns true if this property has more than one value.
    */
-  String getValue();
+  boolean hasMultipleValues();
 }
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardConfigurationProperty.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardConfigurationProperty.java
index 72851f6..ef29748 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardConfigurationProperty.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardConfigurationProperty.java
@@ -17,6 +17,8 @@
 
 import com.google.gwt.core.ext.linker.ConfigurationProperty;
 
+import java.util.List;
+
 /**
  * The standard implementation of {@link ConfigurationProperty} from a
  * {@link com.google.gwt.dev.cfg.ConfigurationProperty}.
@@ -24,19 +26,33 @@
 public class StandardConfigurationProperty implements ConfigurationProperty {
 
   private final String name;
-  private final String value;
+  private final List<String> values;
 
   public StandardConfigurationProperty(
       com.google.gwt.dev.cfg.ConfigurationProperty p) {
-    this.name = p.getName();
-    this.value = p.getValue();
+    name = p.getName();
+    values = p.getValues();
+    
+    if (values == null || values.size() == 0) {
+      throw new IllegalArgumentException("values is null or empty");
+    }
   }
 
   public String getName() {
     return name;
   }
 
+  @Deprecated
   public String getValue() {
-    return value;
+    // values should always have at least one entry
+    return values.get(0);
+  }
+
+  public List<String> getValues() {
+    return values;
+  }
+
+  public boolean hasMultipleValues() {
+    return values.size() > 1;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java
index abd03b1..566c24d 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java
@@ -16,8 +16,10 @@
 package com.google.gwt.dev.cfg;
 
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 
@@ -45,7 +47,15 @@
     String testValue;
     try {
       PropertyOracle propertyOracle = context.getPropertyOracle();
-      testValue = propertyOracle.getPropertyValue(logger, propName);
+      try {
+        SelectionProperty prop
+            = propertyOracle.getSelectionProperty(logger, propName);
+        testValue = prop.getCurrentValue();
+      } catch (BadPropertyValueException e) {
+        ConfigurationProperty prop
+            = propertyOracle.getConfigurationProperty(propName);
+        testValue = prop.getValues().get(0);
+      }
       logger.log(TreeLogger.DEBUG, "Property value is '" + testValue + "'",
           null);
       if (testValue.equals(value)) {
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConfigurationProperty.java b/dev/core/src/com/google/gwt/dev/cfg/ConfigurationProperty.java
index e211499..2be034c 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConfigurationProperty.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConfigurationProperty.java
@@ -15,27 +15,76 @@
  */
 package com.google.gwt.dev.cfg;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Represents a module property which does not impact deferred-binding
  * decisions.
  */
 public class ConfigurationProperty extends Property {
-  private String value;
+  private final boolean allowMultipleValues;
+  private List<String> values = new ArrayList<String>();
 
   public ConfigurationProperty(String name) {
-    this(name, null);
+    this(name, false);
+  }
+  
+  public ConfigurationProperty(String name, boolean allowMultipleValues) {
+    super(name);
+    this.allowMultipleValues = allowMultipleValues;
+    if (!allowMultipleValues) {
+      values.add(null); // single-valued properties default to null
+    }
+  }
+  
+  public void addValue(String value) {
+    if (!allowMultipleValues) {
+      throw new IllegalStateException(
+          "Attempt to add a value to a single-valued ConfigurationProperty");
+    }
+    values.add(value);
   }
 
-  public ConfigurationProperty(String name, String value) {
-    super(name);
-    setValue(value);
+  public boolean allowsMultipleValues() {
+    return allowMultipleValues;
+  }
+  
+  public void clear() {
+    values.clear();
   }
 
   public String getValue() {
-    return value;
+    if (values.size() != 1) {
+      throw new IllegalStateException("size != 1");
+    }
+    return values.get(0);
+  }
+  
+  public List<String> getValues() {
+    ArrayList<String> v = new ArrayList<String>(values.size());
+    v.addAll(values);
+    return v;
+  }
+  
+  public boolean isMultiValued() {
+    return values.size() > 1;
   }
 
   public void setValue(String value) {
-    this.value = value;
+    if (values.size() == 0) {
+      values.add(value);
+    } else {
+      values.set(0, value);
+    }
+  }
+  
+  public void setValues(List<String> values) {
+    if (!allowMultipleValues && values.size() > 1) {
+      throw new IllegalStateException(
+      "Attempt to set > 1 value for a single-valued ConfigurationProperty");
+    }
+    this.values.clear();
+    this.values.addAll(values);
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java
index c63e6c7..63c40da 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java
@@ -50,9 +50,11 @@
 
     protected final String __add_linker_1_name = null;
 
-    protected final String __append_configuration_property_1_name = null;
+    protected final String __clear_configuration_property_1_name = null;
 
-    protected final String __append_configuration_property_2_value = null;
+    protected final String __define_configuration_property_1_name = null;
+
+    protected final String __define_configuration_property_2_is_multi_valued = null;
 
     protected final String __define_linker_1_name = null;
 
@@ -64,6 +66,10 @@
 
     protected final String __entry_point_1_class = null;
 
+    protected final String __extend_configuration_property_1_name = null;
+
+    protected final String __extend_configuration_property_2_value = null;
+
     protected final String __extend_property_1_name = null;
 
     protected final String __extend_property_2_values = null;
@@ -134,31 +140,63 @@
       return null;
     }
 
-    protected Schema __append_configuration_property_begin(PropertyName name,
-        String value) throws UnableToCompleteException {
-
-      // Property must already exist
+    protected Schema __clear_configuration_property_begin(PropertyName name)
+        throws UnableToCompleteException {
+      // Don't allow configuration properties with the same name as a
+      // deferred-binding property.
       Property prop = moduleDef.getProperties().find(name.token);
-      if (prop == null || !(prop instanceof ConfigurationProperty)) {
-        logger.log(TreeLogger.ERROR, "The property " + name.token
-            + " must already exist as a configuration property");
+      if (prop == null) {
+        logger.log(TreeLogger.ERROR, "No property named " + name.token
+            + " has been defined");
+        throw new UnableToCompleteException();
+      } else if (!(prop instanceof ConfigurationProperty)) {
+        if (prop instanceof BindingProperty) {
+          logger.log(TreeLogger.ERROR, "The property " + name.token
+              + " is already defined as a deferred-binding property");
+        } else {
+          logger.log(TreeLogger.ERROR, "The property " + name.token
+              + " is already defined as a property of unknown type");
+        }
         throw new UnableToCompleteException();
       }
 
-      ConfigurationProperty configProp = (ConfigurationProperty) prop;
-      String oldValue = configProp.getValue();
-      if (oldValue == null) {
-        oldValue = "";
-      }
-      if (oldValue.length() > 0) {
-        oldValue += ",";
-      }
-      configProp.setValue(oldValue + value);
+      ((ConfigurationProperty) prop).clear();
 
       // No children.
       return null;
     }
 
+    protected Schema __define_configuration_property_begin(PropertyName name,
+        String is_multi_valued) throws UnableToCompleteException {
+      boolean isMultiValued = toPrimitiveBoolean(is_multi_valued);
+      
+      // Don't allow configuration properties with the same name as a
+      // deferred-binding property.
+      Property existingProperty = moduleDef.getProperties().find(name.token);
+      if (existingProperty == null) {
+        // Create the property
+        existingProperty = moduleDef.getProperties().createConfiguration(
+            name.token, isMultiValued);
+      } else {
+        if (existingProperty instanceof ConfigurationProperty) {
+          logger.log(TreeLogger.ERROR, "The configuration property named "
+              + name.token + " may not be redefined.");
+        } else if (existingProperty instanceof BindingProperty) {
+          logger.log(TreeLogger.ERROR, "The property " + name.token
+              + " is already defined as a deferred-binding property");
+        } else {
+          // Future proofing if other subclasses are added.
+          logger.log(TreeLogger.ERROR, "May not replace property named "
+              + name.token + " of unknown type "
+              + existingProperty.getClass().getName());
+        }
+        throw new UnableToCompleteException();
+      }
+      
+      // No children.
+      return null;
+    }
+
     protected Schema __define_linker_begin(LinkerName name,
         Class<? extends Linker> linker) throws UnableToCompleteException {
       if (!Linker.class.isAssignableFrom(linker)) {
@@ -186,8 +224,8 @@
           logger.log(TreeLogger.ERROR, "The deferred-binding property named "
               + name.token + " may not be redefined.");
         } else if (existingProperty instanceof ConfigurationProperty) {
-          logger.log(TreeLogger.ERROR, "A configuration property named "
-              + name.token + " has already been set.");
+          logger.log(TreeLogger.ERROR, "The property " + name.token
+              + " is already defined as a configuration property");
         } else {
           // Future proofing if other subclasses are added.
           logger.log(TreeLogger.ERROR, "May not replace property named "
@@ -212,6 +250,28 @@
       return null;
     }
 
+    protected Schema __extend_configuration_property_begin(PropertyName name,
+        String value) throws UnableToCompleteException {
+
+      // Property must already exist as a configuration property
+      Property prop = moduleDef.getProperties().find(name.token);
+      if ((prop == null) || !(prop instanceof ConfigurationProperty)) {
+        logger.log(TreeLogger.ERROR, "The property " + name.token
+            + " must already exist as a configuration property");
+        throw new UnableToCompleteException();
+      }
+
+      ConfigurationProperty configProp = (ConfigurationProperty) prop;
+      if (!configProp.allowsMultipleValues()) {
+        logger.log(TreeLogger.ERROR, "The property " + name.token
+            + " does not support multiple values");
+        throw new UnableToCompleteException();
+      }
+      configProp.addValue(value);
+
+      return null;
+    }
+
     protected Schema __extend_property_begin(BindingProperty property,
         PropertyValue[] values) {
       for (int i = 0; i < values.length; i++) {
@@ -343,19 +403,27 @@
 
     protected Schema __set_configuration_property_begin(PropertyName name,
         String value) throws UnableToCompleteException {
-
-      // Don't allow configuration properties with the same name as a
-      // deferred-binding property.
-      Property prop = moduleDef.getProperties().find(name.token);
-      if (prop != null && !(prop instanceof ConfigurationProperty)) {
-        logger.log(TreeLogger.ERROR, "A deferred-binding property named "
-            + name.token + " has already been defined");
+      
+      Property existingProperty = moduleDef.getProperties().find(name.token);
+      if (existingProperty == null) {
+        // If a property is created by "set-configuration-property" without
+        // a previous "define-configuration-property", allow it for backwards
+        // compatibility but don't allow multiple values.
+        existingProperty = moduleDef.getProperties().createConfiguration(
+            name.token, false);
+      } else if (!(existingProperty instanceof ConfigurationProperty)) {
+        if (existingProperty instanceof BindingProperty) {
+          logger.log(TreeLogger.ERROR, "The property " + name.token
+              + " is already defined as a deferred-binding property");
+        } else {
+          // Future proofing if other subclasses are added.
+          logger.log(TreeLogger.ERROR, "May not replace property named "
+              + name.token + " of unknown type "
+              + existingProperty.getClass().getName());
+        }
         throw new UnableToCompleteException();
-      } else {
-        prop = moduleDef.getProperties().createConfiguration(name.token);
       }
-
-      ((ConfigurationProperty) prop).setValue(value);
+      ((ConfigurationProperty) existingProperty).setValue(value);
 
       // No children.
       return null;
diff --git a/dev/core/src/com/google/gwt/dev/cfg/Properties.java b/dev/core/src/com/google/gwt/dev/cfg/Properties.java
index 79af9a3..d6ca29e 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/Properties.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/Properties.java
@@ -47,8 +47,8 @@
    * Creates the specified configuration property, or returns an existing one by
    * the specified name if present.
    */
-  public ConfigurationProperty createConfiguration(String name) {
-    ConfigurationProperty prop = create(name, ConfigurationProperty.class);
+  public ConfigurationProperty createConfiguration(String name, boolean allowMultipleValues) {
+    ConfigurationProperty prop = create(name, allowMultipleValues, ConfigurationProperty.class);
     configProps.add(prop);
     return prop;
   }
@@ -90,6 +90,16 @@
   }
 
   private <T extends Property> T create(String name, Class<T> clazz) {
+    return create(name, false, false, clazz);
+  }
+  
+  private <T extends Property> T create(String name, boolean flag, Class<T> clazz) {
+    return create(name, flag, true, clazz);
+  }
+  
+  private <T extends Property> T create(String name,
+      boolean flag, boolean useFlagArgument,
+      Class<T> clazz) {
     if (clazz == null) {
       throw new NullPointerException("clazz");
     } else if (name == null) {
@@ -109,7 +119,13 @@
 
     Exception ex = null;
     try {
-      T newInstance = clazz.getConstructor(String.class).newInstance(name);
+      T newInstance;
+      if (useFlagArgument) {
+        newInstance = clazz.getConstructor(String.class,
+            boolean.class).newInstance(name, flag);
+      } else {
+        newInstance = clazz.getConstructor(String.class).newInstance(name);
+      }
       map.put(name, newInstance);
       return newInstance;
     } catch (NoSuchMethodException e) {
diff --git a/dev/core/src/com/google/gwt/dev/cfg/StaticPropertyOracle.java b/dev/core/src/com/google/gwt/dev/cfg/StaticPropertyOracle.java
index d0cb379..c257f62 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/StaticPropertyOracle.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/StaticPropertyOracle.java
@@ -20,6 +20,9 @@
 import com.google.gwt.core.ext.TreeLogger;
 
 import java.io.Serializable;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 /**
  * An implementation of {@link PropertyOracle} that contains property values,
@@ -38,6 +41,35 @@
     this.orderedProps = orderedProps;
     this.orderedPropValues = orderedPropValues;
     this.configProps = configProps;
+    
+    // Reject illegal values at construction time
+    int len = orderedProps.length;
+    for (int i = 0; i < len; i++) {
+      BindingProperty prop = orderedProps[i];
+      String value = orderedPropValues[i];
+      if (!prop.isAllowedValue(value)) {
+        throw new IllegalArgumentException("Property " + prop.getName()
+            + " cannot have value " + value);
+      }
+    }
+  }
+
+  public com.google.gwt.core.ext.ConfigurationProperty getConfigurationProperty(
+      String propertyName) throws BadPropertyValueException {
+    for (final ConfigurationProperty prop : configProps) {
+      if (prop.getName().equals(propertyName)) {
+        return new com.google.gwt.core.ext.ConfigurationProperty() {
+          public String getName() {
+            return prop.getName();
+          }
+
+          public List<String> getValues() {
+            return prop.getValues();
+          }
+        };
+      }
+    }
+    throw new BadPropertyValueException(propertyName);
   }
 
   public BindingProperty[] getOrderedProps() {
@@ -48,6 +80,7 @@
     return orderedPropValues;
   }
 
+  @Deprecated
   public String getPropertyValue(TreeLogger logger, String propertyName)
       throws BadPropertyValueException {
     // In practice there will probably be so few properties that a linear
@@ -78,6 +111,7 @@
     throw new BadPropertyValueException(propertyName);
   }
 
+  @Deprecated
   public String[] getPropertyValueSet(TreeLogger logger, String propertyName)
       throws BadPropertyValueException {
     for (int i = 0; i < orderedProps.length; i++) {
@@ -93,4 +127,41 @@
     //
     throw new BadPropertyValueException(propertyName);
   }
+
+  public com.google.gwt.core.ext.SelectionProperty getSelectionProperty(
+      TreeLogger logger, String propertyName)
+      throws BadPropertyValueException {
+    // In practice there will probably be so few properties that a linear
+    // search is at least as fast as a map lookup by name would be.
+    // If that turns out not to be the case, the ctor could build a
+    // name-to-index map.
+    for (int i = 0; i < orderedProps.length; i++) {
+      final BindingProperty prop = orderedProps[i];
+      final String name = prop.getName();
+      if (name.equals(propertyName)) {
+        final String value = orderedPropValues[i];
+        String[] values = prop.getDefinedValues();
+        final TreeSet<String> possibleValues = new TreeSet<String>();
+        for (String v : values) {
+          possibleValues.add(v);
+        }
+
+        return new com.google.gwt.core.ext.SelectionProperty() {
+          public String getCurrentValue() {
+            return value;
+          }
+
+          public String getName() {
+            return name;
+          }
+
+          public SortedSet<String> getPossibleValues() {
+            return possibleValues;
+          }
+        };
+      }
+    }
+
+    throw new BadPropertyValueException(propertyName);
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
index c74aa6a..58440f0 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.dev.cfg.BindingProperty;
 import com.google.gwt.dev.cfg.ConfigurationProperty;
@@ -24,7 +25,10 @@
 import com.google.gwt.dev.cfg.Property;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 /**
  * Implements a {@link PropertyOracle} in terms of a module space, which makes
@@ -43,9 +47,32 @@
     this.props = props;
   }
 
+  public com.google.gwt.core.ext.ConfigurationProperty
+      getConfigurationProperty(String propertyName)
+      throws BadPropertyValueException {
+    Property prop = getProperty(propertyName);
+    if (prop instanceof ConfigurationProperty) {
+      final ConfigurationProperty cprop = (ConfigurationProperty) prop;
+      final String name = cprop.getName();
+      final List<String> values = cprop.getValues();
+      return new com.google.gwt.core.ext.ConfigurationProperty() {
+        public String getName() {
+          return name;
+        }
+
+        public List<String> getValues() {
+          return values;
+        }
+      };
+    } else {
+      throw new BadPropertyValueException(propertyName);
+    }
+  }
+
   /**
    * Executes JavaScript to find the property value.
    */
+  @Deprecated
   public String getPropertyValue(TreeLogger logger, String propertyName)
       throws BadPropertyValueException {
     Property prop = getProperty(propertyName);
@@ -75,6 +102,7 @@
   /**
    * Returns the list of possible values for a property.
    */
+  @Deprecated
   public String[] getPropertyValueSet(TreeLogger logger, String propertyName)
       throws BadPropertyValueException {
     Property prop = getProperty(propertyName);
@@ -84,6 +112,36 @@
     throw new BadPropertyValueException(propertyName);
   }
 
+  public SelectionProperty getSelectionProperty(TreeLogger logger,
+      String propertyName) throws BadPropertyValueException {
+    Property prop = getProperty(propertyName);
+    if (prop instanceof BindingProperty) {
+      final BindingProperty cprop = (BindingProperty) prop;
+      final String name = cprop.getName();
+      final String value = computePropertyValue(logger, propertyName, cprop);
+      final SortedSet<String> possibleValues = new TreeSet<String>();
+      for (String v : cprop.getDefinedValues()) {
+        possibleValues.add(v);
+      }
+      return new com.google.gwt.core.ext.SelectionProperty() {
+        
+        public String getCurrentValue() {
+          return value;
+        }
+
+        public String getName() {
+          return name;
+        }
+
+        public SortedSet<String> getPossibleValues() {
+          return possibleValues;
+        }
+      };
+    } else {
+      throw new BadPropertyValueException(propertyName);
+    }
+  }
+
   /**
    * Returns the value of the specified property.
    * 
diff --git a/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java b/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
index c2f5de3..05fc32a 100644
--- a/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
+++ b/dev/core/test/com/google/gwt/dev/shell/StandardGeneratorContextTest.java
@@ -16,9 +16,11 @@
 package com.google.gwt.dev.shell;
 
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.linker.Artifact;
@@ -75,6 +77,15 @@
         throws BadPropertyValueException {
       return new String[] {};
     }
+
+    public ConfigurationProperty getConfigurationProperty(String name) {
+      return null;
+    }
+
+    public SelectionProperty getSelectionProperty(TreeLogger logger,
+        String name) {
+      return null;
+    }
   }
 
   private static class MockPublicOracle implements PublicOracle {
diff --git a/user/src/com/google/gwt/i18n/CldrLocales.gwt.xml b/user/src/com/google/gwt/i18n/CldrLocales.gwt.xml
index cec511e..6c80f23 100644
--- a/user/src/com/google/gwt/i18n/CldrLocales.gwt.xml
+++ b/user/src/com/google/gwt/i18n/CldrLocales.gwt.xml
@@ -14,459 +14,459 @@
 
 <!-- List of all locales imported into GWT from CLDR, as runtime locales -->
 <module>
-  <append-configuration-property name="runtime.locales" value="aa"/>
-  <append-configuration-property name="runtime.locales" value="aa_DJ"/>
-  <append-configuration-property name="runtime.locales" value="aa_ER"/>
-  <append-configuration-property name="runtime.locales" value="aa_ER_SAAHO"/>
-  <append-configuration-property name="runtime.locales" value="aa_ET"/>
-  <append-configuration-property name="runtime.locales" value="af"/>
-  <append-configuration-property name="runtime.locales" value="af_NA"/>
-  <append-configuration-property name="runtime.locales" value="af_ZA"/>
-  <append-configuration-property name="runtime.locales" value="ak"/>
-  <append-configuration-property name="runtime.locales" value="ak_GH"/>
-  <append-configuration-property name="runtime.locales" value="am"/>
-  <append-configuration-property name="runtime.locales" value="am_ET"/>
-  <append-configuration-property name="runtime.locales" value="ar"/>
-  <append-configuration-property name="runtime.locales" value="ar_AE"/>
-  <append-configuration-property name="runtime.locales" value="ar_BH"/>
-  <append-configuration-property name="runtime.locales" value="ar_DZ"/>
-  <append-configuration-property name="runtime.locales" value="ar_EG"/>
-  <append-configuration-property name="runtime.locales" value="ar_IQ"/>
-  <append-configuration-property name="runtime.locales" value="ar_JO"/>
-  <append-configuration-property name="runtime.locales" value="ar_KW"/>
-  <append-configuration-property name="runtime.locales" value="ar_LB"/>
-  <append-configuration-property name="runtime.locales" value="ar_LY"/>
-  <append-configuration-property name="runtime.locales" value="ar_MA"/>
-  <append-configuration-property name="runtime.locales" value="ar_OM"/>
-  <append-configuration-property name="runtime.locales" value="ar_QA"/>
-  <append-configuration-property name="runtime.locales" value="ar_SA"/>
-  <append-configuration-property name="runtime.locales" value="ar_SD"/>
-  <append-configuration-property name="runtime.locales" value="ar_SY"/>
-  <append-configuration-property name="runtime.locales" value="ar_TN"/>
-  <append-configuration-property name="runtime.locales" value="ar_YE"/>
-  <append-configuration-property name="runtime.locales" value="as"/>
-  <append-configuration-property name="runtime.locales" value="as_IN"/>
-  <append-configuration-property name="runtime.locales" value="az"/>
-  <append-configuration-property name="runtime.locales" value="az_AZ"/>
-  <append-configuration-property name="runtime.locales" value="az_Cyrl"/>
-  <append-configuration-property name="runtime.locales" value="az_Cyrl_AZ"/>
-  <append-configuration-property name="runtime.locales" value="az_Latn"/>
-  <append-configuration-property name="runtime.locales" value="az_Latn_AZ"/>
-  <append-configuration-property name="runtime.locales" value="be"/>
-  <append-configuration-property name="runtime.locales" value="be_BY"/>
-  <append-configuration-property name="runtime.locales" value="bg"/>
-  <append-configuration-property name="runtime.locales" value="bg_BG"/>
-  <append-configuration-property name="runtime.locales" value="bn"/>
-  <append-configuration-property name="runtime.locales" value="bn_BD"/>
-  <append-configuration-property name="runtime.locales" value="bn_IN"/>
-  <append-configuration-property name="runtime.locales" value="bs"/>
-  <append-configuration-property name="runtime.locales" value="bs_BA"/>
-  <append-configuration-property name="runtime.locales" value="byn"/>
-  <append-configuration-property name="runtime.locales" value="byn_ER"/>
-  <append-configuration-property name="runtime.locales" value="ca"/>
-  <append-configuration-property name="runtime.locales" value="ca_ES"/>
-  <append-configuration-property name="runtime.locales" value="cch"/>
-  <append-configuration-property name="runtime.locales" value="cch_NG"/>
-  <append-configuration-property name="runtime.locales" value="cop"/>
-  <append-configuration-property name="runtime.locales" value="cs"/>
-  <append-configuration-property name="runtime.locales" value="cs_CZ"/>
-  <append-configuration-property name="runtime.locales" value="cy"/>
-  <append-configuration-property name="runtime.locales" value="cy_GB"/>
-  <append-configuration-property name="runtime.locales" value="da"/>
-  <append-configuration-property name="runtime.locales" value="da_DK"/>
-  <append-configuration-property name="runtime.locales" value="de"/>
-  <append-configuration-property name="runtime.locales" value="de_AT"/>
-  <append-configuration-property name="runtime.locales" value="de_BE"/>
-  <append-configuration-property name="runtime.locales" value="de_CH"/>
-  <append-configuration-property name="runtime.locales" value="de_DE"/>
-  <append-configuration-property name="runtime.locales" value="de_LI"/>
-  <append-configuration-property name="runtime.locales" value="de_LU"/>
-  <append-configuration-property name="runtime.locales" value="dv"/>
-  <append-configuration-property name="runtime.locales" value="dv_MV"/>
-  <append-configuration-property name="runtime.locales" value="dz"/>
-  <append-configuration-property name="runtime.locales" value="dz_BT"/>
-  <append-configuration-property name="runtime.locales" value="ee"/>
-  <append-configuration-property name="runtime.locales" value="ee_GH"/>
-  <append-configuration-property name="runtime.locales" value="ee_TG"/>
-  <append-configuration-property name="runtime.locales" value="el"/>
-  <append-configuration-property name="runtime.locales" value="el_CY"/>
-  <append-configuration-property name="runtime.locales" value="el_GR"/>
-  <append-configuration-property name="runtime.locales" value="el_POLYTON"/>
-  <append-configuration-property name="runtime.locales" value="en"/>
-  <append-configuration-property name="runtime.locales" value="en_AS"/>
-  <append-configuration-property name="runtime.locales" value="en_AU"/>
-  <append-configuration-property name="runtime.locales" value="en_BE"/>
-  <append-configuration-property name="runtime.locales" value="en_BW"/>
-  <append-configuration-property name="runtime.locales" value="en_BZ"/>
-  <append-configuration-property name="runtime.locales" value="en_CA"/>
-  <append-configuration-property name="runtime.locales" value="en_Dsrt"/>
-  <append-configuration-property name="runtime.locales" value="en_Dsrt_US"/>
-  <append-configuration-property name="runtime.locales" value="en_GB"/>
-  <append-configuration-property name="runtime.locales" value="en_GU"/>
-  <append-configuration-property name="runtime.locales" value="en_HK"/>
-  <append-configuration-property name="runtime.locales" value="en_IE"/>
-  <append-configuration-property name="runtime.locales" value="en_IN"/>
-  <append-configuration-property name="runtime.locales" value="en_JM"/>
-  <append-configuration-property name="runtime.locales" value="en_MH"/>
-  <append-configuration-property name="runtime.locales" value="en_MP"/>
-  <append-configuration-property name="runtime.locales" value="en_MT"/>
-  <append-configuration-property name="runtime.locales" value="en_NA"/>
-  <append-configuration-property name="runtime.locales" value="en_NZ"/>
-  <append-configuration-property name="runtime.locales" value="en_PH"/>
-  <append-configuration-property name="runtime.locales" value="en_PK"/>
-  <append-configuration-property name="runtime.locales" value="en_SG"/>
-  <append-configuration-property name="runtime.locales" value="en_Shaw"/>
-  <append-configuration-property name="runtime.locales" value="en_TT"/>
-  <append-configuration-property name="runtime.locales" value="en_UM"/>
-  <append-configuration-property name="runtime.locales" value="en_US"/>
+  <extend-configuration-property name="runtime.locales" value="aa"/>
+  <extend-configuration-property name="runtime.locales" value="aa_DJ"/>
+  <extend-configuration-property name="runtime.locales" value="aa_ER"/>
+  <extend-configuration-property name="runtime.locales" value="aa_ER_SAAHO"/>
+  <extend-configuration-property name="runtime.locales" value="aa_ET"/>
+  <extend-configuration-property name="runtime.locales" value="af"/>
+  <extend-configuration-property name="runtime.locales" value="af_NA"/>
+  <extend-configuration-property name="runtime.locales" value="af_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="ak"/>
+  <extend-configuration-property name="runtime.locales" value="ak_GH"/>
+  <extend-configuration-property name="runtime.locales" value="am"/>
+  <extend-configuration-property name="runtime.locales" value="am_ET"/>
+  <extend-configuration-property name="runtime.locales" value="ar"/>
+  <extend-configuration-property name="runtime.locales" value="ar_AE"/>
+  <extend-configuration-property name="runtime.locales" value="ar_BH"/>
+  <extend-configuration-property name="runtime.locales" value="ar_DZ"/>
+  <extend-configuration-property name="runtime.locales" value="ar_EG"/>
+  <extend-configuration-property name="runtime.locales" value="ar_IQ"/>
+  <extend-configuration-property name="runtime.locales" value="ar_JO"/>
+  <extend-configuration-property name="runtime.locales" value="ar_KW"/>
+  <extend-configuration-property name="runtime.locales" value="ar_LB"/>
+  <extend-configuration-property name="runtime.locales" value="ar_LY"/>
+  <extend-configuration-property name="runtime.locales" value="ar_MA"/>
+  <extend-configuration-property name="runtime.locales" value="ar_OM"/>
+  <extend-configuration-property name="runtime.locales" value="ar_QA"/>
+  <extend-configuration-property name="runtime.locales" value="ar_SA"/>
+  <extend-configuration-property name="runtime.locales" value="ar_SD"/>
+  <extend-configuration-property name="runtime.locales" value="ar_SY"/>
+  <extend-configuration-property name="runtime.locales" value="ar_TN"/>
+  <extend-configuration-property name="runtime.locales" value="ar_YE"/>
+  <extend-configuration-property name="runtime.locales" value="as"/>
+  <extend-configuration-property name="runtime.locales" value="as_IN"/>
+  <extend-configuration-property name="runtime.locales" value="az"/>
+  <extend-configuration-property name="runtime.locales" value="az_AZ"/>
+  <extend-configuration-property name="runtime.locales" value="az_Cyrl"/>
+  <extend-configuration-property name="runtime.locales" value="az_Cyrl_AZ"/>
+  <extend-configuration-property name="runtime.locales" value="az_Latn"/>
+  <extend-configuration-property name="runtime.locales" value="az_Latn_AZ"/>
+  <extend-configuration-property name="runtime.locales" value="be"/>
+  <extend-configuration-property name="runtime.locales" value="be_BY"/>
+  <extend-configuration-property name="runtime.locales" value="bg"/>
+  <extend-configuration-property name="runtime.locales" value="bg_BG"/>
+  <extend-configuration-property name="runtime.locales" value="bn"/>
+  <extend-configuration-property name="runtime.locales" value="bn_BD"/>
+  <extend-configuration-property name="runtime.locales" value="bn_IN"/>
+  <extend-configuration-property name="runtime.locales" value="bs"/>
+  <extend-configuration-property name="runtime.locales" value="bs_BA"/>
+  <extend-configuration-property name="runtime.locales" value="byn"/>
+  <extend-configuration-property name="runtime.locales" value="byn_ER"/>
+  <extend-configuration-property name="runtime.locales" value="ca"/>
+  <extend-configuration-property name="runtime.locales" value="ca_ES"/>
+  <extend-configuration-property name="runtime.locales" value="cch"/>
+  <extend-configuration-property name="runtime.locales" value="cch_NG"/>
+  <extend-configuration-property name="runtime.locales" value="cop"/>
+  <extend-configuration-property name="runtime.locales" value="cs"/>
+  <extend-configuration-property name="runtime.locales" value="cs_CZ"/>
+  <extend-configuration-property name="runtime.locales" value="cy"/>
+  <extend-configuration-property name="runtime.locales" value="cy_GB"/>
+  <extend-configuration-property name="runtime.locales" value="da"/>
+  <extend-configuration-property name="runtime.locales" value="da_DK"/>
+  <extend-configuration-property name="runtime.locales" value="de"/>
+  <extend-configuration-property name="runtime.locales" value="de_AT"/>
+  <extend-configuration-property name="runtime.locales" value="de_BE"/>
+  <extend-configuration-property name="runtime.locales" value="de_CH"/>
+  <extend-configuration-property name="runtime.locales" value="de_DE"/>
+  <extend-configuration-property name="runtime.locales" value="de_LI"/>
+  <extend-configuration-property name="runtime.locales" value="de_LU"/>
+  <extend-configuration-property name="runtime.locales" value="dv"/>
+  <extend-configuration-property name="runtime.locales" value="dv_MV"/>
+  <extend-configuration-property name="runtime.locales" value="dz"/>
+  <extend-configuration-property name="runtime.locales" value="dz_BT"/>
+  <extend-configuration-property name="runtime.locales" value="ee"/>
+  <extend-configuration-property name="runtime.locales" value="ee_GH"/>
+  <extend-configuration-property name="runtime.locales" value="ee_TG"/>
+  <extend-configuration-property name="runtime.locales" value="el"/>
+  <extend-configuration-property name="runtime.locales" value="el_CY"/>
+  <extend-configuration-property name="runtime.locales" value="el_GR"/>
+  <extend-configuration-property name="runtime.locales" value="el_POLYTON"/>
+  <extend-configuration-property name="runtime.locales" value="en"/>
+  <extend-configuration-property name="runtime.locales" value="en_AS"/>
+  <extend-configuration-property name="runtime.locales" value="en_AU"/>
+  <extend-configuration-property name="runtime.locales" value="en_BE"/>
+  <extend-configuration-property name="runtime.locales" value="en_BW"/>
+  <extend-configuration-property name="runtime.locales" value="en_BZ"/>
+  <extend-configuration-property name="runtime.locales" value="en_CA"/>
+  <extend-configuration-property name="runtime.locales" value="en_Dsrt"/>
+  <extend-configuration-property name="runtime.locales" value="en_Dsrt_US"/>
+  <extend-configuration-property name="runtime.locales" value="en_GB"/>
+  <extend-configuration-property name="runtime.locales" value="en_GU"/>
+  <extend-configuration-property name="runtime.locales" value="en_HK"/>
+  <extend-configuration-property name="runtime.locales" value="en_IE"/>
+  <extend-configuration-property name="runtime.locales" value="en_IN"/>
+  <extend-configuration-property name="runtime.locales" value="en_JM"/>
+  <extend-configuration-property name="runtime.locales" value="en_MH"/>
+  <extend-configuration-property name="runtime.locales" value="en_MP"/>
+  <extend-configuration-property name="runtime.locales" value="en_MT"/>
+  <extend-configuration-property name="runtime.locales" value="en_NA"/>
+  <extend-configuration-property name="runtime.locales" value="en_NZ"/>
+  <extend-configuration-property name="runtime.locales" value="en_PH"/>
+  <extend-configuration-property name="runtime.locales" value="en_PK"/>
+  <extend-configuration-property name="runtime.locales" value="en_SG"/>
+  <extend-configuration-property name="runtime.locales" value="en_Shaw"/>
+  <extend-configuration-property name="runtime.locales" value="en_TT"/>
+  <extend-configuration-property name="runtime.locales" value="en_UM"/>
+  <extend-configuration-property name="runtime.locales" value="en_US"/>
   <!-- This doesn't seem appropriate to include here, if you want it just
        include the following line right after the import for this module.
-  <append-configuration-property name="runtime.locales" value="en_US_POSIX"/>
+  <extend-configuration-property name="runtime.locales" value="en_US_POSIX"/>
   -->
-  <append-configuration-property name="runtime.locales" value="en_VI"/>
-  <append-configuration-property name="runtime.locales" value="en_ZA"/>
-  <append-configuration-property name="runtime.locales" value="en_ZW"/>
-  <append-configuration-property name="runtime.locales" value="eo"/>
-  <append-configuration-property name="runtime.locales" value="es"/>
-  <append-configuration-property name="runtime.locales" value="es_AR"/>
-  <append-configuration-property name="runtime.locales" value="es_BO"/>
-  <append-configuration-property name="runtime.locales" value="es_CL"/>
-  <append-configuration-property name="runtime.locales" value="es_CO"/>
-  <append-configuration-property name="runtime.locales" value="es_CR"/>
-  <append-configuration-property name="runtime.locales" value="es_DO"/>
-  <append-configuration-property name="runtime.locales" value="es_EC"/>
-  <append-configuration-property name="runtime.locales" value="es_ES"/>
-  <append-configuration-property name="runtime.locales" value="es_GT"/>
-  <append-configuration-property name="runtime.locales" value="es_HN"/>
-  <append-configuration-property name="runtime.locales" value="es_MX"/>
-  <append-configuration-property name="runtime.locales" value="es_NI"/>
-  <append-configuration-property name="runtime.locales" value="es_PA"/>
-  <append-configuration-property name="runtime.locales" value="es_PE"/>
-  <append-configuration-property name="runtime.locales" value="es_PR"/>
-  <append-configuration-property name="runtime.locales" value="es_PY"/>
-  <append-configuration-property name="runtime.locales" value="es_SV"/>
-  <append-configuration-property name="runtime.locales" value="es_US"/>
-  <append-configuration-property name="runtime.locales" value="es_UY"/>
-  <append-configuration-property name="runtime.locales" value="es_VE"/>
-  <append-configuration-property name="runtime.locales" value="et"/>
-  <append-configuration-property name="runtime.locales" value="et_EE"/>
-  <append-configuration-property name="runtime.locales" value="eu"/>
-  <append-configuration-property name="runtime.locales" value="eu_ES"/>
-  <append-configuration-property name="runtime.locales" value="fa"/>
-  <append-configuration-property name="runtime.locales" value="fa_AF"/>
-  <append-configuration-property name="runtime.locales" value="fa_IR"/>
-  <append-configuration-property name="runtime.locales" value="fi"/>
-  <append-configuration-property name="runtime.locales" value="fi_FI"/>
-  <append-configuration-property name="runtime.locales" value="fil"/>
-  <append-configuration-property name="runtime.locales" value="fil_PH"/>
-  <append-configuration-property name="runtime.locales" value="fo"/>
-  <append-configuration-property name="runtime.locales" value="fo_FO"/>
-  <append-configuration-property name="runtime.locales" value="fr"/>
-  <append-configuration-property name="runtime.locales" value="fr_BE"/>
-  <append-configuration-property name="runtime.locales" value="fr_CA"/>
-  <append-configuration-property name="runtime.locales" value="fr_CH"/>
-  <append-configuration-property name="runtime.locales" value="fr_FR"/>
-  <append-configuration-property name="runtime.locales" value="fr_LU"/>
-  <append-configuration-property name="runtime.locales" value="fr_MC"/>
-  <append-configuration-property name="runtime.locales" value="fr_SN"/>
-  <append-configuration-property name="runtime.locales" value="fur"/>
-  <append-configuration-property name="runtime.locales" value="fur_IT"/>
-  <append-configuration-property name="runtime.locales" value="ga"/>
-  <append-configuration-property name="runtime.locales" value="gaa"/>
-  <append-configuration-property name="runtime.locales" value="gaa_GH"/>
-  <append-configuration-property name="runtime.locales" value="ga_IE"/>
-  <append-configuration-property name="runtime.locales" value="gez"/>
-  <append-configuration-property name="runtime.locales" value="gez_ER"/>
-  <append-configuration-property name="runtime.locales" value="gez_ET"/>
-  <append-configuration-property name="runtime.locales" value="gl"/>
-  <append-configuration-property name="runtime.locales" value="gl_ES"/>
-  <append-configuration-property name="runtime.locales" value="gu"/>
-  <append-configuration-property name="runtime.locales" value="gu_IN"/>
-  <append-configuration-property name="runtime.locales" value="gv"/>
-  <append-configuration-property name="runtime.locales" value="gv_GB"/>
-  <append-configuration-property name="runtime.locales" value="ha"/>
-  <append-configuration-property name="runtime.locales" value="ha_Arab"/>
-  <append-configuration-property name="runtime.locales" value="ha_Arab_NG"/>
-  <append-configuration-property name="runtime.locales" value="ha_Arab_SD"/>
-  <append-configuration-property name="runtime.locales" value="ha_GH"/>
-  <append-configuration-property name="runtime.locales" value="ha_Latn"/>
-  <append-configuration-property name="runtime.locales" value="ha_Latn_GH"/>
-  <append-configuration-property name="runtime.locales" value="ha_Latn_NE"/>
-  <append-configuration-property name="runtime.locales" value="ha_Latn_NG"/>
-  <append-configuration-property name="runtime.locales" value="ha_NE"/>
-  <append-configuration-property name="runtime.locales" value="ha_NG"/>
-  <append-configuration-property name="runtime.locales" value="ha_SD"/>
-  <append-configuration-property name="runtime.locales" value="haw"/>
-  <append-configuration-property name="runtime.locales" value="haw_US"/>
-  <append-configuration-property name="runtime.locales" value="he"/>
-  <append-configuration-property name="runtime.locales" value="he_IL"/>
-  <append-configuration-property name="runtime.locales" value="hi"/>
-  <append-configuration-property name="runtime.locales" value="hi_IN"/>
-  <append-configuration-property name="runtime.locales" value="hr"/>
-  <append-configuration-property name="runtime.locales" value="hr_HR"/>
-  <append-configuration-property name="runtime.locales" value="hu"/>
-  <append-configuration-property name="runtime.locales" value="hu_HU"/>
-  <append-configuration-property name="runtime.locales" value="hy"/>
-  <append-configuration-property name="runtime.locales" value="hy_AM"/>
-  <append-configuration-property name="runtime.locales" value="hy_AM_REVISED"/>
-  <append-configuration-property name="runtime.locales" value="ia"/>
-  <append-configuration-property name="runtime.locales" value="id"/>
-  <append-configuration-property name="runtime.locales" value="id_ID"/>
-  <append-configuration-property name="runtime.locales" value="ig"/>
-  <append-configuration-property name="runtime.locales" value="ig_NG"/>
-  <append-configuration-property name="runtime.locales" value="ii"/>
-  <append-configuration-property name="runtime.locales" value="ii_CN"/>
-  <append-configuration-property name="runtime.locales" value="in"/>
-  <append-configuration-property name="runtime.locales" value="is"/>
-  <append-configuration-property name="runtime.locales" value="is_IS"/>
-  <append-configuration-property name="runtime.locales" value="it"/>
-  <append-configuration-property name="runtime.locales" value="it_CH"/>
-  <append-configuration-property name="runtime.locales" value="it_IT"/>
-  <append-configuration-property name="runtime.locales" value="iu"/>
-  <append-configuration-property name="runtime.locales" value="iw"/>
-  <append-configuration-property name="runtime.locales" value="ja"/>
-  <append-configuration-property name="runtime.locales" value="ja_JP"/>
-  <append-configuration-property name="runtime.locales" value="ka"/>
-  <append-configuration-property name="runtime.locales" value="ka_GE"/>
-  <append-configuration-property name="runtime.locales" value="kaj"/>
-  <append-configuration-property name="runtime.locales" value="kaj_NG"/>
-  <append-configuration-property name="runtime.locales" value="kam"/>
-  <append-configuration-property name="runtime.locales" value="kam_KE"/>
-  <append-configuration-property name="runtime.locales" value="kcg"/>
-  <append-configuration-property name="runtime.locales" value="kcg_NG"/>
-  <append-configuration-property name="runtime.locales" value="kfo"/>
-  <append-configuration-property name="runtime.locales" value="kfo_CI"/>
-  <append-configuration-property name="runtime.locales" value="kk"/>
-  <append-configuration-property name="runtime.locales" value="kk_Cyrl"/>
-  <append-configuration-property name="runtime.locales" value="kk_Cyrl_KZ"/>
-  <append-configuration-property name="runtime.locales" value="kk_KZ"/>
-  <append-configuration-property name="runtime.locales" value="kl"/>
-  <append-configuration-property name="runtime.locales" value="kl_GL"/>
-  <append-configuration-property name="runtime.locales" value="km"/>
-  <append-configuration-property name="runtime.locales" value="km_KH"/>
-  <append-configuration-property name="runtime.locales" value="kn"/>
-  <append-configuration-property name="runtime.locales" value="kn_IN"/>
-  <append-configuration-property name="runtime.locales" value="ko"/>
-  <append-configuration-property name="runtime.locales" value="kok"/>
-  <append-configuration-property name="runtime.locales" value="kok_IN"/>
-  <append-configuration-property name="runtime.locales" value="ko_KR"/>
-  <append-configuration-property name="runtime.locales" value="kpe"/>
-  <append-configuration-property name="runtime.locales" value="kpe_GN"/>
-  <append-configuration-property name="runtime.locales" value="kpe_LR"/>
-  <append-configuration-property name="runtime.locales" value="ku"/>
-  <append-configuration-property name="runtime.locales" value="ku_Arab"/>
-  <append-configuration-property name="runtime.locales" value="ku_Latn"/>
-  <append-configuration-property name="runtime.locales" value="ku_Latn_TR"/>
-  <append-configuration-property name="runtime.locales" value="ku_TR"/>
-  <append-configuration-property name="runtime.locales" value="kw"/>
-  <append-configuration-property name="runtime.locales" value="kw_GB"/>
-  <append-configuration-property name="runtime.locales" value="ky"/>
-  <append-configuration-property name="runtime.locales" value="ky_KG"/>
-  <append-configuration-property name="runtime.locales" value="ln"/>
-  <append-configuration-property name="runtime.locales" value="ln_CD"/>
-  <append-configuration-property name="runtime.locales" value="ln_CG"/>
-  <append-configuration-property name="runtime.locales" value="lo"/>
-  <append-configuration-property name="runtime.locales" value="lo_LA"/>
-  <append-configuration-property name="runtime.locales" value="lt"/>
-  <append-configuration-property name="runtime.locales" value="lt_LT"/>
-  <append-configuration-property name="runtime.locales" value="lv"/>
-  <append-configuration-property name="runtime.locales" value="lv_LV"/>
-  <append-configuration-property name="runtime.locales" value="mk"/>
-  <append-configuration-property name="runtime.locales" value="mk_MK"/>
-  <append-configuration-property name="runtime.locales" value="ml"/>
-  <append-configuration-property name="runtime.locales" value="ml_IN"/>
-  <append-configuration-property name="runtime.locales" value="mn"/>
-  <append-configuration-property name="runtime.locales" value="mn_CN"/>
-  <append-configuration-property name="runtime.locales" value="mn_Cyrl"/>
-  <append-configuration-property name="runtime.locales" value="mn_Cyrl_MN"/>
-  <append-configuration-property name="runtime.locales" value="mn_MN"/>
-  <append-configuration-property name="runtime.locales" value="mn_Mong"/>
-  <append-configuration-property name="runtime.locales" value="mn_Mong_CN"/>
-  <append-configuration-property name="runtime.locales" value="mo"/>
-  <append-configuration-property name="runtime.locales" value="mr"/>
-  <append-configuration-property name="runtime.locales" value="mr_IN"/>
-  <append-configuration-property name="runtime.locales" value="ms"/>
-  <append-configuration-property name="runtime.locales" value="ms_BN"/>
-  <append-configuration-property name="runtime.locales" value="ms_MY"/>
-  <append-configuration-property name="runtime.locales" value="mt"/>
-  <append-configuration-property name="runtime.locales" value="mt_MT"/>
-  <append-configuration-property name="runtime.locales" value="my"/>
-  <append-configuration-property name="runtime.locales" value="my_MM"/>
-  <append-configuration-property name="runtime.locales" value="nb"/>
-  <append-configuration-property name="runtime.locales" value="nb_NO"/>
-  <append-configuration-property name="runtime.locales" value="ne"/>
-  <append-configuration-property name="runtime.locales" value="ne_IN"/>
-  <append-configuration-property name="runtime.locales" value="ne_NP"/>
-  <append-configuration-property name="runtime.locales" value="nl"/>
-  <append-configuration-property name="runtime.locales" value="nl_BE"/>
-  <append-configuration-property name="runtime.locales" value="nl_NL"/>
-  <append-configuration-property name="runtime.locales" value="nn"/>
-  <append-configuration-property name="runtime.locales" value="nn_NO"/>
-  <append-configuration-property name="runtime.locales" value="no"/>
-  <append-configuration-property name="runtime.locales" value="nr"/>
-  <append-configuration-property name="runtime.locales" value="nr_ZA"/>
-  <append-configuration-property name="runtime.locales" value="nso"/>
-  <append-configuration-property name="runtime.locales" value="nso_ZA"/>
-  <append-configuration-property name="runtime.locales" value="ny"/>
-  <append-configuration-property name="runtime.locales" value="ny_MW"/>
-  <append-configuration-property name="runtime.locales" value="om"/>
-  <append-configuration-property name="runtime.locales" value="om_ET"/>
-  <append-configuration-property name="runtime.locales" value="om_KE"/>
-  <append-configuration-property name="runtime.locales" value="or"/>
-  <append-configuration-property name="runtime.locales" value="or_IN"/>
-  <append-configuration-property name="runtime.locales" value="pa"/>
-  <append-configuration-property name="runtime.locales" value="pa_Arab"/>
-  <append-configuration-property name="runtime.locales" value="pa_Arab_PK"/>
-  <append-configuration-property name="runtime.locales" value="pa_Guru"/>
-  <append-configuration-property name="runtime.locales" value="pa_Guru_IN"/>
-  <append-configuration-property name="runtime.locales" value="pa_IN"/>
-  <append-configuration-property name="runtime.locales" value="pa_PK"/>
-  <append-configuration-property name="runtime.locales" value="pl"/>
-  <append-configuration-property name="runtime.locales" value="pl_PL"/>
-  <append-configuration-property name="runtime.locales" value="ps"/>
-  <append-configuration-property name="runtime.locales" value="ps_AF"/>
-  <append-configuration-property name="runtime.locales" value="pt"/>
-  <append-configuration-property name="runtime.locales" value="pt_BR"/>
-  <append-configuration-property name="runtime.locales" value="pt_PT"/>
-  <append-configuration-property name="runtime.locales" value="ro"/>
-  <append-configuration-property name="runtime.locales" value="ro_MD"/>
-  <append-configuration-property name="runtime.locales" value="root"/>
-  <append-configuration-property name="runtime.locales" value="ro_RO"/>
-  <append-configuration-property name="runtime.locales" value="ru"/>
-  <append-configuration-property name="runtime.locales" value="ru_RU"/>
-  <append-configuration-property name="runtime.locales" value="ru_UA"/>
-  <append-configuration-property name="runtime.locales" value="rw"/>
-  <append-configuration-property name="runtime.locales" value="rw_RW"/>
-  <append-configuration-property name="runtime.locales" value="sa"/>
-  <append-configuration-property name="runtime.locales" value="sa_IN"/>
-  <append-configuration-property name="runtime.locales" value="se"/>
-  <append-configuration-property name="runtime.locales" value="se_FI"/>
-  <append-configuration-property name="runtime.locales" value="se_NO"/>
-  <append-configuration-property name="runtime.locales" value="sh"/>
-  <append-configuration-property name="runtime.locales" value="sh_BA"/>
-  <append-configuration-property name="runtime.locales" value="sh_CS"/>
-  <append-configuration-property name="runtime.locales" value="sh_YU"/>
-  <append-configuration-property name="runtime.locales" value="si"/>
-  <append-configuration-property name="runtime.locales" value="sid"/>
-  <append-configuration-property name="runtime.locales" value="sid_ET"/>
-  <append-configuration-property name="runtime.locales" value="si_LK"/>
-  <append-configuration-property name="runtime.locales" value="sk"/>
-  <append-configuration-property name="runtime.locales" value="sk_SK"/>
-  <append-configuration-property name="runtime.locales" value="sl"/>
-  <append-configuration-property name="runtime.locales" value="sl_SI"/>
-  <append-configuration-property name="runtime.locales" value="so"/>
-  <append-configuration-property name="runtime.locales" value="so_DJ"/>
-  <append-configuration-property name="runtime.locales" value="so_ET"/>
-  <append-configuration-property name="runtime.locales" value="so_KE"/>
-  <append-configuration-property name="runtime.locales" value="so_SO"/>
-  <append-configuration-property name="runtime.locales" value="sq"/>
-  <append-configuration-property name="runtime.locales" value="sq_AL"/>
-  <append-configuration-property name="runtime.locales" value="sr"/>
-  <append-configuration-property name="runtime.locales" value="sr_BA"/>
-  <append-configuration-property name="runtime.locales" value="sr_CS"/>
-  <append-configuration-property name="runtime.locales" value="sr_Cyrl"/>
-  <append-configuration-property name="runtime.locales" value="sr_Cyrl_BA"/>
-  <append-configuration-property name="runtime.locales" value="sr_Cyrl_CS"/>
-  <append-configuration-property name="runtime.locales" value="sr_Cyrl_ME"/>
-  <append-configuration-property name="runtime.locales" value="sr_Cyrl_RS"/>
-  <append-configuration-property name="runtime.locales" value="sr_Cyrl_YU"/>
-  <append-configuration-property name="runtime.locales" value="sr_Latn"/>
-  <append-configuration-property name="runtime.locales" value="sr_Latn_BA"/>
-  <append-configuration-property name="runtime.locales" value="sr_Latn_CS"/>
-  <append-configuration-property name="runtime.locales" value="sr_Latn_ME"/>
-  <append-configuration-property name="runtime.locales" value="sr_Latn_RS"/>
-  <append-configuration-property name="runtime.locales" value="sr_Latn_YU"/>
-  <append-configuration-property name="runtime.locales" value="sr_ME"/>
-  <append-configuration-property name="runtime.locales" value="sr_RS"/>
-  <append-configuration-property name="runtime.locales" value="sr_YU"/>
-  <append-configuration-property name="runtime.locales" value="ss"/>
-  <append-configuration-property name="runtime.locales" value="ss_SZ"/>
-  <append-configuration-property name="runtime.locales" value="ss_ZA"/>
-  <append-configuration-property name="runtime.locales" value="st"/>
-  <append-configuration-property name="runtime.locales" value="st_LS"/>
-  <append-configuration-property name="runtime.locales" value="st_ZA"/>
-  <append-configuration-property name="runtime.locales" value="sv"/>
-  <append-configuration-property name="runtime.locales" value="sv_FI"/>
-  <append-configuration-property name="runtime.locales" value="sv_SE"/>
-  <append-configuration-property name="runtime.locales" value="sw"/>
-  <append-configuration-property name="runtime.locales" value="sw_KE"/>
-  <append-configuration-property name="runtime.locales" value="sw_TZ"/>
-  <append-configuration-property name="runtime.locales" value="syr"/>
-  <append-configuration-property name="runtime.locales" value="syr_SY"/>
-  <append-configuration-property name="runtime.locales" value="ta"/>
-  <append-configuration-property name="runtime.locales" value="ta_IN"/>
-  <append-configuration-property name="runtime.locales" value="te"/>
-  <append-configuration-property name="runtime.locales" value="te_IN"/>
-  <append-configuration-property name="runtime.locales" value="tg"/>
-  <append-configuration-property name="runtime.locales" value="tg_Cyrl"/>
-  <append-configuration-property name="runtime.locales" value="tg_Cyrl_TJ"/>
-  <append-configuration-property name="runtime.locales" value="tg_TJ"/>
-  <append-configuration-property name="runtime.locales" value="th"/>
-  <append-configuration-property name="runtime.locales" value="th_TH"/>
-  <append-configuration-property name="runtime.locales" value="ti"/>
-  <append-configuration-property name="runtime.locales" value="ti_ER"/>
-  <append-configuration-property name="runtime.locales" value="ti_ET"/>
-  <append-configuration-property name="runtime.locales" value="tig"/>
-  <append-configuration-property name="runtime.locales" value="tig_ER"/>
-  <append-configuration-property name="runtime.locales" value="tl"/>
-  <append-configuration-property name="runtime.locales" value="tn"/>
-  <append-configuration-property name="runtime.locales" value="tn_ZA"/>
-  <append-configuration-property name="runtime.locales" value="to"/>
-  <append-configuration-property name="runtime.locales" value="to_TO"/>
-  <append-configuration-property name="runtime.locales" value="tr"/>
-  <append-configuration-property name="runtime.locales" value="tr_TR"/>
-  <append-configuration-property name="runtime.locales" value="trv"/>
-  <append-configuration-property name="runtime.locales" value="ts"/>
-  <append-configuration-property name="runtime.locales" value="ts_ZA"/>
-  <append-configuration-property name="runtime.locales" value="tt"/>
-  <append-configuration-property name="runtime.locales" value="tt_RU"/>
-  <append-configuration-property name="runtime.locales" value="ug"/>
-  <append-configuration-property name="runtime.locales" value="ug_Arab"/>
-  <append-configuration-property name="runtime.locales" value="ug_Arab_CN"/>
-  <append-configuration-property name="runtime.locales" value="ug_CN"/>
-  <append-configuration-property name="runtime.locales" value="uk"/>
-  <append-configuration-property name="runtime.locales" value="uk_UA"/>
-  <append-configuration-property name="runtime.locales" value="ur"/>
-  <append-configuration-property name="runtime.locales" value="ur_IN"/>
-  <append-configuration-property name="runtime.locales" value="ur_PK"/>
-  <append-configuration-property name="runtime.locales" value="uz"/>
-  <append-configuration-property name="runtime.locales" value="uz_AF"/>
-  <append-configuration-property name="runtime.locales" value="uz_Arab"/>
-  <append-configuration-property name="runtime.locales" value="uz_Arab_AF"/>
-  <append-configuration-property name="runtime.locales" value="uz_Cyrl"/>
-  <append-configuration-property name="runtime.locales" value="uz_Cyrl_UZ"/>
-  <append-configuration-property name="runtime.locales" value="uz_Latn"/>
-  <append-configuration-property name="runtime.locales" value="uz_Latn_UZ"/>
-  <append-configuration-property name="runtime.locales" value="uz_UZ"/>
-  <append-configuration-property name="runtime.locales" value="ve"/>
-  <append-configuration-property name="runtime.locales" value="ve_ZA"/>
-  <append-configuration-property name="runtime.locales" value="vi"/>
-  <append-configuration-property name="runtime.locales" value="vi_VN"/>
-  <append-configuration-property name="runtime.locales" value="wal"/>
-  <append-configuration-property name="runtime.locales" value="wal_ET"/>
-  <append-configuration-property name="runtime.locales" value="wo"/>
-  <append-configuration-property name="runtime.locales" value="wo_Latn"/>
-  <append-configuration-property name="runtime.locales" value="wo_Latn_SN"/>
-  <append-configuration-property name="runtime.locales" value="wo_SN"/>
-  <append-configuration-property name="runtime.locales" value="xh"/>
-  <append-configuration-property name="runtime.locales" value="xh_ZA"/>
-  <append-configuration-property name="runtime.locales" value="yo"/>
-  <append-configuration-property name="runtime.locales" value="yo_NG"/>
-  <append-configuration-property name="runtime.locales" value="zh"/>
-  <append-configuration-property name="runtime.locales" value="zh_CN"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hans"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hans_CN"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hans_HK"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hans_MO"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hans_SG"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hant"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hant_HK"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hant_MO"/>
-  <append-configuration-property name="runtime.locales" value="zh_Hant_TW"/>
-  <append-configuration-property name="runtime.locales" value="zh_HK"/>
-  <append-configuration-property name="runtime.locales" value="zh_MO"/>
-  <append-configuration-property name="runtime.locales" value="zh_SG"/>
-  <append-configuration-property name="runtime.locales" value="zh_TW"/>
-  <append-configuration-property name="runtime.locales" value="zu"/>
-  <append-configuration-property name="runtime.locales" value="zu_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="en_VI"/>
+  <extend-configuration-property name="runtime.locales" value="en_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="en_ZW"/>
+  <extend-configuration-property name="runtime.locales" value="eo"/>
+  <extend-configuration-property name="runtime.locales" value="es"/>
+  <extend-configuration-property name="runtime.locales" value="es_AR"/>
+  <extend-configuration-property name="runtime.locales" value="es_BO"/>
+  <extend-configuration-property name="runtime.locales" value="es_CL"/>
+  <extend-configuration-property name="runtime.locales" value="es_CO"/>
+  <extend-configuration-property name="runtime.locales" value="es_CR"/>
+  <extend-configuration-property name="runtime.locales" value="es_DO"/>
+  <extend-configuration-property name="runtime.locales" value="es_EC"/>
+  <extend-configuration-property name="runtime.locales" value="es_ES"/>
+  <extend-configuration-property name="runtime.locales" value="es_GT"/>
+  <extend-configuration-property name="runtime.locales" value="es_HN"/>
+  <extend-configuration-property name="runtime.locales" value="es_MX"/>
+  <extend-configuration-property name="runtime.locales" value="es_NI"/>
+  <extend-configuration-property name="runtime.locales" value="es_PA"/>
+  <extend-configuration-property name="runtime.locales" value="es_PE"/>
+  <extend-configuration-property name="runtime.locales" value="es_PR"/>
+  <extend-configuration-property name="runtime.locales" value="es_PY"/>
+  <extend-configuration-property name="runtime.locales" value="es_SV"/>
+  <extend-configuration-property name="runtime.locales" value="es_US"/>
+  <extend-configuration-property name="runtime.locales" value="es_UY"/>
+  <extend-configuration-property name="runtime.locales" value="es_VE"/>
+  <extend-configuration-property name="runtime.locales" value="et"/>
+  <extend-configuration-property name="runtime.locales" value="et_EE"/>
+  <extend-configuration-property name="runtime.locales" value="eu"/>
+  <extend-configuration-property name="runtime.locales" value="eu_ES"/>
+  <extend-configuration-property name="runtime.locales" value="fa"/>
+  <extend-configuration-property name="runtime.locales" value="fa_AF"/>
+  <extend-configuration-property name="runtime.locales" value="fa_IR"/>
+  <extend-configuration-property name="runtime.locales" value="fi"/>
+  <extend-configuration-property name="runtime.locales" value="fi_FI"/>
+  <extend-configuration-property name="runtime.locales" value="fil"/>
+  <extend-configuration-property name="runtime.locales" value="fil_PH"/>
+  <extend-configuration-property name="runtime.locales" value="fo"/>
+  <extend-configuration-property name="runtime.locales" value="fo_FO"/>
+  <extend-configuration-property name="runtime.locales" value="fr"/>
+  <extend-configuration-property name="runtime.locales" value="fr_BE"/>
+  <extend-configuration-property name="runtime.locales" value="fr_CA"/>
+  <extend-configuration-property name="runtime.locales" value="fr_CH"/>
+  <extend-configuration-property name="runtime.locales" value="fr_FR"/>
+  <extend-configuration-property name="runtime.locales" value="fr_LU"/>
+  <extend-configuration-property name="runtime.locales" value="fr_MC"/>
+  <extend-configuration-property name="runtime.locales" value="fr_SN"/>
+  <extend-configuration-property name="runtime.locales" value="fur"/>
+  <extend-configuration-property name="runtime.locales" value="fur_IT"/>
+  <extend-configuration-property name="runtime.locales" value="ga"/>
+  <extend-configuration-property name="runtime.locales" value="gaa"/>
+  <extend-configuration-property name="runtime.locales" value="gaa_GH"/>
+  <extend-configuration-property name="runtime.locales" value="ga_IE"/>
+  <extend-configuration-property name="runtime.locales" value="gez"/>
+  <extend-configuration-property name="runtime.locales" value="gez_ER"/>
+  <extend-configuration-property name="runtime.locales" value="gez_ET"/>
+  <extend-configuration-property name="runtime.locales" value="gl"/>
+  <extend-configuration-property name="runtime.locales" value="gl_ES"/>
+  <extend-configuration-property name="runtime.locales" value="gu"/>
+  <extend-configuration-property name="runtime.locales" value="gu_IN"/>
+  <extend-configuration-property name="runtime.locales" value="gv"/>
+  <extend-configuration-property name="runtime.locales" value="gv_GB"/>
+  <extend-configuration-property name="runtime.locales" value="ha"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Arab"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Arab_NG"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Arab_SD"/>
+  <extend-configuration-property name="runtime.locales" value="ha_GH"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Latn"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Latn_GH"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Latn_NE"/>
+  <extend-configuration-property name="runtime.locales" value="ha_Latn_NG"/>
+  <extend-configuration-property name="runtime.locales" value="ha_NE"/>
+  <extend-configuration-property name="runtime.locales" value="ha_NG"/>
+  <extend-configuration-property name="runtime.locales" value="ha_SD"/>
+  <extend-configuration-property name="runtime.locales" value="haw"/>
+  <extend-configuration-property name="runtime.locales" value="haw_US"/>
+  <extend-configuration-property name="runtime.locales" value="he"/>
+  <extend-configuration-property name="runtime.locales" value="he_IL"/>
+  <extend-configuration-property name="runtime.locales" value="hi"/>
+  <extend-configuration-property name="runtime.locales" value="hi_IN"/>
+  <extend-configuration-property name="runtime.locales" value="hr"/>
+  <extend-configuration-property name="runtime.locales" value="hr_HR"/>
+  <extend-configuration-property name="runtime.locales" value="hu"/>
+  <extend-configuration-property name="runtime.locales" value="hu_HU"/>
+  <extend-configuration-property name="runtime.locales" value="hy"/>
+  <extend-configuration-property name="runtime.locales" value="hy_AM"/>
+  <extend-configuration-property name="runtime.locales" value="hy_AM_REVISED"/>
+  <extend-configuration-property name="runtime.locales" value="ia"/>
+  <extend-configuration-property name="runtime.locales" value="id"/>
+  <extend-configuration-property name="runtime.locales" value="id_ID"/>
+  <extend-configuration-property name="runtime.locales" value="ig"/>
+  <extend-configuration-property name="runtime.locales" value="ig_NG"/>
+  <extend-configuration-property name="runtime.locales" value="ii"/>
+  <extend-configuration-property name="runtime.locales" value="ii_CN"/>
+  <extend-configuration-property name="runtime.locales" value="in"/>
+  <extend-configuration-property name="runtime.locales" value="is"/>
+  <extend-configuration-property name="runtime.locales" value="is_IS"/>
+  <extend-configuration-property name="runtime.locales" value="it"/>
+  <extend-configuration-property name="runtime.locales" value="it_CH"/>
+  <extend-configuration-property name="runtime.locales" value="it_IT"/>
+  <extend-configuration-property name="runtime.locales" value="iu"/>
+  <extend-configuration-property name="runtime.locales" value="iw"/>
+  <extend-configuration-property name="runtime.locales" value="ja"/>
+  <extend-configuration-property name="runtime.locales" value="ja_JP"/>
+  <extend-configuration-property name="runtime.locales" value="ka"/>
+  <extend-configuration-property name="runtime.locales" value="ka_GE"/>
+  <extend-configuration-property name="runtime.locales" value="kaj"/>
+  <extend-configuration-property name="runtime.locales" value="kaj_NG"/>
+  <extend-configuration-property name="runtime.locales" value="kam"/>
+  <extend-configuration-property name="runtime.locales" value="kam_KE"/>
+  <extend-configuration-property name="runtime.locales" value="kcg"/>
+  <extend-configuration-property name="runtime.locales" value="kcg_NG"/>
+  <extend-configuration-property name="runtime.locales" value="kfo"/>
+  <extend-configuration-property name="runtime.locales" value="kfo_CI"/>
+  <extend-configuration-property name="runtime.locales" value="kk"/>
+  <extend-configuration-property name="runtime.locales" value="kk_Cyrl"/>
+  <extend-configuration-property name="runtime.locales" value="kk_Cyrl_KZ"/>
+  <extend-configuration-property name="runtime.locales" value="kk_KZ"/>
+  <extend-configuration-property name="runtime.locales" value="kl"/>
+  <extend-configuration-property name="runtime.locales" value="kl_GL"/>
+  <extend-configuration-property name="runtime.locales" value="km"/>
+  <extend-configuration-property name="runtime.locales" value="km_KH"/>
+  <extend-configuration-property name="runtime.locales" value="kn"/>
+  <extend-configuration-property name="runtime.locales" value="kn_IN"/>
+  <extend-configuration-property name="runtime.locales" value="ko"/>
+  <extend-configuration-property name="runtime.locales" value="kok"/>
+  <extend-configuration-property name="runtime.locales" value="kok_IN"/>
+  <extend-configuration-property name="runtime.locales" value="ko_KR"/>
+  <extend-configuration-property name="runtime.locales" value="kpe"/>
+  <extend-configuration-property name="runtime.locales" value="kpe_GN"/>
+  <extend-configuration-property name="runtime.locales" value="kpe_LR"/>
+  <extend-configuration-property name="runtime.locales" value="ku"/>
+  <extend-configuration-property name="runtime.locales" value="ku_Arab"/>
+  <extend-configuration-property name="runtime.locales" value="ku_Latn"/>
+  <extend-configuration-property name="runtime.locales" value="ku_Latn_TR"/>
+  <extend-configuration-property name="runtime.locales" value="ku_TR"/>
+  <extend-configuration-property name="runtime.locales" value="kw"/>
+  <extend-configuration-property name="runtime.locales" value="kw_GB"/>
+  <extend-configuration-property name="runtime.locales" value="ky"/>
+  <extend-configuration-property name="runtime.locales" value="ky_KG"/>
+  <extend-configuration-property name="runtime.locales" value="ln"/>
+  <extend-configuration-property name="runtime.locales" value="ln_CD"/>
+  <extend-configuration-property name="runtime.locales" value="ln_CG"/>
+  <extend-configuration-property name="runtime.locales" value="lo"/>
+  <extend-configuration-property name="runtime.locales" value="lo_LA"/>
+  <extend-configuration-property name="runtime.locales" value="lt"/>
+  <extend-configuration-property name="runtime.locales" value="lt_LT"/>
+  <extend-configuration-property name="runtime.locales" value="lv"/>
+  <extend-configuration-property name="runtime.locales" value="lv_LV"/>
+  <extend-configuration-property name="runtime.locales" value="mk"/>
+  <extend-configuration-property name="runtime.locales" value="mk_MK"/>
+  <extend-configuration-property name="runtime.locales" value="ml"/>
+  <extend-configuration-property name="runtime.locales" value="ml_IN"/>
+  <extend-configuration-property name="runtime.locales" value="mn"/>
+  <extend-configuration-property name="runtime.locales" value="mn_CN"/>
+  <extend-configuration-property name="runtime.locales" value="mn_Cyrl"/>
+  <extend-configuration-property name="runtime.locales" value="mn_Cyrl_MN"/>
+  <extend-configuration-property name="runtime.locales" value="mn_MN"/>
+  <extend-configuration-property name="runtime.locales" value="mn_Mong"/>
+  <extend-configuration-property name="runtime.locales" value="mn_Mong_CN"/>
+  <extend-configuration-property name="runtime.locales" value="mo"/>
+  <extend-configuration-property name="runtime.locales" value="mr"/>
+  <extend-configuration-property name="runtime.locales" value="mr_IN"/>
+  <extend-configuration-property name="runtime.locales" value="ms"/>
+  <extend-configuration-property name="runtime.locales" value="ms_BN"/>
+  <extend-configuration-property name="runtime.locales" value="ms_MY"/>
+  <extend-configuration-property name="runtime.locales" value="mt"/>
+  <extend-configuration-property name="runtime.locales" value="mt_MT"/>
+  <extend-configuration-property name="runtime.locales" value="my"/>
+  <extend-configuration-property name="runtime.locales" value="my_MM"/>
+  <extend-configuration-property name="runtime.locales" value="nb"/>
+  <extend-configuration-property name="runtime.locales" value="nb_NO"/>
+  <extend-configuration-property name="runtime.locales" value="ne"/>
+  <extend-configuration-property name="runtime.locales" value="ne_IN"/>
+  <extend-configuration-property name="runtime.locales" value="ne_NP"/>
+  <extend-configuration-property name="runtime.locales" value="nl"/>
+  <extend-configuration-property name="runtime.locales" value="nl_BE"/>
+  <extend-configuration-property name="runtime.locales" value="nl_NL"/>
+  <extend-configuration-property name="runtime.locales" value="nn"/>
+  <extend-configuration-property name="runtime.locales" value="nn_NO"/>
+  <extend-configuration-property name="runtime.locales" value="no"/>
+  <extend-configuration-property name="runtime.locales" value="nr"/>
+  <extend-configuration-property name="runtime.locales" value="nr_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="nso"/>
+  <extend-configuration-property name="runtime.locales" value="nso_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="ny"/>
+  <extend-configuration-property name="runtime.locales" value="ny_MW"/>
+  <extend-configuration-property name="runtime.locales" value="om"/>
+  <extend-configuration-property name="runtime.locales" value="om_ET"/>
+  <extend-configuration-property name="runtime.locales" value="om_KE"/>
+  <extend-configuration-property name="runtime.locales" value="or"/>
+  <extend-configuration-property name="runtime.locales" value="or_IN"/>
+  <extend-configuration-property name="runtime.locales" value="pa"/>
+  <extend-configuration-property name="runtime.locales" value="pa_Arab"/>
+  <extend-configuration-property name="runtime.locales" value="pa_Arab_PK"/>
+  <extend-configuration-property name="runtime.locales" value="pa_Guru"/>
+  <extend-configuration-property name="runtime.locales" value="pa_Guru_IN"/>
+  <extend-configuration-property name="runtime.locales" value="pa_IN"/>
+  <extend-configuration-property name="runtime.locales" value="pa_PK"/>
+  <extend-configuration-property name="runtime.locales" value="pl"/>
+  <extend-configuration-property name="runtime.locales" value="pl_PL"/>
+  <extend-configuration-property name="runtime.locales" value="ps"/>
+  <extend-configuration-property name="runtime.locales" value="ps_AF"/>
+  <extend-configuration-property name="runtime.locales" value="pt"/>
+  <extend-configuration-property name="runtime.locales" value="pt_BR"/>
+  <extend-configuration-property name="runtime.locales" value="pt_PT"/>
+  <extend-configuration-property name="runtime.locales" value="ro"/>
+  <extend-configuration-property name="runtime.locales" value="ro_MD"/>
+  <extend-configuration-property name="runtime.locales" value="root"/>
+  <extend-configuration-property name="runtime.locales" value="ro_RO"/>
+  <extend-configuration-property name="runtime.locales" value="ru"/>
+  <extend-configuration-property name="runtime.locales" value="ru_RU"/>
+  <extend-configuration-property name="runtime.locales" value="ru_UA"/>
+  <extend-configuration-property name="runtime.locales" value="rw"/>
+  <extend-configuration-property name="runtime.locales" value="rw_RW"/>
+  <extend-configuration-property name="runtime.locales" value="sa"/>
+  <extend-configuration-property name="runtime.locales" value="sa_IN"/>
+  <extend-configuration-property name="runtime.locales" value="se"/>
+  <extend-configuration-property name="runtime.locales" value="se_FI"/>
+  <extend-configuration-property name="runtime.locales" value="se_NO"/>
+  <extend-configuration-property name="runtime.locales" value="sh"/>
+  <extend-configuration-property name="runtime.locales" value="sh_BA"/>
+  <extend-configuration-property name="runtime.locales" value="sh_CS"/>
+  <extend-configuration-property name="runtime.locales" value="sh_YU"/>
+  <extend-configuration-property name="runtime.locales" value="si"/>
+  <extend-configuration-property name="runtime.locales" value="sid"/>
+  <extend-configuration-property name="runtime.locales" value="sid_ET"/>
+  <extend-configuration-property name="runtime.locales" value="si_LK"/>
+  <extend-configuration-property name="runtime.locales" value="sk"/>
+  <extend-configuration-property name="runtime.locales" value="sk_SK"/>
+  <extend-configuration-property name="runtime.locales" value="sl"/>
+  <extend-configuration-property name="runtime.locales" value="sl_SI"/>
+  <extend-configuration-property name="runtime.locales" value="so"/>
+  <extend-configuration-property name="runtime.locales" value="so_DJ"/>
+  <extend-configuration-property name="runtime.locales" value="so_ET"/>
+  <extend-configuration-property name="runtime.locales" value="so_KE"/>
+  <extend-configuration-property name="runtime.locales" value="so_SO"/>
+  <extend-configuration-property name="runtime.locales" value="sq"/>
+  <extend-configuration-property name="runtime.locales" value="sq_AL"/>
+  <extend-configuration-property name="runtime.locales" value="sr"/>
+  <extend-configuration-property name="runtime.locales" value="sr_BA"/>
+  <extend-configuration-property name="runtime.locales" value="sr_CS"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Cyrl"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Cyrl_BA"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Cyrl_CS"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Cyrl_ME"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Cyrl_RS"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Cyrl_YU"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Latn"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Latn_BA"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Latn_CS"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Latn_ME"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Latn_RS"/>
+  <extend-configuration-property name="runtime.locales" value="sr_Latn_YU"/>
+  <extend-configuration-property name="runtime.locales" value="sr_ME"/>
+  <extend-configuration-property name="runtime.locales" value="sr_RS"/>
+  <extend-configuration-property name="runtime.locales" value="sr_YU"/>
+  <extend-configuration-property name="runtime.locales" value="ss"/>
+  <extend-configuration-property name="runtime.locales" value="ss_SZ"/>
+  <extend-configuration-property name="runtime.locales" value="ss_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="st"/>
+  <extend-configuration-property name="runtime.locales" value="st_LS"/>
+  <extend-configuration-property name="runtime.locales" value="st_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="sv"/>
+  <extend-configuration-property name="runtime.locales" value="sv_FI"/>
+  <extend-configuration-property name="runtime.locales" value="sv_SE"/>
+  <extend-configuration-property name="runtime.locales" value="sw"/>
+  <extend-configuration-property name="runtime.locales" value="sw_KE"/>
+  <extend-configuration-property name="runtime.locales" value="sw_TZ"/>
+  <extend-configuration-property name="runtime.locales" value="syr"/>
+  <extend-configuration-property name="runtime.locales" value="syr_SY"/>
+  <extend-configuration-property name="runtime.locales" value="ta"/>
+  <extend-configuration-property name="runtime.locales" value="ta_IN"/>
+  <extend-configuration-property name="runtime.locales" value="te"/>
+  <extend-configuration-property name="runtime.locales" value="te_IN"/>
+  <extend-configuration-property name="runtime.locales" value="tg"/>
+  <extend-configuration-property name="runtime.locales" value="tg_Cyrl"/>
+  <extend-configuration-property name="runtime.locales" value="tg_Cyrl_TJ"/>
+  <extend-configuration-property name="runtime.locales" value="tg_TJ"/>
+  <extend-configuration-property name="runtime.locales" value="th"/>
+  <extend-configuration-property name="runtime.locales" value="th_TH"/>
+  <extend-configuration-property name="runtime.locales" value="ti"/>
+  <extend-configuration-property name="runtime.locales" value="ti_ER"/>
+  <extend-configuration-property name="runtime.locales" value="ti_ET"/>
+  <extend-configuration-property name="runtime.locales" value="tig"/>
+  <extend-configuration-property name="runtime.locales" value="tig_ER"/>
+  <extend-configuration-property name="runtime.locales" value="tl"/>
+  <extend-configuration-property name="runtime.locales" value="tn"/>
+  <extend-configuration-property name="runtime.locales" value="tn_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="to"/>
+  <extend-configuration-property name="runtime.locales" value="to_TO"/>
+  <extend-configuration-property name="runtime.locales" value="tr"/>
+  <extend-configuration-property name="runtime.locales" value="tr_TR"/>
+  <extend-configuration-property name="runtime.locales" value="trv"/>
+  <extend-configuration-property name="runtime.locales" value="ts"/>
+  <extend-configuration-property name="runtime.locales" value="ts_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="tt"/>
+  <extend-configuration-property name="runtime.locales" value="tt_RU"/>
+  <extend-configuration-property name="runtime.locales" value="ug"/>
+  <extend-configuration-property name="runtime.locales" value="ug_Arab"/>
+  <extend-configuration-property name="runtime.locales" value="ug_Arab_CN"/>
+  <extend-configuration-property name="runtime.locales" value="ug_CN"/>
+  <extend-configuration-property name="runtime.locales" value="uk"/>
+  <extend-configuration-property name="runtime.locales" value="uk_UA"/>
+  <extend-configuration-property name="runtime.locales" value="ur"/>
+  <extend-configuration-property name="runtime.locales" value="ur_IN"/>
+  <extend-configuration-property name="runtime.locales" value="ur_PK"/>
+  <extend-configuration-property name="runtime.locales" value="uz"/>
+  <extend-configuration-property name="runtime.locales" value="uz_AF"/>
+  <extend-configuration-property name="runtime.locales" value="uz_Arab"/>
+  <extend-configuration-property name="runtime.locales" value="uz_Arab_AF"/>
+  <extend-configuration-property name="runtime.locales" value="uz_Cyrl"/>
+  <extend-configuration-property name="runtime.locales" value="uz_Cyrl_UZ"/>
+  <extend-configuration-property name="runtime.locales" value="uz_Latn"/>
+  <extend-configuration-property name="runtime.locales" value="uz_Latn_UZ"/>
+  <extend-configuration-property name="runtime.locales" value="uz_UZ"/>
+  <extend-configuration-property name="runtime.locales" value="ve"/>
+  <extend-configuration-property name="runtime.locales" value="ve_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="vi"/>
+  <extend-configuration-property name="runtime.locales" value="vi_VN"/>
+  <extend-configuration-property name="runtime.locales" value="wal"/>
+  <extend-configuration-property name="runtime.locales" value="wal_ET"/>
+  <extend-configuration-property name="runtime.locales" value="wo"/>
+  <extend-configuration-property name="runtime.locales" value="wo_Latn"/>
+  <extend-configuration-property name="runtime.locales" value="wo_Latn_SN"/>
+  <extend-configuration-property name="runtime.locales" value="wo_SN"/>
+  <extend-configuration-property name="runtime.locales" value="xh"/>
+  <extend-configuration-property name="runtime.locales" value="xh_ZA"/>
+  <extend-configuration-property name="runtime.locales" value="yo"/>
+  <extend-configuration-property name="runtime.locales" value="yo_NG"/>
+  <extend-configuration-property name="runtime.locales" value="zh"/>
+  <extend-configuration-property name="runtime.locales" value="zh_CN"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hans"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hans_CN"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hans_HK"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hans_MO"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hans_SG"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hant"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hant_HK"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hant_MO"/>
+  <extend-configuration-property name="runtime.locales" value="zh_Hant_TW"/>
+  <extend-configuration-property name="runtime.locales" value="zh_HK"/>
+  <extend-configuration-property name="runtime.locales" value="zh_MO"/>
+  <extend-configuration-property name="runtime.locales" value="zh_SG"/>
+  <extend-configuration-property name="runtime.locales" value="zh_TW"/>
+  <extend-configuration-property name="runtime.locales" value="zu"/>
+  <extend-configuration-property name="runtime.locales" value="zu_ZA"/>
 </module>
diff --git a/user/src/com/google/gwt/i18n/I18N.gwt.xml b/user/src/com/google/gwt/i18n/I18N.gwt.xml
index 24202d8..9ce67a7 100644
--- a/user/src/com/google/gwt/i18n/I18N.gwt.xml
+++ b/user/src/com/google/gwt/i18n/I18N.gwt.xml
@@ -89,5 +89,6 @@
       currency data will support runtime locales - everything else will just
       reference the compile-time locale set in the "locale" property. 
    -->
+  <define-configuration-property name="runtime.locales" is-multi-valued="true"/>
   <set-configuration-property name="runtime.locales" value=""/>
 </module>
diff --git a/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java b/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java
index d399cc1..36425c4 100644
--- a/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java
+++ b/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java
@@ -16,7 +16,9 @@
 package com.google.gwt.i18n.rebind;
 
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.i18n.server.GwtLocaleFactoryImpl;
 import com.google.gwt.i18n.shared.GwtLocale;
@@ -24,7 +26,9 @@
 
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.SortedSet;
 
 /**
  * Utility methods for dealing with locales.
@@ -114,7 +118,11 @@
    */
   public static void init(TreeLogger logger, PropertyOracle propertyOracle) {
     try {
-      String localeName = propertyOracle.getPropertyValue(logger, PROP_LOCALE);
+      SelectionProperty localeProp
+          = propertyOracle.getSelectionProperty(logger, PROP_LOCALE);
+      String localeName = localeProp.getCurrentValue();
+      SortedSet<String> localeValues = localeProp.getPossibleValues();
+
       GwtLocale newCompileLocale = factory.fromString(localeName);
       if (newCompileLocale.equals(compileLocale)) {
         return;
@@ -123,17 +131,16 @@
       allLocales.clear();
       allCompileLocales.clear();
       runtimeLocales.clear();
-      String[] localeValues = propertyOracle.getPropertyValueSet(logger,
-          PROP_LOCALE);
-      String rtLocaleNames = propertyOracle.getPropertyValue(logger,
-          PROP_RUNTIME_LOCALES);
       for (String localeValue : localeValues) {
         allCompileLocales.add(factory.fromString(localeValue));
       }
       allLocales.addAll(allCompileLocales);
-      if (rtLocaleNames != null && rtLocaleNames.length() > 0) {
-        String[] rtLocales = rtLocaleNames.split(",");
-        for (String rtLocale : rtLocales) {
+      
+      ConfigurationProperty prop
+          = propertyOracle.getConfigurationProperty(PROP_RUNTIME_LOCALES);
+      List<String> rtLocaleNames = prop.getValues();
+      if (rtLocaleNames != null) {
+        for (String rtLocale : rtLocaleNames) {
           GwtLocale locale = factory.fromString(rtLocale);
           // TODO(jat): remove use of labels
           existingLocales:
diff --git a/user/src/com/google/gwt/i18n/rebind/LocalizableGenerator.java b/user/src/com/google/gwt/i18n/rebind/LocalizableGenerator.java
index 64ed8e0..0e3f4fd 100644
--- a/user/src/com/google/gwt/i18n/rebind/LocalizableGenerator.java
+++ b/user/src/com/google/gwt/i18n/rebind/LocalizableGenerator.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -87,7 +88,9 @@
       // If the locale is not specified by the user as a request parameter
       // or via a meta tag, or if the locale is formatted incorrectly,
       // getPropertyValue() will return "default".
-      locale = propertyOracle.getPropertyValue(logger, PROP_LOCALE);
+      SelectionProperty localeProp
+          = propertyOracle.getSelectionProperty(logger, PROP_LOCALE);
+      locale = localeProp.getCurrentValue();
     } catch (BadPropertyValueException e) {
       logger.log(TreeLogger.ERROR, "Could not parse specified locale", e);
       throw new UnableToCompleteException();
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index c421faa..2a11a2b 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -668,8 +668,9 @@
       currentModule.clearEntryPoints();
       currentModule.addEntryPointTypeName(GWTRunner.class.getName());
       // Squirrel away the name of the active module for GWTRunnerGenerator
-      ConfigurationProperty moduleNameProp = currentModule.getProperties().createConfiguration(
-          "junit.moduleName");
+      ConfigurationProperty moduleNameProp
+          = currentModule.getProperties().createConfiguration(
+              "junit.moduleName", false);
       moduleNameProp.setValue(moduleName);
       runStyle.maybeCompileModule(syntheticModuleName);
     }
diff --git a/user/src/com/google/gwt/junit/rebind/GWTRunnerGenerator.java b/user/src/com/google/gwt/junit/rebind/GWTRunnerGenerator.java
index 7058dd5..213e514 100644
--- a/user/src/com/google/gwt/junit/rebind/GWTRunnerGenerator.java
+++ b/user/src/com/google/gwt/junit/rebind/GWTRunnerGenerator.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
@@ -76,8 +77,10 @@
 
     String moduleName;
     try {
-      moduleName = context.getPropertyOracle().getPropertyValue(logger,
-          "junit.moduleName");
+      ConfigurationProperty prop
+          = context.getPropertyOracle().getConfigurationProperty(
+              "junit.moduleName");
+      moduleName = prop.getValues().get(0);
     } catch (BadPropertyValueException e) {
       logger.log(TreeLogger.ERROR,
           "Could not resolve junit.moduleName property", e);
diff --git a/user/src/com/google/gwt/resources/Resources.gwt.xml b/user/src/com/google/gwt/resources/Resources.gwt.xml
index 482d555..8e93b39 100644
--- a/user/src/com/google/gwt/resources/Resources.gwt.xml
+++ b/user/src/com/google/gwt/resources/Resources.gwt.xml
@@ -56,20 +56,25 @@
   </generate-with>
 
   <!-- This can be used to disable the use of strongly-named files -->
+  <define-configuration-property name="ClientBundle.enableRenaming" is-multi-valued="false" />
   <set-configuration-property name="ClientBundle.enableRenaming" value="true" />
 
   <!-- This allows merging of CSS rules to be disabled. -->
+  <define-configuration-property name="CssResource.mergeEnabled" is-multi-valued="false" />
   <set-configuration-property name="CssResource.mergeEnabled" value="true" />
 
   <!-- This forces all CssResource accessor functions to have the @Strict -->
   <!-- annotation. This is intended primarily for application developers and -->
   <!-- the library test code. -->
+  <define-configuration-property name="CssResource.strictAccessors" is-multi-valued="false" />
   <set-configuration-property name="CssResource.strictAccessors" value="false" />
 
   <!-- This allows the developer to use shorter obfuscated class names. -->
   <!-- Is is valid to extend this property to use a custom name. -->
+  <define-configuration-property name="CssResource.obfuscationPrefix" is-multi-valued="false" />
   <set-configuration-property name="CssResource.obfuscationPrefix" value="default" />
 
   <!-- This can be used to make CssResource produce human-readable CSS -->
+  <define-configuration-property name="CssResource.style" is-multi-valued="false" />
   <set-configuration-property name="CssResource.style" value="obf" />
 </module>
diff --git a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
index 9b4e4a4..57a51ab 100644
--- a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
+++ b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JMethod;
@@ -118,7 +119,8 @@
     String locale;
     try {
       PropertyOracle oracle = context.getGeneratorContext().getPropertyOracle();
-      locale = oracle.getPropertyValue(logger, "locale");
+      SelectionProperty prop = oracle.getSelectionProperty(logger, "locale");
+      locale = prop.getCurrentValue();
     } catch (BadPropertyValueException e) {
       locale = null;
     }
diff --git a/user/src/com/google/gwt/resources/rebind/context/AbstractClientBundleGenerator.java b/user/src/com/google/gwt/resources/rebind/context/AbstractClientBundleGenerator.java
index 65d51cd..6a305f2 100644
--- a/user/src/com/google/gwt/resources/rebind/context/AbstractClientBundleGenerator.java
+++ b/user/src/com/google/gwt/resources/rebind/context/AbstractClientBundleGenerator.java
@@ -20,6 +20,7 @@
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -121,8 +122,14 @@
 
     public void addPermutationAxis(String propertyName)
         throws BadPropertyValueException {
-      oracle.getPropertyValue(TreeLogger.NULL, propertyName);
-      axes.add(propertyName);
+      // Ensure the property exists and add a permutation axis if the
+      // property is a deferred binding property.
+      try {
+        oracle.getSelectionProperty(TreeLogger.NULL, propertyName).getCurrentValue();
+        axes.add(propertyName);
+      } catch (BadPropertyValueException e) {
+        oracle.getConfigurationProperty(propertyName).getValues();
+      }
     }
   }
 
@@ -464,7 +471,8 @@
     try {
       PropertyOracle oracle = context.getGeneratorContext().getPropertyOracle();
       for (String property : permutationAxes) {
-        String value = oracle.getPropertyValue(logger, property);
+        SelectionProperty prop = oracle.getSelectionProperty(logger, property);
+        String value = prop.getCurrentValue();
         toReturn.append("_" + value);
       }
     } catch (BadPropertyValueException e) {
diff --git a/user/src/com/google/gwt/resources/rebind/context/StaticResourceContext.java b/user/src/com/google/gwt/resources/rebind/context/StaticResourceContext.java
index a4beb90..047e0dd 100644
--- a/user/src/com/google/gwt/resources/rebind/context/StaticResourceContext.java
+++ b/user/src/com/google/gwt/resources/rebind/context/StaticResourceContext.java
@@ -16,6 +16,7 @@
 package com.google.gwt.resources.rebind.context;
 
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
@@ -49,7 +50,9 @@
     // See if filename obfuscation should be enabled
     String enableRenaming = null;
     try {
-      enableRenaming = propertyOracle.getPropertyValue(logger, ENABLE_RENAMING);
+      ConfigurationProperty prop = propertyOracle.getConfigurationProperty(
+          ENABLE_RENAMING);
+      enableRenaming = prop.getValues().get(0);
     } catch (BadPropertyValueException e) {
       logger.log(TreeLogger.ERROR, "Bad value for " + ENABLE_RENAMING, e);
       throw new UnableToCompleteException();
@@ -71,7 +74,6 @@
 
       // The name will be MD5.cache.ext
       outputName = strongName + ".cache." + extension;
-
     } else {
       outputName = suggestedFileName.substring(suggestedFileName.lastIndexOf('/') + 1);
     }
diff --git a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
index 063c04e..5e32938 100644
--- a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
+++ b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
@@ -16,8 +16,10 @@
 package com.google.gwt.resources.rg;
 
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -219,7 +221,16 @@
       } else {
         try {
           String propertyName = x.getPropertyName();
-          String propValue = oracle.getPropertyValue(logger, propertyName);
+          String propValue = null;
+          try {
+            SelectionProperty selProp
+                = oracle.getSelectionProperty(logger, propertyName);
+            propValue = selProp.getCurrentValue();
+          } catch (BadPropertyValueException e) {
+            ConfigurationProperty confProp
+                = oracle.getConfigurationProperty(propertyName);
+            propValue = confProp.getValues().get(0);
+          }
 
           /*
            * If the deferred binding property's value is in the list of values
@@ -1229,8 +1240,9 @@
        */
       try {
         PropertyOracle propertyOracle = context.getGeneratorContext().getPropertyOracle();
-        String propertyValue = propertyOracle.getPropertyValue(logger,
+        ConfigurationProperty prop = propertyOracle.getConfigurationProperty(
             "CssResource.strictAccessors");
+        String propertyValue = prop.getValues().get(0);
         if (Boolean.valueOf(propertyValue)) {
           logger.log(TreeLogger.WARN, "CssResource.forceStrict is true, but "
               + method.getName() + "() is missing the @Strict annotation.");
@@ -1264,16 +1276,20 @@
       throws UnableToCompleteException {
     try {
       PropertyOracle propertyOracle = context.getGeneratorContext().getPropertyOracle();
-      String style = propertyOracle.getPropertyValue(logger,
-          "CssResource.style").toLowerCase();
+      ConfigurationProperty styleProp
+          = propertyOracle.getConfigurationProperty("CssResource.style");
+      String style = styleProp.getValues().get(0);
       prettyOutput = style.equals("pretty");
 
-      String merge = propertyOracle.getPropertyValue(logger,
-          "CssResource.mergeEnabled").toLowerCase();
+      ConfigurationProperty mergeProp
+          = propertyOracle.getConfigurationProperty("CssResource.mergeEnabled");
+      String merge = mergeProp.getValues().get(0);
       enableMerge = merge.equals("true");
 
-      classPrefix = propertyOracle.getPropertyValue(logger,
-          "CssResource.obfuscationPrefix");
+      ConfigurationProperty classPrefixProp
+          = propertyOracle.getConfigurationProperty(
+              "CssResource.obfuscationPrefix");
+      classPrefix = classPrefixProp.getValues().get(0);
     } catch (BadPropertyValueException e) {
       logger.log(TreeLogger.WARN, "Unable to query module property", e);
       throw new UnableToCompleteException();
diff --git a/user/src/com/google/gwt/user/RemoteService.gwt.xml b/user/src/com/google/gwt/user/RemoteService.gwt.xml
index a287f28..31baf7c 100644
--- a/user/src/com/google/gwt/user/RemoteService.gwt.xml
+++ b/user/src/com/google/gwt/user/RemoteService.gwt.xml
@@ -33,6 +33,7 @@
     <!--
         If this is ever turned on by default, fix up RPCSuiteWithElision 
     -->
+    <define-configuration-property name="gwt.elideTypeNamesFromRPC" is-multi-valued="false" />
     <set-configuration-property name="gwt.elideTypeNamesFromRPC" value="false" />
 
 	<generate-with class="com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator">
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
index 9a80053..84a06bb 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ProxyCreator.java
@@ -17,7 +17,9 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.GeneratorContext;
+import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.linker.GeneratedResource;
@@ -230,11 +232,13 @@
     Map<JMethod, JMethod> syncMethToAsyncMethMap = rsav.validate(logger,
         serviceIntf, serviceAsync);
 
+    final PropertyOracle propertyOracle = context.getPropertyOracle();
+    
     // Determine the set of serializable types
     SerializableTypeOracleBuilder typesSentFromBrowserBuilder = new SerializableTypeOracleBuilder(
-        logger, context.getPropertyOracle(), typeOracle);
+        logger, propertyOracle, typeOracle);
     SerializableTypeOracleBuilder typesSentToBrowserBuilder = new SerializableTypeOracleBuilder(
-        logger, context.getPropertyOracle(), typeOracle);
+        logger, propertyOracle, typeOracle);
     try {
       addRequiredRoots(logger, typeOracle, typesSentFromBrowserBuilder);
       addRequiredRoots(logger, typeOracle, typesSentToBrowserBuilder);
@@ -247,8 +251,10 @@
     }
 
     try {
-      elideTypeNames = Boolean.parseBoolean(context.getPropertyOracle().getPropertyValue(
-          logger, TypeSerializerCreator.GWT_ELIDE_TYPE_NAMES_FROM_RPC));
+      ConfigurationProperty prop
+          = context.getPropertyOracle().getConfigurationProperty(
+              TypeSerializerCreator.GWT_ELIDE_TYPE_NAMES_FROM_RPC);
+      elideTypeNames = Boolean.parseBoolean(prop.getValues().get(0));
     } catch (BadPropertyValueException e) {
       logger.log(TreeLogger.ERROR, "Configuration property "
           + TypeSerializerCreator.GWT_ELIDE_TYPE_NAMES_FROM_RPC
diff --git a/user/src/com/google/gwt/user/rebind/rpc/Shared.java b/user/src/com/google/gwt/user/rebind/rpc/Shared.java
index ed1ddd1..3e113d3 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/Shared.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/Shared.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.core.ext.BadPropertyValueException;
 import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.typeinfo.JArrayType;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -133,7 +134,9 @@
   private static boolean getBooleanProperty(TreeLogger logger,
       PropertyOracle propertyOracle, String propertyName, boolean defaultValue) {
     try {
-      String propVal = propertyOracle.getPropertyValue(logger, propertyName);
+      SelectionProperty prop
+         = propertyOracle.getSelectionProperty(logger, propertyName);
+      String propVal = prop.getCurrentValue();
       if (propVal != null && propVal.length() > 0) {
         return Boolean.valueOf(propVal);
       }
diff --git a/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java b/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
index 125bce6..d92c83a 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/TypeSerializerCreator.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
@@ -139,9 +140,10 @@
         + " for TypeSerializerCreator createMethodMap");
 
     try {
-      String value = context.getPropertyOracle().getPropertyValue(logger,
-          GWT_ELIDE_TYPE_NAMES_FROM_RPC);
-      elideTypeNames = Boolean.parseBoolean(value);
+      ConfigurationProperty prop
+          = context.getPropertyOracle().getConfigurationProperty(
+              GWT_ELIDE_TYPE_NAMES_FROM_RPC);
+      elideTypeNames = Boolean.parseBoolean(prop.getValues().get(0));
     } catch (BadPropertyValueException e) {
       logger.log(TreeLogger.ERROR, "The configuration property "
           + GWT_ELIDE_TYPE_NAMES_FROM_RPC
diff --git a/user/src/com/google/gwt/user/server/rpc/SerializationPolicyLoader.java b/user/src/com/google/gwt/user/server/rpc/SerializationPolicyLoader.java
index 6755414..dd4f56e 100644
--- a/user/src/com/google/gwt/user/server/rpc/SerializationPolicyLoader.java
+++ b/user/src/com/google/gwt/user/server/rpc/SerializationPolicyLoader.java
@@ -41,11 +41,11 @@
       + "[true | false], [true | false], [true | false], [true | false], typeId, signature";
 
   /**
-   * Returns the serialization policy file name from the from the serialization
+   * Returns the serialization policy file name from the serialization
    * policy strong name.
    * 
    * @param serializationPolicyStrongName the serialization policy strong name
-   * @return the serialization policy file name from the from the serialization
+   * @return the serialization policy file name from the serialization
    *         policy strong name
    */
   public static String getSerializationPolicyFileName(
diff --git a/user/test/com/google/gwt/dev/cfg/PropertyTest.java b/user/test/com/google/gwt/dev/cfg/PropertyTest.java
index 08f4786..bc85804 100644
--- a/user/test/com/google/gwt/dev/cfg/PropertyTest.java
+++ b/user/test/com/google/gwt/dev/cfg/PropertyTest.java
@@ -98,15 +98,15 @@
     BindingProperty d = properties.createBinding("deferred");
     assertSame(d, properties.createBinding("deferred"));
     try {
-      properties.createConfiguration("deferred");
+      properties.createConfiguration("deferred", false);
       fail("Should have thrown an IllegalArgumentException");
     } catch (IllegalArgumentException e) {
       // OK
     }
 
     assertNull(properties.find("config"));
-    ConfigurationProperty c = properties.createConfiguration("config");
-    assertSame(c, properties.createConfiguration("config"));
+    ConfigurationProperty c = properties.createConfiguration("config", false);
+    assertSame(c, properties.createConfiguration("config", false));
     try {
       properties.createBinding("config");
       fail("Should have thrown an IllegalArgumentException");
diff --git a/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml b/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml
index 9cddf0b..59e730a 100644
--- a/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml
+++ b/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml
@@ -20,6 +20,7 @@
 	<source path="client"/>
 	<extend-property name="locale" values="es_419"/>
 	<set-property name = "locale" value = "es_419"/>
-	<set-configuration-property name="runtime.locales" value="es_AR,es_MX"/>
+	<extend-configuration-property name="runtime.locales" value="es_AR"/>
+	<extend-configuration-property name="runtime.locales" value="es_MX"/>
 	<public path="public_es_AR"/>
 </module>
diff --git a/user/test/com/google/gwt/i18n/I18NTest_es_MX_runtime.gwt.xml b/user/test/com/google/gwt/i18n/I18NTest_es_MX_runtime.gwt.xml
index 246f5a8..e82fb39 100644
--- a/user/test/com/google/gwt/i18n/I18NTest_es_MX_runtime.gwt.xml
+++ b/user/test/com/google/gwt/i18n/I18NTest_es_MX_runtime.gwt.xml
@@ -20,6 +20,7 @@
 	<source path="client"/>
 	<extend-property name="locale" values="es_419"/>
 	<set-property name = "locale" value = "es_419"/>
-	<set-configuration-property name="runtime.locales" value="es_AR,es_MX"/>
+	<extend-configuration-property name="runtime.locales" value="es_AR"/>
+	<extend-configuration-property name="runtime.locales" value="es_MX"/>
 	<public path="public_es_MX"/>
 </module>
diff --git a/user/test/com/google/gwt/module/ConfigurationProperties.gwt.xml b/user/test/com/google/gwt/module/ConfigurationProperties.gwt.xml
index 0d6a6af..41d90e2 100644
--- a/user/test/com/google/gwt/module/ConfigurationProperties.gwt.xml
+++ b/user/test/com/google/gwt/module/ConfigurationProperties.gwt.xml
@@ -13,6 +13,8 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 <module>
+  <define-configuration-property name="testProperty"
+    is-multi-valued="false" />
   <set-configuration-property name="testProperty"
     value="Hello World!" />
   <generate-with
diff --git a/user/test/com/google/gwt/module/rebind/ConfigurationPropertiesGenerator.java b/user/test/com/google/gwt/module/rebind/ConfigurationPropertiesGenerator.java
index 9e5fdf4..d34d42b 100644
--- a/user/test/com/google/gwt/module/rebind/ConfigurationPropertiesGenerator.java
+++ b/user/test/com/google/gwt/module/rebind/ConfigurationPropertiesGenerator.java
@@ -16,6 +16,7 @@
 package com.google.gwt.module.rebind;
 
 import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
 import com.google.gwt.core.ext.Generator;
 import com.google.gwt.core.ext.GeneratorContext;
 import com.google.gwt.core.ext.TreeLogger;
@@ -41,16 +42,17 @@
     if (out != null) {
       String propertyValue;
       try {
-        propertyValue = context.getPropertyOracle().getPropertyValue(logger,
-            "testProperty");
+        ConfigurationProperty prop = context.getPropertyOracle().
+            getConfigurationProperty("testProperty");
+        propertyValue = prop.getValues().get(0);
       } catch (BadPropertyValueException e) {
         logger.log(TreeLogger.ERROR, "testProperty not set", e);
         throw new UnableToCompleteException();
       }
 
       try {
-        context.getPropertyOracle().getPropertyValue(TreeLogger.NULL,
-            "bad_property");
+        ConfigurationProperty prop = context.getPropertyOracle().
+            getConfigurationProperty("bad_property");
         logger.log(TreeLogger.ERROR,
             "Did not get an exception trying to access fake property");
         throw new UnableToCompleteException();