From 2fef5aa0046548cb88034553f522d907195a19f7 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 02 Dec 2013 10:47:18 +0000
Subject: [PATCH] OpenDJ 3 : config framework

---
 opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java          |  912 +--
 opendj-admin/src/main/java/org/opends/server/admin/client/ClientConstraintHandler.java      |    8 
 opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueException.java       |   82 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyIsSingleValuedException.java     |   38 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyNotFoundException.java           |   55 
 opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java                |  300 
 opendj-admin/src/main/java/org/opends/server/admin/RelationDefinition.java                  |  633 +-
 opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectAlreadyExistsException.java |   35 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionUsageBuilder.java      |  583 +-
 opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java           |    6 
 opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java            |  476 -
 opendj-admin/src/main/java/org/opends/server/admin/SetRelationDefinition.java               |  384 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerConstraintHandler.java      |    6 
 opendj-admin/src/main/java/org/opends/server/admin/AdminException.java                      |   59 
 opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java              |  366 
 opendj-admin/src/main/java/org/opends/server/admin/package-info.java                        |    2 
 opendj-admin/src/main/resources/com/forgerock/opendj/ldap/admin.properties                  |  166 
 opendj-admin/src/main/java/org/opends/server/admin/DefinitionDecodingException.java         |   14 
 opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectDefinitionI18NResource.java |   14 
 opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueStringException.java |   83 
 opendj-admin/src/main/java/org/opends/server/admin/UnknownPropertyDefinitionException.java  |   69 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyIsReadOnlyException.java         |   34 
 opendj-admin/src/main/java/org/opends/server/admin/ClassLoaderProvider.java                 |   58 
 opendj-admin/src/main/java/org/opends/server/admin/AdministrationConnector.java             |   45 
 opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java              |  555 +-
 opendj-admin/src/main/java/org/opends/server/core/DirectoryServer.java                      |    8 
 opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectPath.java                   |   13 
 opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java               |    8 
 opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java     |  274 
 opendj-admin/src/main/java/org/opends/server/admin/AdministratorAction.java                 |  244 
 opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java           |  552 +-
 opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java         |  225 
 opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java     |  188 
 opendj-admin/src/main/java/org/opends/server/admin/GenericConstraint.java                   |  299 
 opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java       | 2014 ++++----
 opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java             |  557 +-
 opendj-admin/src/main/java/org/opends/server/admin/DecodingException.java                   |    7 
 opendj-admin/src/main/java/org/opends/server/admin/Tag.java                                 |  265 
 opendj-admin/src/main/java/org/opends/server/admin/OperationsException.java                 |   62 
 opendj-admin/src/main/java/org/opends/server/admin/DefaultBehaviorException.java            |   51 
 opendj-admin/src/main/java/org/opends/server/admin/InstantiableRelationDefinition.java      |  437 -
 opendj-admin/src/main/java/org/opends/server/admin/AdminRuntimeException.java               |   92 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyException.java                   |  107 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyIsMandatoryException.java        |   34 
 opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java                  | 1083 ++--
 opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectNotFoundException.java      |   49 
 opendj-admin/src/main/java/org/opends/server/admin/AbstractManagedObjectDefinition.java     | 1919 +++----
 opendj-admin/src/main/java/org/opends/server/admin/AliasDefaultBehaviorProvider.java        |  117 
 48 files changed, 6,085 insertions(+), 7,503 deletions(-)

diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java
index 7bdc64f..75b597c 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ACIPropertyDefinition.java
@@ -27,11 +27,11 @@
 
 package org.opends.server.admin;
 
+import static com.forgerock.opendj.util.Validator.*;
+
 import org.opends.server.authorization.dseecompat.Aci;
-import org.opends.server.authorization.dseecompat.AciException;
+import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DN;
-import org.opends.server.types.ByteString;
-import static org.opends.server.util.Validator.ensureNotNull;
 
 import java.util.EnumSet;
 
@@ -116,7 +116,7 @@
     ensureNotNull(value);
 
     try {
-      return Aci.decode(ByteString.valueOf(value), DN.NULL_DN);
+      return Aci.decode(ByteString.valueOf(value), DN.rootDN());
     } catch (AciException e) {
       // TODO: it would be nice to throw the cause.
       throw new IllegalPropertyValueStringException(this, value);
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AbstractManagedObjectDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/AbstractManagedObjectDefinition.java
index e570e0d..da13625 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AbstractManagedObjectDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AbstractManagedObjectDefinition.java
@@ -27,8 +27,6 @@
 
 package org.opends.server.admin;
 
-
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -41,13 +39,11 @@
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.Set;
-
 import java.util.Vector;
+
 import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.DefinitionDecodingException.Reason;
 
-
-
 /**
  * Defines the structure of an abstract managed object. Abstract managed objects
  * cannot be instantiated.
@@ -56,1103 +52,924 @@
  * overall configuration model of an application.
  *
  * @param <C>
- *          The type of client managed object configuration that this definition
- *          represents.
+ *            The type of client managed object configuration that this
+ *            definition represents.
  * @param <S>
- *          The type of server managed object configuration that this definition
- *          represents.
+ *            The type of server managed object configuration that this
+ *            definition represents.
  */
-public abstract class AbstractManagedObjectDefinition
-    <C extends ConfigurationClient, S extends Configuration> {
+public abstract class AbstractManagedObjectDefinition<C extends ConfigurationClient, S extends Configuration> {
 
-  // The name of the definition.
-  private final String name;
+    // The name of the definition.
+    private final String name;
 
-  // The parent managed object definition if applicable.
-  private final AbstractManagedObjectDefinition<? super C, ? super S> parent;
+    // The parent managed object definition if applicable.
+    private final AbstractManagedObjectDefinition<? super C, ? super S> parent;
 
-  // The set of constraints associated with this managed object
-  // definition.
-  private final Collection<Constraint> constraints;
+    // The set of constraints associated with this managed object
+    // definition.
+    private final Collection<Constraint> constraints;
 
-  // The set of property definitions applicable to this managed object
-  // definition.
-  private final Map<String, PropertyDefinition<?>> propertyDefinitions;
+    // The set of property definitions applicable to this managed object
+    // definition.
+    private final Map<String, PropertyDefinition<?>> propertyDefinitions;
 
-  // The set of relation definitions applicable to this managed object
-  // definition.
-  private final Map<String, RelationDefinition<?, ?>> relationDefinitions;
+    // The set of relation definitions applicable to this managed object
+    // definition.
+    private final Map<String, RelationDefinition<?, ?>> relationDefinitions;
 
-  // The set of relation definitions directly referencing this managed
-  // object definition.
-  private final Set<RelationDefinition<C, S>> reverseRelationDefinitions;
+    // The set of relation definitions directly referencing this managed
+    // object definition.
+    private final Set<RelationDefinition<C, S>> reverseRelationDefinitions;
 
-  // The set of all property definitions associated with this managed
-  // object definition including inherited property definitions.
-  private final Map<String, PropertyDefinition<?>> allPropertyDefinitions;
+    // The set of all property definitions associated with this managed
+    // object definition including inherited property definitions.
+    private final Map<String, PropertyDefinition<?>> allPropertyDefinitions;
 
-  // The set of all relation definitions associated with this managed
-  // object definition including inherited relation definitions.
-  private final Map<String, RelationDefinition<?, ?>> allRelationDefinitions;
+    // The set of all relation definitions associated with this managed
+    // object definition including inherited relation definitions.
+    private final Map<String, RelationDefinition<?, ?>> allRelationDefinitions;
 
-  // The set of aggregation property definitions applicable to this
-  // managed object definition.
-  private final Map<String, AggregationPropertyDefinition<?, ?>>
-    aggregationPropertyDefinitions;
+    // The set of aggregation property definitions applicable to this
+    // managed object definition.
+    private final Map<String, AggregationPropertyDefinition<?, ?>> aggregationPropertyDefinitions;
 
-  // The set of aggregation property definitions directly referencing this
-  // managed object definition.
-  private final Vector<AggregationPropertyDefinition<?, ?>>
-    reverseAggregationPropertyDefinitions;
+    // The set of aggregation property definitions directly referencing this
+    // managed object definition.
+    private final Vector<AggregationPropertyDefinition<?, ?>> reverseAggregationPropertyDefinitions;
 
-  // The set of all aggregation property definitions associated with this
-  // managed object definition including inherited relation definitions.
-  private final Map<String, AggregationPropertyDefinition<?, ?>>
-    allAggregationPropertyDefinitions;
+    // The set of all aggregation property definitions associated with this
+    // managed object definition including inherited relation definitions.
+    private final Map<String, AggregationPropertyDefinition<?, ?>> allAggregationPropertyDefinitions;
 
-  // The set of tags associated with this managed object.
-  private final Set<Tag> allTags;
+    // The set of tags associated with this managed object.
+    private final Set<Tag> allTags;
 
-  // Options applicable to this definition.
-  private final Set<ManagedObjectOption> options;
+    // Options applicable to this definition.
+    private final Set<ManagedObjectOption> options;
 
-  // The set of managed object definitions which inherit from this definition.
-  private final Map<String,
-    AbstractManagedObjectDefinition<? extends C, ? extends S>> children;
+    // The set of managed object definitions which inherit from this definition.
+    private final Map<String, AbstractManagedObjectDefinition<? extends C, ? extends S>> children;
 
+    /**
+     * Create a new abstract managed object definition.
+     *
+     * @param name
+     *            The name of the definition.
+     * @param parent
+     *            The parent definition, or <code>null</code> if there is no
+     *            parent (only the {@link TopCfgDefn} should have a
+     *            <code>null</code> parent, unless the definition is being used
+     *            for testing).
+     */
+    protected AbstractManagedObjectDefinition(String name, AbstractManagedObjectDefinition<? super C, ? super S> parent) {
+        this.name = name;
+        this.parent = parent;
+        this.constraints = new LinkedList<Constraint>();
+        this.propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+        this.relationDefinitions = new HashMap<String, RelationDefinition<?, ?>>();
+        this.reverseRelationDefinitions = new HashSet<RelationDefinition<C, S>>();
+        this.allPropertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+        this.allRelationDefinitions = new HashMap<String, RelationDefinition<?, ?>>();
+        this.aggregationPropertyDefinitions = new HashMap<String, AggregationPropertyDefinition<?, ?>>();
+        this.reverseAggregationPropertyDefinitions = new Vector<AggregationPropertyDefinition<?, ?>>();
+        this.allAggregationPropertyDefinitions = new HashMap<String, AggregationPropertyDefinition<?, ?>>();
+        this.allTags = new HashSet<Tag>();
+        this.options = EnumSet.noneOf(ManagedObjectOption.class);
 
+        this.children = new HashMap<String, AbstractManagedObjectDefinition<? extends C, ? extends S>>();
 
-  /**
-   * Create a new abstract managed object definition.
-   *
-   * @param name
-   *          The name of the definition.
-   * @param parent
-   *          The parent definition, or <code>null</code> if there
-   *          is no parent (only the {@link TopCfgDefn} should have a
-   *          <code>null</code> parent, unless the definition is
-   *          being used for testing).
-   */
-  protected AbstractManagedObjectDefinition(String name,
-      AbstractManagedObjectDefinition<? super C, ? super S> parent) {
-    this.name = name;
-    this.parent = parent;
-    this.constraints = new LinkedList<Constraint>();
-    this.propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
-    this.relationDefinitions = new HashMap<String, RelationDefinition<?,?>>();
-    this.reverseRelationDefinitions = new HashSet<RelationDefinition<C,S>>();
-    this.allPropertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
-    this.allRelationDefinitions =
-      new HashMap<String, RelationDefinition<?, ?>>();
-    this.aggregationPropertyDefinitions =
-      new HashMap<String, AggregationPropertyDefinition<?,?>>();
-    this.reverseAggregationPropertyDefinitions =
-      new Vector<AggregationPropertyDefinition<?,?>>();
-    this.allAggregationPropertyDefinitions =
-      new HashMap<String, AggregationPropertyDefinition<?, ?>>();
-    this.allTags = new HashSet<Tag>();
-    this.options = EnumSet.noneOf(ManagedObjectOption.class);
+        // If we have a parent definition then inherit its features.
+        if (parent != null) {
+            registerInParent();
 
-    this.children = new HashMap<String,
-        AbstractManagedObjectDefinition<? extends C, ? extends S>>();
+            for (PropertyDefinition<?> pd : parent.getAllPropertyDefinitions()) {
+                allPropertyDefinitions.put(pd.getName(), pd);
+            }
 
-    // If we have a parent definition then inherit its features.
-    if (parent != null) {
-      registerInParent();
+            for (RelationDefinition<?, ?> rd : parent.getAllRelationDefinitions()) {
+                allRelationDefinitions.put(rd.getName(), rd);
+            }
 
-      for (PropertyDefinition<?> pd : parent.getAllPropertyDefinitions()) {
-        allPropertyDefinitions.put(pd.getName(), pd);
-      }
+            for (AggregationPropertyDefinition<?, ?> apd : parent.getAllAggregationPropertyDefinitions()) {
 
-      for (RelationDefinition<?, ?> rd : parent.getAllRelationDefinitions()) {
-        allRelationDefinitions.put(rd.getName(), rd);
-      }
+                allAggregationPropertyDefinitions.put(apd.getName(), apd);
+            }
 
-      for (AggregationPropertyDefinition<?, ?> apd :
-        parent.getAllAggregationPropertyDefinitions()) {
-
-        allAggregationPropertyDefinitions.put(apd.getName(), apd);
-      }
-
-      // Tag inheritance is performed during preprocessing.
-    }
-  }
-
-
-
-  /**
-   * Get all the child managed object definitions which inherit from
-   * this managed object definition.
-   *
-   * @return Returns an unmodifiable collection containing all the
-   *         subordinate managed object definitions which inherit from
-   *         this managed object definition.
-   */
-  public final Collection<AbstractManagedObjectDefinition
-      <? extends C, ? extends S>> getAllChildren() {
-    List<AbstractManagedObjectDefinition<? extends C, ? extends S>> list =
-      new ArrayList<AbstractManagedObjectDefinition<? extends C, ? extends S>>(
-        children.values());
-
-    for (AbstractManagedObjectDefinition<? extends C, ? extends S> child :
-        children.values()) {
-      list.addAll(child.getAllChildren());
-    }
-
-    return Collections.unmodifiableCollection(list);
-  }
-
-
-
-  /**
-   * Get all the constraints associated with this type of managed
-   * object. The returned collection will contain inherited
-   * constraints.
-   *
-   * @return Returns a collection containing all the constraints
-   *         associated with this type of managed object. The caller
-   *         is free to modify the collection if required.
-   */
-  public final Collection<Constraint> getAllConstraints() {
-    // This method does not used a cached set of constraints because
-    // constraints may be updated after child definitions have been
-    // defined.
-    List<Constraint> allConstraints = new LinkedList<Constraint>();
-
-    if (parent != null) {
-      allConstraints.addAll(parent.getAllConstraints());
-    }
-    allConstraints.addAll(constraints);
-
-    return allConstraints;
-  }
-
-
-
-  /**
-   * Get all the property definitions associated with this type of
-   * managed object. The returned collection will contain inherited
-   * property definitions.
-   *
-   * @return Returns an unmodifiable collection containing all the
-   *         property definitions associated with this type of managed
-   *         object.
-   */
-  public final Collection<PropertyDefinition<?>> getAllPropertyDefinitions() {
-    return Collections.unmodifiableCollection(allPropertyDefinitions.values());
-  }
-
-
-
-  /**
-   * Get all the relation definitions associated with this type of
-   * managed object. The returned collection will contain inherited
-   * relation definitions.
-   *
-   * @return Returns an unmodifiable collection containing all the
-   *         relation definitions associated with this type of managed
-   *         object.
-   */
-  public final Collection<RelationDefinition<?, ?>>
-      getAllRelationDefinitions() {
-    return Collections.unmodifiableCollection(allRelationDefinitions.values());
-  }
-
-
-
-  /**
-   * Get all the relation definitions which refer to this managed
-   * object definition. The returned collection will contain relation
-   * definitions which refer to parents of this managed object
-   * definition.
-   *
-   * @return Returns a collection containing all the relation
-   *         definitions which refer to this managed object
-   *         definition. The caller is free to modify the collection
-   *         if required.
-   */
-  public final Collection<RelationDefinition<? super C, ? super S>>
-  getAllReverseRelationDefinitions() {
-    // This method does not used a cached set of relations because
-    // relations may be updated after child definitions have been
-    // defined.
-    List<RelationDefinition<? super C, ? super S>> rdlist =
-      new LinkedList<RelationDefinition<? super C, ? super S>>();
-
-    if (parent != null) {
-      rdlist.addAll(parent.getAllReverseRelationDefinitions());
-    }
-    rdlist.addAll(reverseRelationDefinitions);
-
-    return rdlist;
-  }
-
-
-
-  /**
-   * Get all the aggregation property definitions associated with this type of
-   * managed object. The returned collection will contain inherited
-   * aggregation property definitions.
-   *
-   * @return Returns an unmodifiable collection containing all the
-   *         aggregation property definitions associated with this type of
-   *         managed object.
-   */
-  public final Collection<AggregationPropertyDefinition<?, ?>>
-      getAllAggregationPropertyDefinitions() {
-    return Collections.unmodifiableCollection(
-      allAggregationPropertyDefinitions.values());
-  }
-
-
-
-  /**
-   * Get all the aggregation property definitions which refer to this managed
-   * object definition. The returned collection will contain aggregation
-   * property definitions which refer to parents of this managed object
-   * definition.
-   *
-   * @return Returns a collection containing all the aggregation property
-   *         definitions which refer to this managed object
-   *         definition. The caller is free to modify the collection
-   *         if required.
-   */
-  public final Collection<AggregationPropertyDefinition<?, ?>>
-  getAllReverseAggregationPropertyDefinitions() {
-    // This method does not used a cached set of aggregation properties because
-    // aggregation properties may be updated after child definitions have been
-    // defined.
-    List<AggregationPropertyDefinition<?, ?>> apdlist =
-      new LinkedList<AggregationPropertyDefinition<?, ?>>();
-
-    if (parent != null) {
-      apdlist.addAll(parent.getAllReverseAggregationPropertyDefinitions());
-    }
-    apdlist.addAll(reverseAggregationPropertyDefinitions);
-
-    return apdlist;
-  }
-
-
-
-  /**
-   * Get all the tags associated with this type of managed object. The
-   * returned collection will contain inherited tags.
-   *
-   * @return Returns an unmodifiable collection containing all the
-   *         tags associated with this type of managed object.
-   */
-  public final Collection<Tag> getAllTags() {
-    return Collections.unmodifiableCollection(allTags);
-  }
-
-
-
-  /**
-   * Get the named child managed object definition which inherits from
-   * this managed object definition. This method will recursively
-   * search down through the inheritance hierarchy.
-   *
-   * @param name
-   *          The name of the managed object definition sub-type.
-   * @return Returns the named child managed object definition which
-   *         inherits from this managed object definition.
-   * @throws IllegalArgumentException
-   *           If the specified managed object definition name was
-   *           null or empty or if the requested subordinate managed
-   *           object definition was not found.
-   */
-  public final AbstractManagedObjectDefinition<? extends C, ? extends S>
-      getChild(String name) throws IllegalArgumentException {
-    if ((name == null) || (name.length() == 0)) {
-      throw new IllegalArgumentException("null or empty managed object name");
-    }
-
-    AbstractManagedObjectDefinition<? extends C, ? extends S> d = children
-        .get(name);
-
-    if (d == null) {
-      // Recursively search.
-      for (AbstractManagedObjectDefinition<? extends C, ? extends S> child :
-          children.values()) {
-        try {
-          d = child.getChild(name);
-          break;
-        } catch (IllegalArgumentException e) {
-          // Try the next child.
+            // Tag inheritance is performed during preprocessing.
         }
-      }
     }
 
-    if (d == null) {
-      throw new IllegalArgumentException("child managed object definition \""
-          + name + "\" not found");
+    /**
+     * Get all the child managed object definitions which inherit from this
+     * managed object definition.
+     *
+     * @return Returns an unmodifiable collection containing all the subordinate
+     *         managed object definitions which inherit from this managed object
+     *         definition.
+     */
+    public final Collection<AbstractManagedObjectDefinition<? extends C, ? extends S>> getAllChildren() {
+        List<AbstractManagedObjectDefinition<? extends C, ? extends S>> list = new ArrayList<AbstractManagedObjectDefinition<? extends C, ? extends S>>(
+                children.values());
+
+        for (AbstractManagedObjectDefinition<? extends C, ? extends S> child : children.values()) {
+            list.addAll(child.getAllChildren());
+        }
+
+        return Collections.unmodifiableCollection(list);
     }
 
-    return d;
-  }
+    /**
+     * Get all the constraints associated with this type of managed object. The
+     * returned collection will contain inherited constraints.
+     *
+     * @return Returns a collection containing all the constraints associated
+     *         with this type of managed object. The caller is free to modify
+     *         the collection if required.
+     */
+    public final Collection<Constraint> getAllConstraints() {
+        // This method does not used a cached set of constraints because
+        // constraints may be updated after child definitions have been
+        // defined.
+        List<Constraint> allConstraints = new LinkedList<Constraint>();
 
+        if (parent != null) {
+            allConstraints.addAll(parent.getAllConstraints());
+        }
+        allConstraints.addAll(constraints);
 
-
-  /**
-   * Get the child managed object definitions which inherit directly
-   * from this managed object definition.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         subordinate managed object definitions which inherit
-   *         directly from this managed object definition.
-   */
-  public final Collection<AbstractManagedObjectDefinition
-      <? extends C, ? extends S>> getChildren() {
-    return Collections.unmodifiableCollection(children.values());
-  }
-
-
-
-  /**
-   * Get the constraints defined by this managed object definition.
-   * The returned collection will not contain inherited constraints.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         constraints defined by this managed object definition.
-   */
-  public final Collection<Constraint> getConstraints() {
-    return Collections.unmodifiableCollection(constraints);
-  }
-
-
-
-  /**
-   * Gets the optional description of this managed object definition
-   * in the default locale.
-   *
-   * @return Returns the description of this managed object definition
-   *         in the default locale, or <code>null</code> if there is
-   *         no description.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getDescription() throws UnsupportedOperationException {
-    return getDescription(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the optional description of this managed object definition
-   * in the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the description of this managed object definition
-   *         in the specified locale, or <code>null</code> if there
-   *         is no description.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getDescription(Locale locale)
-      throws UnsupportedOperationException {
-    try {
-      return ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(this, "description", locale);
-    } catch (MissingResourceException e) {
-      return null;
-    }
-  }
-
-
-
-  /**
-   * Get the name of the definition.
-   *
-   * @return Returns the name of the definition.
-   */
-  public final String getName() {
-    return name;
-  }
-
-
-
-  /**
-   * Get the parent managed object definition, if applicable.
-   *
-   * @return Returns the parent of this managed object definition, or
-   *         <code>null</code> if this definition is the
-   *         {@link TopCfgDefn}.
-   */
-  public final AbstractManagedObjectDefinition<? super C,
-      ? super S> getParent() {
-    return parent;
-  }
-
-
-
-  /**
-   * Get the specified property definition associated with this type
-   * of managed object. The search will include any inherited property
-   * definitions.
-   *
-   * @param name
-   *          The name of the property definition to be retrieved.
-   * @return Returns the specified property definition associated with
-   *         this type of managed object.
-   * @throws IllegalArgumentException
-   *           If the specified property name was null or empty or if
-   *           the requested property definition was not found.
-   */
-  public final PropertyDefinition<?> getPropertyDefinition(String name)
-      throws IllegalArgumentException {
-    if ((name == null) || (name.length() == 0)) {
-      throw new IllegalArgumentException("null or empty property name");
+        return allConstraints;
     }
 
-    PropertyDefinition<?> d = allPropertyDefinitions.get(name);
-    if (d == null) {
-      throw new IllegalArgumentException("property definition \"" + name
-          + "\" not found");
+    /**
+     * Get all the property definitions associated with this type of managed
+     * object. The returned collection will contain inherited property
+     * definitions.
+     *
+     * @return Returns an unmodifiable collection containing all the property
+     *         definitions associated with this type of managed object.
+     */
+    public final Collection<PropertyDefinition<?>> getAllPropertyDefinitions() {
+        return Collections.unmodifiableCollection(allPropertyDefinitions.values());
     }
 
-    return d;
-  }
-
-
-
-  /**
-   * Get the property definitions defined by this managed object
-   * definition. The returned collection will not contain inherited
-   * property definitions.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         property definitions defined by this managed object
-   *         definition.
-   */
-  public final Collection<PropertyDefinition<?>> getPropertyDefinitions() {
-    return Collections.unmodifiableCollection(propertyDefinitions
-        .values());
-  }
-
-
-
-  /**
-   * Get the specified relation definition associated with this type
-   * of managed object.The search will include any inherited relation
-   * definitions.
-   *
-   * @param name
-   *          The name of the relation definition to be retrieved.
-   * @return Returns the specified relation definition associated with
-   *         this type of managed object.
-   * @throws IllegalArgumentException
-   *           If the specified relation name was null or empty or if
-   *           the requested relation definition was not found.
-   */
-  public final RelationDefinition<?, ?> getRelationDefinition(String name)
-      throws IllegalArgumentException {
-    if ((name == null) || (name.length() == 0)) {
-      throw new IllegalArgumentException("null or empty relation name");
+    /**
+     * Get all the relation definitions associated with this type of managed
+     * object. The returned collection will contain inherited relation
+     * definitions.
+     *
+     * @return Returns an unmodifiable collection containing all the relation
+     *         definitions associated with this type of managed object.
+     */
+    public final Collection<RelationDefinition<?, ?>> getAllRelationDefinitions() {
+        return Collections.unmodifiableCollection(allRelationDefinitions.values());
     }
 
-    RelationDefinition<?, ?> d = allRelationDefinitions.get(name);
-    if (d == null) {
-      throw new IllegalArgumentException("relation definition \"" + name
-          + "\" not found");
+    /**
+     * Get all the relation definitions which refer to this managed object
+     * definition. The returned collection will contain relation definitions
+     * which refer to parents of this managed object definition.
+     *
+     * @return Returns a collection containing all the relation definitions
+     *         which refer to this managed object definition. The caller is free
+     *         to modify the collection if required.
+     */
+    public final Collection<RelationDefinition<? super C, ? super S>> getAllReverseRelationDefinitions() {
+        // This method does not used a cached set of relations because
+        // relations may be updated after child definitions have been
+        // defined.
+        List<RelationDefinition<? super C, ? super S>> rdlist = new LinkedList<RelationDefinition<? super C, ? super S>>();
+
+        if (parent != null) {
+            rdlist.addAll(parent.getAllReverseRelationDefinitions());
+        }
+        rdlist.addAll(reverseRelationDefinitions);
+
+        return rdlist;
     }
 
-    return d;
-  }
-
-
-
-  /**
-   * Get the relation definitions defined by this managed object
-   * definition. The returned collection will not contain inherited
-   * relation definitions.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         relation definitions defined by this managed object
-   *         definition.
-   */
-  public final Collection<RelationDefinition<?,?>> getRelationDefinitions() {
-    return Collections.unmodifiableCollection(relationDefinitions.values());
-  }
-
-
-
-  /**
-   * Get the relation definitions which refer directly to this managed
-   * object definition. The returned collection will not contain
-   * relation definitions which refer to parents of this managed
-   * object definition.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         relation definitions which refer directly to this managed
-   *         object definition.
-   */
-  public final Collection<RelationDefinition<C, S>>
-      getReverseRelationDefinitions() {
-    return Collections.unmodifiableCollection(reverseRelationDefinitions);
-  }
-
-
-
-  /**
-   * Get the specified aggregation property definition associated with this type
-   * of managed object.The search will include any inherited aggregation
-   * property definitions.
-   *
-   * @param name
-   *          The name of the aggregation property definition to be retrieved.
-   * @return Returns the specified aggregation property definition associated
-   *         with this type of managed object.
-   * @throws IllegalArgumentException
-   *           If the specified aggregation property name was null or empty or
-   *           if the requested aggregation property definition was not found.
-   */
-  public final AggregationPropertyDefinition<?, ?>
-    getAggregationPropertyDefinition(String name)
-    throws IllegalArgumentException {
-    if ((name == null) || (name.length() == 0)) {
-      throw new IllegalArgumentException(
-        "null or empty aggregation property name");
+    /**
+     * Get all the aggregation property definitions associated with this type of
+     * managed object. The returned collection will contain inherited
+     * aggregation property definitions.
+     *
+     * @return Returns an unmodifiable collection containing all the aggregation
+     *         property definitions associated with this type of managed object.
+     */
+    public final Collection<AggregationPropertyDefinition<?, ?>> getAllAggregationPropertyDefinitions() {
+        return Collections.unmodifiableCollection(allAggregationPropertyDefinitions.values());
     }
 
-    AggregationPropertyDefinition<?, ?> d =
-      allAggregationPropertyDefinitions.get(name);
-    if (d == null) {
-      throw new IllegalArgumentException("aggregation property definition \""
-        + name + "\" not found");
+    /**
+     * Get all the aggregation property definitions which refer to this managed
+     * object definition. The returned collection will contain aggregation
+     * property definitions which refer to parents of this managed object
+     * definition.
+     *
+     * @return Returns a collection containing all the aggregation property
+     *         definitions which refer to this managed object definition. The
+     *         caller is free to modify the collection if required.
+     */
+    public final Collection<AggregationPropertyDefinition<?, ?>> getAllReverseAggregationPropertyDefinitions() {
+        // This method does not used a cached set of aggregation properties
+        // because
+        // aggregation properties may be updated after child definitions have
+        // been
+        // defined.
+        List<AggregationPropertyDefinition<?, ?>> apdlist = new LinkedList<AggregationPropertyDefinition<?, ?>>();
+
+        if (parent != null) {
+            apdlist.addAll(parent.getAllReverseAggregationPropertyDefinitions());
+        }
+        apdlist.addAll(reverseAggregationPropertyDefinitions);
+
+        return apdlist;
     }
 
-    return d;
-  }
-
-  /**
-   * Get the aggregation property definitions defined by this managed object
-   * definition. The returned collection will not contain inherited
-   * aggregation property definitions.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         aggregation property definitions defined by this managed object
-   *         definition.
-   */
-  public final Collection<AggregationPropertyDefinition<?, ?>>
-    getAggregationPropertyDefinitions() {
-    return Collections.unmodifiableCollection(
-      aggregationPropertyDefinitions.values());
-  }
-
-  /**
-   * Get the aggregation property definitions which refer directly to this
-   * managed object definition. The returned collection will not contain
-   * aggregation property definitions which refer to parents of this managed
-   * object definition.
-   *
-   * @return Returns an unmodifiable collection containing the
-   *         aggregation property definitions which refer directly to this
-   *         managed object definition.
-   */
-  public final Collection<AggregationPropertyDefinition<?, ?>>
-    getReverseAggregationPropertyDefinitions() {
-    return Collections.unmodifiableCollection(
-      reverseAggregationPropertyDefinitions);
-  }
-
-  /**
-   * Gets the synopsis of this managed object definition in the
-   * default locale.
-   *
-   * @return Returns the synopsis of this managed object definition in
-   *         the default locale.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getSynopsis() throws UnsupportedOperationException {
-    return getSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the synopsis of this managed object definition in the
-   * specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this managed object definition in
-   *         the specified locale.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getSynopsis(Locale locale)
-      throws UnsupportedOperationException {
-    return ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(this, "synopsis", locale);
-  }
-
-
-
-  /**
-   * Gets the user friendly name of this managed object definition in
-   * the default locale.
-   *
-   * @return Returns the user friendly name of this managed object
-   *         definition in the default locale.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getUserFriendlyName()
-      throws UnsupportedOperationException {
-    return getUserFriendlyName(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the user friendly name of this managed object definition in
-   * the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the user friendly name of this managed object
-   *         definition in the specified locale.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getUserFriendlyName(Locale locale)
-      throws UnsupportedOperationException {
-    // TODO: have admin framework getMessage return a Message
-    return Message.raw(ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(this, "user-friendly-name", locale));
-  }
-
-
-
-  /**
-   * Gets the user friendly plural name of this managed object
-   * definition in the default locale.
-   *
-   * @return Returns the user friendly plural name of this managed
-   *         object definition in the default locale.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getUserFriendlyPluralName()
-      throws UnsupportedOperationException {
-    return getUserFriendlyPluralName(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the user friendly plural name of this managed object
-   * definition in the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the user friendly plural name of this managed
-   *         object definition in the specified locale.
-   * @throws UnsupportedOperationException
-   *           If this managed object definition is the
-   *           {@link TopCfgDefn}.
-   */
-  public final Message getUserFriendlyPluralName(Locale locale)
-      throws UnsupportedOperationException {
-    return ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(this, "user-friendly-plural-name", locale);
-  }
-
-
-
-  /**
-   * Determine whether there are any child managed object definitions which
-   * inherit from this managed object definition.
-   *
-   * @return Returns <code>true</code> if this type of managed object has any
-   *         child managed object definitions, <code>false</code> otherwise.
-   */
-  public final boolean hasChildren() {
-    return !children.isEmpty();
-  }
-
-
-
-  /**
-   * Determines whether or not this managed object definition has the
-   * specified option.
-   *
-   * @param option
-   *          The option to test.
-   * @return Returns <code>true</code> if the option is set, or
-   *         <code>false</code> otherwise.
-   */
-  public final boolean hasOption(ManagedObjectOption option) {
-    return options.contains(option);
-  }
-
-
-
-  /**
-   * Determines whether or not this managed object definition has the
-   * specified tag.
-   *
-   * @param t
-   *          The tag definition.
-   * @return Returns <code>true</code> if this managed object
-   *         definition has the specified tag.
-   */
-  public final boolean hasTag(Tag t) {
-    return allTags.contains(t);
-  }
-
-
-
-  /**
-   * Determines whether or not this managed object definition is a
-   * sub-type of the provided managed object definition. This managed
-   * object definition is a sub-type of the provided managed object
-   * definition if they are both the same or if the provided managed
-   * object definition can be obtained by recursive invocations of the
-   * {@link #getParent()} method.
-   *
-   * @param d
-   *          The managed object definition to be checked.
-   * @return Returns <code>true</code> if this managed object
-   *         definition is a sub-type of the provided managed object
-   *         definition.
-   */
-  public final boolean isChildOf(AbstractManagedObjectDefinition<?, ?> d) {
-    AbstractManagedObjectDefinition<?, ?> i;
-    for (i = this; i != null; i = i.parent) {
-      if (i == d) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-
-
-  /**
-   * Determines whether or not this managed object definition is a
-   * super-type of the provided managed object definition. This
-   * managed object definition is a super-type of the provided managed
-   * object definition if they are both the same or if the provided
-   * managed object definition is a member of the set of children
-   * returned from {@link #getAllChildren()}.
-   *
-   * @param d
-   *          The managed object definition to be checked.
-   * @return Returns <code>true</code> if this managed object
-   *         definition is a super-type of the provided managed object
-   *         definition.
-   */
-  public final boolean isParentOf(AbstractManagedObjectDefinition<?, ?> d) {
-    return d.isChildOf(this);
-  }
-
-
-
-  /**
-   * Determines whether or not this managed object definition is the
-   * {@link TopCfgDefn}.
-   *
-   * @return Returns <code>true</code> if this managed object
-   *         definition is the {@link TopCfgDefn}.
-   */
-  public final boolean isTop() {
-    return (this instanceof TopCfgDefn);
-  }
-
-
-
-  /**
-   * Finds a sub-type of this managed object definition which most closely
-   * corresponds to the matching criteria of the provided definition resolver.
-   *
-   * @param r
-   *          The definition resolver.
-   * @return Returns the sub-type of this managed object definition which most
-   *         closely corresponds to the matching criteria of the provided
-   *         definition resolver.
-   * @throws DefinitionDecodingException
-   *           If no matching sub-type could be found or if the resolved
-   *           definition was abstract.
-   * @see DefinitionResolver
-   */
-  @SuppressWarnings("unchecked")
-  public final ManagedObjectDefinition<? extends C, ? extends S>
-      resolveManagedObjectDefinition(
-      DefinitionResolver r) throws DefinitionDecodingException {
-    AbstractManagedObjectDefinition<? extends C, ? extends S> rd;
-    rd = resolveManagedObjectDefinitionAux(this, r);
-    if (rd == null) {
-      // Unable to resolve the definition.
-      throw new DefinitionDecodingException(this,
-          Reason.WRONG_TYPE_INFORMATION);
-    } else if (rd instanceof ManagedObjectDefinition) {
-      return (ManagedObjectDefinition<? extends C, ? extends S>) rd;
-    } else {
-      // Resolved definition was abstract.
-      throw new DefinitionDecodingException(this,
-          Reason.ABSTRACT_TYPE_INFORMATION);
-    }
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final String toString() {
-    StringBuilder builder = new StringBuilder();
-    toString(builder);
-    return builder.toString();
-  }
-
-
-
-  /**
-   * Append a string representation of the managed object definition to the
-   * provided string builder.
-   *
-   * @param builder
-   *          The string builder where the string representation should be
-   *          appended.
-   */
-  public final void toString(StringBuilder builder) {
-    builder.append(getName());
-  }
-
-
-
-  /**
-   * Initializes all of the components associated with this managed
-   * object definition.
-   *
-   * @throws Exception
-   *           If this managed object definition could not be
-   *           initialized.
-   */
-  protected final void initialize() throws Exception {
-    for (PropertyDefinition<?> pd : getAllPropertyDefinitions()) {
-      pd.initialize();
-      pd.getDefaultBehaviorProvider().initialize();
+    /**
+     * Get all the tags associated with this type of managed object. The
+     * returned collection will contain inherited tags.
+     *
+     * @return Returns an unmodifiable collection containing all the tags
+     *         associated with this type of managed object.
+     */
+    public final Collection<Tag> getAllTags() {
+        return Collections.unmodifiableCollection(allTags);
     }
 
-    for (RelationDefinition<?, ?> rd : getAllRelationDefinitions()) {
-      rd.initialize();
+    /**
+     * Get the named child managed object definition which inherits from this
+     * managed object definition. This method will recursively search down
+     * through the inheritance hierarchy.
+     *
+     * @param name
+     *            The name of the managed object definition sub-type.
+     * @return Returns the named child managed object definition which inherits
+     *         from this managed object definition.
+     * @throws IllegalArgumentException
+     *             If the specified managed object definition name was null or
+     *             empty or if the requested subordinate managed object
+     *             definition was not found.
+     */
+    public final AbstractManagedObjectDefinition<? extends C, ? extends S> getChild(String name)
+            throws IllegalArgumentException {
+        if ((name == null) || (name.length() == 0)) {
+            throw new IllegalArgumentException("null or empty managed object name");
+        }
+
+        AbstractManagedObjectDefinition<? extends C, ? extends S> d = children.get(name);
+
+        if (d == null) {
+            // Recursively search.
+            for (AbstractManagedObjectDefinition<? extends C, ? extends S> child : children.values()) {
+                try {
+                    d = child.getChild(name);
+                    break;
+                } catch (IllegalArgumentException e) {
+                    // Try the next child.
+                }
+            }
+        }
+
+        if (d == null) {
+            throw new IllegalArgumentException("child managed object definition \"" + name + "\" not found");
+        }
+
+        return d;
     }
 
-    for (AggregationPropertyDefinition<?, ?> apd :
-      getAllAggregationPropertyDefinitions()) {
-
-      apd.initialize();
-      // Now register the aggregation property in the referenced managed object
-      // definition for reverse lookups.
-      registerReverseAggregationPropertyDefinition(apd);
+    /**
+     * Get the child managed object definitions which inherit directly from this
+     * managed object definition.
+     *
+     * @return Returns an unmodifiable collection containing the subordinate
+     *         managed object definitions which inherit directly from this
+     *         managed object definition.
+     */
+    public final Collection<AbstractManagedObjectDefinition<? extends C, ? extends S>> getChildren() {
+        return Collections.unmodifiableCollection(children.values());
     }
 
-    for (Constraint constraint : getAllConstraints()) {
-      constraint.initialize();
-    }
-  }
-
-
-
-  /**
-   * Register a constraint with this managed object definition.
-   * <p>
-   * This method <b>must not</b> be called by applications.
-   *
-   * @param constraint
-   *          The constraint to be registered.
-   */
-  protected final void registerConstraint(Constraint constraint) {
-    constraints.add(constraint);
-  }
-
-
-
-  /**
-   * Register a property definition with this managed object definition,
-   * overriding any existing property definition with the same name.
-   * <p>
-   * This method <b>must not</b> be called by applications.
-   *
-   * @param d
-   *          The property definition to be registered.
-   */
-  protected final void registerPropertyDefinition(PropertyDefinition<?> d) {
-    String propName = d.getName();
-
-    propertyDefinitions.put(propName, d);
-    allPropertyDefinitions.put(propName, d);
-
-    if (d instanceof AggregationPropertyDefinition<?,?>) {
-      AggregationPropertyDefinition<?, ?> apd =
-        (AggregationPropertyDefinition<?, ?>) d;
-      aggregationPropertyDefinitions.put(propName, apd);
-      // The key must also contain the managed object name, since several MOs
-      // in an inheritance tree may aggregate the same aggregation property name
-      allAggregationPropertyDefinitions.put(
-        apd.getManagedObjectDefinition().getName() + ":" + propName, apd);
-    }
-  }
-
-
-
-  /**
-   * Register a relation definition with this managed object definition,
-   * overriding any existing relation definition with the same name.
-   * <p>
-   * This method <b>must not</b> be called by applications.
-   *
-   * @param d
-   *          The relation definition to be registered.
-   */
-  protected final void registerRelationDefinition(RelationDefinition<?, ?> d) {
-    // Register the relation in this managed object definition.
-    String relName = d.getName();
-
-    relationDefinitions.put(relName, d);
-    allRelationDefinitions.put(relName, d);
-
-    // Now register the relation in the referenced managed object
-    // definition for reverse lookups.
-    registerReverseRelationDefinition(d);
-  }
-
-
-
-  /**
-   * Register an option with this managed object definition.
-   * <p>
-   * This method <b>must not</b> be called by applications.
-   *
-   * @param option
-   *          The option to be registered.
-   */
-  protected final void registerOption(ManagedObjectOption option) {
-    options.add(option);
-  }
-
-
-
-  /**
-   * Register a tag with this managed object definition.
-   * <p>
-   * This method <b>must not</b> be called by applications.
-   *
-   * @param tag
-   *          The tag to be registered.
-   */
-  protected final void registerTag(Tag tag) {
-    allTags.add(tag);
-  }
-
-
-
-  /**
-   * Deregister a constraint from the managed object definition.
-   * <p>
-   * This method <b>must not</b> be called by applications and is
-   * only intended for internal testing.
-   *
-   * @param constraint
-   *          The constraint to be deregistered.
-   */
-  final void deregisterConstraint(Constraint constraint) {
-    if (!constraints.remove(constraint)) {
-      throw new RuntimeException("Failed to deregister a constraint");
-    }
-  }
-
-
-
-  /**
-   * Deregister a relation definition from the managed object
-   * definition.
-   * <p>
-   * This method <b>must not</b> be called by applications and is
-   * only intended for internal testing.
-   *
-   * @param d
-   *          The relation definition to be deregistered.
-   */
-  final void deregisterRelationDefinition(
-      RelationDefinition<?, ?> d) {
-   // Deregister the relation from this managed object definition.
-    String relName = d.getName();
-    relationDefinitions.remove(relName);
-    allRelationDefinitions.remove(relName);
-
-    // Now deregister the relation from the referenced managed object
-    // definition for reverse lookups.
-    d.getChildDefinition().reverseRelationDefinitions.remove(d);
-  }
-
-
-
-  /**
-   * Register this managed object definition in its parent.
-   * <p>
-   * This method <b>must not</b> be called by applications and is
-   * only intended for internal testing.
-   */
-  final void registerInParent() {
-    if (parent != null) {
-      parent.children.put(name, this);
-    }
-  }
-
-
-
-  // Register a relation definition in the referenced managed object
-  // definition's reverse lookup table.
-  private <CC extends ConfigurationClient, SS extends Configuration>
-  void registerReverseRelationDefinition(RelationDefinition<CC, SS> rd) {
-    rd.getChildDefinition().reverseRelationDefinitions.add(rd);
-  }
-
-
-
-  // Register a aggregation property definition in the referenced managed object
-  // definition's reverse lookup table.
-  private void registerReverseAggregationPropertyDefinition(
-    AggregationPropertyDefinition<?, ?> apd) {
-
-    apd.getRelationDefinition().getChildDefinition().
-      reverseAggregationPropertyDefinitions.add(apd);
-  }
-
-
-
-  // Recursively descend definition hierarchy to find the best match definition.
-  private AbstractManagedObjectDefinition<? extends C, ? extends S>
-      resolveManagedObjectDefinitionAux(
-      AbstractManagedObjectDefinition<? extends C, ? extends S> d,
-      DefinitionResolver r) {
-    if (!r.matches(d)) {
-      return null;
+    /**
+     * Get the constraints defined by this managed object definition. The
+     * returned collection will not contain inherited constraints.
+     *
+     * @return Returns an unmodifiable collection containing the constraints
+     *         defined by this managed object definition.
+     */
+    public final Collection<Constraint> getConstraints() {
+        return Collections.unmodifiableCollection(constraints);
     }
 
-    for (AbstractManagedObjectDefinition<? extends C, ? extends S> child : d
-        .getChildren()) {
-      AbstractManagedObjectDefinition<? extends C, ? extends S> rd =
-        resolveManagedObjectDefinitionAux(child, r);
-      if (rd != null) {
-        return rd;
-      }
+    /**
+     * Gets the optional description of this managed object definition in the
+     * default locale.
+     *
+     * @return Returns the description of this managed object definition in the
+     *         default locale, or <code>null</code> if there is no description.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getDescription() throws UnsupportedOperationException {
+        return getDescription(Locale.getDefault());
     }
 
-    return d;
-  }
+    /**
+     * Gets the optional description of this managed object definition in the
+     * specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the description of this managed object definition in the
+     *         specified locale, or <code>null</code> if there is no
+     *         description.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getDescription(Locale locale) throws UnsupportedOperationException {
+        try {
+            return ManagedObjectDefinitionI18NResource.getInstance().getMessage(this, "description", locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Get the name of the definition.
+     *
+     * @return Returns the name of the definition.
+     */
+    public final String getName() {
+        return name;
+    }
+
+    /**
+     * Get the parent managed object definition, if applicable.
+     *
+     * @return Returns the parent of this managed object definition, or
+     *         <code>null</code> if this definition is the {@link TopCfgDefn}.
+     */
+    public final AbstractManagedObjectDefinition<? super C, ? super S> getParent() {
+        return parent;
+    }
+
+    /**
+     * Get the specified property definition associated with this type of
+     * managed object. The search will include any inherited property
+     * definitions.
+     *
+     * @param name
+     *            The name of the property definition to be retrieved.
+     * @return Returns the specified property definition associated with this
+     *         type of managed object.
+     * @throws IllegalArgumentException
+     *             If the specified property name was null or empty or if the
+     *             requested property definition was not found.
+     */
+    public final PropertyDefinition<?> getPropertyDefinition(String name) throws IllegalArgumentException {
+        if ((name == null) || (name.length() == 0)) {
+            throw new IllegalArgumentException("null or empty property name");
+        }
+
+        PropertyDefinition<?> d = allPropertyDefinitions.get(name);
+        if (d == null) {
+            throw new IllegalArgumentException("property definition \"" + name + "\" not found");
+        }
+
+        return d;
+    }
+
+    /**
+     * Get the property definitions defined by this managed object definition.
+     * The returned collection will not contain inherited property definitions.
+     *
+     * @return Returns an unmodifiable collection containing the property
+     *         definitions defined by this managed object definition.
+     */
+    public final Collection<PropertyDefinition<?>> getPropertyDefinitions() {
+        return Collections.unmodifiableCollection(propertyDefinitions.values());
+    }
+
+    /**
+     * Get the specified relation definition associated with this type of
+     * managed object.The search will include any inherited relation
+     * definitions.
+     *
+     * @param name
+     *            The name of the relation definition to be retrieved.
+     * @return Returns the specified relation definition associated with this
+     *         type of managed object.
+     * @throws IllegalArgumentException
+     *             If the specified relation name was null or empty or if the
+     *             requested relation definition was not found.
+     */
+    public final RelationDefinition<?, ?> getRelationDefinition(String name) throws IllegalArgumentException {
+        if ((name == null) || (name.length() == 0)) {
+            throw new IllegalArgumentException("null or empty relation name");
+        }
+
+        RelationDefinition<?, ?> d = allRelationDefinitions.get(name);
+        if (d == null) {
+            throw new IllegalArgumentException("relation definition \"" + name + "\" not found");
+        }
+
+        return d;
+    }
+
+    /**
+     * Get the relation definitions defined by this managed object definition.
+     * The returned collection will not contain inherited relation definitions.
+     *
+     * @return Returns an unmodifiable collection containing the relation
+     *         definitions defined by this managed object definition.
+     */
+    public final Collection<RelationDefinition<?, ?>> getRelationDefinitions() {
+        return Collections.unmodifiableCollection(relationDefinitions.values());
+    }
+
+    /**
+     * Get the relation definitions which refer directly to this managed object
+     * definition. The returned collection will not contain relation definitions
+     * which refer to parents of this managed object definition.
+     *
+     * @return Returns an unmodifiable collection containing the relation
+     *         definitions which refer directly to this managed object
+     *         definition.
+     */
+    public final Collection<RelationDefinition<C, S>> getReverseRelationDefinitions() {
+        return Collections.unmodifiableCollection(reverseRelationDefinitions);
+    }
+
+    /**
+     * Get the specified aggregation property definition associated with this
+     * type of managed object.The search will include any inherited aggregation
+     * property definitions.
+     *
+     * @param name
+     *            The name of the aggregation property definition to be
+     *            retrieved.
+     * @return Returns the specified aggregation property definition associated
+     *         with this type of managed object.
+     * @throws IllegalArgumentException
+     *             If the specified aggregation property name was null or empty
+     *             or if the requested aggregation property definition was not
+     *             found.
+     */
+    public final AggregationPropertyDefinition<?, ?> getAggregationPropertyDefinition(String name)
+            throws IllegalArgumentException {
+        if ((name == null) || (name.length() == 0)) {
+            throw new IllegalArgumentException("null or empty aggregation property name");
+        }
+
+        AggregationPropertyDefinition<?, ?> d = allAggregationPropertyDefinitions.get(name);
+        if (d == null) {
+            throw new IllegalArgumentException("aggregation property definition \"" + name + "\" not found");
+        }
+
+        return d;
+    }
+
+    /**
+     * Get the aggregation property definitions defined by this managed object
+     * definition. The returned collection will not contain inherited
+     * aggregation property definitions.
+     *
+     * @return Returns an unmodifiable collection containing the aggregation
+     *         property definitions defined by this managed object definition.
+     */
+    public final Collection<AggregationPropertyDefinition<?, ?>> getAggregationPropertyDefinitions() {
+        return Collections.unmodifiableCollection(aggregationPropertyDefinitions.values());
+    }
+
+    /**
+     * Get the aggregation property definitions which refer directly to this
+     * managed object definition. The returned collection will not contain
+     * aggregation property definitions which refer to parents of this managed
+     * object definition.
+     *
+     * @return Returns an unmodifiable collection containing the aggregation
+     *         property definitions which refer directly to this managed object
+     *         definition.
+     */
+    public final Collection<AggregationPropertyDefinition<?, ?>> getReverseAggregationPropertyDefinitions() {
+        return Collections.unmodifiableCollection(reverseAggregationPropertyDefinitions);
+    }
+
+    /**
+     * Gets the synopsis of this managed object definition in the default
+     * locale.
+     *
+     * @return Returns the synopsis of this managed object definition in the
+     *         default locale.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getSynopsis() throws UnsupportedOperationException {
+        return getSynopsis(Locale.getDefault());
+    }
+
+    /**
+     * Gets the synopsis of this managed object definition in the specified
+     * locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this managed object definition in the
+     *         specified locale.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) throws UnsupportedOperationException {
+        return ManagedObjectDefinitionI18NResource.getInstance().getMessage(this, "synopsis", locale);
+    }
+
+    /**
+     * Gets the user friendly name of this managed object definition in the
+     * default locale.
+     *
+     * @return Returns the user friendly name of this managed object definition
+     *         in the default locale.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getUserFriendlyName() throws UnsupportedOperationException {
+        return getUserFriendlyName(Locale.getDefault());
+    }
+
+    /**
+     * Gets the user friendly name of this managed object definition in the
+     * specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the user friendly name of this managed object definition
+     *         in the specified locale.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getUserFriendlyName(Locale locale) throws UnsupportedOperationException {
+        return LocalizableMessage.raw(ManagedObjectDefinitionI18NResource.getInstance().getMessage(this,
+                "user-friendly-name", locale));
+    }
+
+    /**
+     * Gets the user friendly plural name of this managed object definition in
+     * the default locale.
+     *
+     * @return Returns the user friendly plural name of this managed object
+     *         definition in the default locale.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getUserFriendlyPluralName() throws UnsupportedOperationException {
+        return getUserFriendlyPluralName(Locale.getDefault());
+    }
+
+    /**
+     * Gets the user friendly plural name of this managed object definition in
+     * the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the user friendly plural name of this managed object
+     *         definition in the specified locale.
+     * @throws UnsupportedOperationException
+     *             If this managed object definition is the {@link TopCfgDefn}.
+     */
+    public final LocalizableMessage getUserFriendlyPluralName(Locale locale) throws UnsupportedOperationException {
+        return ManagedObjectDefinitionI18NResource.getInstance().getMessage(this,
+                "user-friendly-plural-name", locale);
+    }
+
+    /**
+     * Determine whether there are any child managed object definitions which
+     * inherit from this managed object definition.
+     *
+     * @return Returns <code>true</code> if this type of managed object has any
+     *         child managed object definitions, <code>false</code> otherwise.
+     */
+    public final boolean hasChildren() {
+        return !children.isEmpty();
+    }
+
+    /**
+     * Determines whether or not this managed object definition has the
+     * specified option.
+     *
+     * @param option
+     *            The option to test.
+     * @return Returns <code>true</code> if the option is set, or
+     *         <code>false</code> otherwise.
+     */
+    public final boolean hasOption(ManagedObjectOption option) {
+        return options.contains(option);
+    }
+
+    /**
+     * Determines whether or not this managed object definition has the
+     * specified tag.
+     *
+     * @param t
+     *            The tag definition.
+     * @return Returns <code>true</code> if this managed object definition has
+     *         the specified tag.
+     */
+    public final boolean hasTag(Tag t) {
+        return allTags.contains(t);
+    }
+
+    /**
+     * Determines whether or not this managed object definition is a sub-type of
+     * the provided managed object definition. This managed object definition is
+     * a sub-type of the provided managed object definition if they are both the
+     * same or if the provided managed object definition can be obtained by
+     * recursive invocations of the {@link #getParent()} method.
+     *
+     * @param d
+     *            The managed object definition to be checked.
+     * @return Returns <code>true</code> if this managed object definition is a
+     *         sub-type of the provided managed object definition.
+     */
+    public final boolean isChildOf(AbstractManagedObjectDefinition<?, ?> d) {
+        AbstractManagedObjectDefinition<?, ?> i;
+        for (i = this; i != null; i = i.parent) {
+            if (i == d) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Determines whether or not this managed object definition is a super-type
+     * of the provided managed object definition. This managed object definition
+     * is a super-type of the provided managed object definition if they are
+     * both the same or if the provided managed object definition is a member of
+     * the set of children returned from {@link #getAllChildren()}.
+     *
+     * @param d
+     *            The managed object definition to be checked.
+     * @return Returns <code>true</code> if this managed object definition is a
+     *         super-type of the provided managed object definition.
+     */
+    public final boolean isParentOf(AbstractManagedObjectDefinition<?, ?> d) {
+        return d.isChildOf(this);
+    }
+
+    /**
+     * Determines whether or not this managed object definition is the
+     * {@link TopCfgDefn}.
+     *
+     * @return Returns <code>true</code> if this managed object definition is
+     *         the {@link TopCfgDefn}.
+     */
+    public final boolean isTop() {
+        return (this instanceof TopCfgDefn);
+    }
+
+    /**
+     * Finds a sub-type of this managed object definition which most closely
+     * corresponds to the matching criteria of the provided definition resolver.
+     *
+     * @param r
+     *            The definition resolver.
+     * @return Returns the sub-type of this managed object definition which most
+     *         closely corresponds to the matching criteria of the provided
+     *         definition resolver.
+     * @throws DefinitionDecodingException
+     *             If no matching sub-type could be found or if the resolved
+     *             definition was abstract.
+     * @see DefinitionResolver
+     */
+    @SuppressWarnings("unchecked")
+    public final ManagedObjectDefinition<? extends C, ? extends S> resolveManagedObjectDefinition(DefinitionResolver r)
+            throws DefinitionDecodingException {
+        AbstractManagedObjectDefinition<? extends C, ? extends S> rd;
+        rd = resolveManagedObjectDefinitionAux(this, r);
+        if (rd == null) {
+            // Unable to resolve the definition.
+            throw new DefinitionDecodingException(this, Reason.WRONG_TYPE_INFORMATION);
+        } else if (rd instanceof ManagedObjectDefinition) {
+            return (ManagedObjectDefinition<? extends C, ? extends S>) rd;
+        } else {
+            // Resolved definition was abstract.
+            throw new DefinitionDecodingException(this, Reason.ABSTRACT_TYPE_INFORMATION);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String toString() {
+        StringBuilder builder = new StringBuilder();
+        toString(builder);
+        return builder.toString();
+    }
+
+    /**
+     * Append a string representation of the managed object definition to the
+     * provided string builder.
+     *
+     * @param builder
+     *            The string builder where the string representation should be
+     *            appended.
+     */
+    public final void toString(StringBuilder builder) {
+        builder.append(getName());
+    }
+
+    /**
+     * Initializes all of the components associated with this managed object
+     * definition.
+     *
+     * @throws Exception
+     *             If this managed object definition could not be initialized.
+     */
+    protected final void initialize() throws Exception {
+        for (PropertyDefinition<?> pd : getAllPropertyDefinitions()) {
+            pd.initialize();
+            pd.getDefaultBehaviorProvider().initialize();
+        }
+
+        for (RelationDefinition<?, ?> rd : getAllRelationDefinitions()) {
+            rd.initialize();
+        }
+
+        for (AggregationPropertyDefinition<?, ?> apd : getAllAggregationPropertyDefinitions()) {
+
+            apd.initialize();
+            // Now register the aggregation property in the referenced managed
+            // object
+            // definition for reverse lookups.
+            registerReverseAggregationPropertyDefinition(apd);
+        }
+
+        for (Constraint constraint : getAllConstraints()) {
+            constraint.initialize();
+        }
+    }
+
+    /**
+     * Register a constraint with this managed object definition.
+     * <p>
+     * This method <b>must not</b> be called by applications.
+     *
+     * @param constraint
+     *            The constraint to be registered.
+     */
+    protected final void registerConstraint(Constraint constraint) {
+        constraints.add(constraint);
+    }
+
+    /**
+     * Register a property definition with this managed object definition,
+     * overriding any existing property definition with the same name.
+     * <p>
+     * This method <b>must not</b> be called by applications.
+     *
+     * @param d
+     *            The property definition to be registered.
+     */
+    protected final void registerPropertyDefinition(PropertyDefinition<?> d) {
+        String propName = d.getName();
+
+        propertyDefinitions.put(propName, d);
+        allPropertyDefinitions.put(propName, d);
+
+        if (d instanceof AggregationPropertyDefinition<?, ?>) {
+            AggregationPropertyDefinition<?, ?> apd = (AggregationPropertyDefinition<?, ?>) d;
+            aggregationPropertyDefinitions.put(propName, apd);
+            // The key must also contain the managed object name, since several
+            // MOs
+            // in an inheritance tree may aggregate the same aggregation
+            // property name
+            allAggregationPropertyDefinitions.put(apd.getManagedObjectDefinition().getName() + ":" + propName, apd);
+        }
+    }
+
+    /**
+     * Register a relation definition with this managed object definition,
+     * overriding any existing relation definition with the same name.
+     * <p>
+     * This method <b>must not</b> be called by applications.
+     *
+     * @param d
+     *            The relation definition to be registered.
+     */
+    protected final void registerRelationDefinition(RelationDefinition<?, ?> d) {
+        // Register the relation in this managed object definition.
+        String relName = d.getName();
+
+        relationDefinitions.put(relName, d);
+        allRelationDefinitions.put(relName, d);
+
+        // Now register the relation in the referenced managed object
+        // definition for reverse lookups.
+        registerReverseRelationDefinition(d);
+    }
+
+    /**
+     * Register an option with this managed object definition.
+     * <p>
+     * This method <b>must not</b> be called by applications.
+     *
+     * @param option
+     *            The option to be registered.
+     */
+    protected final void registerOption(ManagedObjectOption option) {
+        options.add(option);
+    }
+
+    /**
+     * Register a tag with this managed object definition.
+     * <p>
+     * This method <b>must not</b> be called by applications.
+     *
+     * @param tag
+     *            The tag to be registered.
+     */
+    protected final void registerTag(Tag tag) {
+        allTags.add(tag);
+    }
+
+    /**
+     * Deregister a constraint from the managed object definition.
+     * <p>
+     * This method <b>must not</b> be called by applications and is only
+     * intended for internal testing.
+     *
+     * @param constraint
+     *            The constraint to be deregistered.
+     */
+    final void deregisterConstraint(Constraint constraint) {
+        if (!constraints.remove(constraint)) {
+            throw new RuntimeException("Failed to deregister a constraint");
+        }
+    }
+
+    /**
+     * Deregister a relation definition from the managed object definition.
+     * <p>
+     * This method <b>must not</b> be called by applications and is only
+     * intended for internal testing.
+     *
+     * @param d
+     *            The relation definition to be deregistered.
+     */
+    final void deregisterRelationDefinition(RelationDefinition<?, ?> d) {
+        // Deregister the relation from this managed object definition.
+        String relName = d.getName();
+        relationDefinitions.remove(relName);
+        allRelationDefinitions.remove(relName);
+
+        // Now deregister the relation from the referenced managed object
+        // definition for reverse lookups.
+        d.getChildDefinition().reverseRelationDefinitions.remove(d);
+    }
+
+    /**
+     * Register this managed object definition in its parent.
+     * <p>
+     * This method <b>must not</b> be called by applications and is only
+     * intended for internal testing.
+     */
+    final void registerInParent() {
+        if (parent != null) {
+            parent.children.put(name, this);
+        }
+    }
+
+    // Register a relation definition in the referenced managed object
+    // definition's reverse lookup table.
+    private <CC extends ConfigurationClient, SS extends Configuration> void registerReverseRelationDefinition(
+            RelationDefinition<CC, SS> rd) {
+        rd.getChildDefinition().reverseRelationDefinitions.add(rd);
+    }
+
+    // Register a aggregation property definition in the referenced managed
+    // object
+    // definition's reverse lookup table.
+    private void registerReverseAggregationPropertyDefinition(AggregationPropertyDefinition<?, ?> apd) {
+
+        apd.getRelationDefinition().getChildDefinition().reverseAggregationPropertyDefinitions.add(apd);
+    }
+
+    // Recursively descend definition hierarchy to find the best match
+    // definition.
+    private AbstractManagedObjectDefinition<? extends C, ? extends S> resolveManagedObjectDefinitionAux(
+            AbstractManagedObjectDefinition<? extends C, ? extends S> d, DefinitionResolver r) {
+        if (!r.matches(d)) {
+            return null;
+        }
+
+        for (AbstractManagedObjectDefinition<? extends C, ? extends S> child : d.getChildren()) {
+            AbstractManagedObjectDefinition<? extends C, ? extends S> rd = resolveManagedObjectDefinitionAux(child, r);
+            if (rd != null) {
+                return rd;
+            }
+        }
+
+        return d;
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AdminException.java b/opendj-admin/src/main/java/org/opends/server/admin/AdminException.java
index dea9632..b43017a 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AdminException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AdminException.java
@@ -27,47 +27,38 @@
 
 package org.opends.server.admin;
 
-
-
-import org.opends.messages.Message;
-
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.types.OpenDsException;
 
-
-
 /**
  * Exceptions thrown when interacting with administration framework.
  */
 public abstract class AdminException extends OpenDsException {
 
-  /**
-   * Fake serialization ID.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * Fake serialization ID.
+     */
+    private static final long serialVersionUID = 1L;
 
+    /**
+     * Create an admin exception with a message and cause.
+     *
+     * @param message
+     *            The message.
+     * @param cause
+     *            The cause.
+     */
+    protected AdminException(LocalizableMessage message, Throwable cause) {
+        super(message, cause);
+    }
 
-
-  /**
-   * Create an admin exception with a message and cause.
-   *
-   * @param message
-   *          The message.
-   * @param cause
-   *          The cause.
-   */
-  protected AdminException(Message message, Throwable cause) {
-    super(message, cause);
-  }
-
-
-
-  /**
-   * Create an admin exception with a message.
-   *
-   * @param message
-   *          The message.
-   */
-  protected AdminException(Message message) {
-    super(message);
-  }
+    /**
+     * Create an admin exception with a message.
+     *
+     * @param message
+     *            The message.
+     */
+    protected AdminException(LocalizableMessage message) {
+        super(message);
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AdminRuntimeException.java b/opendj-admin/src/main/java/org/opends/server/admin/AdminRuntimeException.java
index 379e2d1..64a3629 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AdminRuntimeException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AdminRuntimeException.java
@@ -27,65 +27,53 @@
 
 package org.opends.server.admin;
 
-
-
-import org.opends.messages.Message;
-
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Exceptions thrown when interacting with administration framework
- * that applications are not expected to catch.
+ * Exceptions thrown when interacting with administration framework that
+ * applications are not expected to catch.
  */
 public abstract class AdminRuntimeException extends RuntimeException {
 
-  /**
-   * Fake serialization ID.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * Fake serialization ID.
+     */
+    private static final long serialVersionUID = 1L;
 
+    // LocalizableMessage that explains the problem.
+    private final LocalizableMessage message;
 
+    /**
+     * Create an admin runtime exception with a message and cause.
+     *
+     * @param message
+     *            The message.
+     * @param cause
+     *            The cause.
+     */
+    protected AdminRuntimeException(LocalizableMessage message, Throwable cause) {
+        super(message.toString(), cause);
+        this.message = message;
+    }
 
-  // Message that explains the problem.
-  private final Message message;
+    /**
+     * Create an admin runtime exception with a message.
+     *
+     * @param message
+     *            The message.
+     */
+    protected AdminRuntimeException(LocalizableMessage message) {
+        super(message.toString());
+        this.message = message;
+    }
 
-
-
-  /**
-   * Create an admin runtime exception with a message and cause.
-   *
-   * @param message
-   *          The message.
-   * @param cause
-   *          The cause.
-   */
-  protected AdminRuntimeException(Message message, Throwable cause) {
-    super(message.toString(), cause);
-    this.message = message;
-  }
-
-
-
-  /**
-   * Create an admin runtime exception with a message.
-   *
-   * @param message
-   *          The message.
-   */
-  protected AdminRuntimeException(Message message) {
-    super(message.toString());
-    this.message = message;
-  }
-
-
-
-  /**
-   * Returns the message that explains the problem that occurred.
-   *
-   * @return Returns the message describing the problem that occurred
-   *         (never <code>null</code>).
-   */
-  public Message getMessageObject() {
-    return this.message;
-  }
+    /**
+     * Returns the message that explains the problem that occurred.
+     *
+     * @return Returns the message describing the problem that occurred (never
+     *         <code>null</code>).
+     */
+    public LocalizableMessage getLocalizableMessageObject() {
+        return this.message;
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AdministrationConnector.java b/opendj-admin/src/main/java/org/opends/server/admin/AdministrationConnector.java
index 46c1c73..60a078c 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AdministrationConnector.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AdministrationConnector.java
@@ -27,9 +27,6 @@
  */
 package org.opends.server.admin;
 
-import static org.opends.server.loggers.ErrorLogger.logError;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.messages.AdminMessages.*;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.PrintWriter;
@@ -38,36 +35,26 @@
 import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
+
 import javax.naming.ldap.Rdn;
-import org.opends.messages.Message;
+
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.server.ServerManagementContext;
-import org.opends.server.admin.std.meta.LDAPConnectionHandlerCfgDefn.
-  SSLClientAuthPolicy;
-import org.opends.server.admin.std.server.AdministrationConnectorCfg;
-import org.opends.server.admin.std.server.ConnectionHandlerCfg;
-import org.opends.server.admin.std.server.KeyManagerProviderCfg;
-import org.opends.server.admin.std.server.FileBasedKeyManagerProviderCfg;
-import org.opends.server.admin.std.server.FileBasedTrustManagerProviderCfg;
-import org.opends.server.admin.std.server.LDAPConnectionHandlerCfg;
-import org.opends.server.admin.std.server.RootCfg;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.SynchronousStrategy;
-import org.opends.server.protocols.ldap.LDAPConnectionHandler;
 import org.opends.server.types.AddressMask;
 import org.opends.server.types.ConfigChangeResult;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.admin.server.AdministrationConnectorCfg;
+import org.forgerock.opendj.admin.server.FileBasedKeyManagerProviderCfg;
+import org.forgerock.opendj.admin.server.FileBasedTrustManagerProviderCfg;
+import org.forgerock.opendj.admin.server.KeyManagerProviderCfg;
+import org.forgerock.opendj.admin.server.LDAPConnectionHandlerCfg;
+import org.forgerock.opendj.admin.server.RootCfg;
+import org.forgerock.opendj.admin.server.TrustManagerProviderCfg;
 import org.forgerock.opendj.ldap.DN;
 import org.opends.server.types.InitializationException;
-import org.opends.server.types.ResultCode;
-import org.opends.server.util.CertificateManager;
-import org.opends.server.util.SetupUtils;
-import org.opends.server.admin.std.server.TrustManagerProviderCfg;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.loggers.ErrorLogger;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.DebugLogLevel;
 import org.opends.server.types.DirectoryException;
-import org.opends.server.types.FilePermission;
 
 /**
  * This class is a wrapper on top of LDAPConnectionHandler to manage
@@ -218,7 +205,7 @@
    */
   public boolean isConfigurationChangeAcceptable(
       AdministrationConnectorCfg configuration,
-      List<Message> unacceptableReasons)
+      List<LocalizableMessage> unacceptableReasons)
   {
     LDAPConnectionHandlerCfg cfg = new FakeLDAPConnectionHandlerCfg(
         configuration);
@@ -235,7 +222,7 @@
       AdministrationConnectorCfg configuration)
   {
     return new ConfigChangeResult(ResultCode.SUCCESS, true,
-        new ArrayList<Message>());
+        new ArrayList<LocalizableMessage>());
   }
 
 
@@ -676,7 +663,7 @@
         {
           err += pinFilePath + " ";
         }
-        Message message = ERR_ADMIN_CERTIFICATE_GENERATION_MISSING_FILES
+        LocalizableMessage message = ERR_ADMIN_CERTIFICATE_GENERATION_MISSING_FILES
             .get(err);
         logError(message);
         throw new InitializationException(message);
@@ -728,7 +715,7 @@
               new FilePermission(0600)))
           {
             // Log a warning that the permissions were not set.
-            Message message = WARN_ADMIN_SET_PERMISSIONS_FAILED
+            LocalizableMessage message = WARN_ADMIN_SET_PERMISSIONS_FAILED
                 .get(pinFilePath);
             ErrorLogger.logError(message);
           }
@@ -736,7 +723,7 @@
         catch (DirectoryException e)
         {
           // Log a warning that the permissions were not set.
-          Message message = WARN_ADMIN_SET_PERMISSIONS_FAILED.get(pinFilePath);
+          LocalizableMessage message = WARN_ADMIN_SET_PERMISSIONS_FAILED.get(pinFilePath);
           ErrorLogger.logError(message);
         }
       }
@@ -755,7 +742,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      Message message = ERR_ADMIN_CERTIFICATE_GENERATION.get(e.getMessage());
+      LocalizableMessage message = ERR_ADMIN_CERTIFICATE_GENERATION.get(e.getMessage());
       logError(message);
       throw new InitializationException(message);
     }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AdministratorAction.java b/opendj-admin/src/main/java/org/opends/server/admin/AdministratorAction.java
index 2b8d069..192f076 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AdministratorAction.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AdministratorAction.java
@@ -25,167 +25,143 @@
  *      Copyright 2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin;
-import org.opends.messages.Message;
-
-
 
 import java.util.Locale;
 import java.util.MissingResourceException;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Defines an optional action which administators must perform after
- * they have modified a property. By default modifications to
- * properties are assumed to take effect immediately and require no
- * additional administrative action. Developers should be aware that,
- * where feasible, they should implement components such that property
- * modifications require no additional administrative action. This is
- * required in order to minimize server downtime during administration
- * and provide a more user-friendly experience.
+ * Defines an optional action which administators must perform after they have
+ * modified a property. By default modifications to properties are assumed to
+ * take effect immediately and require no additional administrative action.
+ * Developers should be aware that, where feasible, they should implement
+ * components such that property modifications require no additional
+ * administrative action. This is required in order to minimize server downtime
+ * during administration and provide a more user-friendly experience.
  */
 public final class AdministratorAction {
 
-  /**
-   * Specifies the type of administrator action which must be
-   * performed in order for pending changes to take effect.
-   */
-  public static enum Type {
     /**
-     * Used when modifications to a property require a component
-     * restart in order to take effect (usually by disabling and
-     * re-enabling the component). May have a description describing
-     * any additional administrator action that is required when the
-     * component is restarted.
+     * Specifies the type of administrator action which must be performed in
+     * order for pending changes to take effect.
      */
-    COMPONENT_RESTART("component-restart"),
+    public static enum Type {
+        /**
+         * Used when modifications to a property require a component restart in
+         * order to take effect (usually by disabling and re-enabling the
+         * component). May have a description describing any additional
+         * administrator action that is required when the component is
+         * restarted.
+         */
+        COMPONENT_RESTART("component-restart"),
 
-    /**
-     * Used when modifications to a property take effect immediately,
-     * and no additional administrator action is required. May have a
-     * description describing how changes to the modified property
-     * will take effect.
-     */
-    NONE("none"),
+        /**
+         * Used when modifications to a property take effect immediately, and no
+         * additional administrator action is required. May have a description
+         * describing how changes to the modified property will take effect.
+         */
+        NONE("none"),
 
-    /**
-     * Used when modifications to a property require an additional
-     * administrative action in order to take effect. This should be
-     * used when neither a server restart nor a component restart are
-     * applicable. Always has a description which describes the
-     * additional administrator action which is required when the
-     * property is modified.
-     */
-    OTHER("other"),
+        /**
+         * Used when modifications to a property require an additional
+         * administrative action in order to take effect. This should be used
+         * when neither a server restart nor a component restart are applicable.
+         * Always has a description which describes the additional administrator
+         * action which is required when the property is modified.
+         */
+        OTHER("other"),
 
-    /**
-     * Used when modifications to a property require a server restart
-     * in order to take effect. May have a description describing any
-     * additional administrator action that is required when the
-     * component is restarted.
-     */
-    SERVER_RESTART("server-restart");
+        /**
+         * Used when modifications to a property require a server restart in
+         * order to take effect. May have a description describing any
+         * additional administrator action that is required when the component
+         * is restarted.
+         */
+        SERVER_RESTART("server-restart");
 
-    // The user-friendly name of the type.
-    private final String name;
+        // The user-friendly name of the type.
+        private final String name;
 
+        // Private constructor.
+        private Type(String name) {
+            this.name = name;
+        }
 
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return name;
+        }
 
-    // Private constructor.
-    private Type(String name) {
-      this.name = name;
     }
 
+    // The managed object definition associated with this administrator
+    // action.
+    private final AbstractManagedObjectDefinition<?, ?> definition;
 
+    // The name of the property definition associated with this
+    // administrator action.
+    private final String propertyName;
+
+    // The type of administration action.
+    private final Type type;
 
     /**
-     * {@inheritDoc}
+     * Create a new administrator action.
+     *
+     * @param type
+     *            The type of this administration action.
+     * @param d
+     *            The managed object definition associated with this
+     *            administrator action.
+     * @param propertyName
+     *            The name of the property definition associated with this
+     *            administrator action.
      */
-    @Override
-    public String toString() {
-      return name;
+    public AdministratorAction(Type type, AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        this.type = type;
+        this.definition = d;
+        this.propertyName = propertyName;
     }
 
-  }
-
-  // The managed object definition associated with this administrator
-  // action.
-  private final AbstractManagedObjectDefinition<?, ?> definition;
-
-  // The name of the property definition associated with this
-  // administrator action.
-  private final String propertyName;
-
-  // The type of administration action.
-  private final Type type;
-
-
-
-  /**
-   * Create a new administrator action.
-   *
-   * @param type
-   *          The type of this administration action.
-   * @param d
-   *          The managed object definition associated with this
-   *          administrator action.
-   * @param propertyName
-   *          The name of the property definition associated with this
-   *          administrator action.
-   */
-  public AdministratorAction(Type type,
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    this.type = type;
-    this.definition = d;
-    this.propertyName = propertyName;
-  }
-
-
-
-  /**
-   * Gets the synopsis of this administrator action in the default
-   * locale.
-   *
-   * @return Returns the synopsis of this administrator action in the
-   *         default locale, or <code>null</code> if there is no
-   *         synopsis defined.
-   */
-  public final Message getSynopsis() {
-    return getSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the synopsis of this administrator action in the specified
-   * locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this administrator action in the
-   *         specified locale, or <code>null</code> if there is no
-   *         synopsis defined.
-   */
-  public final Message getSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + propertyName
-        + ".requires-admin-action.synopsis";
-    try {
-      return resource.getMessage(definition, property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+    /**
+     * Gets the synopsis of this administrator action in the default locale.
+     *
+     * @return Returns the synopsis of this administrator action in the default
+     *         locale, or <code>null</code> if there is no synopsis defined.
+     */
+    public final LocalizableMessage getSynopsis() {
+        return getSynopsis(Locale.getDefault());
     }
-  }
 
+    /**
+     * Gets the synopsis of this administrator action in the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this administrator action in the
+     *         specified locale, or <code>null</code> if there is no synopsis
+     *         defined.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + propertyName + ".requires-admin-action.synopsis";
+        try {
+            return resource.getLocalizableMessage(definition, property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
 
-
-  /**
-   * Gets the type of this administrator action.
-   *
-   * @return Returns the type of this administrator action.
-   */
-  public final Type getType() {
-    return type;
-  }
+    /**
+     * Gets the type of this administrator action.
+     *
+     * @return Returns the type of this administrator action.
+     */
+    public final Type getType() {
+        return type;
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java
index a028505..33d3c7b 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AggregationPropertyDefinition.java
@@ -26,12 +26,6 @@
  */
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.Validator.*;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -44,7 +38,6 @@
 import java.util.MissingResourceException;
 import java.util.SortedSet;
 
-import org.opends.messages.Message;
 import org.opends.server.admin.client.AuthorizationException;
 import org.opends.server.admin.client.ClientConstraintHandler;
 import org.opends.server.admin.client.CommunicationException;
@@ -58,1147 +51,970 @@
 import org.opends.server.admin.server.ServerManagedObject;
 import org.opends.server.admin.server.ServerManagedObjectChangeListener;
 import org.opends.server.admin.server.ServerManagementContext;
-import org.opends.server.admin.std.meta.RootCfgDefn;
 import org.opends.server.config.ConfigException;
-import org.opends.server.loggers.ErrorLogger;
-import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.types.ConfigChangeResult;
+import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.opendj.ldap.DN;
-import org.opends.server.types.DebugLogLevel;
-import org.opends.server.types.ResultCode;
-import org.opends.server.util.StaticUtils;
-
-
+import org.forgerock.opendj.ldap.ResultCode;
 
 /**
  * Aggregation property definition.
  * <p>
- * An aggregation property names one or more managed objects which are
- * required by the managed object associated with this property. An
- * aggregation property definition takes care to perform referential
- * integrity checks: referenced managed objects cannot be deleted. Nor
- * can an aggregation reference non-existent managed objects.
- * Referential integrity checks are <b>not</b> performed during value
- * validation. Instead they are performed when changes to the managed
- * object are committed.
+ * An aggregation property names one or more managed objects which are required
+ * by the managed object associated with this property. An aggregation property
+ * definition takes care to perform referential integrity checks: referenced
+ * managed objects cannot be deleted. Nor can an aggregation reference
+ * non-existent managed objects. Referential integrity checks are <b>not</b>
+ * performed during value validation. Instead they are performed when changes to
+ * the managed object are committed.
  * <p>
- * An aggregation property definition can optionally identify two
- * properties:
+ * An aggregation property definition can optionally identify two properties:
  * <ul>
- * <li>an <code>enabled</code> property in the aggregated managed
- * object - the property must be a {@link BooleanPropertyDefinition}
- * and indicate whether the aggregated managed object is enabled or
- * not. If specified, the administration framework will prevent the
- * aggregated managed object from being disabled while it is
- * referenced
- * <li>an <code>enabled</code> property in this property's managed
- * object - the property must be a {@link BooleanPropertyDefinition}
- * and indicate whether this property's managed object is enabled or
- * not. If specified, and as long as there is an equivalent
- * <code>enabled</code> property defined for the aggregated managed
- * object, the <code>enabled</code> property in the aggregated
- * managed object will only be checked when this property is true.
+ * <li>an <code>enabled</code> property in the aggregated managed object - the
+ * property must be a {@link BooleanPropertyDefinition} and indicate whether the
+ * aggregated managed object is enabled or not. If specified, the administration
+ * framework will prevent the aggregated managed object from being disabled
+ * while it is referenced
+ * <li>an <code>enabled</code> property in this property's managed object - the
+ * property must be a {@link BooleanPropertyDefinition} and indicate whether
+ * this property's managed object is enabled or not. If specified, and as long
+ * as there is an equivalent <code>enabled</code> property defined for the
+ * aggregated managed object, the <code>enabled</code> property in the
+ * aggregated managed object will only be checked when this property is true.
  * </ul>
- * In other words, these properties can be used to make sure that
- * referenced managed objects are not disabled while they are
- * referenced.
+ * In other words, these properties can be used to make sure that referenced
+ * managed objects are not disabled while they are referenced.
  *
  * @param <C>
- *          The type of client managed object configuration that this
- *          aggregation property definition refers to.
+ *            The type of client managed object configuration that this
+ *            aggregation property definition refers to.
  * @param <S>
- *          The type of server managed object configuration that this
- *          aggregation property definition refers to.
+ *            The type of server managed object configuration that this
+ *            aggregation property definition refers to.
  */
-public final class AggregationPropertyDefinition
-    <C extends ConfigurationClient, S extends Configuration>
-    extends PropertyDefinition<String> {
+public final class AggregationPropertyDefinition<C extends ConfigurationClient, S extends Configuration> extends
+        PropertyDefinition<String> {
 
-  /**
-   * An interface for incrementally constructing aggregation property
-   * definitions.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this aggregation property definition refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this aggregation property definition refers to.
-   */
-  public static class Builder
-      <C extends ConfigurationClient, S extends Configuration>
-      extends AbstractBuilder<String, AggregationPropertyDefinition<C, S>> {
+    /**
+     * An interface for incrementally constructing aggregation property
+     * definitions.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            aggregation property definition refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            aggregation property definition refers to.
+     */
+    public static class Builder<C extends ConfigurationClient, S extends Configuration> extends
+            AbstractBuilder<String, AggregationPropertyDefinition<C, S>> {
+
+        // The string representation of the managed object path specifying
+        // the parent of the aggregated managed objects.
+        private String parentPathString = null;
+
+        // The name of a relation in the parent managed object which
+        // contains the aggregated managed objects.
+        private String rdName = null;
+
+        // The condition which is used to determine if a referenced
+        // managed object is enabled.
+        private Condition targetIsEnabledCondition = Conditions.TRUE;
+
+        // The condition which is used to determine whether or not
+        // referenced managed objects need to be enabled.
+        private Condition targetNeedsEnablingCondition = Conditions.TRUE;
+
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
+        }
+
+        /**
+         * Sets the name of the managed object which is the parent of the
+         * aggregated managed objects.
+         * <p>
+         * This must be defined before the property definition can be built.
+         *
+         * @param pathString
+         *            The string representation of the managed object path
+         *            specifying the parent of the aggregated managed objects.
+         */
+        public final void setParentPath(String pathString) {
+            this.parentPathString = pathString;
+        }
+
+        /**
+         * Sets the relation in the parent managed object which contains the
+         * aggregated managed objects.
+         * <p>
+         * This must be defined before the property definition can be built.
+         *
+         * @param rdName
+         *            The name of a relation in the parent managed object which
+         *            contains the aggregated managed objects.
+         */
+        public final void setRelationDefinition(String rdName) {
+            this.rdName = rdName;
+        }
+
+        /**
+         * Sets the condition which is used to determine if a referenced managed
+         * object is enabled. By default referenced managed objects are assumed
+         * to always be enabled.
+         *
+         * @param condition
+         *            The condition which is used to determine if a referenced
+         *            managed object is enabled.
+         */
+        public final void setTargetIsEnabledCondition(Condition condition) {
+            this.targetIsEnabledCondition = condition;
+        }
+
+        /**
+         * Sets the condition which is used to determine whether or not
+         * referenced managed objects need to be enabled. By default referenced
+         * managed objects must always be enabled.
+         *
+         * @param condition
+         *            The condition which is used to determine whether or not
+         *            referenced managed objects need to be enabled.
+         */
+        public final void setTargetNeedsEnablingCondition(Condition condition) {
+            this.targetNeedsEnablingCondition = condition;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected AggregationPropertyDefinition<C, S> buildInstance(AbstractManagedObjectDefinition<?, ?> d,
+                String propertyName, EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<String> defaultBehavior) {
+            // Make sure that the parent path has been defined.
+            if (parentPathString == null) {
+                throw new IllegalStateException("Parent path undefined");
+            }
+
+            // Make sure that the relation definition has been defined.
+            if (rdName == null) {
+                throw new IllegalStateException("Relation definition undefined");
+            }
+
+            return new AggregationPropertyDefinition<C, S>(d, propertyName, options, adminAction, defaultBehavior,
+                    parentPathString, rdName, targetNeedsEnablingCondition, targetIsEnabledCondition);
+        }
+
+    }
+
+    /**
+     * A change listener which prevents the named component from being disabled.
+     */
+    private class ReferentialIntegrityChangeListener implements ServerManagedObjectChangeListener<S> {
+
+        // The error message which should be returned if an attempt is
+        // made to disable the referenced component.
+        private final LocalizableMessage message;
+
+        // The path of the referenced component.
+        private final ManagedObjectPath<C, S> path;
+
+        // Creates a new referential integrity delete listener.
+        private ReferentialIntegrityChangeListener(ManagedObjectPath<C, S> path, LocalizableMessage message) {
+            this.path = path;
+            this.message = message;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public ConfigChangeResult applyConfigurationChange(ServerManagedObject<? extends S> mo) {
+            try {
+                if (targetIsEnabledCondition.evaluate(mo)) {
+                    return new ConfigChangeResult(ResultCode.SUCCESS, false);
+                }
+            } catch (ConfigException e) {
+                // This should not happen - ignore it and throw an exception
+                // anyway below.
+            }
+
+            // This should not happen - the previous call-back should have
+            // trapped this.
+            throw new IllegalStateException("Attempting to disable a referenced "
+                    + relationDefinition.getChildDefinition().getUserFriendlyName());
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean isConfigurationChangeAcceptable(ServerManagedObject<? extends S> mo,
+                List<LocalizableMessage> unacceptableReasons) {
+            // Always prevent the referenced component from being
+            // disabled.
+            try {
+                if (!targetIsEnabledCondition.evaluate(mo)) {
+                    unacceptableReasons.add(message);
+                    return false;
+                } else {
+                    return true;
+                }
+            } catch (ConfigException e) {
+                // The condition could not be evaluated.
+                if (debugEnabled()) {
+                    TRACER.debugCaught(DebugLogLevel.ERROR, e);
+                }
+
+                LocalizableMessage message = ERR_REFINT_UNABLE_TO_EVALUATE_TARGET_CONDITION.get(mo.getManagedObjectDefinition()
+                        .getUserFriendlyName(), String.valueOf(mo.getDN()), StaticUtils.getExceptionLocalizableMessage(e));
+                ErrorLogger.logError(message);
+                unacceptableReasons.add(message);
+                return false;
+            }
+        }
+
+        // Gets the path associated with this listener.
+        private ManagedObjectPath<C, S> getManagedObjectPath() {
+            return path;
+        }
+
+    }
+
+    /**
+     * A delete listener which prevents the named component from being deleted.
+     */
+    private class ReferentialIntegrityDeleteListener implements ConfigurationDeleteListener<S> {
+
+        // The DN of the referenced configuration entry.
+        private final DN dn;
+
+        // The error message which should be returned if an attempt is
+        // made to delete the referenced component.
+        private final LocalizableMessage message;
+
+        // Creates a new referential integrity delete listener.
+        private ReferentialIntegrityDeleteListener(DN dn, LocalizableMessage message) {
+            this.dn = dn;
+            this.message = message;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public ConfigChangeResult applyConfigurationDelete(S configuration) {
+            // This should not happen - the
+            // isConfigurationDeleteAcceptable() call-back should have
+            // trapped this.
+            if (configuration.dn().equals(dn)) {
+                // This should not happen - the
+                // isConfigurationDeleteAcceptable() call-back should have
+                // trapped this.
+                throw new IllegalStateException("Attempting to delete a referenced "
+                        + relationDefinition.getChildDefinition().getUserFriendlyName());
+            } else {
+                return new ConfigChangeResult(ResultCode.SUCCESS, false);
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean isConfigurationDeleteAcceptable(S configuration, List<LocalizableMessage> unacceptableReasons) {
+            if (configuration.dn().equals(dn)) {
+                // Always prevent deletion of the referenced component.
+                unacceptableReasons.add(message);
+                return false;
+            }
+
+            return true;
+        }
+
+    }
+
+    /**
+     * The server-side constraint handler implementation.
+     */
+    private class ServerHandler extends ServerConstraintHandler {
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isUsable(ServerManagedObject<?> managedObject, Collection<LocalizableMessage> unacceptableReasons)
+                throws ConfigException {
+            SortedSet<String> names = managedObject.getPropertyValues(AggregationPropertyDefinition.this);
+            ServerManagementContext context = ServerManagementContext.getInstance();
+            LocalizableMessage thisUFN = managedObject.getManagedObjectDefinition().getUserFriendlyName();
+            String thisDN = managedObject.getDN().toString();
+            LocalizableMessage thatUFN = getRelationDefinition().getUserFriendlyName();
+
+            boolean isUsable = true;
+            boolean needsEnabling = targetNeedsEnablingCondition.evaluate(managedObject);
+            for (String name : names) {
+                ManagedObjectPath<C, S> path = getChildPath(name);
+                String thatDN = path.toDN().toString();
+
+                if (!context.managedObjectExists(path)) {
+                    LocalizableMessage msg = ERR_SERVER_REFINT_DANGLING_REFERENCE.get(name, getName(), thisUFN, thisDN, thatUFN,
+                            thatDN);
+                    unacceptableReasons.add(msg);
+                    isUsable = false;
+                } else if (needsEnabling) {
+                    // Check that the referenced component is enabled if
+                    // required.
+                    ServerManagedObject<? extends S> ref = context.getManagedObject(path);
+                    if (!targetIsEnabledCondition.evaluate(ref)) {
+                        LocalizableMessage msg = ERR_SERVER_REFINT_TARGET_DISABLED.get(name, getName(), thisUFN, thisDN, thatUFN,
+                                thatDN);
+                        unacceptableReasons.add(msg);
+                        isUsable = false;
+                    }
+                }
+            }
+
+            return isUsable;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void performPostAdd(ServerManagedObject<?> managedObject) throws ConfigException {
+            // First make sure existing listeners associated with this
+            // managed object are removed. This is required in order to
+            // prevent multiple change listener registrations from
+            // occurring, for example if this call-back is invoked multiple
+            // times after the same add event.
+            performPostDelete(managedObject);
+
+            // Add change and delete listeners against all referenced
+            // components.
+            LocalizableMessage thisUFN = managedObject.getManagedObjectDefinition().getUserFriendlyName();
+            String thisDN = managedObject.getDN().toString();
+            LocalizableMessage thatUFN = getRelationDefinition().getUserFriendlyName();
+
+            // Referenced managed objects will only need a change listener
+            // if they have can be disabled.
+            boolean needsChangeListeners = targetNeedsEnablingCondition.evaluate(managedObject);
+
+            // Delete listeners need to be registered against the parent
+            // entry of the referenced components.
+            ServerManagementContext context = ServerManagementContext.getInstance();
+            ManagedObjectPath<?, ?> parentPath = getParentPath();
+            ServerManagedObject<?> parent = context.getManagedObject(parentPath);
+
+            // Create entries in the listener tables.
+            List<ReferentialIntegrityDeleteListener> dlist = new LinkedList<ReferentialIntegrityDeleteListener>();
+            deleteListeners.put(managedObject.getDN(), dlist);
+
+            List<ReferentialIntegrityChangeListener> clist = new LinkedList<ReferentialIntegrityChangeListener>();
+            changeListeners.put(managedObject.getDN(), clist);
+
+            for (String name : managedObject.getPropertyValues(AggregationPropertyDefinition.this)) {
+                ManagedObjectPath<C, S> path = getChildPath(name);
+                DN dn = path.toDN();
+                String thatDN = dn.toString();
+
+                // Register the delete listener.
+                LocalizableMessage msg = ERR_SERVER_REFINT_CANNOT_DELETE.get(thatUFN, thatDN, getName(), thisUFN, thisDN);
+                ReferentialIntegrityDeleteListener dl = new ReferentialIntegrityDeleteListener(dn, msg);
+                parent.registerDeleteListener(getRelationDefinition(), dl);
+                dlist.add(dl);
+
+                // Register the change listener if required.
+                if (needsChangeListeners) {
+                    ServerManagedObject<? extends S> ref = context.getManagedObject(path);
+                    msg = ERR_SERVER_REFINT_CANNOT_DISABLE.get(thatUFN, thatDN, getName(), thisUFN, thisDN);
+                    ReferentialIntegrityChangeListener cl = new ReferentialIntegrityChangeListener(path, msg);
+                    ref.registerChangeListener(cl);
+                    clist.add(cl);
+                }
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void performPostDelete(ServerManagedObject<?> managedObject) throws ConfigException {
+            // Remove any registered delete and change listeners.
+            ServerManagementContext context = ServerManagementContext.getInstance();
+            DN dn = managedObject.getDN();
+
+            // Delete listeners need to be deregistered against the parent
+            // entry of the referenced components.
+            ManagedObjectPath<?, ?> parentPath = getParentPath();
+            ServerManagedObject<?> parent = context.getManagedObject(parentPath);
+            if (deleteListeners.containsKey(dn)) {
+                for (ReferentialIntegrityDeleteListener dl : deleteListeners.get(dn)) {
+                    parent.deregisterDeleteListener(getRelationDefinition(), dl);
+                }
+                deleteListeners.remove(dn);
+            }
+
+            // Change listeners need to be deregistered from their
+            // associated referenced component.
+            if (changeListeners.containsKey(dn)) {
+                for (ReferentialIntegrityChangeListener cl : changeListeners.get(dn)) {
+                    ManagedObjectPath<C, S> path = cl.getManagedObjectPath();
+                    ServerManagedObject<? extends S> ref = context.getManagedObject(path);
+                    ref.deregisterChangeListener(cl);
+                }
+                changeListeners.remove(dn);
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void performPostModify(ServerManagedObject<?> managedObject) throws ConfigException {
+            // Remove all the constraints associated with this managed
+            // object and then re-register them.
+            performPostDelete(managedObject);
+            performPostAdd(managedObject);
+        }
+    }
+
+    /**
+     * The client-side constraint handler implementation which enforces
+     * referential integrity when aggregating managed objects are added or
+     * modified.
+     */
+    private class SourceClientHandler extends ClientConstraintHandler {
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isAddAcceptable(ManagementContext context, ManagedObject<?> managedObject,
+                Collection<LocalizableMessage> unacceptableReasons) throws AuthorizationException, CommunicationException {
+            // If all of this managed object's "enabled" properties are true
+            // then any referenced managed objects must also be enabled.
+            boolean needsEnabling = targetNeedsEnablingCondition.evaluate(context, managedObject);
+
+            // Check the referenced managed objects exist and, if required,
+            // are enabled.
+            boolean isAcceptable = true;
+            LocalizableMessage ufn = getRelationDefinition().getUserFriendlyName();
+            for (String name : managedObject.getPropertyValues(AggregationPropertyDefinition.this)) {
+                // Retrieve the referenced managed object and make sure it
+                // exists.
+                ManagedObjectPath<?, ?> path = getChildPath(name);
+                ManagedObject<?> ref;
+                try {
+                    ref = context.getManagedObject(path);
+                } catch (DefinitionDecodingException e) {
+                    LocalizableMessage msg = ERR_CLIENT_REFINT_TARGET_INVALID.get(ufn, name, getName(), e.getLocalizableMessageObject());
+                    unacceptableReasons.add(msg);
+                    isAcceptable = false;
+                    continue;
+                } catch (ManagedObjectDecodingException e) {
+                    LocalizableMessage msg = ERR_CLIENT_REFINT_TARGET_INVALID.get(ufn, name, getName(), e.getLocalizableMessageObject());
+                    unacceptableReasons.add(msg);
+                    isAcceptable = false;
+                    continue;
+                } catch (ManagedObjectNotFoundException e) {
+                    LocalizableMessage msg = ERR_CLIENT_REFINT_TARGET_DANGLING_REFERENCE.get(ufn, name, getName());
+                    unacceptableReasons.add(msg);
+                    isAcceptable = false;
+                    continue;
+                }
+
+                // Make sure the reference managed object is enabled.
+                if (needsEnabling) {
+                    if (!targetIsEnabledCondition.evaluate(context, ref)) {
+                        LocalizableMessage msg = ERR_CLIENT_REFINT_TARGET_DISABLED.get(ufn, name, getName());
+                        unacceptableReasons.add(msg);
+                        isAcceptable = false;
+                    }
+                }
+            }
+            return isAcceptable;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isModifyAcceptable(ManagementContext context, ManagedObject<?> managedObject,
+                Collection<LocalizableMessage> unacceptableReasons) throws AuthorizationException, CommunicationException {
+            // The same constraint applies as for adds.
+            return isAddAcceptable(context, managedObject, unacceptableReasons);
+        }
+
+    }
+
+    /**
+     * The client-side constraint handler implementation which enforces
+     * referential integrity when aggregated managed objects are deleted or
+     * modified.
+     */
+    private class TargetClientHandler extends ClientConstraintHandler {
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isDeleteAcceptable(ManagementContext context, ManagedObjectPath<?, ?> path,
+                Collection<LocalizableMessage> unacceptableReasons) throws AuthorizationException, CommunicationException {
+            // Any references to the deleted managed object should cause a
+            // constraint violation.
+            boolean isAcceptable = true;
+            for (ManagedObject<?> mo : findReferences(context, getManagedObjectDefinition(), path.getName())) {
+                String name = mo.getManagedObjectPath().getName();
+                if (name == null) {
+                    LocalizableMessage msg = ERR_CLIENT_REFINT_CANNOT_DELETE_WITHOUT_NAME.get(getName(), mo
+                            .getManagedObjectDefinition().getUserFriendlyName(), getManagedObjectDefinition()
+                            .getUserFriendlyName());
+                    unacceptableReasons.add(msg);
+                } else {
+                    LocalizableMessage msg = ERR_CLIENT_REFINT_CANNOT_DELETE_WITH_NAME.get(getName(), mo
+                            .getManagedObjectDefinition().getUserFriendlyName(), name, getManagedObjectDefinition()
+                            .getUserFriendlyName());
+                    unacceptableReasons.add(msg);
+                }
+                isAcceptable = false;
+            }
+            return isAcceptable;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isModifyAcceptable(ManagementContext context, ManagedObject<?> managedObject,
+                Collection<LocalizableMessage> unacceptableReasons) throws AuthorizationException, CommunicationException {
+            // If the modified managed object is disabled and there are some
+            // active references then refuse the change.
+            if (targetIsEnabledCondition.evaluate(context, managedObject)) {
+                return true;
+            }
+
+            // The referenced managed object is disabled. Need to check for
+            // active references.
+            boolean isAcceptable = true;
+            for (ManagedObject<?> mo : findReferences(context, getManagedObjectDefinition(), managedObject
+                    .getManagedObjectPath().getName())) {
+                if (targetNeedsEnablingCondition.evaluate(context, mo)) {
+                    String name = mo.getManagedObjectPath().getName();
+                    if (name == null) {
+                        LocalizableMessage msg = ERR_CLIENT_REFINT_CANNOT_DISABLE_WITHOUT_NAME.get(managedObject
+                                .getManagedObjectDefinition().getUserFriendlyName(), getName(), mo
+                                .getManagedObjectDefinition().getUserFriendlyName());
+                        unacceptableReasons.add(msg);
+                    } else {
+                        LocalizableMessage msg = ERR_CLIENT_REFINT_CANNOT_DISABLE_WITH_NAME.get(managedObject
+                                .getManagedObjectDefinition().getUserFriendlyName(), getName(), mo
+                                .getManagedObjectDefinition().getUserFriendlyName(), name);
+                        unacceptableReasons.add(msg);
+                    }
+                    isAcceptable = false;
+                }
+            }
+            return isAcceptable;
+        }
+
+        // Find all managed objects which reference the named managed
+        // object using this property.
+        private <CC extends ConfigurationClient> List<ManagedObject<? extends CC>> findReferences(
+                ManagementContext context, AbstractManagedObjectDefinition<CC, ?> mod, String name)
+                throws AuthorizationException, CommunicationException {
+            List<ManagedObject<? extends CC>> instances = findInstances(context, mod);
+
+            Iterator<ManagedObject<? extends CC>> i = instances.iterator();
+            while (i.hasNext()) {
+                ManagedObject<? extends CC> mo = i.next();
+                boolean hasReference = false;
+
+                for (String value : mo.getPropertyValues(AggregationPropertyDefinition.this)) {
+                    if (compare(value, name) == 0) {
+                        hasReference = true;
+                        break;
+                    }
+                }
+
+                if (!hasReference) {
+                    i.remove();
+                }
+            }
+
+            return instances;
+        }
+
+        // Find all instances of a specific type of managed object.
+        @SuppressWarnings("unchecked")
+        private <CC extends ConfigurationClient> List<ManagedObject<? extends CC>> findInstances(
+                ManagementContext context, AbstractManagedObjectDefinition<CC, ?> mod) throws AuthorizationException,
+                CommunicationException {
+            List<ManagedObject<? extends CC>> instances = new LinkedList<ManagedObject<? extends CC>>();
+
+            if (mod == RootCfgDefn.getInstance()) {
+                instances.add((ManagedObject<? extends CC>) context.getRootConfigurationManagedObject());
+            } else {
+                for (RelationDefinition<? super CC, ?> rd : mod.getAllReverseRelationDefinitions()) {
+                    for (ManagedObject<?> parent : findInstances(context, rd.getParentDefinition())) {
+                        try {
+                            if (rd instanceof SingletonRelationDefinition) {
+                                SingletonRelationDefinition<? super CC, ?> srd = (SingletonRelationDefinition<? super CC, ?>) rd;
+                                ManagedObject<?> mo = parent.getChild(srd);
+                                if (mo.getManagedObjectDefinition().isChildOf(mod)) {
+                                    instances.add((ManagedObject<? extends CC>) mo);
+                                }
+                            } else if (rd instanceof OptionalRelationDefinition) {
+                                OptionalRelationDefinition<? super CC, ?> ord = (OptionalRelationDefinition<? super CC, ?>) rd;
+                                ManagedObject<?> mo = parent.getChild(ord);
+                                if (mo.getManagedObjectDefinition().isChildOf(mod)) {
+                                    instances.add((ManagedObject<? extends CC>) mo);
+                                }
+                            } else if (rd instanceof InstantiableRelationDefinition) {
+                                InstantiableRelationDefinition<? super CC, ?> ird = (InstantiableRelationDefinition<? super CC, ?>) rd;
+
+                                for (String name : parent.listChildren(ird)) {
+                                    ManagedObject<?> mo = parent.getChild(ird, name);
+                                    if (mo.getManagedObjectDefinition().isChildOf(mod)) {
+                                        instances.add((ManagedObject<? extends CC>) mo);
+                                    }
+                                }
+                            }
+                        } catch (OperationsException e) {
+                            // Ignore all operations exceptions.
+                        }
+                    }
+                }
+            }
+
+            return instances;
+        }
+    }
+
+    /**
+     * The tracer object for the debug logger.
+     */
+    private static final DebugTracer TRACER = getTracer();
+
+    /**
+     * Creates an aggregation property definition builder.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            aggregation property definition refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            aggregation property definition refers to.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new aggregation property definition builder.
+     */
+    public static <C extends ConfigurationClient, S extends Configuration> Builder<C, S> createBuilder(
+            AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder<C, S>(d, propertyName);
+    }
+
+    // The active server-side referential integrity change listeners
+    // associated with this property.
+    private final Map<DN, List<ReferentialIntegrityChangeListener>> changeListeners = new HashMap<DN, List<ReferentialIntegrityChangeListener>>();
+
+    // The active server-side referential integrity delete listeners
+    // associated with this property.
+    private final Map<DN, List<ReferentialIntegrityDeleteListener>> deleteListeners = new HashMap<DN, List<ReferentialIntegrityDeleteListener>>();
+
+    // The name of the managed object which is the parent of the
+    // aggregated managed objects.
+    private ManagedObjectPath<?, ?> parentPath;
 
     // The string representation of the managed object path specifying
     // the parent of the aggregated managed objects.
-    private String parentPathString = null;
+    private final String parentPathString;
 
     // The name of a relation in the parent managed object which
     // contains the aggregated managed objects.
-    private String rdName = null;
+    private final String rdName;
 
-    // The condition which is used to determine if a referenced
-    // managed object is enabled.
-    private Condition targetIsEnabledCondition = Conditions.TRUE;
+    // The relation in the parent managed object which contains the
+    // aggregated managed objects.
+    private InstantiableRelationDefinition<C, S> relationDefinition;
+
+    // The source constraint.
+    private final Constraint sourceConstraint;
+
+    // The condition which is used to determine if a referenced managed
+    // object is enabled.
+    private final Condition targetIsEnabledCondition;
 
     // The condition which is used to determine whether or not
     // referenced managed objects need to be enabled.
-    private Condition targetNeedsEnablingCondition = Conditions.TRUE;
+    private final Condition targetNeedsEnablingCondition;
 
+    // Private constructor.
+    private AggregationPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<String> defaultBehavior, String parentPathString, String rdName,
+            Condition targetNeedsEnablingCondition, Condition targetIsEnabledCondition) {
+        super(d, String.class, propertyName, options, adminAction, defaultBehavior);
 
+        this.parentPathString = parentPathString;
+        this.rdName = rdName;
+        this.targetNeedsEnablingCondition = targetNeedsEnablingCondition;
+        this.targetIsEnabledCondition = targetIsEnabledCondition;
+        this.sourceConstraint = new Constraint() {
 
-    // Private constructor
-    private Builder(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName) {
-      super(d, propertyName);
-    }
-
-
-
-    /**
-     * Sets the name of the managed object which is the parent of the
-     * aggregated managed objects.
-     * <p>
-     * This must be defined before the property definition can be
-     * built.
-     *
-     * @param pathString
-     *          The string representation of the managed object path
-     *          specifying the parent of the aggregated managed
-     *          objects.
-     */
-    public final void setParentPath(String pathString) {
-      this.parentPathString = pathString;
-    }
-
-
-
-    /**
-     * Sets the relation in the parent managed object which contains
-     * the aggregated managed objects.
-     * <p>
-     * This must be defined before the property definition can be
-     * built.
-     *
-     * @param rdName
-     *          The name of a relation in the parent managed object
-     *          which contains the aggregated managed objects.
-     */
-    public final void setRelationDefinition(String rdName) {
-      this.rdName = rdName;
-    }
-
-
-
-    /**
-     * Sets the condition which is used to determine if a referenced
-     * managed object is enabled. By default referenced managed
-     * objects are assumed to always be enabled.
-     *
-     * @param condition
-     *          The condition which is used to determine if a
-     *          referenced managed object is enabled.
-     */
-    public final void setTargetIsEnabledCondition(Condition condition) {
-      this.targetIsEnabledCondition = condition;
-    }
-
-
-
-    /**
-     * Sets the condition which is used to determine whether or not
-     * referenced managed objects need to be enabled. By default
-     * referenced managed objects must always be enabled.
-     *
-     * @param condition
-     *          The condition which is used to determine whether or
-     *          not referenced managed objects need to be enabled.
-     */
-    public final void setTargetNeedsEnablingCondition(Condition condition) {
-      this.targetNeedsEnablingCondition = condition;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected AggregationPropertyDefinition<C, S> buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options, AdministratorAction adminAction,
-        DefaultBehaviorProvider<String> defaultBehavior) {
-      // Make sure that the parent path has been defined.
-      if (parentPathString == null) {
-        throw new IllegalStateException("Parent path undefined");
-      }
-
-      // Make sure that the relation definition has been defined.
-      if (rdName == null) {
-        throw new IllegalStateException("Relation definition undefined");
-      }
-
-      return new AggregationPropertyDefinition<C, S>(d, propertyName, options,
-          adminAction, defaultBehavior, parentPathString, rdName,
-          targetNeedsEnablingCondition, targetIsEnabledCondition);
-    }
-
-  }
-
-
-
-  /**
-   * A change listener which prevents the named component from being
-   * disabled.
-   */
-  private class ReferentialIntegrityChangeListener implements
-      ServerManagedObjectChangeListener<S> {
-
-    // The error message which should be returned if an attempt is
-    // made to disable the referenced component.
-    private final Message message;
-
-    // The path of the referenced component.
-    private final ManagedObjectPath<C, S> path;
-
-
-
-    // Creates a new referential integrity delete listener.
-    private ReferentialIntegrityChangeListener(ManagedObjectPath<C, S> path,
-        Message message) {
-      this.path = path;
-      this.message = message;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public ConfigChangeResult applyConfigurationChange(
-        ServerManagedObject<? extends S> mo) {
-      try {
-        if (targetIsEnabledCondition.evaluate(mo)) {
-          return new ConfigChangeResult(ResultCode.SUCCESS, false);
-        }
-      } catch (ConfigException e) {
-        // This should not happen - ignore it and throw an exception
-        // anyway below.
-      }
-
-      // This should not happen - the previous call-back should have
-      // trapped this.
-      throw new IllegalStateException("Attempting to disable a referenced "
-          + relationDefinition.getChildDefinition().getUserFriendlyName());
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isConfigurationChangeAcceptable(
-        ServerManagedObject<? extends S> mo,
-        List<Message> unacceptableReasons) {
-      // Always prevent the referenced component from being
-      // disabled.
-      try {
-        if (!targetIsEnabledCondition.evaluate(mo)) {
-          unacceptableReasons.add(message);
-          return false;
-        } else {
-          return true;
-        }
-      } catch (ConfigException e) {
-        // The condition could not be evaluated.
-        if (debugEnabled()) {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        Message message = ERR_REFINT_UNABLE_TO_EVALUATE_TARGET_CONDITION.get(mo
-            .getManagedObjectDefinition().getUserFriendlyName(), String
-            .valueOf(mo.getDN()), StaticUtils.getExceptionMessage(e));
-        ErrorLogger.logError(message);
-        unacceptableReasons.add(message);
-        return false;
-      }
-    }
-
-
-
-    // Gets the path associated with this listener.
-    private ManagedObjectPath<C, S> getManagedObjectPath() {
-      return path;
-    }
-
-  }
-
-
-
-  /**
-   * A delete listener which prevents the named component from being
-   * deleted.
-   */
-  private class ReferentialIntegrityDeleteListener implements
-      ConfigurationDeleteListener<S> {
-
-    // The DN of the referenced configuration entry.
-    private final DN dn;
-
-    // The error message which should be returned if an attempt is
-    // made to delete the referenced component.
-    private final Message message;
-
-
-
-    // Creates a new referential integrity delete listener.
-    private ReferentialIntegrityDeleteListener(DN dn, Message message) {
-      this.dn = dn;
-      this.message = message;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public ConfigChangeResult applyConfigurationDelete(S configuration) {
-      // This should not happen - the
-      // isConfigurationDeleteAcceptable() call-back should have
-      // trapped this.
-      if (configuration.dn().equals(dn)) {
-        // This should not happen - the
-        // isConfigurationDeleteAcceptable() call-back should have
-        // trapped this.
-        throw new IllegalStateException("Attempting to delete a referenced "
-            + relationDefinition.getChildDefinition().getUserFriendlyName());
-      } else {
-        return new ConfigChangeResult(ResultCode.SUCCESS, false);
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isConfigurationDeleteAcceptable(S configuration,
-        List<Message> unacceptableReasons) {
-      if (configuration.dn().equals(dn)) {
-        // Always prevent deletion of the referenced component.
-        unacceptableReasons.add(message);
-        return false;
-      }
-
-      return true;
-    }
-
-  }
-
-
-
-  /**
-   * The server-side constraint handler implementation.
-   */
-  private class ServerHandler extends ServerConstraintHandler {
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isUsable(ServerManagedObject<?> managedObject,
-        Collection<Message> unacceptableReasons) throws ConfigException {
-      SortedSet<String> names = managedObject
-          .getPropertyValues(AggregationPropertyDefinition.this);
-      ServerManagementContext context = ServerManagementContext.getInstance();
-      Message thisUFN = managedObject.getManagedObjectDefinition()
-          .getUserFriendlyName();
-      String thisDN = managedObject.getDN().toString();
-      Message thatUFN = getRelationDefinition().getUserFriendlyName();
-
-      boolean isUsable = true;
-      boolean needsEnabling = targetNeedsEnablingCondition
-          .evaluate(managedObject);
-      for (String name : names) {
-        ManagedObjectPath<C, S> path = getChildPath(name);
-        String thatDN = path.toDN().toString();
-
-        if (!context.managedObjectExists(path)) {
-          Message msg = ERR_SERVER_REFINT_DANGLING_REFERENCE.get(name,
-              getName(), thisUFN, thisDN, thatUFN, thatDN);
-          unacceptableReasons.add(msg);
-          isUsable = false;
-        } else if (needsEnabling) {
-          // Check that the referenced component is enabled if
-          // required.
-          ServerManagedObject<? extends S> ref = context.getManagedObject(path);
-          if (!targetIsEnabledCondition.evaluate(ref)) {
-            Message msg = ERR_SERVER_REFINT_TARGET_DISABLED.get(name,
-                getName(), thisUFN, thisDN, thatUFN, thatDN);
-            unacceptableReasons.add(msg);
-            isUsable = false;
-          }
-        }
-      }
-
-      return isUsable;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void performPostAdd(ServerManagedObject<?> managedObject)
-        throws ConfigException {
-      // First make sure existing listeners associated with this
-      // managed object are removed. This is required in order to
-      // prevent multiple change listener registrations from
-      // occurring, for example if this call-back is invoked multiple
-      // times after the same add event.
-      performPostDelete(managedObject);
-
-      // Add change and delete listeners against all referenced
-      // components.
-      Message thisUFN = managedObject.getManagedObjectDefinition()
-          .getUserFriendlyName();
-      String thisDN = managedObject.getDN().toString();
-      Message thatUFN = getRelationDefinition().getUserFriendlyName();
-
-      // Referenced managed objects will only need a change listener
-      // if they have can be disabled.
-      boolean needsChangeListeners = targetNeedsEnablingCondition
-          .evaluate(managedObject);
-
-      // Delete listeners need to be registered against the parent
-      // entry of the referenced components.
-      ServerManagementContext context = ServerManagementContext.getInstance();
-      ManagedObjectPath<?, ?> parentPath = getParentPath();
-      ServerManagedObject<?> parent = context.getManagedObject(parentPath);
-
-      // Create entries in the listener tables.
-      List<ReferentialIntegrityDeleteListener> dlist =
-        new LinkedList<ReferentialIntegrityDeleteListener>();
-      deleteListeners.put(managedObject.getDN(), dlist);
-
-      List<ReferentialIntegrityChangeListener> clist =
-        new LinkedList<ReferentialIntegrityChangeListener>();
-      changeListeners.put(managedObject.getDN(), clist);
-
-      for (String name : managedObject
-          .getPropertyValues(AggregationPropertyDefinition.this)) {
-        ManagedObjectPath<C, S> path = getChildPath(name);
-        DN dn = path.toDN();
-        String thatDN = dn.toString();
-
-        // Register the delete listener.
-        Message msg = ERR_SERVER_REFINT_CANNOT_DELETE.get(thatUFN, thatDN,
-            getName(), thisUFN, thisDN);
-        ReferentialIntegrityDeleteListener dl =
-          new ReferentialIntegrityDeleteListener(dn, msg);
-        parent.registerDeleteListener(getRelationDefinition(), dl);
-        dlist.add(dl);
-
-        // Register the change listener if required.
-        if (needsChangeListeners) {
-          ServerManagedObject<? extends S> ref = context.getManagedObject(path);
-          msg = ERR_SERVER_REFINT_CANNOT_DISABLE.get(thatUFN, thatDN,
-              getName(), thisUFN, thisDN);
-          ReferentialIntegrityChangeListener cl =
-            new ReferentialIntegrityChangeListener(path, msg);
-          ref.registerChangeListener(cl);
-          clist.add(cl);
-        }
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void performPostDelete(ServerManagedObject<?> managedObject)
-        throws ConfigException {
-      // Remove any registered delete and change listeners.
-      ServerManagementContext context = ServerManagementContext.getInstance();
-      DN dn = managedObject.getDN();
-
-      // Delete listeners need to be deregistered against the parent
-      // entry of the referenced components.
-      ManagedObjectPath<?, ?> parentPath = getParentPath();
-      ServerManagedObject<?> parent = context.getManagedObject(parentPath);
-      if (deleteListeners.containsKey(dn)) {
-        for (ReferentialIntegrityDeleteListener dl : deleteListeners.get(dn)) {
-          parent.deregisterDeleteListener(getRelationDefinition(), dl);
-        }
-        deleteListeners.remove(dn);
-      }
-
-      // Change listeners need to be deregistered from their
-      // associated referenced component.
-      if (changeListeners.containsKey(dn)) {
-        for (ReferentialIntegrityChangeListener cl : changeListeners.get(dn)) {
-          ManagedObjectPath<C, S> path = cl.getManagedObjectPath();
-          ServerManagedObject<? extends S> ref = context.getManagedObject(path);
-          ref.deregisterChangeListener(cl);
-        }
-        changeListeners.remove(dn);
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void performPostModify(ServerManagedObject<?> managedObject)
-        throws ConfigException {
-      // Remove all the constraints associated with this managed
-      // object and then re-register them.
-      performPostDelete(managedObject);
-      performPostAdd(managedObject);
-    }
-  }
-
-
-
-  /**
-   * The client-side constraint handler implementation which enforces
-   * referential integrity when aggregating managed objects are added
-   * or modified.
-   */
-  private class SourceClientHandler extends ClientConstraintHandler {
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isAddAcceptable(ManagementContext context,
-        ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
-        throws AuthorizationException, CommunicationException {
-      // If all of this managed object's "enabled" properties are true
-      // then any referenced managed objects must also be enabled.
-      boolean needsEnabling = targetNeedsEnablingCondition.evaluate(context,
-          managedObject);
-
-      // Check the referenced managed objects exist and, if required,
-      // are enabled.
-      boolean isAcceptable = true;
-      Message ufn = getRelationDefinition().getUserFriendlyName();
-      for (String name : managedObject
-          .getPropertyValues(AggregationPropertyDefinition.this)) {
-        // Retrieve the referenced managed object and make sure it
-        // exists.
-        ManagedObjectPath<?, ?> path = getChildPath(name);
-        ManagedObject<?> ref;
-        try {
-          ref = context.getManagedObject(path);
-        } catch (DefinitionDecodingException e) {
-          Message msg = ERR_CLIENT_REFINT_TARGET_INVALID.get(ufn, name,
-              getName(), e.getMessageObject());
-          unacceptableReasons.add(msg);
-          isAcceptable = false;
-          continue;
-        } catch (ManagedObjectDecodingException e) {
-          Message msg = ERR_CLIENT_REFINT_TARGET_INVALID.get(ufn, name,
-              getName(), e.getMessageObject());
-          unacceptableReasons.add(msg);
-          isAcceptable = false;
-          continue;
-        } catch (ManagedObjectNotFoundException e) {
-          Message msg = ERR_CLIENT_REFINT_TARGET_DANGLING_REFERENCE.get(ufn,
-              name, getName());
-          unacceptableReasons.add(msg);
-          isAcceptable = false;
-          continue;
-        }
-
-        // Make sure the reference managed object is enabled.
-        if (needsEnabling) {
-          if (!targetIsEnabledCondition.evaluate(context, ref)) {
-            Message msg = ERR_CLIENT_REFINT_TARGET_DISABLED.get(ufn, name,
-                getName());
-            unacceptableReasons.add(msg);
-            isAcceptable = false;
-          }
-        }
-      }
-      return isAcceptable;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isModifyAcceptable(ManagementContext context,
-        ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
-        throws AuthorizationException, CommunicationException {
-      // The same constraint applies as for adds.
-      return isAddAcceptable(context, managedObject, unacceptableReasons);
-    }
-
-  }
-
-
-
-  /**
-   * The client-side constraint handler implementation which enforces
-   * referential integrity when aggregated managed objects are deleted
-   * or modified.
-   */
-  private class TargetClientHandler extends ClientConstraintHandler {
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isDeleteAcceptable(ManagementContext context,
-        ManagedObjectPath<?, ?> path, Collection<Message> unacceptableReasons)
-        throws AuthorizationException, CommunicationException {
-      // Any references to the deleted managed object should cause a
-      // constraint violation.
-      boolean isAcceptable = true;
-      for (ManagedObject<?> mo : findReferences(context,
-          getManagedObjectDefinition(), path.getName())) {
-        String name = mo.getManagedObjectPath().getName();
-        if (name == null) {
-          Message msg = ERR_CLIENT_REFINT_CANNOT_DELETE_WITHOUT_NAME.get(
-              getName(), mo.getManagedObjectDefinition().getUserFriendlyName(),
-              getManagedObjectDefinition().getUserFriendlyName());
-          unacceptableReasons.add(msg);
-        } else {
-          Message msg = ERR_CLIENT_REFINT_CANNOT_DELETE_WITH_NAME.get(
-              getName(), mo.getManagedObjectDefinition().getUserFriendlyName(),
-              name, getManagedObjectDefinition().getUserFriendlyName());
-          unacceptableReasons.add(msg);
-        }
-        isAcceptable = false;
-      }
-      return isAcceptable;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isModifyAcceptable(ManagementContext context,
-        ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
-        throws AuthorizationException, CommunicationException {
-      // If the modified managed object is disabled and there are some
-      // active references then refuse the change.
-      if (targetIsEnabledCondition.evaluate(context, managedObject)) {
-        return true;
-      }
-
-      // The referenced managed object is disabled. Need to check for
-      // active references.
-      boolean isAcceptable = true;
-      for (ManagedObject<?> mo : findReferences(context,
-          getManagedObjectDefinition(), managedObject.getManagedObjectPath()
-              .getName())) {
-        if (targetNeedsEnablingCondition.evaluate(context, mo)) {
-          String name = mo.getManagedObjectPath().getName();
-          if (name == null) {
-            Message msg = ERR_CLIENT_REFINT_CANNOT_DISABLE_WITHOUT_NAME.get(
-                managedObject.getManagedObjectDefinition()
-                    .getUserFriendlyName(), getName(), mo
-                    .getManagedObjectDefinition().getUserFriendlyName());
-            unacceptableReasons.add(msg);
-          } else {
-            Message msg = ERR_CLIENT_REFINT_CANNOT_DISABLE_WITH_NAME.get(
-                managedObject.getManagedObjectDefinition()
-                    .getUserFriendlyName(), getName(), mo
-                    .getManagedObjectDefinition().getUserFriendlyName(), name);
-            unacceptableReasons.add(msg);
-          }
-          isAcceptable = false;
-        }
-      }
-      return isAcceptable;
-    }
-
-
-
-    // Find all managed objects which reference the named managed
-    // object using this property.
-    private <CC extends ConfigurationClient>
-        List<ManagedObject<? extends CC>> findReferences(
-        ManagementContext context, AbstractManagedObjectDefinition<CC, ?> mod,
-        String name) throws AuthorizationException, CommunicationException {
-      List<ManagedObject<? extends CC>> instances = findInstances(context, mod);
-
-      Iterator<ManagedObject<? extends CC>> i = instances.iterator();
-      while (i.hasNext()) {
-        ManagedObject<? extends CC> mo = i.next();
-        boolean hasReference = false;
-
-        for (String value : mo
-            .getPropertyValues(AggregationPropertyDefinition.this)) {
-          if (compare(value, name) == 0) {
-            hasReference = true;
-            break;
-          }
-        }
-
-        if (!hasReference) {
-          i.remove();
-        }
-      }
-
-      return instances;
-    }
-
-
-
-    // Find all instances of a specific type of managed object.
-    @SuppressWarnings("unchecked")
-    private <CC extends ConfigurationClient>
-        List<ManagedObject<? extends CC>> findInstances(
-        ManagementContext context, AbstractManagedObjectDefinition<CC, ?> mod)
-        throws AuthorizationException, CommunicationException {
-      List<ManagedObject<? extends CC>> instances =
-        new LinkedList<ManagedObject<? extends CC>>();
-
-      if (mod == RootCfgDefn.getInstance()) {
-        instances.add((ManagedObject<? extends CC>) context
-            .getRootConfigurationManagedObject());
-      } else {
-        for (RelationDefinition<? super CC, ?> rd : mod
-            .getAllReverseRelationDefinitions()) {
-          for (ManagedObject<?> parent : findInstances(context, rd
-              .getParentDefinition())) {
-            try {
-              if (rd instanceof SingletonRelationDefinition) {
-                SingletonRelationDefinition<? super CC, ?> srd =
-                  (SingletonRelationDefinition<? super CC, ?>) rd;
-                ManagedObject<?> mo = parent.getChild(srd);
-                if (mo.getManagedObjectDefinition().isChildOf(mod)) {
-                  instances.add((ManagedObject<? extends CC>) mo);
-                }
-              } else if (rd instanceof OptionalRelationDefinition) {
-                OptionalRelationDefinition<? super CC, ?> ord =
-                  (OptionalRelationDefinition<? super CC, ?>) rd;
-                ManagedObject<?> mo = parent.getChild(ord);
-                if (mo.getManagedObjectDefinition().isChildOf(mod)) {
-                  instances.add((ManagedObject<? extends CC>) mo);
-                }
-              } else if (rd instanceof InstantiableRelationDefinition) {
-                InstantiableRelationDefinition<? super CC, ?> ird =
-                  (InstantiableRelationDefinition<? super CC, ?>) rd;
-
-                for (String name : parent.listChildren(ird)) {
-                  ManagedObject<?> mo = parent.getChild(ird, name);
-                  if (mo.getManagedObjectDefinition().isChildOf(mod)) {
-                    instances.add((ManagedObject<? extends CC>) mo);
-                  }
-                }
-              }
-            } catch (OperationsException e) {
-              // Ignore all operations exceptions.
+            /**
+             * {@inheritDoc}
+             */
+            public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
+                ClientConstraintHandler handler = new SourceClientHandler();
+                return Collections.singleton(handler);
             }
-          }
+
+            /**
+             * {@inheritDoc}
+             */
+            public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
+                ServerConstraintHandler handler = new ServerHandler();
+                return Collections.singleton(handler);
+            }
+        };
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitAggregation(this, p);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
+        return v.visitAggregation(this, value, p);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
+
+        try {
+            validateValue(value);
+            return value;
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
         }
-      }
-
-      return instances;
     }
-  }
 
-
-
-  /**
-   * The tracer object for the debug logger.
-   */
-  private static final DebugTracer TRACER = getTracer();
-
-
-
-  /**
-   * Creates an aggregation property definition builder.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this aggregation property definition refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this aggregation property definition refers to.
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new aggregation property definition builder.
-   */
-  public static <C extends ConfigurationClient, S extends Configuration>
-      Builder<C, S> createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder<C, S>(d, propertyName);
-  }
-
-  // The active server-side referential integrity change listeners
-  // associated with this property.
-  private final Map<DN, List<ReferentialIntegrityChangeListener>>
-    changeListeners = new HashMap<DN,
-      List<ReferentialIntegrityChangeListener>>();
-
-  // The active server-side referential integrity delete listeners
-  // associated with this property.
-  private final Map<DN, List<ReferentialIntegrityDeleteListener>>
-    deleteListeners = new HashMap<DN,
-      List<ReferentialIntegrityDeleteListener>>();
-
-  // The name of the managed object which is the parent of the
-  // aggregated managed objects.
-  private ManagedObjectPath<?, ?> parentPath;
-
-  // The string representation of the managed object path specifying
-  // the parent of the aggregated managed objects.
-  private final String parentPathString;
-
-  // The name of a relation in the parent managed object which
-  // contains the aggregated managed objects.
-  private final String rdName;
-
-  // The relation in the parent managed object which contains the
-  // aggregated managed objects.
-  private InstantiableRelationDefinition<C, S> relationDefinition;
-
-  // The source constraint.
-  private final Constraint sourceConstraint;
-
-  // The condition which is used to determine if a referenced managed
-  // object is enabled.
-  private final Condition targetIsEnabledCondition;
-
-  // The condition which is used to determine whether or not
-  // referenced managed objects need to be enabled.
-  private final Condition targetNeedsEnablingCondition;
-
-
-
-  // Private constructor.
-  private AggregationPropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options, AdministratorAction adminAction,
-      DefaultBehaviorProvider<String> defaultBehavior, String parentPathString,
-      String rdName, Condition targetNeedsEnablingCondition,
-      Condition targetIsEnabledCondition) {
-    super(d, String.class, propertyName, options, adminAction, defaultBehavior);
-
-    this.parentPathString = parentPathString;
-    this.rdName = rdName;
-    this.targetNeedsEnablingCondition = targetNeedsEnablingCondition;
-    this.targetIsEnabledCondition = targetIsEnabledCondition;
-    this.sourceConstraint = new Constraint() {
-
-      /**
-       * {@inheritDoc}
-       */
-      public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
-        ClientConstraintHandler handler = new SourceClientHandler();
-        return Collections.singleton(handler);
-      }
-
-
-
-      /**
-       * {@inheritDoc}
-       */
-      public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
-        ServerConstraintHandler handler = new ServerHandler();
-        return Collections.singleton(handler);
-      }
-    };
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitAggregation(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
-    return v.visitAggregation(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    try {
-      validateValue(value);
-      return value;
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * Constructs a DN for a referenced managed object having the provided name.
+     * This method is implemented by first calling {@link #getChildPath(String)}
+     * and then invoking {@code ManagedObjectPath.toDN()} on the returned path.
+     *
+     * @param name
+     *            The name of the child managed object.
+     * @return Returns a DN for a referenced managed object having the provided
+     *         name.
+     */
+    public final DN getChildDN(String name) {
+        return getChildPath(name).toDN();
     }
-  }
 
-
-
-  /**
-   * Constructs a DN for a referenced managed object having the
-   * provided name. This method is implemented by first calling
-   * {@link #getChildPath(String)} and then invoking
-   * {@code ManagedObjectPath.toDN()} on the returned path.
-   *
-   * @param name
-   *          The name of the child managed object.
-   * @return Returns a DN for a referenced managed object having the
-   *         provided name.
-   */
-  public final DN getChildDN(String name) {
-    return getChildPath(name).toDN();
-  }
-
-
-
-  /**
-   * Constructs a managed object path for a referenced managed object
-   * having the provided name.
-   *
-   * @param name
-   *          The name of the child managed object.
-   * @return Returns a managed object path for a referenced managed
-   *         object having the provided name.
-   */
-  public final ManagedObjectPath<C, S> getChildPath(String name) {
-    return parentPath.child(relationDefinition, name);
-  }
-
-
-
-  /**
-   * Gets the name of the managed object which is the parent of the
-   * aggregated managed objects.
-   *
-   * @return Returns the name of the managed object which is the
-   *         parent of the aggregated managed objects.
-   */
-  public final ManagedObjectPath<?, ?> getParentPath() {
-    return parentPath;
-  }
-
-
-
-  /**
-   * Gets the relation in the parent managed object which contains the
-   * aggregated managed objects.
-   *
-   * @return Returns the relation in the parent managed object which
-   *         contains the aggregated managed objects.
-   */
-  public final InstantiableRelationDefinition<C, S> getRelationDefinition() {
-    return relationDefinition;
-  }
-
-
-
-  /**
-   * Gets the constraint which should be enforced on the aggregating
-   * managed object.
-   *
-   * @return Returns the constraint which should be enforced on the
-   *         aggregating managed object.
-   */
-  public final Constraint getSourceConstraint() {
-    return sourceConstraint;
-  }
-
-
-
-  /**
-   * Gets the optional constraint synopsis of this aggregation
-   * property definition in the default locale. The constraint
-   * synopsis describes when and how referenced managed objects must
-   * be enabled. When there are no constraints between the source
-   * managed object and the objects it references through this
-   * aggregation, <code>null</code> is returned.
-   *
-   * @return Returns the optional constraint synopsis of this
-   *         aggregation property definition in the default locale, or
-   *         <code>null</code> if there is no constraint synopsis.
-   */
-  public final Message getSourceConstraintSynopsis() {
-    return getSourceConstraintSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the optional constraint synopsis of this aggregation
-   * property definition in the specified locale.The constraint
-   * synopsis describes when and how referenced managed objects must
-   * be enabled. When there are no constraints between the source
-   * managed object and the objects it references through this
-   * aggregation, <code>null</code> is returned.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the optional constraint synopsis of this
-   *         aggregation property definition in the specified locale,
-   *         or <code>null</code> if there is no constraint
-   *         synopsis.
-   */
-  public final Message getSourceConstraintSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + getName()
-        + ".syntax.aggregation.constraint-synopsis";
-    try {
-      return resource
-          .getMessage(getManagedObjectDefinition(), property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+    /**
+     * Constructs a managed object path for a referenced managed object having
+     * the provided name.
+     *
+     * @param name
+     *            The name of the child managed object.
+     * @return Returns a managed object path for a referenced managed object
+     *         having the provided name.
+     */
+    public final ManagedObjectPath<C, S> getChildPath(String name) {
+        return parentPath.child(relationDefinition, name);
     }
-  }
 
-
-
-  /**
-   * Gets the condition which is used to determine if a referenced
-   * managed object is enabled.
-   *
-   * @return Returns the condition which is used to determine if a
-   *         referenced managed object is enabled.
-   */
-  public final Condition getTargetIsEnabledCondition() {
-    return targetIsEnabledCondition;
-  }
-
-
-
-  /**
-   * Gets the condition which is used to determine whether or not
-   * referenced managed objects need to be enabled.
-   *
-   * @return Returns the condition which is used to determine whether
-   *         or not referenced managed objects need to be enabled.
-   */
-  public final Condition getTargetNeedsEnablingCondition() {
-    return targetNeedsEnablingCondition;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String normalizeValue(String value)
-      throws IllegalPropertyValueException {
-    try {
-      Reference<C, S> reference = Reference.parseName(parentPath,
-          relationDefinition, value);
-      return reference.getNormalizedName();
-    } catch (IllegalArgumentException e) {
-      throw new IllegalPropertyValueException(this, value);
+    /**
+     * Gets the name of the managed object which is the parent of the aggregated
+     * managed objects.
+     *
+     * @return Returns the name of the managed object which is the parent of the
+     *         aggregated managed objects.
+     */
+    public final ManagedObjectPath<?, ?> getParentPath() {
+        return parentPath;
     }
-  }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void toString(StringBuilder builder) {
-    super.toString(builder);
-
-    builder.append(" parentPath=");
-    builder.append(parentPath);
-
-    builder.append(" relationDefinition=");
-    builder.append(relationDefinition.getName());
-
-    builder.append(" targetNeedsEnablingCondition=");
-    builder.append(String.valueOf(targetNeedsEnablingCondition));
-
-    builder.append(" targetIsEnabledCondition=");
-    builder.append(String.valueOf(targetIsEnabledCondition));
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(String value) throws IllegalPropertyValueException {
-    try {
-      Reference.parseName(parentPath, relationDefinition, value);
-    } catch (IllegalArgumentException e) {
-      throw new IllegalPropertyValueException(this, value);
+    /**
+     * Gets the relation in the parent managed object which contains the
+     * aggregated managed objects.
+     *
+     * @return Returns the relation in the parent managed object which contains
+     *         the aggregated managed objects.
+     */
+    public final InstantiableRelationDefinition<C, S> getRelationDefinition() {
+        return relationDefinition;
     }
-  }
 
+    /**
+     * Gets the constraint which should be enforced on the aggregating managed
+     * object.
+     *
+     * @return Returns the constraint which should be enforced on the
+     *         aggregating managed object.
+     */
+    public final Constraint getSourceConstraint() {
+        return sourceConstraint;
+    }
 
+    /**
+     * Gets the optional constraint synopsis of this aggregation property
+     * definition in the default locale. The constraint synopsis describes when
+     * and how referenced managed objects must be enabled. When there are no
+     * constraints between the source managed object and the objects it
+     * references through this aggregation, <code>null</code> is returned.
+     *
+     * @return Returns the optional constraint synopsis of this aggregation
+     *         property definition in the default locale, or <code>null</code>
+     *         if there is no constraint synopsis.
+     */
+    public final LocalizableMessage getSourceConstraintSynopsis() {
+        return getSourceConstraintSynopsis(Locale.getDefault());
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @SuppressWarnings("unchecked")
-  @Override
-  public void initialize() throws Exception {
-    // Decode the path.
-    parentPath = ManagedObjectPath.valueOf(parentPathString);
+    /**
+     * Gets the optional constraint synopsis of this aggregation property
+     * definition in the specified locale.The constraint synopsis describes when
+     * and how referenced managed objects must be enabled. When there are no
+     * constraints between the source managed object and the objects it
+     * references through this aggregation, <code>null</code> is returned.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the optional constraint synopsis of this aggregation
+     *         property definition in the specified locale, or <code>null</code>
+     *         if there is no constraint synopsis.
+     */
+    public final LocalizableMessage getSourceConstraintSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + getName() + ".syntax.aggregation.constraint-synopsis";
+        try {
+            return resource.getLocalizableMessage(getManagedObjectDefinition(), property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
 
-    // Decode the relation definition.
-    AbstractManagedObjectDefinition<?, ?> parent = parentPath
-        .getManagedObjectDefinition();
-    RelationDefinition<?, ?> rd = parent.getRelationDefinition(rdName);
-    relationDefinition = (InstantiableRelationDefinition<C, S>) rd;
+    /**
+     * Gets the condition which is used to determine if a referenced managed
+     * object is enabled.
+     *
+     * @return Returns the condition which is used to determine if a referenced
+     *         managed object is enabled.
+     */
+    public final Condition getTargetIsEnabledCondition() {
+        return targetIsEnabledCondition;
+    }
 
-    // Now decode the conditions.
-    targetNeedsEnablingCondition.initialize(getManagedObjectDefinition());
-    targetIsEnabledCondition.initialize(rd.getChildDefinition());
+    /**
+     * Gets the condition which is used to determine whether or not referenced
+     * managed objects need to be enabled.
+     *
+     * @return Returns the condition which is used to determine whether or not
+     *         referenced managed objects need to be enabled.
+     */
+    public final Condition getTargetNeedsEnablingCondition() {
+        return targetNeedsEnablingCondition;
+    }
 
-    // Register a client-side constraint with the referenced
-    // definition. This will be used to enforce referential integrity
-    // for actions performed against referenced managed objects.
-    Constraint constraint = new Constraint() {
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String normalizeValue(String value) throws IllegalPropertyValueException {
+        try {
+            Reference<C, S> reference = Reference.parseName(parentPath, relationDefinition, value);
+            return reference.getNormalizedName();
+        } catch (IllegalArgumentException e) {
+            throw new IllegalPropertyValueException(this, value);
+        }
+    }
 
-      /**
-       * {@inheritDoc}
-       */
-      public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
-        ClientConstraintHandler handler = new TargetClientHandler();
-        return Collections.singleton(handler);
-      }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void toString(StringBuilder builder) {
+        super.toString(builder);
 
+        builder.append(" parentPath=");
+        builder.append(parentPath);
 
+        builder.append(" relationDefinition=");
+        builder.append(relationDefinition.getName());
 
-      /**
-       * {@inheritDoc}
-       */
-      public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
-        return Collections.emptyList();
-      }
-    };
+        builder.append(" targetNeedsEnablingCondition=");
+        builder.append(String.valueOf(targetNeedsEnablingCondition));
 
-    rd.getChildDefinition().registerConstraint(constraint);
-  }
+        builder.append(" targetIsEnabledCondition=");
+        builder.append(String.valueOf(targetIsEnabledCondition));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void validateValue(String value) throws IllegalPropertyValueException {
+        try {
+            Reference.parseName(parentPath, relationDefinition, value);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalPropertyValueException(this, value);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void initialize() throws Exception {
+        // Decode the path.
+        parentPath = ManagedObjectPath.valueOf(parentPathString);
+
+        // Decode the relation definition.
+        AbstractManagedObjectDefinition<?, ?> parent = parentPath.getManagedObjectDefinition();
+        RelationDefinition<?, ?> rd = parent.getRelationDefinition(rdName);
+        relationDefinition = (InstantiableRelationDefinition<C, S>) rd;
+
+        // Now decode the conditions.
+        targetNeedsEnablingCondition.initialize(getManagedObjectDefinition());
+        targetIsEnabledCondition.initialize(rd.getChildDefinition());
+
+        // Register a client-side constraint with the referenced
+        // definition. This will be used to enforce referential integrity
+        // for actions performed against referenced managed objects.
+        Constraint constraint = new Constraint() {
+
+            /**
+             * {@inheritDoc}
+             */
+            public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
+                ClientConstraintHandler handler = new TargetClientHandler();
+                return Collections.singleton(handler);
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
+                return Collections.emptyList();
+            }
+        };
+
+        rd.getChildDefinition().registerConstraint(constraint);
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AliasDefaultBehaviorProvider.java b/opendj-admin/src/main/java/org/opends/server/admin/AliasDefaultBehaviorProvider.java
index fc9d3ea..d091dfb 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AliasDefaultBehaviorProvider.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AliasDefaultBehaviorProvider.java
@@ -25,11 +25,10 @@
  *      Copyright 2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
 import java.util.Locale;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
  * A default behavior provider which indicates special behavior. It should be
@@ -40,76 +39,62 @@
  * values.
  *
  * @param <T>
- *          The type of values represented by this provider.
+ *            The type of values represented by this provider.
  */
-public final class AliasDefaultBehaviorProvider<T> extends
-    DefaultBehaviorProvider<T> {
+public final class AliasDefaultBehaviorProvider<T> extends DefaultBehaviorProvider<T> {
 
-  // The managed object definition associated with this default
-  // behavior.
-  private final AbstractManagedObjectDefinition<?, ?> definition;
+    // The managed object definition associated with this default
+    // behavior.
+    private final AbstractManagedObjectDefinition<?, ?> definition;
 
-  // The name of the property definition associated with this default
-  // behavior.
-  private final String propertyName;
+    // The name of the property definition associated with this default
+    // behavior.
+    private final String propertyName;
 
+    /**
+     * Create an alias default behavior provider.
+     *
+     * @param d
+     *            The managed object definition associated with this default
+     *            behavior.
+     * @param propertyName
+     *            The name of the property definition associated with this
+     *            default behavior.
+     */
+    public AliasDefaultBehaviorProvider(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        this.definition = d;
+        this.propertyName = propertyName;
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    public <R, P> R accept(DefaultBehaviorProviderVisitor<T, R, P> v, P p) {
+        return v.visitAlias(this, p);
+    }
 
-  /**
-   * Create an alias default behavior provider.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          default behavior.
-   * @param propertyName
-   *          The name of the property definition associated with this
-   *          default behavior.
-   */
-  public AliasDefaultBehaviorProvider(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    this.definition = d;
-    this.propertyName = propertyName;
-  }
+    /**
+     * Gets the synopsis of this alias default behavior in the default locale.
+     *
+     * @return Returns the synopsis of this alias default behavior in the
+     *         default locale.
+     */
+    public final LocalizableMessage getSynopsis() {
+        return getSynopsis(Locale.getDefault());
+    }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public <R, P> R accept(DefaultBehaviorProviderVisitor<T, R, P> v, P p) {
-    return v.visitAlias(this, p);
-  }
-
-
-
-  /**
-   * Gets the synopsis of this alias default behavior in the
-   * default locale.
-   *
-   * @return Returns the synopsis of this alias default behavior in
-   *         the default locale.
-   */
-  public final Message getSynopsis() {
-    return getSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the synopsis of this alias default behavior in the specified
-   * locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this alias default behavior in
-   *         the specified locale.
-   */
-  public final Message getSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + propertyName
-        + ".default-behavior.alias.synopsis";
-    return resource.getMessage(definition, property, locale);
-  }
+    /**
+     * Gets the synopsis of this alias default behavior in the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this alias default behavior in the
+     *         specified locale.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + propertyName + ".default-behavior.alias.synopsis";
+        return resource.getLocalizableMessage(definition, property, locale);
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java
index 3defe92..97289a5 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AttributeTypePropertyDefinition.java
@@ -27,7 +27,7 @@
 
 package org.opends.server.admin;
 
-
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 
@@ -37,179 +37,141 @@
 /**
  * Attribute type property definition.
  */
-public final class AttributeTypePropertyDefinition extends
-    PropertyDefinition<AttributeType> {
+public final class AttributeTypePropertyDefinition extends PropertyDefinition<AttributeType> {
 
-  /**
-   * An interface for incrementally constructing attribute type
-   * property definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<AttributeType, AttributeTypePropertyDefinition> {
+    /**
+     * An interface for incrementally constructing attribute type property
+     * definitions.
+     */
+    public static class Builder extends AbstractBuilder<AttributeType, AttributeTypePropertyDefinition> {
 
-    // Private constructor
-    private Builder(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName) {
-      super(d, propertyName);
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected AttributeTypePropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d,
+                String propertyName, EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<AttributeType> defaultBehavior) {
+            return new AttributeTypePropertyDefinition(d, propertyName, options, adminAction, defaultBehavior);
+        }
     }
 
+    // Flag indicating whether or not attribute type names should be
+    // validated against the schema.
+    private static boolean isCheckSchema = true;
 
+    /**
+     * Create a attribute type property definition builder.
+     *
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new attribute type property definition builder.
+     */
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
+    }
+
+    /**
+     * Determines whether or not attribute type names should be validated
+     * against the schema.
+     *
+     * @return Returns <code>true</code> if attribute type names should be
+     *         validated against the schema.
+     */
+    public static boolean isCheckSchema() {
+        return isCheckSchema;
+    }
+
+    /**
+     * Specify whether or not attribute type names should be validated against
+     * the schema.
+     * <p>
+     * By default validation is switched on.
+     *
+     * @param value
+     *            <code>true</code> if attribute type names should be validated
+     *            against the schema.
+     */
+    public static void setCheckSchema(boolean value) {
+        isCheckSchema = value;
+    }
+
+    // Private constructor.
+    private AttributeTypePropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<AttributeType> defaultBehavior) {
+        super(d, AttributeType.class, propertyName, options, adminAction, defaultBehavior);
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected AttributeTypePropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<AttributeType> defaultBehavior) {
-      return new AttributeTypePropertyDefinition(d, propertyName,
-          options, adminAction, defaultBehavior);
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitAttributeType(this, p);
     }
-  }
 
-  // Flag indicating whether or not attribute type names should be
-  // validated against the schema.
-  private static boolean isCheckSchema = true;
-
-
-
-  /**
-   * Create a attribute type property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new attribute type property definition
-   *         builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  /**
-   * Determines whether or not attribute type names should be
-   * validated against the schema.
-   *
-   * @return Returns <code>true</code> if attribute type names
-   *         should be validated against the schema.
-   */
-  public static boolean isCheckSchema() {
-    return isCheckSchema;
-  }
-
-
-
-  /**
-   * Specify whether or not attribute type names should be validated
-   * against the schema.
-   * <p>
-   * By default validation is switched on.
-   *
-   * @param value
-   *          <code>true</code> if attribute type names should be
-   *          validated against the schema.
-   */
-  public static void setCheckSchema(boolean value) {
-    isCheckSchema = value;
-  }
-
-
-
-  // Private constructor.
-  private AttributeTypePropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<AttributeType> defaultBehavior) {
-    super(d, AttributeType.class, propertyName, options,
-        adminAction, defaultBehavior);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitAttributeType(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v,
-      AttributeType value, P p) {
-    return v.visitAttributeType(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(AttributeType o1, AttributeType o2) {
-    return o1.getNameOrOID().compareToIgnoreCase(o2.getNameOrOID());
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public AttributeType decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    String name = value.trim().toLowerCase();
-    AttributeType type = DirectoryServer.getAttributeType(name,
-        !isCheckSchema);
-
-    if (type == null) {
-      throw new IllegalPropertyValueStringException(this, value);
-    } else {
-      try {
-        validateValue(type);
-        return type;
-      } catch (IllegalPropertyValueException e) {
-        throw new IllegalPropertyValueStringException(this, value);
-      }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, AttributeType value, P p) {
+        return v.visitAttributeType(this, value, p);
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(AttributeType o1, AttributeType o2) {
+        return o1.getNameOrOID().compareToIgnoreCase(o2.getNameOrOID());
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public AttributeType decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String encodeValue(AttributeType value)
-      throws IllegalPropertyValueException {
-    return value.getNameOrOID();
-  }
+        String name = value.trim().toLowerCase();
+        AttributeType type = DirectoryServer.getAttributeType(name, !isCheckSchema);
 
+        if (type == null) {
+            throw new IllegalPropertyValueStringException(this, value);
+        } else {
+            try {
+                validateValue(type);
+                return type;
+            } catch (IllegalPropertyValueException e) {
+                throw new IllegalPropertyValueStringException(this, value);
+            }
+        }
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String encodeValue(AttributeType value) throws IllegalPropertyValueException {
+        return value.getNameOrOID();
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(AttributeType value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void validateValue(AttributeType value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
-    // No implementation required.
-  }
+        // No implementation required.
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java
index 7a4a6f2..fac54de 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/BooleanPropertyDefinition.java
@@ -27,16 +27,12 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Map;
 
-
-
 /**
  * Boolean property definition.
  */
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ClassLoaderProvider.java b/opendj-admin/src/main/java/org/opends/server/admin/ClassLoaderProvider.java
index 3e7f27d..ca8e856 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ClassLoaderProvider.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ClassLoaderProvider.java
@@ -29,12 +29,7 @@
 
 
 
-import static org.opends.messages.AdminMessages.*;
-import static org.opends.messages.ExtensionMessages.*;
-import static org.opends.server.loggers.ErrorLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.StaticUtils.*;
-import static org.opends.server.util.ServerConstants.EOL;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.io.ByteArrayOutputStream;
 import java.io.BufferedReader;
@@ -58,15 +53,10 @@
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 
-import org.opends.messages.Message;
-import org.opends.server.admin.std.meta.RootCfgDefn;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.admin.meta.RootCfgDefn;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.DebugLogLevel;
 import org.opends.server.types.InitializationException;
-import org.opends.server.util.Validator;
-
-
 
 /**
  * Manages the class loader which should be used for loading
@@ -216,7 +206,7 @@
   public synchronized void addExtension(String... extensions)
       throws InitializationException, IllegalStateException,
       IllegalArgumentException {
-    Validator.ensureNotNull(extensions);
+    ensureNotNull(extensions);
 
     if (loader == null) {
       throw new IllegalStateException(
@@ -419,7 +409,7 @@
           TRACER.debugCaught(DebugLogLevel.ERROR, e);
         }
 
-        Message message = ERR_ADMIN_CANNOT_OPEN_JAR_FILE.
+        LocalizableMessage message = ERR_ADMIN_CANNOT_OPEN_JAR_FILE.
             get(extension.getName(), extension.getParent(),
                 stackTraceToSingleLineString(e));
         throw new InitializationException(message);
@@ -566,7 +556,7 @@
       if (!extensionsPath.exists()) {
         // The extensions directory does not exist. This is not a
         // critical problem.
-        Message message = ERR_ADMIN_NO_EXTENSIONS_DIR.get(
+        LocalizableMessage message = ERR_ADMIN_NO_EXTENSIONS_DIR.get(
                 String.valueOf(extensionsPath));
         logError(message);
         return;
@@ -575,7 +565,7 @@
       if (!extensionsPath.isDirectory()) {
         // The extensions directory is not a directory. This is more
         // critical.
-        Message message =
+        LocalizableMessage message =
             ERR_ADMIN_EXTENSIONS_DIR_NOT_DIRECTORY.get(
                     String.valueOf(extensionsPath));
         throw new InitializationException(message);
@@ -610,7 +600,7 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      Message message = ERR_ADMIN_EXTENSIONS_CANNOT_LIST_FILES.get(
+      LocalizableMessage message = ERR_ADMIN_EXTENSIONS_CANNOT_LIST_FILES.get(
           String.valueOf(extensionsPath), stackTraceToSingleLineString(e));
       throw new InitializationException(message, e);
     }
@@ -632,7 +622,7 @@
         + CORE_MANIFEST);
 
     if (is == null) {
-      Message message = ERR_ADMIN_CANNOT_FIND_CORE_MANIFEST.get(CORE_MANIFEST);
+      LocalizableMessage message = ERR_ADMIN_CANNOT_FIND_CORE_MANIFEST.get(CORE_MANIFEST);
       throw new InitializationException(message);
     }
 
@@ -643,7 +633,7 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      Message message = ERR_CLASS_LOADER_CANNOT_LOAD_CORE.get(CORE_MANIFEST,
+      LocalizableMessage message = ERR_CLASS_LOADER_CANNOT_LOAD_CORE.get(CORE_MANIFEST,
           stackTraceToSingleLineString(e));
       throw new InitializationException(message);
     }
@@ -675,7 +665,7 @@
           TRACER.debugCaught(DebugLogLevel.ERROR, e);
         }
 
-        Message message = ERR_ADMIN_CANNOT_READ_EXTENSION_MANIFEST.get(
+        LocalizableMessage message = ERR_ADMIN_CANNOT_READ_EXTENSION_MANIFEST.get(
             EXTENSION_MANIFEST, jarFile.getName(),
             stackTraceToSingleLineString(e));
         throw new InitializationException(message);
@@ -688,7 +678,7 @@
           TRACER.debugCaught(DebugLogLevel.ERROR, e);
         }
 
-        Message message = ERR_CLASS_LOADER_CANNOT_LOAD_EXTENSION.get(jarFile
+        LocalizableMessage message = ERR_CLASS_LOADER_CANNOT_LOAD_EXTENSION.get(jarFile
             .getName(), EXTENSION_MANIFEST, stackTraceToSingleLineString(e));
         throw new InitializationException(message);
       }
@@ -729,8 +719,8 @@
       try {
         className = reader.readLine();
       } catch (IOException e) {
-        Message msg = ERR_CLASS_LOADER_CANNOT_READ_MANIFEST_FILE.get(String
-            .valueOf(e.getMessage()));
+        LocalizableMessage msg = ERR_CLASS_LOADER_CANNOT_READ_MANIFEST_FILE.get(String
+            .valueOf(e.getLocalizableMessage()));
         throw new InitializationException(msg, e);
       }
 
@@ -750,15 +740,15 @@
         continue;
       }
 
-      TRACER.debugMessage(DebugLogLevel.INFO, "Loading class " + className);
+      TRACER.debugLocalizableMessage(DebugLogLevel.INFO, "Loading class " + className);
 
       // Load the class and get an instance of it if it is a definition.
       Class<?> theClass;
       try {
         theClass = Class.forName(className, true, loader);
       } catch (Exception e) {
-        Message msg = ERR_CLASS_LOADER_CANNOT_LOAD_CLASS.get(className, String
-            .valueOf(e.getMessage()));
+        LocalizableMessage msg = ERR_CLASS_LOADER_CANNOT_LOAD_CLASS.get(className, String
+            .valueOf(e.getLocalizableMessage()));
         throw new InitializationException(msg, e);
       }
       if (AbstractManagedObjectDefinition.class.isAssignableFrom(theClass)) {
@@ -767,8 +757,8 @@
         try {
           method = theClass.getMethod("getInstance");
         } catch (Exception e) {
-          Message msg = ERR_CLASS_LOADER_CANNOT_FIND_GET_INSTANCE_METHOD.get(
-              className, String.valueOf(e.getMessage()));
+          LocalizableMessage msg = ERR_CLASS_LOADER_CANNOT_FIND_GET_INSTANCE_METHOD.get(
+              className, String.valueOf(e.getLocalizableMessage()));
           throw new InitializationException(msg, e);
         }
 
@@ -777,8 +767,8 @@
         try {
           d = (AbstractManagedObjectDefinition<?, ?>) method.invoke(null);
         } catch (Exception e) {
-          Message msg = ERR_CLASS_LOADER_CANNOT_INVOKE_GET_INSTANCE_METHOD.get(
-              className, String.valueOf(e.getMessage()));
+          LocalizableMessage msg = ERR_CLASS_LOADER_CANNOT_INVOKE_GET_INSTANCE_METHOD.get(
+              className, String.valueOf(e.getLocalizableMessage()));
           throw new InitializationException(msg, e);
         }
         definitions.add(d);
@@ -790,8 +780,8 @@
       try {
         d.initialize();
       } catch (Exception e) {
-        Message msg = ERR_CLASS_LOADER_CANNOT_INITIALIZE_DEFN.get(d.getName(),
-            d.getClass().getName(), String.valueOf(e.getMessage()));
+        LocalizableMessage msg = ERR_CLASS_LOADER_CANNOT_INITIALIZE_DEFN.get(d.getName(),
+            d.getClass().getName(), String.valueOf(e.getLocalizableMessage()));
         throw new InitializationException(msg, e);
       }
     }
@@ -820,7 +810,7 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      Message message = ERR_ADMIN_CANNOT_OPEN_JAR_FILE.get(
+      LocalizableMessage message = ERR_ADMIN_CANNOT_OPEN_JAR_FILE.get(
           jar.getName(), jar.getParent(), stackTraceToSingleLineString(e));
       throw new InitializationException(message);
     }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
index ef9e783..4938211 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
@@ -27,356 +27,295 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.LinkedList;
 import java.util.List;
 
-
-
 /**
  * Class property definition.
  * <p>
- * A class property definition defines a property whose values
- * represent a Java class. It is possible to restrict the type of java
- * class by specifying "instance of" constraints.
+ * A class property definition defines a property whose values represent a Java
+ * class. It is possible to restrict the type of java class by specifying
+ * "instance of" constraints.
  * <p>
- * Note that in a client/server environment, the client is probably
- * not capable of validating the Java class (e.g. it will not be able
- * to load it nor have access to the interfaces it is supposed to
- * implement). For this reason, it is possible to switch off
- * validation in the client by calling the static method
+ * Note that in a client/server environment, the client is probably not capable
+ * of validating the Java class (e.g. it will not be able to load it nor have
+ * access to the interfaces it is supposed to implement). For this reason, it is
+ * possible to switch off validation in the client by calling the static method
  * {@link #setAllowClassValidation(boolean)}.
  */
 public final class ClassPropertyDefinition extends PropertyDefinition<String> {
 
-  /**
-   * An interface for incrementally constructing class property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<String, ClassPropertyDefinition> {
+    /**
+     * An interface for incrementally constructing class property definitions.
+     */
+    public static class Builder extends AbstractBuilder<String, ClassPropertyDefinition> {
 
-    // List of interfaces which property values must implement.
-    private List<String> instanceOfInterfaces;
+        // List of interfaces which property values must implement.
+        private List<String> instanceOfInterfaces;
 
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
 
+            this.instanceOfInterfaces = new LinkedList<String>();
+        }
 
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
+        /**
+         * Add an class name which property values must implement.
+         *
+         * @param className
+         *            The name of a class which property values must implement.
+         */
+        public final void addInstanceOf(String className) {
+            ensureNotNull(className);
 
-      this.instanceOfInterfaces = new LinkedList<String>();
+            // Do some basic checks to make sure the string representation
+            // is valid.
+            String value = className.trim();
+            if (!value.matches(CLASS_RE)) {
+                throw new IllegalArgumentException("\"" + value + "\" is not a valid Java class name");
+            }
+
+            // If possible try and load the class in order to perform
+            // additional
+            // validation.
+            if (isAllowClassValidation()) {
+                // Check that the class can be loaded so that validation can
+                // be
+                // performed.
+                try {
+                    loadClass(value);
+                } catch (ClassNotFoundException e) {
+                    // TODO: can we do something better here?
+                    throw new RuntimeException(e);
+                }
+            }
+
+            instanceOfInterfaces.add(value);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected ClassPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<String> defaultBehavior) {
+            return new ClassPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior,
+                    instanceOfInterfaces);
+        }
+
     }
 
+    // Regular expression for validating class names.
+    private static final String CLASS_RE = "^([A-Za-z][A-Za-z0-9_]*\\.)*[A-Za-z][A-Za-z0-9_]*(\\$[A-Za-z0-9_]+)*$";
 
+    // Flag indicating whether class property values should be
+    // validated.
+    private static boolean allowClassValidation = true;
 
     /**
-     * Add an class name which property values must implement.
+     * Create a class property definition builder.
      *
-     * @param className
-     *          The name of a class which property values must
-     *          implement.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new class property definition builder.
      */
-    public final void addInstanceOf(String className) {
-      ensureNotNull(className);
-
-      // Do some basic checks to make sure the string representation
-      // is valid.
-      String value = className.trim();
-      if (!value.matches(CLASS_RE)) {
-        throw new IllegalArgumentException("\"" + value
-            + "\" is not a valid Java class name");
-      }
-
-      // If possible try and load the class in order to perform
-      // additional
-      // validation.
-      if (isAllowClassValidation()) {
-        // Check that the class can be loaded so that validation can
-        // be
-        // performed.
-        try {
-          loadClass(value);
-        } catch (ClassNotFoundException e) {
-          // TODO: can we do something better here?
-          throw new RuntimeException(e);
-        }
-      }
-
-      instanceOfInterfaces.add(value);
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
     }
 
+    /**
+     * Determine whether or not class property definitions should validate class
+     * name property values. Validation involves checking that the class exists
+     * and that it implements the required interfaces.
+     *
+     * @return Returns <code>true</code> if class property definitions should
+     *         validate class name property values.
+     */
+    public static boolean isAllowClassValidation() {
+        return allowClassValidation;
+    }
 
+    /**
+     * Specify whether or not class property definitions should validate class
+     * name property values. Validation involves checking that the class exists
+     * and that it implements the required interfaces.
+     * <p>
+     * By default validation is switched on.
+     *
+     * @param value
+     *            <code>true</code> if class property definitions should
+     *            validate class name property values.
+     */
+    public static void setAllowClassValidation(boolean value) {
+        allowClassValidation = value;
+    }
+
+    // Load a named class.
+    private static Class<?> loadClass(String className) throws ClassNotFoundException, LinkageError {
+        return Class.forName(className, true, ClassLoaderProvider.getInstance().getClassLoader());
+    }
+
+    // List of interfaces which property values must implement.
+    private final List<String> instanceOfInterfaces;
+
+    // Private constructor.
+    private ClassPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<String> defaultBehavior, List<String> instanceOfInterfaces) {
+        super(d, String.class, propertyName, options, adminAction, defaultBehavior);
+
+        this.instanceOfInterfaces = Collections.unmodifiableList(new LinkedList<String>(instanceOfInterfaces));
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected ClassPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName, EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<String> defaultBehavior) {
-      return new ClassPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior, instanceOfInterfaces);
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitClass(this, p);
     }
 
-  }
-
-  // Regular expression for validating class names.
-  private static final String CLASS_RE =
-    "^([A-Za-z][A-Za-z0-9_]*\\.)*[A-Za-z][A-Za-z0-9_]*(\\$[A-Za-z0-9_]+)*$";
-
-  // Flag indicating whether class property values should be
-  // validated.
-  private static boolean allowClassValidation = true;
-
-
-
-  /**
-   * Create a class property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new class property definition builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  /**
-   * Determine whether or not class property definitions should
-   * validate class name property values. Validation involves checking
-   * that the class exists and that it implements the required
-   * interfaces.
-   *
-   * @return Returns <code>true</code> if class property definitions
-   *         should validate class name property values.
-   */
-  public static boolean isAllowClassValidation() {
-    return allowClassValidation;
-  }
-
-
-
-  /**
-   * Specify whether or not class property definitions should validate
-   * class name property values. Validation involves checking that the
-   * class exists and that it implements the required interfaces.
-   * <p>
-   * By default validation is switched on.
-   *
-   * @param value
-   *          <code>true</code> if class property definitions should
-   *          validate class name property values.
-   */
-  public static void setAllowClassValidation(boolean value) {
-    allowClassValidation = value;
-  }
-
-
-
-  // Load a named class.
-  private static Class<?> loadClass(String className)
-      throws ClassNotFoundException, LinkageError {
-    return Class.forName(className, true, ClassLoaderProvider
-        .getInstance().getClassLoader());
-  }
-
-  // List of interfaces which property values must implement.
-  private final List<String> instanceOfInterfaces;
-
-
-
-  // Private constructor.
-  private ClassPropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<String> defaultBehavior,
-      List<String> instanceOfInterfaces) {
-    super(d, String.class, propertyName, options, adminAction, defaultBehavior);
-
-    this.instanceOfInterfaces = Collections
-        .unmodifiableList(new LinkedList<String>(instanceOfInterfaces));
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitClass(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
-    return v.visitClass(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    try {
-      validateValue(value);
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
+        return v.visitClass(this, value, p);
     }
 
-    return value;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-
-
-  /**
-   * Get an unmodifiable list of classes which values of this property
-   * must implement.
-   *
-   * @return Returns an unmodifiable list of classes which values of
-   *         this property must implement.
-   */
-  public List<String> getInstanceOfInterface() {
-    return instanceOfInterfaces;
-  }
-
-
-
-  /**
-   * Validate and load the named class, and cast it to a subclass of
-   * the specified class.
-   *
-   * @param <T>
-   *          The requested type.
-   * @param className
-   *          The name of the class to validate and load.
-   * @param instanceOf
-   *          The class representing the requested type.
-   * @return Returns the named class cast to a subclass of the
-   *         specified class.
-   * @throws IllegalPropertyValueException
-   *           If the named class was invalid, could not be loaded, or
-   *           did not implement the required interfaces.
-   * @throws ClassCastException
-   *           If the referenced class does not implement the
-   *           requested type.
-   */
-  public <T> Class<? extends T> loadClass(String className,
-      Class<T> instanceOf) throws IllegalPropertyValueException,
-      ClassCastException {
-    ensureNotNull(className, instanceOf);
-
-    // Make sure that the named class is valid.
-    validateClassName(className);
-    Class<?> theClass = validateClassInterfaces(className);
-
-    // Cast it to the required type.
-    return theClass.asSubclass(instanceOf);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String normalizeValue(String value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    return value.trim();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(String value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // Always make sure the name is a valid class name.
-    validateClassName(value);
-
-    // If additional validation is enabled then attempt to load the
-    // class and
-    // check the interfaces that it implements/extends.
-    if (allowClassValidation) {
-      validateClassInterfaces(value);
-    }
-  }
-
-
-
-  // Make sure that named class implements the interfaces named by
-  // this
-  // definition.
-  private Class<?> validateClassInterfaces(String className)
-      throws IllegalPropertyValueException {
-    String nvalue = className.trim();
-
-    Class<?> theClass;
-    try {
-      theClass = loadClass(nvalue);
-    } catch (Exception e) {
-      // If the class cannot be loaded then it is an invalid value.
-      throw new IllegalPropertyValueException(this, className);
-    }
-
-    for (String i : instanceOfInterfaces) {
-      try {
-        Class<?> instanceOfClass = loadClass(i);
-
-        if (!instanceOfClass.isAssignableFrom(theClass)) {
-          throw new IllegalPropertyValueException(this, className);
+        try {
+            validateValue(value);
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
         }
-      } catch (Exception e) {
-        // Should not happen because the class was validated when the
-        // property
-        // definition was constructed.
-        throw new IllegalPropertyValueException(this, className);
-      }
+
+        return value;
     }
 
-    return theClass;
-  }
-
-
-
-  // Do some basic checks to make sure the string representation is
-  // valid.
-  private void validateClassName(String className)
-      throws IllegalPropertyValueException {
-    String nvalue = className.trim();
-    if (!nvalue.matches(CLASS_RE)) {
-      throw new IllegalPropertyValueException(this, className);
+    /**
+     * Get an unmodifiable list of classes which values of this property must
+     * implement.
+     *
+     * @return Returns an unmodifiable list of classes which values of this
+     *         property must implement.
+     */
+    public List<String> getInstanceOfInterface() {
+        return instanceOfInterfaces;
     }
-  }
+
+    /**
+     * Validate and load the named class, and cast it to a subclass of the
+     * specified class.
+     *
+     * @param <T>
+     *            The requested type.
+     * @param className
+     *            The name of the class to validate and load.
+     * @param instanceOf
+     *            The class representing the requested type.
+     * @return Returns the named class cast to a subclass of the specified
+     *         class.
+     * @throws IllegalPropertyValueException
+     *             If the named class was invalid, could not be loaded, or did
+     *             not implement the required interfaces.
+     * @throws ClassCastException
+     *             If the referenced class does not implement the requested
+     *             type.
+     */
+    public <T> Class<? extends T> loadClass(String className, Class<T> instanceOf)
+            throws IllegalPropertyValueException, ClassCastException {
+        ensureNotNull(className, instanceOf);
+
+        // Make sure that the named class is valid.
+        validateClassName(className);
+        Class<?> theClass = validateClassInterfaces(className);
+
+        // Cast it to the required type.
+        return theClass.asSubclass(instanceOf);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String normalizeValue(String value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        return value.trim();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void validateValue(String value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        // Always make sure the name is a valid class name.
+        validateClassName(value);
+
+        // If additional validation is enabled then attempt to load the
+        // class and
+        // check the interfaces that it implements/extends.
+        if (allowClassValidation) {
+            validateClassInterfaces(value);
+        }
+    }
+
+    // Make sure that named class implements the interfaces named by
+    // this
+    // definition.
+    private Class<?> validateClassInterfaces(String className) throws IllegalPropertyValueException {
+        String nvalue = className.trim();
+
+        Class<?> theClass;
+        try {
+            theClass = loadClass(nvalue);
+        } catch (Exception e) {
+            // If the class cannot be loaded then it is an invalid value.
+            throw new IllegalPropertyValueException(this, className);
+        }
+
+        for (String i : instanceOfInterfaces) {
+            try {
+                Class<?> instanceOfClass = loadClass(i);
+
+                if (!instanceOfClass.isAssignableFrom(theClass)) {
+                    throw new IllegalPropertyValueException(this, className);
+                }
+            } catch (Exception e) {
+                // Should not happen because the class was validated when the
+                // property
+                // definition was constructed.
+                throw new IllegalPropertyValueException(this, className);
+            }
+        }
+
+        return theClass;
+    }
+
+    // Do some basic checks to make sure the string representation is
+    // valid.
+    private void validateClassName(String className) throws IllegalPropertyValueException {
+        String nvalue = className.trim();
+        if (!nvalue.matches(CLASS_RE)) {
+            throw new IllegalPropertyValueException(this, className);
+        }
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java
index a27b348..2b5f8da 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/DNPropertyDefinition.java
@@ -27,214 +27,168 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 
 import org.forgerock.opendj.ldap.DN;
-import org.opends.server.types.DirectoryException;
-
-
 
 /**
  * DN property definition.
  */
 public final class DNPropertyDefinition extends PropertyDefinition<DN> {
 
-  // Optional base DN which all valid values must be immediately
-  // subordinate to.
-  private final DN baseDN;
-
-
-
-  /**
-   * An interface for incrementally constructing DN property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<DN, DNPropertyDefinition> {
-
     // Optional base DN which all valid values must be immediately
     // subordinate to.
-    private DN baseDN = null;
-
-
-
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
-    }
-
-
+    private final DN baseDN;
 
     /**
-     * Set the base DN which all valid values must be immediately
-     * subordinate to. By default there is no based DN.
-     *
-     * @param baseDN
-     *          The string representation of the base DN.
-     * @throws IllegalArgumentException
-     *           If the provided string is not a valid DN string
-     *           representation.
+     * An interface for incrementally constructing DN property definitions.
      */
-    public void setBaseDN(String baseDN)
-        throws IllegalArgumentException {
-      if (baseDN == null) {
-        setBaseDN((DN) null);
-      } else {
-        try {
-          setBaseDN(DN.decode(baseDN));
-        } catch (DirectoryException e) {
-          throw new IllegalArgumentException(e);
+    public static class Builder extends AbstractBuilder<DN, DNPropertyDefinition> {
+
+        // Optional base DN which all valid values must be immediately
+        // subordinate to.
+        private DN baseDN = null;
+
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
         }
-      }
+
+        /**
+         * Set the base DN which all valid values must be immediately
+         * subordinate to. By default there is no based DN.
+         *
+         * @param baseDN
+         *            The string representation of the base DN.
+         * @throws IllegalArgumentException
+         *             If the provided string is not a valid DN string
+         *             representation.
+         */
+        public void setBaseDN(String baseDN) throws IllegalArgumentException {
+            if (baseDN == null) {
+                setBaseDN((DN) null);
+            } else {
+                // TODO: is it correct to replace server DN.decode by SDK
+                // valueOf ?
+                setBaseDN(DN.valueOf(baseDN));
+            }
+        }
+
+        /**
+         * Set the base DN which all valid values must be immediately
+         * subordinate to. By default there is no based DN.
+         *
+         * @param baseDN
+         *            The base DN.
+         */
+        public void setBaseDN(DN baseDN) {
+            this.baseDN = baseDN;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected DNPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<DN> defaultBehavior) {
+            return new DNPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior, baseDN);
+        }
     }
 
-
-
     /**
-     * Set the base DN which all valid values must be immediately
-     * subordinate to. By default there is no based DN.
+     * Create a DN property definition builder.
      *
-     * @param baseDN
-     *          The base DN.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new boolean property definition builder.
      */
-    public void setBaseDN(DN baseDN) {
-      this.baseDN = baseDN;
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
     }
 
+    // Private constructor.
+    private DNPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<DN> defaultBehavior, DN baseDN) {
+        super(d, DN.class, propertyName, options, adminAction, defaultBehavior);
+        this.baseDN = baseDN;
+    }
 
+    /**
+     * Get the base DN which all valid values must be immediately subordinate
+     * to, or <code>null</code> if there is no based DN.
+     *
+     * @return Returns the base DN which all valid values must be immediately
+     *         subordinate to.
+     */
+    public DN getBaseDN() {
+        return baseDN;
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected DNPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<DN> defaultBehavior) {
-      return new DNPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior, baseDN);
+    public void validateValue(DN value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        if (baseDN != null) {
+            DN parent = value.parent();
+
+            if (parent == null) {
+                parent = DN.rootDN();
+            }
+
+            if (!parent.equals(baseDN)) {
+                throw new IllegalPropertyValueException(this, value);
+            }
+        }
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public DN decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-
-  /**
-   * Create a DN property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new boolean property definition builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  // Private constructor.
-  private DNPropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<DN> defaultBehavior, DN baseDN) {
-    super(d, DN.class, propertyName, options, adminAction, defaultBehavior);
-    this.baseDN = baseDN;
-  }
-
-
-
-  /**
-   * Get the base DN which all valid values must be immediately
-   * subordinate to, or <code>null</code> if there is no based DN.
-   *
-   * @return Returns the base DN which all valid values must be
-   *         immediately subordinate to.
-   */
-  public DN getBaseDN() {
-    return baseDN;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(DN value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    if (baseDN != null) {
-      DN parent = value.getParent();
-
-      if (parent == null) {
-        parent = DN.nullDN();
-      }
-
-      if (!parent.equals(baseDN)) {
-        throw new IllegalPropertyValueException(this, value);
-      }
+        try {
+            // TODO: is it correct to replace server DN.decode by SDK valueOf ?
+            DN dn = DN.valueOf(value);
+            validateValue(dn);
+            return dn;
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
     }
-  }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public DN decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    try {
-      DN dn = DN.decode(value);
-      validateValue(dn);
-      return dn;
-    } catch (DirectoryException e) {
-      throw new IllegalPropertyValueStringException(this, value);
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitDN(this, p);
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, DN value, P p) {
+        return v.visitDN(this, value, p);
+    }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitDN(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, DN value, P p) {
-    return v.visitDN(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(DN o1, DN o2) {
-    return o1.compareTo(o2);
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(DN o1, DN o2) {
+        return o1.compareTo(o2);
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/DecodingException.java b/opendj-admin/src/main/java/org/opends/server/admin/DecodingException.java
index 1affb2a..95b6031 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/DecodingException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/DecodingException.java
@@ -27,10 +27,7 @@
 
 package org.opends.server.admin;
 
-
-
-import org.opends.messages.Message;
-
+import org.forgerock.i18n.LocalizableMessage;
 
 
 /**
@@ -51,7 +48,7 @@
    * @param message
    *          The message.
    */
-  protected DecodingException(Message message) {
+  protected DecodingException(LocalizableMessage message) {
     super(message);
   }
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/DefaultBehaviorException.java b/opendj-admin/src/main/java/org/opends/server/admin/DefaultBehaviorException.java
index 838ed01..6e26c89 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/DefaultBehaviorException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/DefaultBehaviorException.java
@@ -27,43 +27,34 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
-
 /**
  * This exception is thrown when a property's default values cannot be
  * determined. This can occur in the following situations:
  * <ul>
- * <li>the property has a well-defined set of default values but they
- * are invalid according to the property's syntax
- * <li>the property inherits its default values from another managed
- * object but they could not be retrieved, perhaps because of a
- * communication problem.
+ * <li>the property has a well-defined set of default values but they are
+ * invalid according to the property's syntax
+ * <li>the property inherits its default values from another managed object but
+ * they could not be retrieved, perhaps because of a communication problem.
  * </ul>
  */
 public class DefaultBehaviorException extends PropertyException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = -2542117466747573053L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = -2542117466747573053L;
 
-
-
-  /**
-   * Create a new default behavior exception with a cause.
-   *
-   * @param pd
-   *          The property definition whose default values could not
-   *          be determined.
-   * @param cause
-   *          The exception that prevented the default values from
-   *          being determined.
-   */
-  public DefaultBehaviorException(PropertyDefinition<?> pd, Throwable cause) {
-    super(pd, ERR_DEFAULT_BEHAVIOR_PROPERTY_EXCEPTION.get(pd.getName()), cause);
-  }
+    /**
+     * Create a new default behavior exception with a cause.
+     *
+     * @param pd
+     *            The property definition whose default values could not be
+     *            determined.
+     * @param cause
+     *            The exception that prevented the default values from being
+     *            determined.
+     */
+    public DefaultBehaviorException(PropertyDefinition<?> pd, Throwable cause) {
+        super(pd, ERR_DEFAULT_BEHAVIOR_PROPERTY_EXCEPTION.get(pd.getName()), cause);
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/DefinitionDecodingException.java b/opendj-admin/src/main/java/org/opends/server/admin/DefinitionDecodingException.java
index da41458..b7704ae 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/DefinitionDecodingException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/DefinitionDecodingException.java
@@ -27,13 +27,9 @@
 
 package org.opends.server.admin;
 
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
-
-import static org.opends.messages.AdminMessages.*;
-
-import org.opends.messages.Message;
-
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
  * The requested managed object was found but its type could not be
@@ -75,9 +71,9 @@
 
 
   // Create the message.
-  private static Message createMessage(AbstractManagedObjectDefinition<?, ?> d,
+  private static LocalizableMessage createLocalizableMessage(AbstractManagedObjectDefinition<?, ?> d,
       Reason reason) {
-    Message ufn = d.getUserFriendlyName();
+    LocalizableMessage ufn = d.getUserFriendlyName();
     switch (reason) {
     case NO_TYPE_INFORMATION:
       return ERR_DECODING_EXCEPTION_NO_TYPE_INFO.get(ufn);
@@ -106,7 +102,7 @@
    */
   public DefinitionDecodingException(AbstractManagedObjectDefinition<?, ?> d,
       Reason reason) {
-    super(createMessage(d, reason));
+    super(createLocalizableMessage(d, reason));
     this.d = d;
     this.reason = reason;
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java
index fdf1c1c..4a4ab0a 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/DurationPropertyDefinition.java
@@ -27,583 +27,501 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.*;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 
-
-
 /**
  * Duration property definition.
  * <p>
  * A duration property definition comprises of:
  * <ul>
- * <li>a <i>base unit</i> - specifies the minimum granularity which
- * can be used to specify duration property values. For example, if
- * the base unit is in seconds then values represented in milliseconds
- * will not be permitted. The default base unit is seconds
- * <li>an optional <i>maximum unit</i> - specifies the biggest
- * duration unit which can be used to specify duration property
- * values. Values presented in units greater than this unit will not
- * be permitted. There is no default maximum unit
- * <li><i>lower limit</i> - specifies the smallest duration
- * permitted by the property. The default lower limit is 0 and can
- * never be less than 0
- * <li>an optional <i>upper limit</i> - specifies the biggest
- * duration permitted by the property. By default, there is no upper
- * limit
- * <li>support for <i>unlimited</i> durations - when permitted users
- * can specify "unlimited" durations. These are represented using the
- * decoded value, -1, or the encoded string value "unlimited". By
- * default, unlimited durations are not permitted. In addition, it is
- * not possible to define an upper limit and support unlimited values.
+ * <li>a <i>base unit</i> - specifies the minimum granularity which can be used
+ * to specify duration property values. For example, if the base unit is in
+ * seconds then values represented in milliseconds will not be permitted. The
+ * default base unit is seconds
+ * <li>an optional <i>maximum unit</i> - specifies the biggest duration unit
+ * which can be used to specify duration property values. Values presented in
+ * units greater than this unit will not be permitted. There is no default
+ * maximum unit
+ * <li><i>lower limit</i> - specifies the smallest duration permitted by the
+ * property. The default lower limit is 0 and can never be less than 0
+ * <li>an optional <i>upper limit</i> - specifies the biggest duration permitted
+ * by the property. By default, there is no upper limit
+ * <li>support for <i>unlimited</i> durations - when permitted users can specify
+ * "unlimited" durations. These are represented using the decoded value, -1, or
+ * the encoded string value "unlimited". By default, unlimited durations are not
+ * permitted. In addition, it is not possible to define an upper limit and
+ * support unlimited values.
  * </ul>
- * Decoded values are represented using <code>long</code> values in
- * the base unit defined for the duration property definition.
+ * Decoded values are represented using <code>long</code> values in the base
+ * unit defined for the duration property definition.
  */
 public final class DurationPropertyDefinition extends PropertyDefinition<Long> {
 
-  // String used to represent unlimited durations.
-  private static final String UNLIMITED = "unlimited";
-
-  // The base unit for this property definition.
-  private final DurationUnit baseUnit;
-
-  // The optional maximum unit for this property definition.
-  private final DurationUnit maximumUnit;
-
-  // The lower limit of the property value in milli-seconds.
-  private final long lowerLimit;
-
-  // The optional upper limit of the property value in milli-seconds.
-  private final Long upperLimit;
-
-  // Indicates whether this property allows the use of the "unlimited"
-  // duration value (represented using a -1L or the string
-  // "unlimited").
-  private final boolean allowUnlimited;
-
-
-
-  /**
-   * An interface for incrementally constructing duration property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<Long, DurationPropertyDefinition> {
+    // String used to represent unlimited durations.
+    private static final String UNLIMITED = "unlimited";
 
     // The base unit for this property definition.
-    private DurationUnit baseUnit = DurationUnit.SECONDS;
+    private final DurationUnit baseUnit;
 
     // The optional maximum unit for this property definition.
-    private DurationUnit maximumUnit = null;
+    private final DurationUnit maximumUnit;
 
     // The lower limit of the property value in milli-seconds.
-    private long lowerLimit = 0L;
+    private final long lowerLimit;
 
-    // The optional upper limit of the property value in
-    // milli-seconds.
-    private Long upperLimit = null;
+    // The optional upper limit of the property value in milli-seconds.
+    private final Long upperLimit;
 
-    // Indicates whether this property allows the use of the
-    // "unlimited" duration value (represented using a -1L or the
-    // string "unlimited").
-    private boolean allowUnlimited = false;
-
-
-
-    // Private constructor
-    private Builder(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName) {
-      super(d, propertyName);
-    }
-
-
+    // Indicates whether this property allows the use of the "unlimited"
+    // duration value (represented using a -1L or the string
+    // "unlimited").
+    private final boolean allowUnlimited;
 
     /**
-     * Set the base unit for this property definition (values
-     * including limits are specified in this unit). By default a
-     * duration property definition uses seconds.
-     *
-     * @param unit
-     *          The string representation of the base unit (must not
-     *          be <code>null</code>).
-     * @throws IllegalArgumentException
-     *           If the provided unit name did not correspond to a
-     *           known duration unit, or if the base unit is bigger
-     *           than the maximum unit.
+     * An interface for incrementally constructing duration property
+     * definitions.
      */
-    public final void setBaseUnit(String unit) throws IllegalArgumentException {
-      ensureNotNull(unit);
+    public static class Builder extends AbstractBuilder<Long, DurationPropertyDefinition> {
 
-      setBaseUnit(DurationUnit.getUnit(unit));
-    }
+        // The base unit for this property definition.
+        private DurationUnit baseUnit = DurationUnit.SECONDS;
 
+        // The optional maximum unit for this property definition.
+        private DurationUnit maximumUnit = null;
 
+        // The lower limit of the property value in milli-seconds.
+        private long lowerLimit = 0L;
 
-    /**
-     * Set the base unit for this property definition (values
-     * including limits are specified in this unit). By default a
-     * duration property definition uses seconds.
-     *
-     * @param unit
-     *          The base unit (must not be <code>null</code>).
-     * @throws IllegalArgumentException
-     *           If the provided base unit is bigger than the maximum
-     *           unit.
-     */
-    public final void setBaseUnit(DurationUnit unit)
-        throws IllegalArgumentException {
-      ensureNotNull(unit);
+        // The optional upper limit of the property value in
+        // milli-seconds.
+        private Long upperLimit = null;
 
-      // Make sure that the base unit is not bigger than the maximum
-      // unit.
-      if (maximumUnit != null) {
-        if (unit.getDuration() > maximumUnit.getDuration()) {
-          throw new IllegalArgumentException(
-              "Base unit greater than maximum unit");
-        }
-      }
+        // Indicates whether this property allows the use of the
+        // "unlimited" duration value (represented using a -1L or the
+        // string "unlimited").
+        private boolean allowUnlimited = false;
 
-      this.baseUnit = unit;
-    }
-
-
-
-    /**
-     * Set the maximum unit for this property definition. By default
-     * there is no maximum unit.
-     *
-     * @param unit
-     *          The string representation of the maximum unit, or
-     *          <code>null</code> if there should not be a maximum
-     *          unit.
-     * @throws IllegalArgumentException
-     *           If the provided unit name did not correspond to a
-     *           known duration unit, or if the maximum unit is
-     *           smaller than the base unit.
-     */
-    public final void setMaximumUnit(String unit)
-        throws IllegalArgumentException {
-      if (unit == null) {
-        setMaximumUnit((DurationUnit) null);
-      } else {
-        setMaximumUnit(DurationUnit.getUnit(unit));
-      }
-    }
-
-
-
-    /**
-     * Set the maximum unit for this property definition. By default
-     * there is no maximum unit.
-     *
-     * @param unit
-     *          The maximum unit, or <code>null</code> if there
-     *          should not be a maximum unit.
-     * @throws IllegalArgumentException
-     *           If the provided maximum unit is smaller than the base
-     *           unit.
-     */
-    public final void setMaximumUnit(DurationUnit unit)
-        throws IllegalArgumentException {
-      if (unit != null) {
-        // Make sure that the maximum unit is not smaller than the
-        // base unit.
-        if (unit.getDuration() < baseUnit.getDuration()) {
-          throw new IllegalArgumentException(
-              "Maximum unit smaller than base unit");
-        }
-      }
-
-      this.maximumUnit = unit;
-    }
-
-
-
-    /**
-     * Set the lower limit in milli-seconds.
-     *
-     * @param lowerLimit
-     *          The new lower limit (must be >= 0) in milli-seconds.
-     * @throws IllegalArgumentException
-     *           If a negative lower limit was specified, or the lower
-     *           limit is greater than the upper limit.
-     */
-    public final void setLowerLimit(long lowerLimit)
-        throws IllegalArgumentException {
-      if (lowerLimit < 0) {
-        throw new IllegalArgumentException("Negative lower limit");
-      }
-
-      if (upperLimit != null && lowerLimit > upperLimit) {
-        throw new IllegalArgumentException(
-            "Lower limit greater than upper limit");
-      }
-
-      this.lowerLimit = lowerLimit;
-    }
-
-
-
-    /**
-     * Set the lower limit using a string representation of the limit.
-     * If the string does not specify a unit, the current base unit
-     * will be used.
-     *
-     * @param lowerLimit
-     *          The string representation of the new lower limit.
-     * @throws IllegalArgumentException
-     *           If the lower limit could not be parsed, or if a
-     *           negative lower limit was specified, or the lower
-     *           limit is greater than the upper limit.
-     */
-    public final void setLowerLimit(String lowerLimit)
-        throws IllegalArgumentException {
-      setLowerLimit(DurationUnit.parseValue(lowerLimit, baseUnit));
-    }
-
-
-
-    /**
-     * Set the upper limit in milli-seconds.
-     *
-     * @param upperLimit
-     *          The new upper limit in milli-seconds, or
-     *          <code>null</code> if there is no upper limit.
-     * @throws IllegalArgumentException
-     *           If a negative upper limit was specified, or the lower
-     *           limit is greater than the upper limit or unlimited
-     *           durations are permitted.
-     */
-    public final void setUpperLimit(Long upperLimit)
-        throws IllegalArgumentException {
-      if (upperLimit != null) {
-        if (upperLimit < 0) {
-          throw new IllegalArgumentException("Negative upper limit");
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
         }
 
-        if (lowerLimit > upperLimit) {
-          throw new IllegalArgumentException(
-              "Lower limit greater than upper limit");
+        /**
+         * Set the base unit for this property definition (values including
+         * limits are specified in this unit). By default a duration property
+         * definition uses seconds.
+         *
+         * @param unit
+         *            The string representation of the base unit (must not be
+         *            <code>null</code>).
+         * @throws IllegalArgumentException
+         *             If the provided unit name did not correspond to a known
+         *             duration unit, or if the base unit is bigger than the
+         *             maximum unit.
+         */
+        public final void setBaseUnit(String unit) throws IllegalArgumentException {
+            ensureNotNull(unit);
+
+            setBaseUnit(DurationUnit.getUnit(unit));
         }
 
-        if (allowUnlimited) {
-          throw new IllegalArgumentException(
-              "Upper limit specified when unlimited durations are permitted");
+        /**
+         * Set the base unit for this property definition (values including
+         * limits are specified in this unit). By default a duration property
+         * definition uses seconds.
+         *
+         * @param unit
+         *            The base unit (must not be <code>null</code>).
+         * @throws IllegalArgumentException
+         *             If the provided base unit is bigger than the maximum
+         *             unit.
+         */
+        public final void setBaseUnit(DurationUnit unit) throws IllegalArgumentException {
+            ensureNotNull(unit);
+
+            // Make sure that the base unit is not bigger than the maximum
+            // unit.
+            if (maximumUnit != null) {
+                if (unit.getDuration() > maximumUnit.getDuration()) {
+                    throw new IllegalArgumentException("Base unit greater than maximum unit");
+                }
+            }
+
+            this.baseUnit = unit;
         }
-      }
 
-      this.upperLimit = upperLimit;
+        /**
+         * Set the maximum unit for this property definition. By default there
+         * is no maximum unit.
+         *
+         * @param unit
+         *            The string representation of the maximum unit, or
+         *            <code>null</code> if there should not be a maximum unit.
+         * @throws IllegalArgumentException
+         *             If the provided unit name did not correspond to a known
+         *             duration unit, or if the maximum unit is smaller than the
+         *             base unit.
+         */
+        public final void setMaximumUnit(String unit) throws IllegalArgumentException {
+            if (unit == null) {
+                setMaximumUnit((DurationUnit) null);
+            } else {
+                setMaximumUnit(DurationUnit.getUnit(unit));
+            }
+        }
+
+        /**
+         * Set the maximum unit for this property definition. By default there
+         * is no maximum unit.
+         *
+         * @param unit
+         *            The maximum unit, or <code>null</code> if there should not
+         *            be a maximum unit.
+         * @throws IllegalArgumentException
+         *             If the provided maximum unit is smaller than the base
+         *             unit.
+         */
+        public final void setMaximumUnit(DurationUnit unit) throws IllegalArgumentException {
+            if (unit != null) {
+                // Make sure that the maximum unit is not smaller than the
+                // base unit.
+                if (unit.getDuration() < baseUnit.getDuration()) {
+                    throw new IllegalArgumentException("Maximum unit smaller than base unit");
+                }
+            }
+
+            this.maximumUnit = unit;
+        }
+
+        /**
+         * Set the lower limit in milli-seconds.
+         *
+         * @param lowerLimit
+         *            The new lower limit (must be >= 0) in milli-seconds.
+         * @throws IllegalArgumentException
+         *             If a negative lower limit was specified, or the lower
+         *             limit is greater than the upper limit.
+         */
+        public final void setLowerLimit(long lowerLimit) throws IllegalArgumentException {
+            if (lowerLimit < 0) {
+                throw new IllegalArgumentException("Negative lower limit");
+            }
+
+            if (upperLimit != null && lowerLimit > upperLimit) {
+                throw new IllegalArgumentException("Lower limit greater than upper limit");
+            }
+
+            this.lowerLimit = lowerLimit;
+        }
+
+        /**
+         * Set the lower limit using a string representation of the limit. If
+         * the string does not specify a unit, the current base unit will be
+         * used.
+         *
+         * @param lowerLimit
+         *            The string representation of the new lower limit.
+         * @throws IllegalArgumentException
+         *             If the lower limit could not be parsed, or if a negative
+         *             lower limit was specified, or the lower limit is greater
+         *             than the upper limit.
+         */
+        public final void setLowerLimit(String lowerLimit) throws IllegalArgumentException {
+            setLowerLimit(DurationUnit.parseValue(lowerLimit, baseUnit));
+        }
+
+        /**
+         * Set the upper limit in milli-seconds.
+         *
+         * @param upperLimit
+         *            The new upper limit in milli-seconds, or <code>null</code>
+         *            if there is no upper limit.
+         * @throws IllegalArgumentException
+         *             If a negative upper limit was specified, or the lower
+         *             limit is greater than the upper limit or unlimited
+         *             durations are permitted.
+         */
+        public final void setUpperLimit(Long upperLimit) throws IllegalArgumentException {
+            if (upperLimit != null) {
+                if (upperLimit < 0) {
+                    throw new IllegalArgumentException("Negative upper limit");
+                }
+
+                if (lowerLimit > upperLimit) {
+                    throw new IllegalArgumentException("Lower limit greater than upper limit");
+                }
+
+                if (allowUnlimited) {
+                    throw new IllegalArgumentException("Upper limit specified when unlimited durations are permitted");
+                }
+            }
+
+            this.upperLimit = upperLimit;
+        }
+
+        /**
+         * Set the upper limit using a string representation of the limit. If
+         * the string does not specify a unit, the current base unit will be
+         * used.
+         *
+         * @param upperLimit
+         *            The string representation of the new upper limit, or
+         *            <code>null</code> if there is no upper limit.
+         * @throws IllegalArgumentException
+         *             If the upper limit could not be parsed, or if the lower
+         *             limit is greater than the upper limit.
+         */
+        public final void setUpperLimit(String upperLimit) throws IllegalArgumentException {
+            if (upperLimit == null) {
+                setUpperLimit((Long) null);
+            } else {
+                setUpperLimit(DurationUnit.parseValue(upperLimit, baseUnit));
+            }
+        }
+
+        /**
+         * Specify whether or not this property definition will allow unlimited
+         * values (default is false).
+         *
+         * @param allowUnlimited
+         *            <code>true</code> if the property will allow unlimited
+         *            values, or <code>false</code> otherwise.
+         * @throws IllegalArgumentException
+         *             If unlimited values are to be permitted but there is an
+         *             upper limit specified.
+         */
+        public final void setAllowUnlimited(boolean allowUnlimited) throws IllegalArgumentException {
+            if (allowUnlimited && upperLimit != null) {
+                throw new IllegalArgumentException("Upper limit specified when unlimited durations are permitted");
+            }
+
+            this.allowUnlimited = allowUnlimited;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected DurationPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d,
+                String propertyName, EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<Long> defaultBehavior) {
+            return new DurationPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior, baseUnit,
+                    maximumUnit, lowerLimit, upperLimit, allowUnlimited);
+        }
     }
 
-
-
     /**
-     * Set the upper limit using a string representation of the limit.
-     * If the string does not specify a unit, the current base unit
-     * will be used.
+     * Create a duration property definition builder.
      *
-     * @param upperLimit
-     *          The string representation of the new upper limit, or
-     *          <code>null</code> if there is no upper limit.
-     * @throws IllegalArgumentException
-     *           If the upper limit could not be parsed, or if the
-     *           lower limit is greater than the upper limit.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new integer property definition builder.
      */
-    public final void setUpperLimit(String upperLimit)
-        throws IllegalArgumentException {
-      if (upperLimit == null) {
-        setUpperLimit((Long) null);
-      } else {
-        setUpperLimit(DurationUnit.parseValue(upperLimit, baseUnit));
-      }
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
     }
 
-
+    // Private constructor.
+    private DurationPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<Long> defaultBehavior, DurationUnit baseUnit, DurationUnit maximumUnit,
+            Long lowerLimit, Long upperLimit, boolean allowUnlimited) {
+        super(d, Long.class, propertyName, options, adminAction, defaultBehavior);
+        this.baseUnit = baseUnit;
+        this.maximumUnit = maximumUnit;
+        this.lowerLimit = lowerLimit;
+        this.upperLimit = upperLimit;
+        this.allowUnlimited = allowUnlimited;
+    }
 
     /**
-     * Specify whether or not this property definition will allow
-     * unlimited values (default is false).
+     * Get the base unit for this property definition (values including limits
+     * are specified in this unit).
      *
-     * @param allowUnlimited
-     *          <code>true</code> if the property will allow
-     *          unlimited values, or <code>false</code> otherwise.
-     * @throws IllegalArgumentException
-     *           If unlimited values are to be permitted but there is
-     *           an upper limit specified.
+     * @return Returns the base unit for this property definition (values
+     *         including limits are specified in this unit).
      */
-    public final void setAllowUnlimited(boolean allowUnlimited)
-        throws IllegalArgumentException {
-      if (allowUnlimited && upperLimit != null) {
-        throw new IllegalArgumentException(
-            "Upper limit specified when unlimited durations are permitted");
-      }
-
-      this.allowUnlimited = allowUnlimited;
+    public DurationUnit getBaseUnit() {
+        return baseUnit;
     }
 
+    /**
+     * Get the maximum unit for this property definition if specified.
+     *
+     * @return Returns the maximum unit for this property definition, or
+     *         <code>null</code> if there is no maximum unit.
+     */
+    public DurationUnit getMaximumUnit() {
+        return maximumUnit;
+    }
 
+    /**
+     * Get the lower limit in milli-seconds.
+     *
+     * @return Returns the lower limit in milli-seconds.
+     */
+    public long getLowerLimit() {
+        return lowerLimit;
+    }
+
+    /**
+     * Get the upper limit in milli-seconds.
+     *
+     * @return Returns the upper limit in milli-seconds, or <code>null</code> if
+     *         there is no upper limit.
+     */
+    public Long getUpperLimit() {
+        return upperLimit;
+    }
+
+    /**
+     * Determine whether this property allows unlimited durations.
+     *
+     * @return Returns <code>true</code> if this this property allows unlimited
+     *         durations.
+     */
+    public boolean isAllowUnlimited() {
+        return allowUnlimited;
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected DurationPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<Long> defaultBehavior) {
-      return new DurationPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior, baseUnit, maximumUnit, lowerLimit,
-          upperLimit, allowUnlimited);
-    }
-  }
+    public void validateValue(Long value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
+        long nvalue = baseUnit.toMilliSeconds(value);
+        if (!allowUnlimited && nvalue < lowerLimit) {
+            throw new IllegalPropertyValueException(this, value);
 
+            // unlimited allowed
+        } else if (nvalue >= 0 && nvalue < lowerLimit) {
+            throw new IllegalPropertyValueException(this, value);
+        }
 
-  /**
-   * Create a duration property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new integer property definition builder.
-   */
-  public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d,
-      String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  // Private constructor.
-  private DurationPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d,
-      String propertyName, EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<Long> defaultBehavior, DurationUnit baseUnit,
-      DurationUnit maximumUnit, Long lowerLimit, Long upperLimit,
-      boolean allowUnlimited) {
-    super(d, Long.class, propertyName, options, adminAction, defaultBehavior);
-    this.baseUnit = baseUnit;
-    this.maximumUnit = maximumUnit;
-    this.lowerLimit = lowerLimit;
-    this.upperLimit = upperLimit;
-    this.allowUnlimited = allowUnlimited;
-  }
-
-
-
-  /**
-   * Get the base unit for this property definition (values including
-   * limits are specified in this unit).
-   *
-   * @return Returns the base unit for this property definition
-   *         (values including limits are specified in this unit).
-   */
-  public DurationUnit getBaseUnit() {
-    return baseUnit;
-  }
-
-
-
-  /**
-   * Get the maximum unit for this property definition if specified.
-   *
-   * @return Returns the maximum unit for this property definition, or
-   *         <code>null</code> if there is no maximum unit.
-   */
-  public DurationUnit getMaximumUnit() {
-    return maximumUnit;
-  }
-
-
-
-  /**
-   * Get the lower limit in milli-seconds.
-   *
-   * @return Returns the lower limit in milli-seconds.
-   */
-  public long getLowerLimit() {
-    return lowerLimit;
-  }
-
-
-
-  /**
-   * Get the upper limit in milli-seconds.
-   *
-   * @return Returns the upper limit in milli-seconds, or
-   *         <code>null</code> if there is no upper limit.
-   */
-  public Long getUpperLimit() {
-    return upperLimit;
-  }
-
-
-
-  /**
-   * Determine whether this property allows unlimited durations.
-   *
-   * @return Returns <code>true</code> if this this property allows
-   *         unlimited durations.
-   */
-  public boolean isAllowUnlimited() {
-    return allowUnlimited;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(Long value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    long nvalue = baseUnit.toMilliSeconds(value);
-    if (!allowUnlimited && nvalue < lowerLimit) {
-      throw new IllegalPropertyValueException(this, value);
-
-      // unlimited allowed
-    } else if (nvalue >= 0 && nvalue < lowerLimit) {
-      throw new IllegalPropertyValueException(this, value);
+        if ((upperLimit != null) && (nvalue > upperLimit)) {
+            throw new IllegalPropertyValueException(this, value);
+        }
     }
 
-    if ((upperLimit != null) && (nvalue > upperLimit)) {
-      throw new IllegalPropertyValueException(this, value);
-    }
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String encodeValue(Long value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
+        // Make sure that we correctly encode negative values as
+        // "unlimited".
+        if (allowUnlimited) {
+            if (value < 0) {
+                return UNLIMITED;
+            }
+        }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String encodeValue(Long value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // Make sure that we correctly encode negative values as
-    // "unlimited".
-    if (allowUnlimited) {
-      if (value < 0) {
-        return UNLIMITED;
-      }
+        // Encode the size value using the base unit.
+        StringBuilder builder = new StringBuilder();
+        builder.append(value);
+        builder.append(' ');
+        builder.append(baseUnit.toString());
+        return builder.toString();
     }
 
-    // Encode the size value using the base unit.
-    StringBuilder builder = new StringBuilder();
-    builder.append(value);
-    builder.append(' ');
-    builder.append(baseUnit.toString());
-    return builder.toString();
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Long decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
+        // First check for the special "unlimited" value when necessary.
+        if (allowUnlimited) {
+            if (value.trim().equalsIgnoreCase(UNLIMITED)) {
+                return -1L;
+            }
+        }
 
+        // Parse the string representation.
+        long ms;
+        try {
+            ms = DurationUnit.parseValue(value);
+        } catch (NumberFormatException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public Long decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
+        // Check the unit is in range - values must not be more granular
+        // than the base unit.
+        if ((ms % baseUnit.getDuration()) != 0) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
 
-    // First check for the special "unlimited" value when necessary.
-    if (allowUnlimited) {
-      if (value.trim().equalsIgnoreCase(UNLIMITED)) {
-        return -1L;
-      }
+        // Convert the value a long in the property's required unit.
+        Long i = (long) baseUnit.fromMilliSeconds(ms);
+        try {
+            validateValue(i);
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
+        return i;
     }
 
-    // Parse the string representation.
-    long ms;
-    try {
-      ms = DurationUnit.parseValue(value);
-    } catch (NumberFormatException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitDuration(this, p);
     }
 
-    // Check the unit is in range - values must not be more granular
-    // than the base unit.
-    if ((ms % baseUnit.getDuration()) != 0) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, Long value, P p) {
+        return v.visitDuration(this, value, p);
     }
 
-    // Convert the value a long in the property's required unit.
-    Long i = (long) baseUnit.fromMilliSeconds(ms);
-    try {
-      validateValue(i);
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
-    }
-    return i;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void toString(StringBuilder builder) {
+        super.toString(builder);
 
+        builder.append(" baseUnit=");
+        builder.append(baseUnit);
 
+        if (maximumUnit != null) {
+            builder.append(" maximumUnit=");
+            builder.append(maximumUnit);
+        }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitDuration(this, p);
-  }
+        builder.append(" lowerLimit=");
+        builder.append(lowerLimit);
+        builder.append("ms");
 
+        if (upperLimit != null) {
+            builder.append(" upperLimit=");
+            builder.append(upperLimit);
+            builder.append("ms");
+        }
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, Long value, P p) {
-    return v.visitDuration(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void toString(StringBuilder builder) {
-    super.toString(builder);
-
-    builder.append(" baseUnit=");
-    builder.append(baseUnit);
-
-    if (maximumUnit != null) {
-      builder.append(" maximumUnit=");
-      builder.append(maximumUnit);
+        builder.append(" allowUnlimited=");
+        builder.append(allowUnlimited);
     }
 
-    builder.append(" lowerLimit=");
-    builder.append(lowerLimit);
-    builder.append("ms");
-
-    if (upperLimit != null) {
-      builder.append(" upperLimit=");
-      builder.append(upperLimit);
-      builder.append("ms");
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(Long o1, Long o2) {
+        return o1.compareTo(o2);
     }
 
-    builder.append(" allowUnlimited=");
-    builder.append(allowUnlimited);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(Long o1, Long o2) {
-    return o1.compareTo(o2);
-  }
-
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java
index 815bdfc..5ebc2ff 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/EnumPropertyDefinition.java
@@ -26,11 +26,8 @@
  */
 
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 import java.util.HashMap;
@@ -38,238 +35,195 @@
 import java.util.Map;
 import java.util.MissingResourceException;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
  * Enumeration property definition.
  *
  * @param <E>
- *          The enumeration that should be used for values of this
- *          property definition.
+ *            The enumeration that should be used for values of this property
+ *            definition.
  */
-public final class EnumPropertyDefinition<E extends Enum<E>> extends
-    PropertyDefinition<E> {
-
-  /**
-   * An interface for incrementally constructing enumeration property
-   * definitions.
-   *
-   * @param <E>
-   *          The enumeration that should be used for values of this
-   *          property definition.
-   */
-  public static class Builder<E extends Enum<E>> extends
-      AbstractBuilder<E, EnumPropertyDefinition<E>> {
-
-    // The enumeration class.
-    private Class<E> enumClass;
-
-
-
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
-      this.enumClass = null;
-    }
-
-
+public final class EnumPropertyDefinition<E extends Enum<E>> extends PropertyDefinition<E> {
 
     /**
-     * Set the enumeration class which should be used for values of
-     * this property definition.
+     * An interface for incrementally constructing enumeration property
+     * definitions.
      *
-     * @param enumClass
-     *          The enumeration class which should be used for values
-     *          of this property definition.
+     * @param <E>
+     *            The enumeration that should be used for values of this
+     *            property definition.
      */
-    public final void setEnumClass(Class<E> enumClass) {
-      this.enumClass = enumClass;
+    public static class Builder<E extends Enum<E>> extends AbstractBuilder<E, EnumPropertyDefinition<E>> {
+
+        // The enumeration class.
+        private Class<E> enumClass;
+
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
+            this.enumClass = null;
+        }
+
+        /**
+         * Set the enumeration class which should be used for values of this
+         * property definition.
+         *
+         * @param enumClass
+         *            The enumeration class which should be used for values of
+         *            this property definition.
+         */
+        public final void setEnumClass(Class<E> enumClass) {
+            this.enumClass = enumClass;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected EnumPropertyDefinition<E> buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<E> defaultBehavior) {
+            // Make sure that the enumeration class has been defined.
+            if (enumClass == null) {
+                throw new IllegalStateException("Enumeration class undefined");
+            }
+
+            return new EnumPropertyDefinition<E>(d, propertyName, options, adminAction, defaultBehavior, enumClass);
+        }
     }
 
+    /**
+     * Create an enumeration property definition builder.
+     *
+     * @param <E>
+     *            The enumeration that should be used for values of this
+     *            property definition.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new enumeration property definition builder.
+     */
+    public static <E extends Enum<E>> Builder<E> createBuilder(AbstractManagedObjectDefinition<?, ?> d,
+            String propertyName) {
+        return new Builder<E>(d, propertyName);
+    }
 
+    // The enumeration class.
+    private final Class<E> enumClass;
+
+    // Map used for decoding values.
+    private final Map<String, E> decodeMap;
+
+    // Private constructor.
+    private EnumPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<E> defaultBehavior, Class<E> enumClass) {
+        super(d, enumClass, propertyName, options, adminAction, defaultBehavior);
+        this.enumClass = enumClass;
+
+        // Initialize the decoding map.
+        this.decodeMap = new HashMap<String, E>();
+        for (E value : EnumSet.<E> allOf(enumClass)) {
+            String s = value.toString().trim().toLowerCase();
+            this.decodeMap.put(s, value);
+        }
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected EnumPropertyDefinition<E> buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<E> defaultBehavior) {
-      // Make sure that the enumeration class has been defined.
-      if (enumClass == null) {
-        throw new IllegalStateException("Enumeration class undefined");
-      }
-
-      return new EnumPropertyDefinition<E>(d, propertyName, options,
-          adminAction, defaultBehavior, enumClass);
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitEnum(this, p);
     }
-  }
 
-
-
-  /**
-   * Create an enumeration property definition builder.
-   *
-   * @param <E>
-   *          The enumeration that should be used for values of this
-   *          property definition.
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new enumeration property definition builder.
-   */
-  public static <E extends Enum<E>> Builder<E> createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder<E>(d, propertyName);
-  }
-
-  // The enumeration class.
-  private final Class<E> enumClass;
-
-  // Map used for decoding values.
-  private final Map<String, E> decodeMap;
-
-
-
-  // Private constructor.
-  private EnumPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d,
-      String propertyName, EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<E> defaultBehavior, Class<E> enumClass) {
-    super(d, enumClass, propertyName, options, adminAction, defaultBehavior);
-    this.enumClass = enumClass;
-
-    // Initialize the decoding map.
-    this.decodeMap = new HashMap<String, E>();
-    for (E value : EnumSet.<E> allOf(enumClass)) {
-      String s = value.toString().trim().toLowerCase();
-      this.decodeMap.put(s, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, E value, P p) {
+        return v.visitEnum(this, value, p);
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public E decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitEnum(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, E value, P p) {
-    return v.visitEnum(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public E decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    String nvalue = value.trim().toLowerCase();
-    E eValue = decodeMap.get(nvalue);
-    if (eValue == null) {
-      throw new IllegalPropertyValueStringException(this, value);
-    } else {
-      return eValue;
+        String nvalue = value.trim().toLowerCase();
+        E eValue = decodeMap.get(nvalue);
+        if (eValue == null) {
+            throw new IllegalPropertyValueStringException(this, value);
+        } else {
+            return eValue;
+        }
     }
-  }
 
-
-
-  /**
-   * Get the enumeration class used for values of this property.
-   *
-   * @return Returns the enumeration class used for values of this
-   *         property.
-   */
-  public Class<E> getEnumClass() {
-    return enumClass;
-  }
-
-
-
-  /**
-   * Gets the synopsis of the specified enumeration value of this
-   * enumeration property definition in the default locale.
-   *
-   * @param value
-   *          The enumeration value.
-   * @return Returns the synopsis of the specified enumeration value
-   *         of this enumeration property definition in the default
-   *         locale.
-   */
-  public final Message getValueSynopsis(E value) {
-    return getValueSynopsis(Locale.getDefault(), value);
-  }
-
-
-
-  /**
-   * Gets the synopsis of the specified enumeration value of this
-   * enumeration property definition in the specified locale.
-   *
-   * @param value
-   *          The enumeration value.
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of the specified enumeration value
-   *         of this enumeration property definition in the specified
-   *         locale.
-   */
-  public final Message getValueSynopsis(Locale locale, E value) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + getName()
-        + ".syntax.enumeration.value." + value.toString()
-        + ".synopsis";
-    try {
-      return resource.getMessage(getManagedObjectDefinition(),
-          property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+    /**
+     * Get the enumeration class used for values of this property.
+     *
+     * @return Returns the enumeration class used for values of this property.
+     */
+    public Class<E> getEnumClass() {
+        return enumClass;
     }
-  }
 
+    /**
+     * Gets the synopsis of the specified enumeration value of this enumeration
+     * property definition in the default locale.
+     *
+     * @param value
+     *            The enumeration value.
+     * @return Returns the synopsis of the specified enumeration value of this
+     *         enumeration property definition in the default locale.
+     */
+    public final LocalizableMessage getValueSynopsis(E value) {
+        return getValueSynopsis(Locale.getDefault(), value);
+    }
 
+    /**
+     * Gets the synopsis of the specified enumeration value of this enumeration
+     * property definition in the specified locale.
+     *
+     * @param value
+     *            The enumeration value.
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of the specified enumeration value of this
+     *         enumeration property definition in the specified locale.
+     */
+    public final LocalizableMessage getValueSynopsis(Locale locale, E value) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + getName() + ".syntax.enumeration.value." + value.toString() + ".synopsis";
+        try {
+            return resource.getMessage(getManagedObjectDefinition(), property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String normalizeValue(E value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String normalizeValue(E value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
-    return value.toString().trim().toLowerCase();
-  }
+        return value.toString().trim().toLowerCase();
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void validateValue(E value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(E value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // No additional validation required.
-  }
+        // No additional validation required.
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/GenericConstraint.java b/opendj-admin/src/main/java/org/opends/server/admin/GenericConstraint.java
index 87ae550..5e4dbde 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/GenericConstraint.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/GenericConstraint.java
@@ -26,13 +26,11 @@
  */
 package org.opends.server.admin;
 
-
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Locale;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.client.AuthorizationException;
 import org.opends.server.admin.client.ClientConstraintHandler;
 import org.opends.server.admin.client.CommunicationException;
@@ -43,181 +41,152 @@
 import org.opends.server.admin.server.ServerManagedObject;
 import org.opends.server.config.ConfigException;
 
-
-
 /**
- * A generic constraint which comprises of an underlying condition and
- * a description. The condition must evaluate to <code>true</code>
- * in order for a new managed object to be created or modified.
+ * A generic constraint which comprises of an underlying condition and a
+ * description. The condition must evaluate to <code>true</code> in order for a
+ * new managed object to be created or modified.
  */
 public class GenericConstraint extends Constraint {
 
-  /**
-   * The client-side constraint handler.
-   */
-  private class ClientHandler extends ClientConstraintHandler {
+    /**
+     * The client-side constraint handler.
+     */
+    private class ClientHandler extends ClientConstraintHandler {
 
-    // Private constructor.
-    private ClientHandler() {
-      // No implementation required.
+        // Private constructor.
+        private ClientHandler() {
+            // No implementation required.
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isAddAcceptable(ManagementContext context, ManagedObject<?> managedObject,
+                Collection<LocalizableMessage> unacceptableReasons) throws AuthorizationException, CommunicationException {
+            if (!condition.evaluate(context, managedObject)) {
+                unacceptableReasons.add(getSynopsis());
+                return false;
+            } else {
+                return true;
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isModifyAcceptable(ManagementContext context, ManagedObject<?> managedObject,
+                Collection<LocalizableMessage> unacceptableReasons) throws AuthorizationException, CommunicationException {
+            if (!condition.evaluate(context, managedObject)) {
+                unacceptableReasons.add(getSynopsis());
+                return false;
+            } else {
+                return true;
+            }
+        }
+
+    };
+
+    /**
+     * The server-side constraint handler.
+     */
+    private class ServerHandler extends ServerConstraintHandler {
+
+        // Private constructor.
+        private ServerHandler() {
+            // No implementation required.
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isUsable(ServerManagedObject<?> managedObject, Collection<LocalizableMessage> unacceptableReasons)
+                throws ConfigException {
+            if (!condition.evaluate(managedObject)) {
+                unacceptableReasons.add(getSynopsis());
+                return false;
+            } else {
+                return true;
+            }
+        }
+
+    };
+
+    // The client-side constraint handler.
+    private final ClientConstraintHandler clientHandler = new ClientHandler();
+
+    // The condition associated with this constraint.
+    private final Condition condition;
+
+    // The managed object definition associated with this constraint.
+    private final AbstractManagedObjectDefinition<?, ?> definition;
+
+    // The constraint ID.
+    private final int id;
+
+    // The server-side constraint handler.
+    private final ServerConstraintHandler serverHandler = new ServerHandler();
+
+    /**
+     * Creates a new generic constraint.
+     *
+     * @param definition
+     *            The managed object definition associated with this constraint.
+     * @param id
+     *            The constraint ID.
+     * @param condition
+     *            The condition associated with this constraint.
+     */
+    public GenericConstraint(AbstractManagedObjectDefinition<?, ?> definition, int id, Condition condition) {
+        this.definition = definition;
+        this.id = id;
+        this.condition = condition;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
+        return Collections.singleton(clientHandler);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
+        return Collections.singleton(serverHandler);
+    }
+
+    /**
+     * Gets the synopsis of this constraint in the default locale.
+     *
+     * @return Returns the synopsis of this constraint in the default locale.
+     */
+    public final LocalizableMessage getSynopsis() {
+        return getSynopsis(Locale.getDefault());
+    }
+
+    /**
+     * Gets the synopsis of this constraint in the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this constraint in the specified locale.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "constraint." + id + ".synopsis";
+        return resource.getMessage(definition, property, locale);
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public boolean isAddAcceptable(ManagementContext context,
-        ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
-        throws AuthorizationException, CommunicationException {
-      if (!condition.evaluate(context, managedObject)) {
-        unacceptableReasons.add(getSynopsis());
-        return false;
-      } else {
-        return true;
-      }
+    protected void initialize() throws Exception {
+        condition.initialize(definition);
     }
 
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isModifyAcceptable(ManagementContext context,
-        ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
-        throws AuthorizationException, CommunicationException {
-      if (!condition.evaluate(context, managedObject)) {
-        unacceptableReasons.add(getSynopsis());
-        return false;
-      } else {
-        return true;
-      }
-    }
-
-  };
-
-
-
-  /**
-   * The server-side constraint handler.
-   */
-  private class ServerHandler extends ServerConstraintHandler {
-
-    // Private constructor.
-    private ServerHandler() {
-      // No implementation required.
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isUsable(ServerManagedObject<?> managedObject,
-        Collection<Message> unacceptableReasons) throws ConfigException {
-      if (!condition.evaluate(managedObject)) {
-        unacceptableReasons.add(getSynopsis());
-        return false;
-      } else {
-        return true;
-      }
-    }
-
-  };
-
-  // The client-side constraint handler.
-  private final ClientConstraintHandler clientHandler = new ClientHandler();
-
-  // The condition associated with this constraint.
-  private final Condition condition;
-
-  // The managed object definition associated with this constraint.
-  private final AbstractManagedObjectDefinition<?, ?> definition;
-
-  // The constraint ID.
-  private final int id;
-
-  // The server-side constraint handler.
-  private final ServerConstraintHandler serverHandler = new ServerHandler();
-
-
-
-  /**
-   * Creates a new generic constraint.
-   *
-   * @param definition
-   *          The managed object definition associated with this
-   *          constraint.
-   * @param id
-   *          The constraint ID.
-   * @param condition
-   *          The condition associated with this constraint.
-   */
-  public GenericConstraint(AbstractManagedObjectDefinition<?, ?> definition,
-      int id, Condition condition) {
-    this.definition = definition;
-    this.id = id;
-    this.condition = condition;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
-    return Collections.singleton(clientHandler);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
-    return Collections.singleton(serverHandler);
-  }
-
-
-
-  /**
-   * Gets the synopsis of this constraint in the default locale.
-   *
-   * @return Returns the synopsis of this constraint in the default
-   *         locale.
-   */
-  public final Message getSynopsis() {
-    return getSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the synopsis of this constraint in the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this constraint in the specified
-   *         locale.
-   */
-  public final Message getSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "constraint." + id + ".synopsis";
-    return resource.getMessage(definition, property, locale);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  protected void initialize() throws Exception {
-    condition.initialize(definition);
-  }
-
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java
index caf5b95..6bdefdb 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/IPAddressMaskPropertyDefinition.java
@@ -27,140 +27,108 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 
 import org.opends.server.config.ConfigException;
 import org.opends.server.types.AddressMask;
 
-
-
 /**
  * IP address mask property definition.
  */
-public final class IPAddressMaskPropertyDefinition extends
-    PropertyDefinition<AddressMask> {
+public final class IPAddressMaskPropertyDefinition extends PropertyDefinition<AddressMask> {
 
-  /**
-   * An interface for incrementally constructing IP address mask property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<AddressMask, IPAddressMaskPropertyDefinition> {
+    /**
+     * An interface for incrementally constructing IP address mask property
+     * definitions.
+     */
+    public static class Builder extends AbstractBuilder<AddressMask, IPAddressMaskPropertyDefinition> {
 
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected IPAddressMaskPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d,
+                String propertyName, EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<AddressMask> defaultBehavior) {
+            return new IPAddressMaskPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior);
+        }
+
     }
 
+    /**
+     * Create a IP address mask property definition builder.
+     *
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new IP address mask property definition builder.
+     */
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
+    }
 
+    // Private constructor.
+    private IPAddressMaskPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<AddressMask> defaultBehavior) {
+        super(d, AddressMask.class, propertyName, options, adminAction, defaultBehavior);
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected IPAddressMaskPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName, EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<AddressMask> defaultBehavior) {
-      return new IPAddressMaskPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior);
+    public void validateValue(AddressMask value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        // No additional validation required.
     }
 
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public AddressMask decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-
-
-  /**
-   * Create a IP address mask property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new IP address mask property definition builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  // Private constructor.
-  private IPAddressMaskPropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<AddressMask> defaultBehavior) {
-    super(d, AddressMask.class, propertyName, options, adminAction,
-        defaultBehavior);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(AddressMask value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // No additional validation required.
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public AddressMask decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    try {
-      return AddressMask.decode(value);
-    } catch (ConfigException e) {
-      // TODO: it would be nice to throw the cause.
-      throw new IllegalPropertyValueStringException(this, value);
+        try {
+            return AddressMask.decode(value);
+        } catch (ConfigException e) {
+            // TODO: it would be nice to throw the cause.
+            throw new IllegalPropertyValueStringException(this, value);
+        }
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitIPAddressMask(this, p);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, AddressMask value, P p) {
+        return v.visitIPAddressMask(this, value, p);
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitIPAddressMask(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, AddressMask value, P p) {
-    return v.visitIPAddressMask(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(AddressMask o1, AddressMask o2) {
-    return o1.toString().compareTo(o2.toString());
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(AddressMask o1, AddressMask o2) {
+        return o1.toString().compareTo(o2.toString());
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java
index 380920b..ad9cdbb 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/IPAddressPropertyDefinition.java
@@ -27,162 +27,127 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.EnumSet;
 
-
-
 /**
  * IP address property definition.
  */
-public final class IPAddressPropertyDefinition extends
-    PropertyDefinition<InetAddress> {
+public final class IPAddressPropertyDefinition extends PropertyDefinition<InetAddress> {
 
-  /**
-   * An interface for incrementally constructing IP address property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<InetAddress, IPAddressPropertyDefinition> {
+    /**
+     * An interface for incrementally constructing IP address property
+     * definitions.
+     */
+    public static class Builder extends AbstractBuilder<InetAddress, IPAddressPropertyDefinition> {
 
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected IPAddressPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d,
+                String propertyName, EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<InetAddress> defaultBehavior) {
+            return new IPAddressPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior);
+        }
+
     }
 
+    /**
+     * Create a IP address property definition builder.
+     *
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new IP address property definition builder.
+     */
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
+    }
 
+    // Private constructor.
+    private IPAddressPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<InetAddress> defaultBehavior) {
+        super(d, InetAddress.class, propertyName, options, adminAction, defaultBehavior);
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected IPAddressPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<InetAddress> defaultBehavior) {
-      return new IPAddressPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior);
+    public void validateValue(InetAddress value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        // No additional validation required.
     }
 
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public InetAddress decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-
-
-  /**
-   * Create a IP address property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new IP address property definition builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  // Private constructor.
-  private IPAddressPropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<InetAddress> defaultBehavior) {
-    super(d, InetAddress.class, propertyName, options, adminAction,
-        defaultBehavior);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(InetAddress value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // No additional validation required.
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public InetAddress decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    try {
-      return InetAddress.getByName(value);
-    } catch (UnknownHostException e) {
-      // TODO: it would be nice to throw the cause.
-      throw new IllegalPropertyValueStringException(this, value);
+        try {
+            return InetAddress.getByName(value);
+        } catch (UnknownHostException e) {
+            // TODO: it would be nice to throw the cause.
+            throw new IllegalPropertyValueStringException(this, value);
+        }
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String encodeValue(InetAddress value) throws IllegalPropertyValueException {
+        // We should return the host name if it is available, or the IP
+        // address if not.
 
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String encodeValue(InetAddress value)
-      throws IllegalPropertyValueException {
-    // We should return the host name if it is available, or the IP
-    // address if not.
-
-    // Unforunately, there is no InetAddress method for doing this, so
-    // we have to resort to hacking at the toString() encoding.
-    String s = value.toString();
-    int i = s.indexOf('/');
-    if (i > 0) {
-      // Host address is before the forward slash.
-      return s.substring(0, i);
-    } else {
-      return value.getHostAddress();
+        // Unforunately, there is no InetAddress method for doing this, so
+        // we have to resort to hacking at the toString() encoding.
+        String s = value.toString();
+        int i = s.indexOf('/');
+        if (i > 0) {
+            // Host address is before the forward slash.
+            return s.substring(0, i);
+        } else {
+            return value.getHostAddress();
+        }
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitIPAddress(this, p);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, InetAddress value, P p) {
+        return v.visitIPAddress(this, value, p);
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitIPAddress(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, InetAddress value, P p) {
-    return v.visitIPAddress(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(InetAddress o1, InetAddress o2) {
-    return o1.getHostAddress().compareTo(o2.getHostAddress());
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(InetAddress o1, InetAddress o2) {
+        return o1.getHostAddress().compareTo(o2.getHostAddress());
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueException.java b/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueException.java
index 969520a..04dcc0b 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueException.java
@@ -27,62 +27,50 @@
 
 package org.opends.server.admin;
 
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
-
-import static org.opends.messages.AdminMessages.*;
-
-import org.opends.messages.Message;
-
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Thrown to indicate that a property value was invalid according to
- * its associated property definition.
+ * Thrown to indicate that a property value was invalid according to its
+ * associated property definition.
  */
 public class IllegalPropertyValueException extends PropertyException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = -3145632074909281823L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = -3145632074909281823L;
 
-  // The illegal property value.
-  private final Object value;
+    // The illegal property value.
+    private final Object value;
 
+    /**
+     * Create a new illegal property value exception.
+     *
+     * @param pd
+     *            The property definition.
+     * @param value
+     *            The illegal property value.
+     */
+    public IllegalPropertyValueException(PropertyDefinition<?> pd, Object value) {
+        super(pd, createMessage(pd, value));
+        this.value = value;
+    }
 
+    /**
+     * Get the illegal property value that caused the exception.
+     *
+     * @return Returns the illegal property value.
+     */
+    public final Object getIllegalValue() {
+        return value;
+    }
 
-  /**
-   * Create a new illegal property value exception.
-   *
-   * @param pd
-   *          The property definition.
-   * @param value
-   *          The illegal property value.
-   */
-  public IllegalPropertyValueException(PropertyDefinition<?> pd, Object value) {
-    super(pd, createMessage(pd, value));
-    this.value = value;
-  }
-
-
-
-  /**
-   * Get the illegal property value that caused the exception.
-   *
-   * @return Returns the illegal property value.
-   */
-  public final Object getIllegalValue() {
-    return value;
-  }
-
-
-
-  // Create the message.
-  private static Message createMessage(PropertyDefinition<?> pd, Object value) {
-    PropertyDefinitionUsageBuilder builder = new PropertyDefinitionUsageBuilder(
-        true);
-    return ERR_ILLEGAL_PROPERTY_VALUE_EXCEPTION.get(String.valueOf(value), pd
-        .getName(), builder.getUsage(pd));
-  }
+    // Create the message.
+    private static LocalizableMessage createMessage(PropertyDefinition<?> pd, Object value) {
+        PropertyDefinitionUsageBuilder builder = new PropertyDefinitionUsageBuilder(true);
+        return ERR_ILLEGAL_PROPERTY_VALUE_EXCEPTION.get(String.valueOf(value), pd.getName(), builder.getUsage(pd));
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueStringException.java b/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueStringException.java
index b0a6ae7..31b1333 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueStringException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/IllegalPropertyValueStringException.java
@@ -27,63 +27,50 @@
 
 package org.opends.server.admin;
 
+import org.forgerock.i18n.LocalizableMessage;
 
-
-import static org.opends.messages.AdminMessages.*;
-
-import org.opends.messages.Message;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
- * Thrown to indicate that a property value string was invalid
- * according to its associated property definition.
+ * Thrown to indicate that a property value string was invalid according to its
+ * associated property definition.
  */
 public class IllegalPropertyValueStringException extends PropertyException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = -3145632074909281823L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = -3145632074909281823L;
 
-  // The illegal property value string.
-  private final String value;
+    // The illegal property value string.
+    private final String value;
 
+    /**
+     * Create a new illegal property value string exception.
+     *
+     * @param pd
+     *            The property definition.
+     * @param value
+     *            The illegal property value string.
+     */
+    public IllegalPropertyValueStringException(PropertyDefinition<?> pd, String value) {
+        super(pd, createMessage(pd, value));
+        this.value = value;
+    }
 
+    /**
+     * Get the illegal property value string that caused the exception.
+     *
+     * @return Returns the illegal property value string.
+     */
+    public final String getIllegalValueString() {
+        return value;
+    }
 
-  /**
-   * Create a new illegal property value string exception.
-   *
-   * @param pd
-   *          The property definition.
-   * @param value
-   *          The illegal property value string.
-   */
-  public IllegalPropertyValueStringException(PropertyDefinition<?> pd,
-      String value) {
-    super(pd, createMessage(pd, value));
-    this.value = value;
-  }
-
-
-
-  /**
-   * Get the illegal property value string that caused the exception.
-   *
-   * @return Returns the illegal property value string.
-   */
-  public final String getIllegalValueString() {
-    return value;
-  }
-
-
-
-  // Create the message.
-  private static Message createMessage(PropertyDefinition<?> pd, String value) {
-    PropertyDefinitionUsageBuilder builder = new PropertyDefinitionUsageBuilder(
-        true);
-    return ERR_ILLEGAL_PROPERTY_VALUE_STRING_EXCEPTION.get(value, pd.getName(),
-        builder.getUsage(pd));
-  }
+    // Create the message.
+    private static LocalizableMessage createMessage(PropertyDefinition<?> pd, String value) {
+        PropertyDefinitionUsageBuilder builder = new PropertyDefinitionUsageBuilder(true);
+        return ERR_ILLEGAL_PROPERTY_VALUE_STRING_EXCEPTION.get(value, pd.getName(), builder.getUsage(pd));
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/InstantiableRelationDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/InstantiableRelationDefinition.java
index 2600a97..65c08b8 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/InstantiableRelationDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/InstantiableRelationDefinition.java
@@ -26,11 +26,8 @@
  */
 
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
-
-
-import static org.opends.server.util.Validator.*;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -38,267 +35,227 @@
 import java.util.Map;
 import java.util.Set;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * A managed object composite relationship definition which represents
- * a composition of zero or more managed objects.
+ * A managed object composite relationship definition which represents a
+ * composition of zero or more managed objects.
  *
  * @param <C>
- *          The type of client managed object configuration that this
- *          relation definition refers to.
+ *            The type of client managed object configuration that this relation
+ *            definition refers to.
  * @param <S>
- *          The type of server managed object configuration that this
- *          relation definition refers to.
+ *            The type of server managed object configuration that this relation
+ *            definition refers to.
  */
-public final class InstantiableRelationDefinition
-    <C extends ConfigurationClient, S extends Configuration>
-    extends RelationDefinition<C, S> {
+public final class InstantiableRelationDefinition<C extends ConfigurationClient, S extends Configuration> extends
+        RelationDefinition<C, S> {
 
-  /**
-   * An interface for incrementally constructing instantiable relation
-   * definitions.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this relation definition refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this relation definition refers to.
-   */
-  public static final class Builder
-      <C extends ConfigurationClient, S extends Configuration>
-      extends AbstractBuilder<C, S, InstantiableRelationDefinition<C, S>> {
+    /**
+     * An interface for incrementally constructing instantiable relation
+     * definitions.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            relation definition refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            relation definition refers to.
+     */
+    public static final class Builder<C extends ConfigurationClient, S extends Configuration> extends
+            AbstractBuilder<C, S, InstantiableRelationDefinition<C, S>> {
+
+        // The optional naming property definition.
+        private PropertyDefinition<?> namingPropertyDefinition = null;
+
+        // The plural name of the relation.
+        private final String pluralName;
+
+        // The optional default managed objects associated with this
+        // instantiable relation definition.
+        private final Map<String, DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects = new HashMap<String, DefaultManagedObject<? extends C, ? extends S>>();
+
+        /**
+         * Creates a new builder which can be used to incrementally build an
+         * instantiable relation definition.
+         *
+         * @param pd
+         *            The parent managed object definition.
+         * @param name
+         *            The name of the relation.
+         * @param pluralName
+         *            The plural name of the relation.
+         * @param cd
+         *            The child managed object definition.
+         */
+        public Builder(AbstractManagedObjectDefinition<?, ?> pd, String name, String pluralName,
+                AbstractManagedObjectDefinition<C, S> cd) {
+            super(pd, name, cd);
+            this.pluralName = pluralName;
+        }
+
+        /**
+         * Adds the named default managed object to this instantiable relation
+         * definition.
+         *
+         * @param name
+         *            The name of the default managed object.
+         * @param defaultManagedObject
+         *            The default managed object.
+         */
+        public void setDefaultManagedObject(String name,
+                DefaultManagedObject<? extends C, ? extends S> defaultManagedObject) {
+            this.defaultManagedObjects.put(name, defaultManagedObject);
+        }
+
+        /**
+         * Sets the naming property for the instantiable relation definition.
+         *
+         * @param namingPropertyDefinition
+         *            The property of the child managed object definition which
+         *            should be used for naming, or <code>null</code> if this
+         *            relation does not use a property for naming.
+         */
+        public void setNamingProperty(PropertyDefinition<?> namingPropertyDefinition) {
+            ensureNotNull(namingPropertyDefinition);
+            this.namingPropertyDefinition = namingPropertyDefinition;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected InstantiableRelationDefinition<C, S> buildInstance(Common<C, S> common) {
+            return new InstantiableRelationDefinition<C, S>(common, pluralName, namingPropertyDefinition,
+                    defaultManagedObjects);
+        }
+
+    }
 
     // The optional naming property definition.
-    private PropertyDefinition<?> namingPropertyDefinition = null;
+    private final PropertyDefinition<?> namingPropertyDefinition;
 
     // The plural name of the relation.
     private final String pluralName;
 
     // The optional default managed objects associated with this
     // instantiable relation definition.
-    private final Map<String, DefaultManagedObject<? extends C, ? extends S>>
-      defaultManagedObjects = new HashMap<String,
-        DefaultManagedObject<? extends C, ? extends S>>();
+    private final Map<String, DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects;
 
-
-    /**
-     * Creates a new builder which can be used to incrementally build
-     * an instantiable relation definition.
-     *
-     * @param pd
-     *          The parent managed object definition.
-     * @param name
-     *          The name of the relation.
-     * @param pluralName
-     *          The plural name of the relation.
-     * @param cd
-     *          The child managed object definition.
-     */
-    public Builder(AbstractManagedObjectDefinition<?, ?> pd, String name,
-        String pluralName, AbstractManagedObjectDefinition<C, S> cd) {
-      super(pd, name, cd);
-      this.pluralName = pluralName;
+    // Private constructor.
+    private InstantiableRelationDefinition(Common<C, S> common, String pluralName,
+            PropertyDefinition<?> namingPropertyDefinition,
+            Map<String, DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects) {
+        super(common);
+        this.pluralName = pluralName;
+        this.namingPropertyDefinition = namingPropertyDefinition;
+        this.defaultManagedObjects = defaultManagedObjects;
     }
 
-
-
-    /**
-     * Adds the named default managed object to this instantiable
-     * relation definition.
-     *
-     * @param name
-     *          The name of the default managed object.
-     * @param defaultManagedObject
-     *          The default managed object.
-     */
-    public void setDefaultManagedObject(String name,
-        DefaultManagedObject<? extends C, ? extends S> defaultManagedObject) {
-      this.defaultManagedObjects.put(name, defaultManagedObject);
-    }
-
-
-
-    /**
-     * Sets the naming property for the instantiable relation
-     * definition.
-     *
-     * @param namingPropertyDefinition
-     *          The property of the child managed object definition
-     *          which should be used for naming, or <code>null</code>
-     *          if this relation does not use a property for naming.
-     */
-    public void setNamingProperty(
-        PropertyDefinition<?> namingPropertyDefinition) {
-      ensureNotNull(namingPropertyDefinition);
-      this.namingPropertyDefinition = namingPropertyDefinition;
-    }
-
-
-
     /**
      * {@inheritDoc}
      */
     @Override
-    protected InstantiableRelationDefinition<C, S> buildInstance(
-        Common<C, S> common) {
-      return new InstantiableRelationDefinition<C, S>(common, pluralName,
-          namingPropertyDefinition, defaultManagedObjects);
+    public <R, P> R accept(RelationDefinitionVisitor<R, P> v, P p) {
+        return v.visitInstantiable(this, p);
     }
 
-  }
-
-  // The optional naming property definition.
-  private final PropertyDefinition<?> namingPropertyDefinition;
-
-  // The plural name of the relation.
-  private final String pluralName;
-
-  // The optional default managed objects associated with this
-  // instantiable relation definition.
-  private final Map<String, DefaultManagedObject<? extends C, ? extends S>>
-    defaultManagedObjects;
-
-
-
-  // Private constructor.
-  private InstantiableRelationDefinition(Common<C, S> common,
-      String pluralName,
-      PropertyDefinition<?> namingPropertyDefinition,
-      Map<String, DefaultManagedObject<? extends C, ? extends S>>
-        defaultManagedObjects) {
-    super(common);
-    this.pluralName = pluralName;
-    this.namingPropertyDefinition = namingPropertyDefinition;
-    this.defaultManagedObjects = defaultManagedObjects;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(RelationDefinitionVisitor<R, P> v, P p) {
-    return v.visitInstantiable(this, p);
-  }
-
-
-
-  /**
-   * Gets the named default managed object associated with this
-   * instantiable relation definition.
-   *
-   * @param name
-   *          The name of the default managed object.
-   * @return Returns the named default managed object.
-   * @throws IllegalArgumentException
-   *           If there is no default managed object associated with
-   *           the provided name.
-   */
-  public DefaultManagedObject<? extends C, ? extends S> getDefaultManagedObject(
-      String name) throws IllegalArgumentException {
-    if (!defaultManagedObjects.containsKey(name)) {
-      throw new IllegalArgumentException(
-          "unrecognized default managed object \"" + name + "\"");
+    /**
+     * Gets the named default managed object associated with this instantiable
+     * relation definition.
+     *
+     * @param name
+     *            The name of the default managed object.
+     * @return Returns the named default managed object.
+     * @throws IllegalArgumentException
+     *             If there is no default managed object associated with the
+     *             provided name.
+     */
+    public DefaultManagedObject<? extends C, ? extends S> getDefaultManagedObject(String name)
+            throws IllegalArgumentException {
+        if (!defaultManagedObjects.containsKey(name)) {
+            throw new IllegalArgumentException("unrecognized default managed object \"" + name + "\"");
+        }
+        return defaultManagedObjects.get(name);
     }
-    return defaultManagedObjects.get(name);
-  }
 
-
-
-  /**
-   * Gets the names of the default managed objects associated with
-   * this instantiable relation definition.
-   *
-   * @return Returns an unmodifiable set containing the names of the
-   *         default managed object.
-   */
-  public Set<String> getDefaultManagedObjectNames() {
-    return Collections.unmodifiableSet(defaultManagedObjects.keySet());
-  }
-
-
-
-  /**
-   * Get the property of the child managed object definition which
-   * should be used for naming children.
-   *
-   * @return Returns the property of the child managed object
-   *         definition which should be used for naming, or
-   *         <code>null</code> if this relation does not use a
-   *         property for naming.
-   */
-  public PropertyDefinition<?> getNamingPropertyDefinition() {
-    return namingPropertyDefinition;
-  }
-
-
-
-  /**
-   * Get the plural name of the relation.
-   *
-   * @return Returns the plural name of the relation.
-   */
-  public String getPluralName() {
-    return pluralName;
-  }
-
-
-
-  /**
-   * Gets the user friendly plural name of this relation definition in
-   * the default locale.
-   *
-   * @return Returns the user friendly plural name of this relation
-   *         definition in the default locale.
-   */
-  public Message getUserFriendlyPluralName() {
-    return getUserFriendlyPluralName(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the user friendly plural name of this relation definition in
-   * the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the user friendly plural name of this relation
-   *         definition in the specified locale.
-   */
-  public Message getUserFriendlyPluralName(Locale locale) {
-    String property = "relation." + getName() + ".user-friendly-plural-name";
-    return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
-        getParentDefinition(), property, locale);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void toString(StringBuilder builder) {
-    builder.append("name=");
-    builder.append(getName());
-    builder.append(" type=collection parent=");
-    builder.append(getParentDefinition().getName());
-    builder.append(" child=");
-    builder.append(getChildDefinition().getName());
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  protected void initialize() throws Exception {
-    for (DefaultManagedObject<?, ?> dmo : defaultManagedObjects.values()) {
-      dmo.initialize();
+    /**
+     * Gets the names of the default managed objects associated with this
+     * instantiable relation definition.
+     *
+     * @return Returns an unmodifiable set containing the names of the default
+     *         managed object.
+     */
+    public Set<String> getDefaultManagedObjectNames() {
+        return Collections.unmodifiableSet(defaultManagedObjects.keySet());
     }
-  }
+
+    /**
+     * Get the property of the child managed object definition which should be
+     * used for naming children.
+     *
+     * @return Returns the property of the child managed object definition which
+     *         should be used for naming, or <code>null</code> if this relation
+     *         does not use a property for naming.
+     */
+    public PropertyDefinition<?> getNamingPropertyDefinition() {
+        return namingPropertyDefinition;
+    }
+
+    /**
+     * Get the plural name of the relation.
+     *
+     * @return Returns the plural name of the relation.
+     */
+    public String getPluralName() {
+        return pluralName;
+    }
+
+    /**
+     * Gets the user friendly plural name of this relation definition in the
+     * default locale.
+     *
+     * @return Returns the user friendly plural name of this relation definition
+     *         in the default locale.
+     */
+    public LocalizableMessage getUserFriendlyPluralName() {
+        return getUserFriendlyPluralName(Locale.getDefault());
+    }
+
+    /**
+     * Gets the user friendly plural name of this relation definition in the
+     * specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the user friendly plural name of this relation definition
+     *         in the specified locale.
+     */
+    public LocalizableMessage getUserFriendlyPluralName(Locale locale) {
+        String property = "relation." + getName() + ".user-friendly-plural-name";
+        return ManagedObjectDefinitionI18NResource.getInstance().getMessage(getParentDefinition(), property, locale);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void toString(StringBuilder builder) {
+        builder.append("name=");
+        builder.append(getName());
+        builder.append(" type=collection parent=");
+        builder.append(getParentDefinition().getName());
+        builder.append(" child=");
+        builder.append(getChildDefinition().getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void initialize() throws Exception {
+        for (DefaultManagedObject<?, ?> dmo : defaultManagedObjects.values()) {
+            dmo.initialize();
+        }
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java
index ec9d92d..96c16e2 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/IntegerPropertyDefinition.java
@@ -26,17 +26,14 @@
  */
 
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 import java.util.Locale;
 import java.util.MissingResourceException;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
  * Integer property definition.
@@ -45,350 +42,297 @@
  * constraints. Support is provided for "unlimited" values. These are
  * represented using a negative value or using the string "unlimited".
  */
-public final class IntegerPropertyDefinition extends
-    PropertyDefinition<Integer> {
+public final class IntegerPropertyDefinition extends PropertyDefinition<Integer> {
 
-  // String used to represent unlimited.
-  private static final String UNLIMITED = "unlimited";
-
-  // The lower limit of the property value.
-  private final int lowerLimit;
-
-  // The optional upper limit of the property value.
-  private final Integer upperLimit;
-
-  // Indicates whether this property allows the use of the "unlimited" value
-  // (represented using a -1 or the string "unlimited").
-  private final boolean allowUnlimited;
-
-
-
-  /**
-   * An interface for incrementally constructing integer property definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<Integer, IntegerPropertyDefinition> {
+    // String used to represent unlimited.
+    private static final String UNLIMITED = "unlimited";
 
     // The lower limit of the property value.
-    private int lowerLimit = 0;
+    private final int lowerLimit;
 
     // The optional upper limit of the property value.
-    private Integer upperLimit = null;
+    private final Integer upperLimit;
 
     // Indicates whether this property allows the use of the "unlimited" value
     // (represented using a -1 or the string "unlimited").
-    private boolean allowUnlimited = false;
-
-
-
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
-    }
-
-
+    private final boolean allowUnlimited;
 
     /**
-     * Set the lower limit.
-     *
-     * @param lowerLimit
-     *          The new lower limit (must be >= 0).
-     * @throws IllegalArgumentException
-     *           If a negative lower limit was specified or the lower limit is
-     *           greater than the upper limit.
+     * An interface for incrementally constructing integer property definitions.
      */
-    public final void setLowerLimit(int lowerLimit)
-        throws IllegalArgumentException {
-      if (lowerLimit < 0) {
-        throw new IllegalArgumentException("Negative lower limit");
-      }
-      if (upperLimit != null && lowerLimit > upperLimit) {
-        throw new IllegalArgumentException(
-            "Lower limit greater than upper limit");
-      }
-      this.lowerLimit = lowerLimit;
-    }
+    public static class Builder extends AbstractBuilder<Integer, IntegerPropertyDefinition> {
 
+        // The lower limit of the property value.
+        private int lowerLimit = 0;
 
+        // The optional upper limit of the property value.
+        private Integer upperLimit = null;
 
-    /**
-     * Set the upper limit.
-     *
-     * @param upperLimit
-     *          The new upper limit or <code>null</code> if there is no upper
-     *          limit.
-     */
-    public final void setUpperLimit(Integer upperLimit) {
-      if (upperLimit != null) {
-        if (upperLimit < 0) {
-          throw new IllegalArgumentException("Negative lower limit");
+        // Indicates whether this property allows the use of the "unlimited"
+        // value
+        // (represented using a -1 or the string "unlimited").
+        private boolean allowUnlimited = false;
+
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
         }
-        if (lowerLimit > upperLimit) {
-          throw new IllegalArgumentException(
-              "Lower limit greater than upper limit");
+
+        /**
+         * Set the lower limit.
+         *
+         * @param lowerLimit
+         *            The new lower limit (must be >= 0).
+         * @throws IllegalArgumentException
+         *             If a negative lower limit was specified or the lower
+         *             limit is greater than the upper limit.
+         */
+        public final void setLowerLimit(int lowerLimit) throws IllegalArgumentException {
+            if (lowerLimit < 0) {
+                throw new IllegalArgumentException("Negative lower limit");
+            }
+            if (upperLimit != null && lowerLimit > upperLimit) {
+                throw new IllegalArgumentException("Lower limit greater than upper limit");
+            }
+            this.lowerLimit = lowerLimit;
         }
-      }
-      this.upperLimit = upperLimit;
+
+        /**
+         * Set the upper limit.
+         *
+         * @param upperLimit
+         *            The new upper limit or <code>null</code> if there is no
+         *            upper limit.
+         */
+        public final void setUpperLimit(Integer upperLimit) {
+            if (upperLimit != null) {
+                if (upperLimit < 0) {
+                    throw new IllegalArgumentException("Negative lower limit");
+                }
+                if (lowerLimit > upperLimit) {
+                    throw new IllegalArgumentException("Lower limit greater than upper limit");
+                }
+            }
+            this.upperLimit = upperLimit;
+        }
+
+        /**
+         * Specify whether or not this property definition will allow unlimited
+         * values (default is false).
+         *
+         * @param allowUnlimited
+         *            <code>true</code> if the property will allow unlimited
+         *            values, or <code>false</code> otherwise.
+         */
+        public final void setAllowUnlimited(boolean allowUnlimited) {
+            this.allowUnlimited = allowUnlimited;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected IntegerPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<Integer> defaultBehavior) {
+            return new IntegerPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior, lowerLimit,
+                    upperLimit, allowUnlimited);
+        }
+
     }
 
-
-
     /**
-     * Specify whether or not this property definition will allow unlimited
-     * values (default is false).
+     * Create an integer property definition builder.
      *
-     * @param allowUnlimited
-     *          <code>true</code> if the property will allow unlimited values,
-     *          or <code>false</code> otherwise.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new integer property definition builder.
      */
-    public final void setAllowUnlimited(boolean allowUnlimited) {
-      this.allowUnlimited = allowUnlimited;
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
     }
 
+    // Private constructor.
+    private IntegerPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<Integer> defaultBehavior, int lowerLimit, Integer upperLimit, boolean allowUnlimited) {
+        super(d, Integer.class, propertyName, options, adminAction, defaultBehavior);
+        this.lowerLimit = lowerLimit;
+        this.upperLimit = upperLimit;
+        this.allowUnlimited = allowUnlimited;
+    }
 
+    /**
+     * Get the lower limit.
+     *
+     * @return Returns the lower limit.
+     */
+    public int getLowerLimit() {
+        return lowerLimit;
+    }
+
+    /**
+     * Get the upper limit.
+     *
+     * @return Returns the upper limit or <code>null</code> if there is no upper
+     *         limit.
+     */
+    public Integer getUpperLimit() {
+        return upperLimit;
+    }
+
+    /**
+     * Gets the optional unit synopsis of this integer property definition in
+     * the default locale.
+     *
+     * @return Returns the unit synopsis of this integer property definition in
+     *         the default locale, or <code>null</code> if there is no unit
+     *         synopsis.
+     */
+    public LocalizableMessage getUnitSynopsis() {
+        return getUnitSynopsis(Locale.getDefault());
+    }
+
+    /**
+     * Gets the optional unit synopsis of this integer property definition in
+     * the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the unit synopsis of this integer property definition in
+     *         the specified locale, or <code>null</code> if there is no unit
+     *         synopsis.
+     */
+    public LocalizableMessage getUnitSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + getName() + ".syntax.integer.unit-synopsis";
+        try {
+            return resource.getMessage(getManagedObjectDefinition(), property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Determine whether this property allows unlimited values.
+     *
+     * @return Returns <code>true</code> if this this property allows unlimited
+     *         values.
+     */
+    public boolean isAllowUnlimited() {
+        return allowUnlimited;
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected IntegerPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<Integer> defaultBehavior) {
-      return new IntegerPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior, lowerLimit, upperLimit, allowUnlimited);
+    public void validateValue(Integer value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        if (!allowUnlimited && value < lowerLimit) {
+            throw new IllegalPropertyValueException(this, value);
+
+            // unlimited allowed
+        } else if (value >= 0 && value < lowerLimit) {
+            throw new IllegalPropertyValueException(this, value);
+        }
+
+        if ((upperLimit != null) && (value > upperLimit)) {
+            throw new IllegalPropertyValueException(this, value);
+        }
     }
 
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String encodeValue(Integer value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
+        // Make sure that we correctly encode negative values as "unlimited".
+        if (allowUnlimited) {
+            if (value < 0) {
+                return UNLIMITED;
+            }
+        }
 
-
-  /**
-   * Create an integer property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new integer property definition builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  // Private constructor.
-  private IntegerPropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<Integer> defaultBehavior, int lowerLimit,
-      Integer upperLimit, boolean allowUnlimited) {
-    super(d, Integer.class, propertyName, options, adminAction,
-        defaultBehavior);
-    this.lowerLimit = lowerLimit;
-    this.upperLimit = upperLimit;
-    this.allowUnlimited = allowUnlimited;
-  }
-
-
-
-  /**
-   * Get the lower limit.
-   *
-   * @return Returns the lower limit.
-   */
-  public int getLowerLimit() {
-    return lowerLimit;
-  }
-
-
-
-  /**
-   * Get the upper limit.
-   *
-   * @return Returns the upper limit or <code>null</code> if there is no upper
-   *         limit.
-   */
-  public Integer getUpperLimit() {
-    return upperLimit;
-  }
-
-
-
-  /**
-   * Gets the optional unit synopsis of this integer property
-   * definition in the default locale.
-   *
-   * @return Returns the unit synopsis of this integer property
-   *         definition in the default locale, or <code>null</code>
-   *         if there is no unit synopsis.
-   */
-  public Message getUnitSynopsis() {
-    return getUnitSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the optional unit synopsis of this integer property
-   * definition in the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the unit synopsis of this integer property
-   *         definition in the specified locale, or <code>null</code>
-   *         if there is no unit synopsis.
-   */
-  public Message getUnitSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + getName() + ".syntax.integer.unit-synopsis";
-    try {
-      return resource.getMessage(getManagedObjectDefinition(),
-          property, locale);
-    } catch (MissingResourceException e) {
-      return null;
-    }
-  }
-
-
-
-  /**
-   * Determine whether this property allows unlimited values.
-   *
-   * @return Returns <code>true</code> if this this property allows unlimited
-   *         values.
-   */
-  public boolean isAllowUnlimited() {
-    return allowUnlimited;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(Integer value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    if (!allowUnlimited && value < lowerLimit) {
-      throw new IllegalPropertyValueException(this, value);
-
-    // unlimited allowed
-    } else if (value >= 0 && value < lowerLimit) {
-      throw new IllegalPropertyValueException(this, value);
+        return value.toString();
     }
 
-    if ((upperLimit != null) && (value > upperLimit)) {
-      throw new IllegalPropertyValueException(this, value);
-    }
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Integer decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String encodeValue(Integer value)
-          throws IllegalPropertyValueException {
-    ensureNotNull(value);
+        if (allowUnlimited) {
+            if (value.trim().equalsIgnoreCase(UNLIMITED)) {
+                return -1;
+            }
+        }
 
-    // Make sure that we correctly encode negative values as "unlimited".
-    if (allowUnlimited) {
-      if (value < 0) {
-        return UNLIMITED;
-      }
+        Integer i;
+        try {
+            i = Integer.valueOf(value);
+        } catch (NumberFormatException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
+
+        try {
+            validateValue(i);
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
+
+        return i;
     }
 
-    return value.toString();
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public Integer decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    if (allowUnlimited) {
-      if (value.trim().equalsIgnoreCase(UNLIMITED)) {
-        return -1;
-      }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitInteger(this, p);
     }
 
-    Integer i;
-    try {
-      i = Integer.valueOf(value);
-    } catch (NumberFormatException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, Integer value, P p) {
+        return v.visitInteger(this, value, p);
     }
 
-    try {
-      validateValue(i);
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void toString(StringBuilder builder) {
+        super.toString(builder);
+
+        builder.append(" lowerLimit=");
+        builder.append(lowerLimit);
+
+        if (upperLimit != null) {
+            builder.append(" upperLimit=");
+            builder.append(upperLimit);
+        }
+
+        builder.append(" allowUnlimited=");
+        builder.append(allowUnlimited);
     }
 
-    return i;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitInteger(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, Integer value, P p) {
-    return v.visitInteger(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void toString(StringBuilder builder) {
-    super.toString(builder);
-
-    builder.append(" lowerLimit=");
-    builder.append(lowerLimit);
-
-    if (upperLimit != null) {
-      builder.append(" upperLimit=");
-      builder.append(upperLimit);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(Integer o1, Integer o2) {
+        return o1.compareTo(o2);
     }
 
-    builder.append(" allowUnlimited=");
-    builder.append(allowUnlimited);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(Integer o1, Integer o2) {
-    return o1.compareTo(o2);
-  }
-
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectAlreadyExistsException.java b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectAlreadyExistsException.java
index c658baa..8445adf 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectAlreadyExistsException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectAlreadyExistsException.java
@@ -27,30 +27,23 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
- * A managed object could not be created because there is an existing
- * managed object with the same name.
+ * A managed object could not be created because there is an existing managed
+ * object with the same name.
  */
-public final class ManagedObjectAlreadyExistsException extends
-    OperationsException {
+public final class ManagedObjectAlreadyExistsException extends OperationsException {
 
-  /**
-   * Version ID required by serializable classes.
-   */
-  private static final long serialVersionUID = -2344653674171609366L;
+    /**
+     * Version ID required by serializable classes.
+     */
+    private static final long serialVersionUID = -2344653674171609366L;
 
-
-
-  /**
-   * Create a managed object already exists exception.
-   */
-  public ManagedObjectAlreadyExistsException() {
-    super(ERR_MANAGED_OBJECT_ALREADY_EXISTS_EXCEPTION.get());
-  }
+    /**
+     * Create a managed object already exists exception.
+     */
+    public ManagedObjectAlreadyExistsException() {
+        super(ERR_MANAGED_OBJECT_ALREADY_EXISTS_EXCEPTION.get());
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectDefinitionI18NResource.java b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectDefinitionI18NResource.java
index 1d621a8..e3e0a3d 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectDefinitionI18NResource.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectDefinitionI18NResource.java
@@ -131,9 +131,9 @@
    *           If the provided managed object definition was the
    *           {@link TopCfgDefn}.
    */
-  public LocalizableMessage getLocalizableMessage(AbstractManagedObjectDefinition<?, ?> d, String key)
+  public LocalizableMessage getMessage(AbstractManagedObjectDefinition<?, ?> d, String key)
       throws MissingResourceException, UnsupportedOperationException {
-    return getLocalizableMessage(d, key, Locale.getDefault(), (String[]) null);
+    return getMessage(d, key, Locale.getDefault(), (String[]) null);
   }
 
 
@@ -156,10 +156,10 @@
    *           If the provided managed object definition was the
    *           {@link TopCfgDefn}.
    */
-  public LocalizableMessage getLocalizableMessage(AbstractManagedObjectDefinition<?, ?> d,
+  public LocalizableMessage getMessage(AbstractManagedObjectDefinition<?, ?> d,
       String key, Locale locale) throws MissingResourceException,
       UnsupportedOperationException {
-    return getLocalizableMessage(d, key, locale, (String[]) null);
+    return getMessage(d, key, locale, (String[]) null);
   }
 
 
@@ -185,7 +185,7 @@
    *           If the provided managed object definition was the
    *           {@link TopCfgDefn}.
    */
-  public LocalizableMessage getLocalizableMessage(AbstractManagedObjectDefinition<?, ?> d,
+  public LocalizableMessage getMessage(AbstractManagedObjectDefinition<?, ?> d,
       String key, Locale locale, String... args)
       throws MissingResourceException, UnsupportedOperationException {
     ResourceBundle resource = getResourceBundle(d, locale);
@@ -219,10 +219,10 @@
    *           If the provided managed object definition was the
    *           {@link TopCfgDefn}.
    */
-  public LocalizableMessage getLocalizableMessage(AbstractManagedObjectDefinition<?, ?> d,
+  public LocalizableMessage getMessage(AbstractManagedObjectDefinition<?, ?> d,
       String key, String... args) throws MissingResourceException,
       UnsupportedOperationException {
-    return getLocalizableMessage(d, key, Locale.getDefault(), args);
+    return getMessage(d, key, Locale.getDefault(), args);
   }
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectNotFoundException.java b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectNotFoundException.java
index bfcf0c1..ca408ed 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectNotFoundException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectNotFoundException.java
@@ -27,41 +27,32 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
  * The requested managed object could not be located.
  */
 public class ManagedObjectNotFoundException extends OperationsException {
 
-  /**
-   * Version ID required by serializable classes.
-   */
-  private static final long serialVersionUID = -477551786551892978L;
+    /**
+     * Version ID required by serializable classes.
+     */
+    private static final long serialVersionUID = -477551786551892978L;
 
+    /**
+     * Create a managed object not found exception.
+     */
+    public ManagedObjectNotFoundException() {
+        super(ERR_MANAGED_OBJECT_NOT_FOUND_EXCEPTION.get());
+    }
 
-
-  /**
-   * Create a managed object not found exception.
-   */
-  public ManagedObjectNotFoundException() {
-    super(ERR_MANAGED_OBJECT_NOT_FOUND_EXCEPTION.get());
-  }
-
-
-
-  /**
-   * Create a managed object not found exception with the specified
-   * cause.
-   *
-   * @param cause
-   *          The cause of this exception.
-   */
-  public ManagedObjectNotFoundException(Throwable cause) {
-    super(ERR_MANAGED_OBJECT_NOT_FOUND_EXCEPTION.get(), cause);
-  }
+    /**
+     * Create a managed object not found exception with the specified cause.
+     *
+     * @param cause
+     *            The cause of this exception.
+     */
+    public ManagedObjectNotFoundException(Throwable cause) {
+        super(ERR_MANAGED_OBJECT_NOT_FOUND_EXCEPTION.get(), cause);
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectPath.java b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectPath.java
index 91529d6..a38d04a 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectPath.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ManagedObjectPath.java
@@ -36,11 +36,14 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.opends.server.admin.std.client.RootCfgClient;
-import org.opends.server.admin.std.meta.RootCfgDefn;
-import org.opends.server.admin.std.server.RootCfg;
+import org.forgerock.opendj.admin.client.RootCfgClient;
+import org.forgerock.opendj.admin.meta.RootCfgDefn;
+import org.forgerock.opendj.admin.server.RootCfg;
+import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.RDN;
+import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.opends.server.core.DirectoryServer;
-import org.opends.server.types.*;
+import org.opends.server.types.DirectoryException;
 
 
 /**
@@ -138,7 +141,7 @@
 
     // Create a new DN builder.
     private DNSerializer() {
-      this.dn = DN.nullDN();
+      this.dn = DN.rootDN();
       this.profile = LDAPProfile.getInstance();
     }
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/OperationsException.java b/opendj-admin/src/main/java/org/opends/server/admin/OperationsException.java
index e8827ae..4c7d850 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/OperationsException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/OperationsException.java
@@ -27,46 +27,38 @@
 
 package org.opends.server.admin;
 
-
-
-import org.opends.messages.Message;
-
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Exceptions thrown as a result of errors that occurred when reading,
- * listing, and modifying managed objects.
+ * Exceptions thrown as a result of errors that occurred when reading, listing,
+ * and modifying managed objects.
  */
 public abstract class OperationsException extends AdminException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = 6329910102360262187L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = 6329910102360262187L;
 
+    /**
+     * Create an operations exception with a message and cause.
+     *
+     * @param message
+     *            The message.
+     * @param cause
+     *            The cause.
+     */
+    protected OperationsException(LocalizableMessage message, Throwable cause) {
+        super(message, cause);
+    }
 
-
-  /**
-   * Create an operations exception with a message and cause.
-   *
-   * @param message
-   *          The message.
-   * @param cause
-   *          The cause.
-   */
-  protected OperationsException(Message message, Throwable cause) {
-    super(message, cause);
-  }
-
-
-
-  /**
-   * Create an operations exception with a message.
-   *
-   * @param message
-   *          The message.
-   */
-  protected OperationsException(Message message) {
-    super(message);
-  }
+    /**
+     * Create an operations exception with a message.
+     *
+     * @param message
+     *            The message.
+     */
+    protected OperationsException(LocalizableMessage message) {
+        super(message);
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java
index 3f92b5e..e5e2d81 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinition.java
@@ -27,8 +27,6 @@
 
 package org.opends.server.admin;
 
-
-
 import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.Comparator;
@@ -39,637 +37,546 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 
-
-
 /**
  * An interface for querying generic property definition features.
  * <p>
- * Property definitions are analogous to ConfigAttributes in the
- * current model and will play a similar role. Eventually these will
- * replace them.
+ * Property definitions are analogous to ConfigAttributes in the current model
+ * and will play a similar role. Eventually these will replace them.
  * <p>
- * Implementations <b>must</b> take care to implement the various
- * comparison methods.
+ * Implementations <b>must</b> take care to implement the various comparison
+ * methods.
  *
  * @param <T>
- *          The data-type of values of the property.
+ *            The data-type of values of the property.
  */
-public abstract class PropertyDefinition<T> implements Comparator<T>,
-    Comparable<PropertyDefinition<?>> {
+public abstract class PropertyDefinition<T> implements Comparator<T>, Comparable<PropertyDefinition<?>> {
 
-  /**
-   * An interface for incrementally constructing property definitions.
-   *
-   * @param <T>
-   *          The data-type of values of the property.
-   * @param <D>
-   *          The type of property definition constructed by this
-   *          builder.
-   */
-  protected abstract static class AbstractBuilder
-      <T, D extends PropertyDefinition<T>> {
+    /**
+     * An interface for incrementally constructing property definitions.
+     *
+     * @param <T>
+     *            The data-type of values of the property.
+     * @param <D>
+     *            The type of property definition constructed by this builder.
+     */
+    protected abstract static class AbstractBuilder<T, D extends PropertyDefinition<T>> {
+
+        // The administrator action.
+        private AdministratorAction adminAction;
+
+        // The default behavior provider.
+        private DefaultBehaviorProvider<T> defaultBehavior;
+
+        // The abstract managed object
+        private final AbstractManagedObjectDefinition<?, ?> definition;
+
+        // The options applicable to this definition.
+        private final EnumSet<PropertyOption> options;
+
+        // The name of this property definition.
+        private final String propertyName;
+
+        /**
+         * Create a property definition builder.
+         *
+         * @param d
+         *            The managed object definition associated with this
+         *            property definition.
+         * @param propertyName
+         *            The property name.
+         */
+        protected AbstractBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            this.definition = d;
+            this.propertyName = propertyName;
+            this.options = EnumSet.noneOf(PropertyOption.class);
+            this.adminAction = new AdministratorAction(AdministratorAction.Type.NONE, d, propertyName);
+            this.defaultBehavior = new UndefinedDefaultBehaviorProvider<T>();
+        }
+
+        /**
+         * Construct a property definition based on the properties of this
+         * builder.
+         *
+         * @return The new property definition.
+         */
+        public final D getInstance() {
+            return buildInstance(definition, propertyName, options, adminAction, defaultBehavior);
+        }
+
+        /**
+         * Set the administrator action.
+         *
+         * @param adminAction
+         *            The administrator action.
+         */
+        public final void setAdministratorAction(AdministratorAction adminAction) {
+            ensureNotNull(adminAction);
+            this.adminAction = adminAction;
+        }
+
+        /**
+         * Set the default behavior provider.
+         *
+         * @param defaultBehavior
+         *            The default behavior provider.
+         */
+        public final void setDefaultBehaviorProvider(DefaultBehaviorProvider<T> defaultBehavior) {
+            ensureNotNull(defaultBehavior);
+            this.defaultBehavior = defaultBehavior;
+        }
+
+        /**
+         * Add a property definition option.
+         *
+         * @param option
+         *            The property option.
+         */
+        public final void setOption(PropertyOption option) {
+            ensureNotNull(option);
+            options.add(option);
+        }
+
+        /**
+         * Build a property definition based on the properties of this builder.
+         *
+         * @param d
+         *            The managed object definition associated with this
+         *            property definition.
+         * @param propertyName
+         *            The property name.
+         * @param options
+         *            Options applicable to this definition.
+         * @param adminAction
+         *            The administrator action.
+         * @param defaultBehavior
+         *            The default behavior provider.
+         * @return The new property definition.
+         */
+        protected abstract D buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<T> defaultBehavior);
+    }
 
     // The administrator action.
-    private AdministratorAction adminAction;
+    private final AdministratorAction adminAction;
 
     // The default behavior provider.
-    private DefaultBehaviorProvider<T> defaultBehavior;
+    private final DefaultBehaviorProvider<T> defaultBehavior;
 
     // The abstract managed object
     private final AbstractManagedObjectDefinition<?, ?> definition;
 
-    // The options applicable to this definition.
-    private final EnumSet<PropertyOption> options;
+    // Options applicable to this definition.
+    private final Set<PropertyOption> options;
 
-    // The name of this property definition.
+    // The property name.
     private final String propertyName;
 
-
+    // The property value class.
+    private final Class<T> theClass;
 
     /**
-     * Create a property definition builder.
+     * Create a property definition.
      *
      * @param d
-     *          The managed object definition associated with this
-     *          property definition.
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param theClass
+     *            The property value class.
      * @param propertyName
-     *          The property name.
-     */
-    protected AbstractBuilder(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName) {
-      this.definition = d;
-      this.propertyName = propertyName;
-      this.options = EnumSet.noneOf(PropertyOption.class);
-      this.adminAction = new AdministratorAction(AdministratorAction.Type.NONE,
-          d, propertyName);
-      this.defaultBehavior = new UndefinedDefaultBehaviorProvider<T>();
-    }
-
-
-
-    /**
-     * Construct a property definition based on the properties of this
-     * builder.
-     *
-     * @return The new property definition.
-     */
-    public final D getInstance() {
-      return buildInstance(definition, propertyName, options, adminAction,
-          defaultBehavior);
-    }
-
-
-
-    /**
-     * Set the administrator action.
-     *
+     *            The property name.
+     * @param options
+     *            Options applicable to this definition.
      * @param adminAction
-     *          The administrator action.
-     */
-    public final void setAdministratorAction(AdministratorAction adminAction) {
-      ensureNotNull(adminAction);
-      this.adminAction = adminAction;
-    }
-
-
-
-    /**
-     * Set the default behavior provider.
-     *
+     *            The administrator action.
      * @param defaultBehavior
-     *          The default behavior provider.
+     *            The default behavior provider.
      */
-    public final void setDefaultBehaviorProvider(
-        DefaultBehaviorProvider<T> defaultBehavior) {
-      ensureNotNull(defaultBehavior);
-      this.defaultBehavior = defaultBehavior;
+    protected PropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, Class<T> theClass, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction, DefaultBehaviorProvider<T> defaultBehavior) {
+        ensureNotNull(d, theClass, propertyName);
+        ensureNotNull(options, adminAction, defaultBehavior);
+
+        this.definition = d;
+        this.theClass = theClass;
+        this.propertyName = propertyName;
+        this.options = EnumSet.copyOf(options);
+        this.adminAction = adminAction;
+        this.defaultBehavior = defaultBehavior;
     }
 
-
+    /**
+     * Apply a visitor to this property definition.
+     *
+     * @param <R>
+     *            The return type of the visitor's methods.
+     * @param <P>
+     *            The type of the additional parameters to the visitor's
+     *            methods.
+     * @param v
+     *            The property definition visitor.
+     * @param p
+     *            Optional additional visitor parameter.
+     * @return Returns a result as specified by the visitor.
+     */
+    public abstract <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p);
 
     /**
-     * Add a property definition option.
+     * Apply a visitor to a property value associated with this property
+     * definition.
+     *
+     * @param <R>
+     *            The return type of the visitor's methods.
+     * @param <P>
+     *            The type of the additional parameters to the visitor's
+     *            methods.
+     * @param v
+     *            The property value visitor.
+     * @param value
+     *            The property value.
+     * @param p
+     *            Optional additional visitor parameter.
+     * @return Returns a result as specified by the visitor.
+     */
+    public abstract <R, P> R accept(PropertyValueVisitor<R, P> v, T value, P p);
+
+    /**
+     * Cast the provided value to the type associated with this property
+     * definition.
+     * <p>
+     * This method only casts the object to the required type; it does not
+     * validate the value once it has been cast. Subsequent validation should be
+     * performed using the method {@link #validateValue(Object)}.
+     * <p>
+     * This method guarantees the following expression is always
+     * <code>true</code>:
+     *
+     * <pre>
+     *  PropertyDefinition d;
+     *  x == d.cast(x);
+     * </pre>
+     *
+     * @param object
+     *            The property value to be cast (can be <code>null</code>).
+     * @return Returns the property value cast to the correct type.
+     * @throws ClassCastException
+     *             If the provided property value did not have the correct type.
+     */
+    public final T castValue(Object object) throws ClassCastException {
+        return theClass.cast(object);
+    }
+
+    /**
+     * Compares two property values for order. Returns a negative integer, zero,
+     * or a positive integer as the first argument is less than, equal to, or
+     * greater than the second.
+     * <p>
+     * This default implementation normalizes both values using
+     * {@link #normalizeValue(Object)} and then performs a case-sensitive string
+     * comparison.
+     *
+     * @param o1
+     *            the first object to be compared.
+     * @param o2
+     *            the second object to be compared.
+     * @return a negative integer, zero, or a positive integer as the first
+     *         argument is less than, equal to, or greater than the second.
+     */
+    public int compare(T o1, T o2) {
+        ensureNotNull(o1, o2);
+
+        String s1 = normalizeValue(o1);
+        String s2 = normalizeValue(o2);
+
+        return s1.compareTo(s2);
+    }
+
+    /**
+     * Compares this property definition with the specified property definition
+     * for order. Returns a negative integer, zero, or a positive integer if
+     * this property definition is less than, equal to, or greater than the
+     * specified property definition.
+     * <p>
+     * The ordering must be determined first from the property name and then
+     * base on the underlying value type.
+     *
+     * @param o
+     *            The reference property definition with which to compare.
+     * @return Returns a negative integer, zero, or a positive integer if this
+     *         property definition is less than, equal to, or greater than the
+     *         specified property definition.
+     */
+    public final int compareTo(PropertyDefinition<?> o) {
+        int rc = propertyName.compareTo(o.propertyName);
+        if (rc == 0) {
+            rc = theClass.getName().compareTo(o.theClass.getName());
+        }
+        return rc;
+    }
+
+    /**
+     * Parse and validate a string representation of a property value.
+     *
+     * @param value
+     *            The property string value (must not be <code>null</code>).
+     * @return Returns the decoded property value.
+     * @throws IllegalPropertyValueStringException
+     *             If the property value string is invalid.
+     */
+    public abstract T decodeValue(String value) throws IllegalPropertyValueStringException;
+
+    /**
+     * Encode the provided property value into its string representation.
+     * <p>
+     * This default implementation simply returns invokes the
+     * {@link Object#toString()} method on the provided value.
+     *
+     * @param value
+     *            The property value (must not be <code>null</code>).
+     * @return Returns the encoded property string value.
+     * @throws IllegalPropertyValueException
+     *             If the property value is invalid.
+     */
+    public String encodeValue(T value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        return value.toString();
+    }
+
+    /**
+     * Indicates whether some other object is &quot;equal to&quot; this property
+     * definition. This method must obey the general contract of
+     * <tt>Object.equals(Object)</tt>. Additionally, this method can return
+     * <tt>true</tt> <i>only</i> if the specified Object is also a property
+     * definition and it has the same name, as returned by {@link #getName()},
+     * and also is deemed to be &quot;compatible&quot; with this property
+     * definition. Compatibility means that the two property definitions share
+     * the same underlying value type and provide similar comparator
+     * implementations.
+     *
+     * @param o
+     *            The reference object with which to compare.
+     * @return Returns <code>true</code> only if the specified object is also a
+     *         property definition and it has the same name and is compatible
+     *         with this property definition.
+     * @see java.lang.Object#equals(java.lang.Object)
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public final boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        } else if (o instanceof PropertyDefinition) {
+            PropertyDefinition<?> other = (PropertyDefinition<?>) o;
+            if (propertyName.equals(other.propertyName)) {
+                if (theClass.equals(other.theClass)) {
+                    return true;
+                }
+            }
+            return false;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Get the administrator action associated with this property definition.
+     * The administrator action describes any action which the administrator
+     * must perform in order for changes to this property to take effect.
+     *
+     * @return Returns the administrator action associated with this property
+     *         definition.
+     */
+    public final AdministratorAction getAdministratorAction() {
+        return adminAction;
+    }
+
+    /**
+     * Get the default behavior provider associated with this property
+     * definition.
+     *
+     * @return Returns the default behavior provider associated with this
+     *         property definition.
+     */
+    public final DefaultBehaviorProvider<T> getDefaultBehaviorProvider() {
+        return defaultBehavior;
+    }
+
+    /**
+     * Gets the optional description of this property definition in the default
+     * locale.
+     *
+     * @return Returns the description of this property definition in the
+     *         default locale, or <code>null</code> if there is no description.
+     */
+    public final LocalizableMessage getDescription() {
+        return getDescription(Locale.getDefault());
+    }
+
+    /**
+     * Gets the optional description of this property definition in the
+     * specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the description of this property definition in the
+     *         specified locale, or <code>null</code> if there is no
+     *         description.
+     */
+    public final LocalizableMessage getDescription(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + propertyName + ".description";
+        try {
+            return resource.getMessage(definition, property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Gets the managed object definition associated with this property
+     * definition.
+     *
+     * @return Returns the managed object definition associated with this
+     *         property definition.
+     */
+    public final AbstractManagedObjectDefinition<?, ?> getManagedObjectDefinition() {
+        return definition;
+    }
+
+    /**
+     * Get the name of the property.
+     *
+     * @return Returns the name of the property.
+     */
+    public final String getName() {
+        return propertyName;
+    }
+
+    /**
+     * Gets the synopsis of this property definition in the default locale.
+     *
+     * @return Returns the synopsis of this property definition in the default
+     *         locale.
+     */
+    public final LocalizableMessage getSynopsis() {
+        return getSynopsis(Locale.getDefault());
+    }
+
+    /**
+     * Gets the synopsis of this property definition in the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this property definition in the specified
+     *         locale.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + propertyName + ".synopsis";
+        return resource.getMessage(definition, property, locale);
+    }
+
+    /**
+     * Returns a hash code value for this property definition. The hash code
+     * should be derived from the property name and the type of values handled
+     * by this property definition.
+     *
+     * @return Returns the hash code value for this property definition.
+     */
+    @Override
+    public final int hashCode() {
+        int rc = 17 + propertyName.hashCode();
+        return 37 * rc + theClass.hashCode();
+    }
+
+    /**
+     * Check if the specified option is set for this property definition.
      *
      * @param option
-     *          The property option.
+     *            The option to test.
+     * @return Returns <code>true</code> if the option is set, or
+     *         <code>false</code> otherwise.
      */
-    public final void setOption(PropertyOption option) {
-      ensureNotNull(option);
-      options.add(option);
+    public final boolean hasOption(PropertyOption option) {
+        return options.contains(option);
     }
 
-
-
     /**
-     * Build a property definition based on the properties of this
-     * builder.
+     * Get a normalized string representation of a property value. This can then
+     * be used for comparisons and for generating hash-codes.
+     * <p>
+     * This method may throw an exception if the provided value is invalid.
+     * However, applications should not assume that implementations of this
+     * method will always validate a value. This task is the responsibility of
+     * {@link #validateValue(Object)}.
+     * <p>
+     * This default implementation simply returns the string representation of
+     * the provided value. Sub-classes might want to override this method if
+     * this behavior is insufficient (for example, a string property definition
+     * might strip white-space and convert characters to lower-case).
      *
-     * @param d
-     *          The managed object definition associated with this
-     *          property definition.
-     * @param propertyName
-     *          The property name.
-     * @param options
-     *          Options applicable to this definition.
-     * @param adminAction
-     *          The administrator action.
-     * @param defaultBehavior
-     *          The default behavior provider.
-     * @return The new property definition.
+     * @param value
+     *            The property value to be normalized.
+     * @return Returns the normalized property value.
+     * @throws IllegalPropertyValueException
+     *             If the property value is invalid.
      */
-    protected abstract D buildInstance(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName, EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<T> defaultBehavior);
-  }
+    public String normalizeValue(T value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
-  // The administrator action.
-  private final AdministratorAction adminAction;
-
-  // The default behavior provider.
-  private final DefaultBehaviorProvider<T> defaultBehavior;
-
-  // The abstract managed object
-  private final AbstractManagedObjectDefinition<?, ?> definition;
-
-  // Options applicable to this definition.
-  private final Set<PropertyOption> options;
-
-  // The property name.
-  private final String propertyName;
-
-  // The property value class.
-  private final Class<T> theClass;
-
-
-
-  /**
-   * Create a property definition.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param theClass
-   *          The property value class.
-   * @param propertyName
-   *          The property name.
-   * @param options
-   *          Options applicable to this definition.
-   * @param adminAction
-   *          The administrator action.
-   * @param defaultBehavior
-   *          The default behavior provider.
-   */
-  protected PropertyDefinition(AbstractManagedObjectDefinition<?, ?> d,
-      Class<T> theClass, String propertyName, EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<T> defaultBehavior) {
-    ensureNotNull(d, theClass, propertyName);
-    ensureNotNull(options, adminAction, defaultBehavior);
-
-    this.definition = d;
-    this.theClass = theClass;
-    this.propertyName = propertyName;
-    this.options = EnumSet.copyOf(options);
-    this.adminAction = adminAction;
-    this.defaultBehavior = defaultBehavior;
-  }
-
-
-
-  /**
-   * Apply a visitor to this property definition.
-   *
-   * @param <R>
-   *          The return type of the visitor's methods.
-   * @param <P>
-   *          The type of the additional parameters to the visitor's
-   *          methods.
-   * @param v
-   *          The property definition visitor.
-   * @param p
-   *          Optional additional visitor parameter.
-   * @return Returns a result as specified by the visitor.
-   */
-  public abstract <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p);
-
-
-
-  /**
-   * Apply a visitor to a property value associated with this property
-   * definition.
-   *
-   * @param <R>
-   *          The return type of the visitor's methods.
-   * @param <P>
-   *          The type of the additional parameters to the visitor's
-   *          methods.
-   * @param v
-   *          The property value visitor.
-   * @param value
-   *          The property value.
-   * @param p
-   *          Optional additional visitor parameter.
-   * @return Returns a result as specified by the visitor.
-   */
-  public abstract <R, P> R accept(PropertyValueVisitor<R, P> v, T value, P p);
-
-
-
-  /**
-   * Cast the provided value to the type associated with this property
-   * definition.
-   * <p>
-   * This method only casts the object to the required type; it does
-   * not validate the value once it has been cast. Subsequent
-   * validation should be performed using the method
-   * {@link #validateValue(Object)}.
-   * <p>
-   * This method guarantees the following expression is always
-   * <code>true</code>:
-   *
-   * <pre>
-   *  PropertyDefinition d;
-   *  x == d.cast(x);
-   * </pre>
-   *
-   * @param object
-   *          The property value to be cast (can be <code>null</code>).
-   * @return Returns the property value cast to the correct type.
-   * @throws ClassCastException
-   *           If the provided property value did not have the correct
-   *           type.
-   */
-  public final T castValue(Object object) throws ClassCastException {
-    return theClass.cast(object);
-  }
-
-
-
-  /**
-   * Compares two property values for order. Returns a negative
-   * integer, zero, or a positive integer as the first argument is
-   * less than, equal to, or greater than the second.
-   * <p>
-   * This default implementation normalizes both values using
-   * {@link #normalizeValue(Object)} and then performs a
-   * case-sensitive string comparison.
-   *
-   * @param o1
-   *          the first object to be compared.
-   * @param o2
-   *          the second object to be compared.
-   * @return a negative integer, zero, or a positive integer as the
-   *         first argument is less than, equal to, or greater than
-   *         the second.
-   */
-  public int compare(T o1, T o2) {
-    ensureNotNull(o1, o2);
-
-    String s1 = normalizeValue(o1);
-    String s2 = normalizeValue(o2);
-
-    return s1.compareTo(s2);
-  }
-
-
-
-  /**
-   * Compares this property definition with the specified property
-   * definition for order. Returns a negative integer, zero, or a
-   * positive integer if this property definition is less than, equal
-   * to, or greater than the specified property definition.
-   * <p>
-   * The ordering must be determined first from the property name and
-   * then base on the underlying value type.
-   *
-   * @param o
-   *          The reference property definition with which to compare.
-   * @return Returns a negative integer, zero, or a positive integer
-   *         if this property definition is less than, equal to, or
-   *         greater than the specified property definition.
-   */
-  public final int compareTo(PropertyDefinition<?> o) {
-    int rc = propertyName.compareTo(o.propertyName);
-    if (rc == 0) {
-      rc = theClass.getName().compareTo(o.theClass.getName());
+        return encodeValue(value);
     }
-    return rc;
-  }
 
-
-
-  /**
-   * Parse and validate a string representation of a property value.
-   *
-   * @param value
-   *          The property string value (must not be <code>null</code>).
-   * @return Returns the decoded property value.
-   * @throws IllegalPropertyValueStringException
-   *           If the property value string is invalid.
-   */
-  public abstract T decodeValue(String value)
-      throws IllegalPropertyValueStringException;
-
-
-
-  /**
-   * Encode the provided property value into its string
-   * representation.
-   * <p>
-   * This default implementation simply returns invokes the
-   * {@link Object#toString()} method on the provided value.
-   *
-   * @param value
-   *          The property value (must not be <code>null</code>).
-   * @return Returns the encoded property string value.
-   * @throws IllegalPropertyValueException
-   *           If the property value is invalid.
-   */
-  public String encodeValue(T value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    return value.toString();
-  }
-
-
-
-  /**
-   * Indicates whether some other object is &quot;equal to&quot; this
-   * property definition. This method must obey the general contract
-   * of <tt>Object.equals(Object)</tt>. Additionally, this method
-   * can return <tt>true</tt> <i>only</i> if the specified Object
-   * is also a property definition and it has the same name, as
-   * returned by {@link #getName()}, and also is deemed to be
-   * &quot;compatible&quot; with this property definition.
-   * Compatibility means that the two property definitions share the
-   * same underlying value type and provide similar comparator
-   * implementations.
-   *
-   * @param o
-   *          The reference object with which to compare.
-   * @return Returns <code>true</code> only if the specified object
-   *         is also a property definition and it has the same name
-   *         and is compatible with this property definition.
-   * @see java.lang.Object#equals(java.lang.Object)
-   * @see java.lang.Object#hashCode()
-   */
-  @Override
-  public final boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    } else if (o instanceof PropertyDefinition) {
-      PropertyDefinition<?> other = (PropertyDefinition<?>) o;
-      if (propertyName.equals(other.propertyName)) {
-        if (theClass.equals(other.theClass)) {
-          return true;
-        }
-      }
-      return false;
-    } else {
-      return false;
+    /**
+     * Returns a string representation of this property definition.
+     *
+     * @return Returns a string representation of this property definition.
+     * @see Object#toString()
+     */
+    @Override
+    public final String toString() {
+        StringBuilder builder = new StringBuilder();
+        toString(builder);
+        return builder.toString();
     }
-  }
 
-
-
-  /**
-   * Get the administrator action associated with this property
-   * definition. The administrator action describes any action which
-   * the administrator must perform in order for changes to this
-   * property to take effect.
-   *
-   * @return Returns the administrator action associated with this
-   *         property definition.
-   */
-  public final AdministratorAction getAdministratorAction() {
-    return adminAction;
-  }
-
-
-
-  /**
-   * Get the default behavior provider associated with this property
-   * definition.
-   *
-   * @return Returns the default behavior provider associated with
-   *         this property definition.
-   */
-  public final DefaultBehaviorProvider<T> getDefaultBehaviorProvider() {
-    return defaultBehavior;
-  }
-
-
-
-  /**
-   * Gets the optional description of this property definition in the
-   * default locale.
-   *
-   * @return Returns the description of this property definition in
-   *         the default locale, or <code>null</code> if there is no
-   *         description.
-   */
-  public final LocalizableMessage getDescription() {
-    return getDescription(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the optional description of this property definition in the
-   * specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the description of this property definition in
-   *         the specified locale, or <code>null</code> if there is
-   *         no description.
-   */
-  public final LocalizableMessage getDescription(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + propertyName + ".description";
-    try {
-      return resource.getLocalizableMessage(definition, property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+    /**
+     * Append a string representation of the property definition to the provided
+     * string builder.
+     * <p>
+     * This simple implementation just outputs the propertyName of the property
+     * definition. Sub-classes should override this method to provide more
+     * complete string representations.
+     *
+     * @param builder
+     *            The string builder where the string representation should be
+     *            appended.
+     */
+    public void toString(StringBuilder builder) {
+        builder.append(propertyName);
     }
-  }
 
+    /**
+     * Determine if the provided property value is valid according to this
+     * property definition.
+     *
+     * @param value
+     *            The property value (must not be <code>null</code>).
+     * @throws IllegalPropertyValueException
+     *             If the property value is invalid.
+     */
+    public abstract void validateValue(T value) throws IllegalPropertyValueException;
 
-
-  /**
-   * Gets the managed object definition associated with this property
-   * definition.
-   *
-   * @return Returns the managed object definition associated with
-   *         this property definition.
-   */
-  public final AbstractManagedObjectDefinition<?, ?>
-      getManagedObjectDefinition() {
-    return definition;
-  }
-
-
-
-  /**
-   * Get the name of the property.
-   *
-   * @return Returns the name of the property.
-   */
-  public final String getName() {
-    return propertyName;
-  }
-
-
-
-  /**
-   * Gets the synopsis of this property definition in the default
-   * locale.
-   *
-   * @return Returns the synopsis of this property definition in the
-   *         default locale.
-   */
-  public final LocalizableMessage getSynopsis() {
-    return getSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the synopsis of this property definition in the specified
-   * locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this property definition in the
-   *         specified locale.
-   */
-  public final LocalizableMessage getSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + propertyName + ".synopsis";
-    return resource.getLocalizableMessage(definition, property, locale);
-  }
-
-
-
-  /**
-   * Returns a hash code value for this property definition. The hash
-   * code should be derived from the property name and the type of
-   * values handled by this property definition.
-   *
-   * @return Returns the hash code value for this property definition.
-   */
-  @Override
-  public final int hashCode() {
-    int rc = 17 + propertyName.hashCode();
-    return 37 * rc + theClass.hashCode();
-  }
-
-
-
-  /**
-   * Check if the specified option is set for this property
-   * definition.
-   *
-   * @param option
-   *          The option to test.
-   * @return Returns <code>true</code> if the option is set, or
-   *         <code>false</code> otherwise.
-   */
-  public final boolean hasOption(PropertyOption option) {
-    return options.contains(option);
-  }
-
-
-
-  /**
-   * Get a normalized string representation of a property value. This
-   * can then be used for comparisons and for generating hash-codes.
-   * <p>
-   * This method may throw an exception if the provided value is
-   * invalid. However, applications should not assume that
-   * implementations of this method will always validate a value. This
-   * task is the responsibility of {@link #validateValue(Object)}.
-   * <p>
-   * This default implementation simply returns the string
-   * representation of the provided value. Sub-classes might want to
-   * override this method if this behavior is insufficient (for
-   * example, a string property definition might strip white-space and
-   * convert characters to lower-case).
-   *
-   * @param value
-   *          The property value to be normalized.
-   * @return Returns the normalized property value.
-   * @throws IllegalPropertyValueException
-   *           If the property value is invalid.
-   */
-  public String normalizeValue(T value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    return encodeValue(value);
-  }
-
-
-
-  /**
-   * Returns a string representation of this property definition.
-   *
-   * @return Returns a string representation of this property
-   *         definition.
-   * @see Object#toString()
-   */
-  @Override
-  public final String toString() {
-    StringBuilder builder = new StringBuilder();
-    toString(builder);
-    return builder.toString();
-  }
-
-
-
-  /**
-   * Append a string representation of the property definition to the
-   * provided string builder.
-   * <p>
-   * This simple implementation just outputs the propertyName of the
-   * property definition. Sub-classes should override this method to
-   * provide more complete string representations.
-   *
-   * @param builder
-   *          The string builder where the string representation
-   *          should be appended.
-   */
-  public void toString(StringBuilder builder) {
-    builder.append(propertyName);
-  }
-
-
-
-  /**
-   * Determine if the provided property value is valid according to
-   * this property definition.
-   *
-   * @param value
-   *          The property value (must not be <code>null</code>).
-   * @throws IllegalPropertyValueException
-   *           If the property value is invalid.
-   */
-  public abstract void validateValue(T value)
-      throws IllegalPropertyValueException;
-
-
-
-  /**
-   * Performs any run-time initialization required by this property
-   * definition. This may include resolving managed object paths and
-   * property names.
-   *
-   * @throws Exception
-   *           If this property definition could not be initialized.
-   */
-  protected void initialize() throws Exception {
-    // No implementation required.
-  }
+    /**
+     * Performs any run-time initialization required by this property
+     * definition. This may include resolving managed object paths and property
+     * names.
+     *
+     * @throws Exception
+     *             If this property definition could not be initialized.
+     */
+    protected void initialize() throws Exception {
+        // No implementation required.
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionUsageBuilder.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionUsageBuilder.java
index ecb17af..57d4e5b 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionUsageBuilder.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyDefinitionUsageBuilder.java
@@ -25,354 +25,319 @@
  *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.admin;
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
-
 
 import java.text.NumberFormat;
 import java.util.EnumSet;
 import java.util.Set;
 import java.util.TreeSet;
 
-
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 
 /**
- * A property definition visitor which can be used to generate syntax
- * usage information.
+ * A property definition visitor which can be used to generate syntax usage
+ * information.
  */
 public final class PropertyDefinitionUsageBuilder {
 
-  /**
-   * Underlying implementation.
-   */
-  private class MyPropertyDefinitionVisitor extends
-      PropertyDefinitionVisitor<Message, Void> {
-
-    // Flag indicating whether detailed syntax information will be
-    // generated.
-    private final boolean isDetailed;
-
-    // The formatter to use for numeric values.
-    private final NumberFormat numberFormat;
-
-
-
-    // Private constructor.
-    private MyPropertyDefinitionVisitor(boolean isDetailed) {
-      this.isDetailed = isDetailed;
-
-      this.numberFormat = NumberFormat.getNumberInstance();
-      this.numberFormat.setGroupingUsed(true);
-      this.numberFormat.setMaximumFractionDigits(2);
-    }
-
-
-
     /**
-     * {@inheritDoc}
+     * Underlying implementation.
      */
-    @Override
-    public <C extends ConfigurationClient, S extends Configuration>
-    Message visitAggregation(AggregationPropertyDefinition<C, S> d, Void p) {
-      return Message.raw("NAME");
-    }
+    private class MyPropertyDefinitionVisitor extends PropertyDefinitionVisitor<LocalizableMessage, Void> {
 
+        // Flag indicating whether detailed syntax information will be
+        // generated.
+        private final boolean isDetailed;
 
+        // The formatter to use for numeric values.
+        private final NumberFormat numberFormat;
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitAttributeType(AttributeTypePropertyDefinition d,
-        Void p) {
-      return Message.raw("OID");
-    }
+        // Private constructor.
+        private MyPropertyDefinitionVisitor(boolean isDetailed) {
+            this.isDetailed = isDetailed;
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitACI(ACIPropertyDefinition d,
-        Void p) {
-      return Message.raw("ACI");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitBoolean(BooleanPropertyDefinition d, Void p) {
-      if (isDetailed) {
-        return Message.raw("false | true");
-      } else {
-        return Message.raw("BOOLEAN");
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitClass(ClassPropertyDefinition d, Void p) {
-      if (isDetailed && !d.getInstanceOfInterface().isEmpty()) {
-        return Message.raw("CLASS <= " + d.getInstanceOfInterface().get(0));
-      } else {
-        return Message.raw("CLASS");
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitDN(DNPropertyDefinition d, Void p) {
-      if (isDetailed && d.getBaseDN() != null) {
-        return Message.raw("DN <= " + d.getBaseDN());
-      } else {
-        return Message.raw("DN");
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitDuration(DurationPropertyDefinition d, Void p) {
-      MessageBuilder builder = new MessageBuilder();
-      DurationUnit unit = d.getBaseUnit();
-
-      if (isDetailed && d.getLowerLimit() > 0) {
-        builder.append(DurationUnit.toString(d.getLowerLimit()));
-        builder.append(" <= ");
-      }
-
-      builder.append("DURATION (");
-      builder.append(unit.getShortName());
-      builder.append(")");
-
-      if (isDetailed) {
-        if (d.getUpperLimit() != null) {
-          builder.append(" <= ");
-          builder.append(DurationUnit.toString(d.getUpperLimit()));
+            this.numberFormat = NumberFormat.getNumberInstance();
+            this.numberFormat.setGroupingUsed(true);
+            this.numberFormat.setMaximumFractionDigits(2);
         }
 
-        if (d.isAllowUnlimited()) {
-          builder.append(" | unlimited");
-        }
-      }
-
-      return builder.toMessage();
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public <E extends Enum<E>> Message visitEnum(EnumPropertyDefinition<E> d,
-        Void p) {
-      if (!isDetailed) {
-        // Use the last word in the property name.
-        String name = d.getName();
-        int i = name.lastIndexOf('-');
-        if (i == -1 || i == (name.length() - 1)) {
-          return Message.raw(name.toUpperCase());
-        } else {
-          return Message.raw(name.substring(i + 1).toUpperCase());
-        }
-      } else {
-        Set<String> values = new TreeSet<String>();
-
-        for (Object value : EnumSet.allOf(d.getEnumClass())) {
-          values.add(value.toString().trim().toLowerCase());
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public <C extends ConfigurationClient, S extends Configuration> LocalizableMessage visitAggregation(
+                AggregationPropertyDefinition<C, S> d, Void p) {
+            return LocalizableMessage.raw("NAME");
         }
 
-        boolean isFirst = true;
-        MessageBuilder builder = new MessageBuilder();
-        for (String s : values) {
-          if (!isFirst) {
-            builder.append(" | ");
-          }
-          builder.append(s);
-          isFirst = false;
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitAttributeType(AttributeTypePropertyDefinition d, Void p) {
+            return LocalizableMessage.raw("OID");
         }
 
-        return builder.toMessage();
-      }
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitInteger(IntegerPropertyDefinition d, Void p) {
-      MessageBuilder builder = new MessageBuilder();
-
-      if (isDetailed) {
-        builder.append(String.valueOf(d.getLowerLimit()));
-        builder.append(" <= ");
-      }
-
-      builder.append("INTEGER");
-
-      if (isDetailed) {
-        if (d.getUpperLimit() != null) {
-          builder.append(" <= ");
-          builder.append(String.valueOf(d.getUpperLimit()));
-        } else if (d.isAllowUnlimited()) {
-          builder.append(" | unlimited");
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitACI(ACIPropertyDefinition d, Void p) {
+            return LocalizableMessage.raw("ACI");
         }
-      }
 
-      return builder.toMessage();
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitIPAddress(IPAddressPropertyDefinition d, Void p) {
-      return Message.raw("HOST_NAME");
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitIPAddressMask(IPAddressMaskPropertyDefinition d,
-        Void p) {
-      return Message.raw("IP_ADDRESS_MASK");
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Message visitSize(SizePropertyDefinition d, Void p) {
-      MessageBuilder builder = new MessageBuilder();
-
-      if (isDetailed && d.getLowerLimit() > 0) {
-        SizeUnit unit = SizeUnit.getBestFitUnitExact(d.getLowerLimit());
-        builder.append(numberFormat.format(unit.fromBytes(d.getLowerLimit())));
-        builder.append(' ');
-        builder.append(unit.getShortName());
-        builder.append(" <= ");
-      }
-
-      builder.append("SIZE");
-
-      if (isDetailed) {
-        if (d.getUpperLimit() != null) {
-          long upperLimit = d.getUpperLimit();
-          SizeUnit unit = SizeUnit.getBestFitUnitExact(upperLimit);
-
-          // Quite often an upper limit is some power of 2 minus 1. In those
-          // cases lets use a "less than" relation rather than a "less than
-          // or equal to" relation. This will result in a much more readable
-          // quantity.
-          if (unit == SizeUnit.BYTES && upperLimit < Long.MAX_VALUE) {
-            unit = SizeUnit.getBestFitUnitExact(upperLimit + 1);
-            if (unit != SizeUnit.BYTES) {
-              upperLimit += 1;
-              builder.append(" < ");
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitBoolean(BooleanPropertyDefinition d, Void p) {
+            if (isDetailed) {
+                return LocalizableMessage.raw("false | true");
             } else {
-              builder.append(" <= ");
+                return LocalizableMessage.raw("BOOLEAN");
             }
-          } else {
-            builder.append(" <= ");
-          }
-
-          builder.append(numberFormat.format(unit.fromBytes(upperLimit)));
-          builder.append(' ');
-          builder.append(unit.getShortName());
         }
 
-        if (d.isAllowUnlimited()) {
-          builder.append(" | unlimited");
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitClass(ClassPropertyDefinition d, Void p) {
+            if (isDetailed && !d.getInstanceOfInterface().isEmpty()) {
+                return LocalizableMessage.raw("CLASS <= " + d.getInstanceOfInterface().get(0));
+            } else {
+                return LocalizableMessage.raw("CLASS");
+            }
         }
-      }
 
-      return builder.toMessage();
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitDN(DNPropertyDefinition d, Void p) {
+            if (isDetailed && d.getBaseDN() != null) {
+                return LocalizableMessage.raw("DN <= " + d.getBaseDN());
+            } else {
+                return LocalizableMessage.raw("DN");
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitDuration(DurationPropertyDefinition d, Void p) {
+            LocalizableMessageBuilder builder = new LocalizableMessageBuilder();
+            DurationUnit unit = d.getBaseUnit();
+
+            if (isDetailed && d.getLowerLimit() > 0) {
+                builder.append(DurationUnit.toString(d.getLowerLimit()));
+                builder.append(" <= ");
+            }
+
+            builder.append("DURATION (");
+            builder.append(unit.getShortName());
+            builder.append(")");
+
+            if (isDetailed) {
+                if (d.getUpperLimit() != null) {
+                    builder.append(" <= ");
+                    builder.append(DurationUnit.toString(d.getUpperLimit()));
+                }
+
+                if (d.isAllowUnlimited()) {
+                    builder.append(" | unlimited");
+                }
+            }
+
+            return builder.toMessage();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public <E extends Enum<E>> LocalizableMessage visitEnum(EnumPropertyDefinition<E> d, Void p) {
+            if (!isDetailed) {
+                // Use the last word in the property name.
+                String name = d.getName();
+                int i = name.lastIndexOf('-');
+                if (i == -1 || i == (name.length() - 1)) {
+                    return LocalizableMessage.raw(name.toUpperCase());
+                } else {
+                    return LocalizableMessage.raw(name.substring(i + 1).toUpperCase());
+                }
+            } else {
+                Set<String> values = new TreeSet<String>();
+
+                for (Object value : EnumSet.allOf(d.getEnumClass())) {
+                    values.add(value.toString().trim().toLowerCase());
+                }
+
+                boolean isFirst = true;
+                LocalizableMessageBuilder builder = new LocalizableMessageBuilder();
+                for (String s : values) {
+                    if (!isFirst) {
+                        builder.append(" | ");
+                    }
+                    builder.append(s);
+                    isFirst = false;
+                }
+
+                return builder.toMessage();
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitInteger(IntegerPropertyDefinition d, Void p) {
+            LocalizableMessageBuilder builder = new LocalizableMessageBuilder();
+
+            if (isDetailed) {
+                builder.append(String.valueOf(d.getLowerLimit()));
+                builder.append(" <= ");
+            }
+
+            builder.append("INTEGER");
+
+            if (isDetailed) {
+                if (d.getUpperLimit() != null) {
+                    builder.append(" <= ");
+                    builder.append(String.valueOf(d.getUpperLimit()));
+                } else if (d.isAllowUnlimited()) {
+                    builder.append(" | unlimited");
+                }
+            }
+
+            return builder.toMessage();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitIPAddress(IPAddressPropertyDefinition d, Void p) {
+            return LocalizableMessage.raw("HOST_NAME");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitIPAddressMask(IPAddressMaskPropertyDefinition d, Void p) {
+            return LocalizableMessage.raw("IP_ADDRESS_MASK");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitSize(SizePropertyDefinition d, Void p) {
+            LocalizableMessageBuilder builder = new LocalizableMessageBuilder();
+
+            if (isDetailed && d.getLowerLimit() > 0) {
+                SizeUnit unit = SizeUnit.getBestFitUnitExact(d.getLowerLimit());
+                builder.append(numberFormat.format(unit.fromBytes(d.getLowerLimit())));
+                builder.append(' ');
+                builder.append(unit.getShortName());
+                builder.append(" <= ");
+            }
+
+            builder.append("SIZE");
+
+            if (isDetailed) {
+                if (d.getUpperLimit() != null) {
+                    long upperLimit = d.getUpperLimit();
+                    SizeUnit unit = SizeUnit.getBestFitUnitExact(upperLimit);
+
+                    // Quite often an upper limit is some power of 2 minus 1. In
+                    // those
+                    // cases lets use a "less than" relation rather than a "less
+                    // than
+                    // or equal to" relation. This will result in a much more
+                    // readable
+                    // quantity.
+                    if (unit == SizeUnit.BYTES && upperLimit < Long.MAX_VALUE) {
+                        unit = SizeUnit.getBestFitUnitExact(upperLimit + 1);
+                        if (unit != SizeUnit.BYTES) {
+                            upperLimit += 1;
+                            builder.append(" < ");
+                        } else {
+                            builder.append(" <= ");
+                        }
+                    } else {
+                        builder.append(" <= ");
+                    }
+
+                    builder.append(numberFormat.format(unit.fromBytes(upperLimit)));
+                    builder.append(' ');
+                    builder.append(unit.getShortName());
+                }
+
+                if (d.isAllowUnlimited()) {
+                    builder.append(" | unlimited");
+                }
+            }
+
+            return builder.toMessage();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public LocalizableMessage visitString(StringPropertyDefinition d, Void p) {
+            if (d.getPattern() != null) {
+                if (isDetailed) {
+                    LocalizableMessageBuilder builder = new LocalizableMessageBuilder();
+                    builder.append(d.getPatternUsage());
+                    builder.append(" - ");
+                    builder.append(d.getPatternSynopsis());
+                    return builder.toMessage();
+                } else {
+                    return LocalizableMessage.raw(d.getPatternUsage());
+                }
+            } else {
+                return LocalizableMessage.raw("STRING");
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public <T> LocalizableMessage visitUnknown(PropertyDefinition<T> d, Void p)
+                throws UnknownPropertyDefinitionException {
+            return LocalizableMessage.raw("?");
+        }
     }
 
-
+    // Underlying implementation.
+    private final MyPropertyDefinitionVisitor pimpl;
 
     /**
-     * {@inheritDoc}
+     * Creates a new property usage builder.
+     *
+     * @param isDetailed
+     *            Indicates whether or not the generated usage should contain
+     *            detailed information such as constraints.
      */
-    @Override
-    public Message visitString(StringPropertyDefinition d, Void p) {
-      if (d.getPattern() != null) {
-        if (isDetailed) {
-          MessageBuilder builder = new MessageBuilder();
-          builder.append(d.getPatternUsage());
-          builder.append(" - ");
-          builder.append(d.getPatternSynopsis());
-          return builder.toMessage();
-        } else {
-          return Message.raw(d.getPatternUsage());
-        }
-      } else {
-        return Message.raw("STRING");
-      }
+    public PropertyDefinitionUsageBuilder(boolean isDetailed) {
+        this.pimpl = new MyPropertyDefinitionVisitor(isDetailed);
     }
 
-
-
     /**
-     * {@inheritDoc}
+     * Generates the usage information for the provided property definition.
+     *
+     * @param pd
+     *            The property definitions.
+     * @return Returns the usage information for the provided property
+     *         definition.
      */
-    @Override
-    public <T> Message visitUnknown(PropertyDefinition<T> d, Void p)
-        throws UnknownPropertyDefinitionException {
-      return Message.raw("?");
-    }
-  }
-
-  // Underlying implementation.
-  private final MyPropertyDefinitionVisitor pimpl;
-
-
-
-  /**
-   * Creates a new property usage builder.
-   *
-   * @param isDetailed
-   *          Indicates whether or not the generated usage should
-   *          contain detailed information such as constraints.
-   */
-  public PropertyDefinitionUsageBuilder(boolean isDetailed) {
-    this.pimpl = new MyPropertyDefinitionVisitor(isDetailed);
-  }
-
-
-
-  /**
-   * Generates the usage information for the provided property
-   * definition.
-   *
-   * @param pd
-   *          The property definitions.
-   * @return Returns the usage information for the provided property
-   *         definition.
-   */
-  public Message getUsage(PropertyDefinition<?> pd) {
-    return pd.accept(pimpl, null);
-  };
+    public LocalizableMessage getUsage(PropertyDefinition<?> pd) {
+        return pd.accept(pimpl, null);
+    };
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyException.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyException.java
index 2e5751a..7fc721c 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyException.java
@@ -27,73 +27,62 @@
 
 package org.opends.server.admin;
 
-
-
-import org.opends.messages.Message;
-
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Exceptions thrown as a result of errors that occurred when decoding
- * and modifying property values.
+ * Exceptions thrown as a result of errors that occurred when decoding and
+ * modifying property values.
  */
 public abstract class PropertyException extends AdminRuntimeException {
 
-  /**
-   * Version ID required by serializable classes.
-   */
-  private static final long serialVersionUID = -8465109598081914482L;
+    /**
+     * Version ID required by serializable classes.
+     */
+    private static final long serialVersionUID = -8465109598081914482L;
 
-  // The property definition associated with the property that caused
-  // the exception.
-  private final PropertyDefinition<?> pd;
+    // The property definition associated with the property that caused
+    // the exception.
+    private final PropertyDefinition<?> pd;
 
+    /**
+     * Creates property exception without a cause.
+     *
+     * @param pd
+     *            The property definition associated with the property that
+     *            caused the exception.
+     * @param message
+     *            The message.
+     */
+    protected PropertyException(PropertyDefinition<?> pd, LocalizableMessage message) {
+        super(message);
+        this.pd = pd;
+    }
 
+    /**
+     * Creates property exception with a cause.
+     *
+     * @param pd
+     *            The property definition associated with the property that
+     *            caused the exception.
+     * @param message
+     *            The message.
+     * @param cause
+     *            The cause.
+     */
+    protected PropertyException(PropertyDefinition<?> pd, LocalizableMessage message, Throwable cause) {
+        super(message, cause);
+        this.pd = pd;
+    }
 
-  /**
-   * Creates property exception without a cause.
-   *
-   * @param pd
-   *          The property definition associated with the property
-   *          that caused the exception.
-   * @param message
-   *          The message.
-   */
-  protected PropertyException(PropertyDefinition<?> pd, Message message) {
-    super(message);
-    this.pd = pd;
-  }
-
-
-
-  /**
-   * Creates property exception with a cause.
-   *
-   * @param pd
-   *          The property definition associated with the property
-   *          that caused the exception.
-   * @param message
-   *          The message.
-   * @param cause
-   *          The cause.
-   */
-  protected PropertyException(PropertyDefinition<?> pd, Message message,
-      Throwable cause) {
-    super(message, cause);
-    this.pd = pd;
-  }
-
-
-
-  /**
-   * Get the property definition associated with the property that
-   * caused the exception.
-   *
-   * @return Returns the property definition associated with the
-   *         property that caused the exception.
-   */
-  public final PropertyDefinition<?> getPropertyDefinition() {
-    return pd;
-  }
+    /**
+     * Get the property definition associated with the property that caused the
+     * exception.
+     *
+     * @return Returns the property definition associated with the property that
+     *         caused the exception.
+     */
+    public final PropertyDefinition<?> getPropertyDefinition() {
+        return pd;
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsMandatoryException.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsMandatoryException.java
index 198d4f8..5bfc8bb 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsMandatoryException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsMandatoryException.java
@@ -27,32 +27,26 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
  * Thrown when an attempt is made to remove a mandatory property.
  */
 public class PropertyIsMandatoryException extends PropertyException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = 5328211711156565625L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = 5328211711156565625L;
 
-
-
-  /**
-   * Create a new property is mandatory exception.
-   *
-   * @param pd
-   *          The property definition.
-   */
-  public PropertyIsMandatoryException(PropertyDefinition<?> pd) {
-    super(pd, ERR_PROPERTY_IS_MANDATORY_EXCEPTION.get(pd.getName()));
-  }
+    /**
+     * Create a new property is mandatory exception.
+     *
+     * @param pd
+     *            The property definition.
+     */
+    public PropertyIsMandatoryException(PropertyDefinition<?> pd) {
+        super(pd, ERR_PROPERTY_IS_MANDATORY_EXCEPTION.get(pd.getName()));
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsReadOnlyException.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsReadOnlyException.java
index 72e3954..e57f793 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsReadOnlyException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsReadOnlyException.java
@@ -27,32 +27,26 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
  * Thrown when an attempt is made to modify a read-only property.
  */
 public class PropertyIsReadOnlyException extends PropertyException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = 5315348044141024459L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = 5315348044141024459L;
 
-
-
-  /**
-   * Create a new property is read-only exception.
-   *
-   * @param pd
-   *          The property definition.
-   */
-  public PropertyIsReadOnlyException(PropertyDefinition<?> pd) {
-    super(pd, ERR_PROPERTY_IS_READ_ONLY_EXCEPTION.get(pd.getName()));
-  }
+    /**
+     * Create a new property is read-only exception.
+     *
+     * @param pd
+     *            The property definition.
+     */
+    public PropertyIsReadOnlyException(PropertyDefinition<?> pd) {
+        super(pd, ERR_PROPERTY_IS_READ_ONLY_EXCEPTION.get(pd.getName()));
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsSingleValuedException.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsSingleValuedException.java
index cae55c2..4b6e7c0 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsSingleValuedException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyIsSingleValuedException.java
@@ -27,32 +27,26 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
- * Thrown when an attempt is made to add more than value to a
- * single-valued property.
+ * Thrown when an attempt is made to add more than value to a single-valued
+ * property.
  */
 public class PropertyIsSingleValuedException extends PropertyException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = -8056602690887917027L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = -8056602690887917027L;
 
-
-
-  /**
-   * Create a new property is single valued exception.
-   *
-   * @param pd
-   *          The property definition.
-   */
-  public PropertyIsSingleValuedException(PropertyDefinition<?> pd) {
-    super(pd, ERR_PROPERTY_IS_SINGLE_VALUED_EXCEPTION.get(pd.getName()));
-  }
+    /**
+     * Create a new property is single valued exception.
+     *
+     * @param pd
+     *            The property definition.
+     */
+    public PropertyIsSingleValuedException(PropertyDefinition<?> pd) {
+        super(pd, ERR_PROPERTY_IS_SINGLE_VALUED_EXCEPTION.get(pd.getName()));
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/PropertyNotFoundException.java b/opendj-admin/src/main/java/org/opends/server/admin/PropertyNotFoundException.java
index 853fc26..5bbe804 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/PropertyNotFoundException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/PropertyNotFoundException.java
@@ -27,8 +27,7 @@
 
 package org.opends.server.admin;
 
-import static org.opends.messages.AdminMessages.*;
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
  * Thrown when an attempt is made to retrieve a property using its name but the
@@ -39,37 +38,33 @@
  */
 public class PropertyNotFoundException extends OperationsException {
 
-  /**
-   * Serialization ID.
-   */
-  private static final long serialVersionUID = -895548482881819610L;
+    /**
+     * Serialization ID.
+     */
+    private static final long serialVersionUID = -895548482881819610L;
 
-  // The name of the property that could not be found.
-  private final String propertyName;
+    // The name of the property that could not be found.
+    private final String propertyName;
 
+    /**
+     * Create a new property not found exception.
+     *
+     * @param propertyName
+     *            The name of the property that could not be found.
+     */
+    public PropertyNotFoundException(String propertyName) {
+        super(ERR_PROPERTY_NOT_FOUND_EXCEPTION.get(propertyName));
 
+        this.propertyName = propertyName;
+    }
 
-  /**
-   * Create a new property not found exception.
-   *
-   * @param propertyName
-   *          The name of the property that could not be found.
-   */
-  public PropertyNotFoundException(String propertyName) {
-    super(ERR_PROPERTY_NOT_FOUND_EXCEPTION.get(propertyName));
-
-    this.propertyName = propertyName;
-  }
-
-
-
-  /**
-   * Get the name of the property that could not be found.
-   *
-   * @return Returns the name of the property that could not be found.
-   */
-  public String getPropertyName() {
-    return propertyName;
-  }
+    /**
+     * Get the name of the property that could not be found.
+     *
+     * @return Returns the name of the property that could not be found.
+     */
+    public String getPropertyName() {
+        return propertyName;
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/RelationDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/RelationDefinition.java
index bc6a863..5567526 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/RelationDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/RelationDefinition.java
@@ -26,396 +26,335 @@
  */
 
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
-
-
-import static org.opends.server.util.Validator.*;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.Set;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
- * Relation definitions define relationships between types of managed
- * objects. In addition they define the ownership model:
+ * Relation definitions define relationships between types of managed objects.
+ * In addition they define the ownership model:
  * <ul>
- * <li>composition - referenced managed objects are owned by the
- * parent managed object and are deleted when the parent is deleted
- * <li>aggregation - referenced managed objects are not owned by the
- * parent managed object. Instead they are shared by other managed
- * objects.
+ * <li>composition - referenced managed objects are owned by the parent managed
+ * object and are deleted when the parent is deleted
+ * <li>aggregation - referenced managed objects are not owned by the parent
+ * managed object. Instead they are shared by other managed objects.
  * </ul>
- * Relations define how clients interact with the configuration. For
- * example, clients manage aggregated managed objects in a shared
- * location and attach them to parent managed objects. Composed
- * managed objects, on the other hand, would be created directly
- * beneath the parent managed object and destroyed with it too.
+ * Relations define how clients interact with the configuration. For example,
+ * clients manage aggregated managed objects in a shared location and attach
+ * them to parent managed objects. Composed managed objects, on the other hand,
+ * would be created directly beneath the parent managed object and destroyed
+ * with it too.
  * <p>
- * Within the server, listeners can choose to request notification of
- * managed objects being added or removed from relations.
+ * Within the server, listeners can choose to request notification of managed
+ * objects being added or removed from relations.
  * <p>
  * In LDAP, compositions are represented as follows:
  * <ul>
- * <li>singleton relations (one to one): a referenced managed object
- * is represented using a child entry directly beneath the parent
- * <li>optional relations (one to zero or one): a referenced managed
- * object is represented using a child entry directly beneath the
- * parent
- * <li>instantiable relations (one to many): the relation is
- * represented using a child entry directly beneath the parent.
- * Referenced managed objects are represented using child entries of
- * this "relation entry" and are named by the user
- * <li>set relations (one to many): the relation is
- * represented using a child entry directly beneath the parent.
- * Referenced managed objects are represented using child entries of
- * this "relation entry" whose name is the type of the managed object.
- * </ul>
- * Whereas, aggregations are represented by storing the DNs of the
- * referenced managed objects in an attribute of the aggregating
+ * <li>singleton relations (one to one): a referenced managed object is
+ * represented using a child entry directly beneath the parent
+ * <li>optional relations (one to zero or one): a referenced managed object is
+ * represented using a child entry directly beneath the parent
+ * <li>instantiable relations (one to many): the relation is represented using a
+ * child entry directly beneath the parent. Referenced managed objects are
+ * represented using child entries of this "relation entry" and are named by the
+ * user
+ * <li>set relations (one to many): the relation is represented using a child
+ * entry directly beneath the parent. Referenced managed objects are represented
+ * using child entries of this "relation entry" whose name is the type of the
  * managed object.
+ * </ul>
+ * Whereas, aggregations are represented by storing the DNs of the referenced
+ * managed objects in an attribute of the aggregating managed object.
  *
  * @param <C>
- *          The type of client managed object configuration that this
- *          relation definition refers to.
+ *            The type of client managed object configuration that this relation
+ *            definition refers to.
  * @param <S>
- *          The type of server managed object configuration that this
- *          relation definition refers to.
+ *            The type of server managed object configuration that this relation
+ *            definition refers to.
  */
-public abstract class RelationDefinition
-    <C extends ConfigurationClient, S extends Configuration> {
+public abstract class RelationDefinition<C extends ConfigurationClient, S extends Configuration> {
 
-  /**
-   * An interface for incrementally constructing relation definitions.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this relation definition refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this relation definition refers to.
-   * @param <D>
-   *          The type of relation definition constructed by this
-   *          builder.
-   */
-  protected abstract static class AbstractBuilder
-      <C extends ConfigurationClient, S extends Configuration,
-       D extends RelationDefinition<C, S>> {
+    /**
+     * An interface for incrementally constructing relation definitions.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            relation definition refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            relation definition refers to.
+     * @param <D>
+     *            The type of relation definition constructed by this builder.
+     */
+    protected abstract static class AbstractBuilder<C extends ConfigurationClient, S extends Configuration, D extends RelationDefinition<C, S>> {
+
+        // Common fields.
+        private final Common<C, S> common;
+
+        /**
+         * Create a property definition builder.
+         *
+         * @param pd
+         *            The parent managed object definition.
+         * @param name
+         *            The name of the relation.
+         * @param cd
+         *            The child managed object definition.
+         */
+        protected AbstractBuilder(AbstractManagedObjectDefinition<?, ?> pd, String name,
+                AbstractManagedObjectDefinition<C, S> cd) {
+            this.common = new Common<C, S>(pd, name, cd);
+        }
+
+        /**
+         * Construct a relation definition based on the properties of this
+         * builder.
+         *
+         * @return The new relation definition.
+         */
+        public final D getInstance() {
+            return buildInstance(common);
+        }
+
+        /**
+         * Add a relation definition option.
+         *
+         * @param option
+         *            The relation option.
+         */
+        public final void setOption(RelationOption option) {
+            ensureNotNull(option);
+            common.options.add(option);
+        }
+
+        /**
+         * Build a relation definition based on the properties of this builder.
+         *
+         * @param common
+         *            The common fields of the new relation definition.
+         * @return The new relation definition.
+         */
+        protected abstract D buildInstance(Common<C, S> common);
+    }
+
+    /**
+     * Opaque structure containing fields common to all relation definition
+     * types.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            relation definition refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            relation definition refers to.
+     */
+    protected static final class Common<C extends ConfigurationClient, S extends Configuration> {
+
+        // The definition of the child managed object.
+        private final AbstractManagedObjectDefinition<C, S> cd;
+
+        // The name of the relation.
+        private final String name;
+
+        // Options applicable to this definition.
+        private final Set<RelationOption> options;
+
+        // The definition of the parent managed object.
+        private final AbstractManagedObjectDefinition<?, ?> pd;
+
+        // Private constructor.
+        private Common(AbstractManagedObjectDefinition<?, ?> pd, String name, AbstractManagedObjectDefinition<C, S> cd) {
+            this.name = name;
+            this.pd = pd;
+            this.cd = cd;
+            this.options = EnumSet.noneOf(RelationOption.class);
+        }
+    }
 
     // Common fields.
     private final Common<C, S> common;
 
-
-
     /**
-     * Create a property definition builder.
-     *
-     * @param pd
-     *          The parent managed object definition.
-     * @param name
-     *          The name of the relation.
-     * @param cd
-     *          The child managed object definition.
-     */
-    protected AbstractBuilder(AbstractManagedObjectDefinition<?, ?> pd,
-        String name, AbstractManagedObjectDefinition<C, S> cd) {
-      this.common = new Common<C, S>(pd, name, cd);
-    }
-
-
-
-    /**
-     * Construct a relation definition based on the properties of this
-     * builder.
-     *
-     * @return The new relation definition.
-     */
-    public final D getInstance() {
-      return buildInstance(common);
-    }
-
-
-
-    /**
-     * Add a relation definition option.
-     *
-     * @param option
-     *          The relation option.
-     */
-    public final void setOption(RelationOption option) {
-      ensureNotNull(option);
-      common.options.add(option);
-    }
-
-
-
-    /**
-     * Build a relation definition based on the properties of this
-     * builder.
+     * Create a new managed object relation definition with the specified common
+     * fields.
      *
      * @param common
-     *          The common fields of the new relation definition.
-     * @return The new relation definition.
+     *            The common fields of the new relation definition.
      */
-    protected abstract D buildInstance(Common<C, S> common);
-  }
-
-
-
-  /**
-   * Opaque structure containing fields common to all relation
-   * definition types.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that
-   *          this relation definition refers to.
-   * @param <S>
-   *          The type of server managed object configuration that
-   *          this relation definition refers to.
-   */
-  protected static final class Common
-    <C extends ConfigurationClient, S extends Configuration> {
-
-    // The definition of the child managed object.
-    private final AbstractManagedObjectDefinition<C, S> cd;
-
-    // The name of the relation.
-    private final String name;
-
-    // Options applicable to this definition.
-    private final Set<RelationOption> options;
-
-    // The definition of the parent managed object.
-    private final AbstractManagedObjectDefinition<?, ?> pd;
-
-
-
-    // Private constructor.
-    private Common(AbstractManagedObjectDefinition<?, ?> pd, String name,
-        AbstractManagedObjectDefinition<C, S> cd) {
-      this.name = name;
-      this.pd = pd;
-      this.cd = cd;
-      this.options = EnumSet.noneOf(RelationOption.class);
+    protected RelationDefinition(Common<C, S> common) {
+        this.common = common;
     }
-  }
 
-  // Common fields.
-  private final Common<C, S> common;
+    /**
+     * Apply a visitor to this relation definition.
+     *
+     * @param <R>
+     *            The return type of the visitor's methods.
+     * @param <P>
+     *            The type of the additional parameters to the visitor's
+     *            methods.
+     * @param v
+     *            The relation definition visitor.
+     * @param p
+     *            Optional additional visitor parameter.
+     * @return Returns a result as specified by the visitor.
+     */
+    public abstract <R, P> R accept(RelationDefinitionVisitor<R, P> v, P p);
 
-
-
-  /**
-   * Create a new managed object relation definition with the
-   * specified common fields.
-   *
-   * @param common
-   *          The common fields of the new relation definition.
-   */
-  protected RelationDefinition(Common<C, S> common) {
-    this.common = common;
-  }
-
-
-
-  /**
-   * Apply a visitor to this relation definition.
-   *
-   * @param <R>
-   *          The return type of the visitor's methods.
-   * @param <P>
-   *          The type of the additional parameters to the visitor's
-   *          methods.
-   * @param v
-   *          The relation definition visitor.
-   * @param p
-   *          Optional additional visitor parameter.
-   * @return Returns a result as specified by the visitor.
-   */
-  public abstract <R, P> R accept(RelationDefinitionVisitor<R, P> v, P p);
-
-
-
-  /**
-   * Get the definition of the child managed object.
-   *
-   * @return Returns the definition of the child managed object.
-   */
-  public final AbstractManagedObjectDefinition<C, S> getChildDefinition() {
-    return common.cd;
-  }
-
-
-
-  /**
-   * Gets the optional description of this relation definition in the
-   * default locale.
-   *
-   * @return Returns the description of this relation definition in
-   *         the default locale, or <code>null</code> if there is no
-   *         description.
-   */
-  public final Message getDescription() {
-    return getDescription(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the optional description of this relation definition in the
-   * specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the description of this relation definition in
-   *         the specified locale, or <code>null</code> if there is
-   *         no description.
-   */
-  public final Message getDescription(Locale locale) {
-    try {
-      String property = "relation." + common.name + ".description";
-      return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
-          getParentDefinition(), property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+    /**
+     * Get the definition of the child managed object.
+     *
+     * @return Returns the definition of the child managed object.
+     */
+    public final AbstractManagedObjectDefinition<C, S> getChildDefinition() {
+        return common.cd;
     }
-  }
 
+    /**
+     * Gets the optional description of this relation definition in the default
+     * locale.
+     *
+     * @return Returns the description of this relation definition in the
+     *         default locale, or <code>null</code> if there is no description.
+     */
+    public final LocalizableMessage getDescription() {
+        return getDescription(Locale.getDefault());
+    }
 
+    /**
+     * Gets the optional description of this relation definition in the
+     * specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the description of this relation definition in the
+     *         specified locale, or <code>null</code> if there is no
+     *         description.
+     */
+    public final LocalizableMessage getDescription(Locale locale) {
+        try {
+            String property = "relation." + common.name + ".description";
+            return ManagedObjectDefinitionI18NResource.getInstance()
+                    .getMessage(getParentDefinition(), property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
 
-  /**
-   * Get the name of the relation.
-   *
-   * @return Returns the name of the relation.
-   */
-  public final String getName() {
-    return common.name;
-  }
+    /**
+     * Get the name of the relation.
+     *
+     * @return Returns the name of the relation.
+     */
+    public final String getName() {
+        return common.name;
+    }
 
+    /**
+     * Get the definition of the parent managed object.
+     *
+     * @return Returns the definition of the parent managed object.
+     */
+    public final AbstractManagedObjectDefinition<?, ?> getParentDefinition() {
+        return common.pd;
+    }
 
+    /**
+     * Gets the synopsis of this relation definition in the default locale.
+     *
+     * @return Returns the synopsis of this relation definition in the default
+     *         locale.
+     */
+    public final LocalizableMessage getSynopsis() {
+        return getSynopsis(Locale.getDefault());
+    }
 
-  /**
-   * Get the definition of the parent managed object.
-   *
-   * @return Returns the definition of the parent managed object.
-   */
-  public final AbstractManagedObjectDefinition<?, ?> getParentDefinition() {
-    return common.pd;
-  }
+    /**
+     * Gets the synopsis of this relation definition in the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this relation definition in the specified
+     *         locale.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) {
+        String property = "relation." + common.name + ".synopsis";
+        return ManagedObjectDefinitionI18NResource.getInstance().getMessage(getParentDefinition(), property, locale);
+    }
 
+    /**
+     * Gets the user friendly name of this relation definition in the default
+     * locale.
+     *
+     * @return Returns the user friendly name of this relation definition in the
+     *         default locale.
+     */
+    public final LocalizableMessage getUserFriendlyName() {
+        return getUserFriendlyName(Locale.getDefault());
+    }
 
+    /**
+     * Gets the user friendly name of this relation definition in the specified
+     * locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the user friendly name of this relation definition in the
+     *         specified locale.
+     */
+    public final LocalizableMessage getUserFriendlyName(Locale locale) {
+        String property = "relation." + common.name + ".user-friendly-name";
+        return ManagedObjectDefinitionI18NResource.getInstance().getMessage(getParentDefinition(), property, locale);
+    }
 
-  /**
-   * Gets the synopsis of this relation definition in the default
-   * locale.
-   *
-   * @return Returns the synopsis of this relation definition in the
-   *         default locale.
-   */
-  public final Message getSynopsis() {
-    return getSynopsis(Locale.getDefault());
-  }
+    /**
+     * Check if the specified option is set for this relation definition.
+     *
+     * @param option
+     *            The option to test.
+     * @return Returns <code>true</code> if the option is set, or
+     *         <code>false</code> otherwise.
+     */
+    public final boolean hasOption(RelationOption option) {
+        return common.options.contains(option);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String toString() {
+        StringBuilder builder = new StringBuilder();
+        toString(builder);
+        return builder.toString();
+    }
 
+    /**
+     * Append a string representation of the managed object relation to the
+     * provided string builder.
+     *
+     * @param builder
+     *            The string builder where the string representation should be
+     *            appended.
+     */
+    public abstract void toString(StringBuilder builder);
 
-  /**
-   * Gets the synopsis of this relation definition in the specified
-   * locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this relation definition in the
-   *         specified locale.
-   */
-  public final Message getSynopsis(Locale locale) {
-    String property = "relation." + common.name + ".synopsis";
-    return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
-        getParentDefinition(), property, locale);
-  }
-
-
-
-  /**
-   * Gets the user friendly name of this relation definition in the
-   * default locale.
-   *
-   * @return Returns the user friendly name of this relation
-   *         definition in the default locale.
-   */
-  public final Message getUserFriendlyName() {
-    return getUserFriendlyName(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the user friendly name of this relation definition in the
-   * specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the user friendly name of this relation
-   *         definition in the specified locale.
-   */
-  public final Message getUserFriendlyName(Locale locale) {
-    String property = "relation." + common.name + ".user-friendly-name";
-    return ManagedObjectDefinitionI18NResource.getInstance().getMessage(
-        getParentDefinition(), property, locale);
-  }
-
-
-
-  /**
-   * Check if the specified option is set for this relation
-   * definition.
-   *
-   * @param option
-   *          The option to test.
-   * @return Returns <code>true</code> if the option is set, or
-   *         <code>false</code> otherwise.
-   */
-  public final boolean hasOption(RelationOption option) {
-    return common.options.contains(option);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final String toString() {
-    StringBuilder builder = new StringBuilder();
-    toString(builder);
-    return builder.toString();
-  }
-
-
-
-  /**
-   * Append a string representation of the managed object relation to
-   * the provided string builder.
-   *
-   * @param builder
-   *          The string builder where the string representation
-   *          should be appended.
-   */
-  public abstract void toString(StringBuilder builder);
-
-
-
-  /**
-   * Performs any run-time initialization required by this relation
-   * definition. This may include resolving managed object paths and
-   * property names.
-   *
-   * @throws Exception
-   *           If this relation definition could not be initialized.
-   */
-  protected void initialize() throws Exception {
-    // No implementation required.
-  }
+    /**
+     * Performs any run-time initialization required by this relation
+     * definition. This may include resolving managed object paths and property
+     * names.
+     *
+     * @throws Exception
+     *             If this relation definition could not be initialized.
+     */
+    protected void initialize() throws Exception {
+        // No implementation required.
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/SetRelationDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/SetRelationDefinition.java
index 426c97d..43b79de 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/SetRelationDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/SetRelationDefinition.java
@@ -27,17 +27,13 @@
 
 package org.opends.server.admin;
 
-
-
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
-import org.opends.messages.Message;
-
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
  * A managed object composite relationship definition which represents a
@@ -45,245 +41,183 @@
  * different type. The manage objects are named using their type name.
  *
  * @param <C>
- *          The type of client managed object configuration that this
- *          relation definition refers to.
+ *            The type of client managed object configuration that this relation
+ *            definition refers to.
  * @param <S>
- *          The type of server managed object configuration that this
- *          relation definition refers to.
+ *            The type of server managed object configuration that this relation
+ *            definition refers to.
  */
-public final class SetRelationDefinition
-    <C extends ConfigurationClient, S extends Configuration>
-    extends RelationDefinition<C, S>
-{
+public final class SetRelationDefinition<C extends ConfigurationClient, S extends Configuration> extends
+        RelationDefinition<C, S> {
 
-  /**
-   * An interface for incrementally constructing set relation
-   * definitions.
-   *
-   * @param <C>
-   *          The type of client managed object configuration that this
-   *          relation definition refers to.
-   * @param <S>
-   *          The type of server managed object configuration that this
-   *          relation definition refers to.
-   */
-  public static final class Builder
-      <C extends ConfigurationClient, S extends Configuration>
-      extends AbstractBuilder<C, S, SetRelationDefinition<C, S>>
-  {
+    /**
+     * An interface for incrementally constructing set relation definitions.
+     *
+     * @param <C>
+     *            The type of client managed object configuration that this
+     *            relation definition refers to.
+     * @param <S>
+     *            The type of server managed object configuration that this
+     *            relation definition refers to.
+     */
+    public static final class Builder<C extends ConfigurationClient, S extends Configuration> extends
+            AbstractBuilder<C, S, SetRelationDefinition<C, S>> {
+
+        // The plural name of the relation.
+        private final String pluralName;
+
+        // The optional default managed objects associated with this
+        // set relation definition.
+        private final Map<String, DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects = new HashMap<String, DefaultManagedObject<? extends C, ? extends S>>();
+
+        /**
+         * Creates a new builder which can be used to incrementally build a set
+         * relation definition.
+         *
+         * @param pd
+         *            The parent managed object definition.
+         * @param name
+         *            The name of the relation.
+         * @param pluralName
+         *            The plural name of the relation.
+         * @param cd
+         *            The child managed object definition.
+         */
+        public Builder(AbstractManagedObjectDefinition<?, ?> pd, String name, String pluralName,
+                AbstractManagedObjectDefinition<C, S> cd) {
+            super(pd, name, cd);
+            this.pluralName = pluralName;
+        }
+
+        /**
+         * Adds the default managed object to this set relation definition.
+         *
+         * @param defaultManagedObject
+         *            The default managed object.
+         */
+        public void setDefaultManagedObject(DefaultManagedObject<? extends C, ? extends S> defaultManagedObject) {
+            this.defaultManagedObjects.put(defaultManagedObject.getManagedObjectDefinition().getName(),
+                    defaultManagedObject);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected SetRelationDefinition<C, S> buildInstance(Common<C, S> common) {
+            return new SetRelationDefinition<C, S>(common, pluralName, defaultManagedObjects);
+        }
+
+    }
 
     // The plural name of the relation.
     private final String pluralName;
 
     // The optional default managed objects associated with this
     // set relation definition.
-    private final Map<String,
-                      DefaultManagedObject<? extends C, ? extends S>>
-      defaultManagedObjects =
-        new HashMap<String, DefaultManagedObject<? extends C, ? extends S>>();
+    private final Map<String, DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects;
 
-
-
-    /**
-     * Creates a new builder which can be used to incrementally build a
-     * set relation definition.
-     *
-     * @param pd
-     *          The parent managed object definition.
-     * @param name
-     *          The name of the relation.
-     * @param pluralName
-     *          The plural name of the relation.
-     * @param cd
-     *          The child managed object definition.
-     */
-    public Builder(AbstractManagedObjectDefinition<?, ?> pd,
-        String name, String pluralName,
-        AbstractManagedObjectDefinition<C, S> cd)
-    {
-      super(pd, name, cd);
-      this.pluralName = pluralName;
+    // Private constructor.
+    private SetRelationDefinition(Common<C, S> common, String pluralName,
+            Map<String, DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects) {
+        super(common);
+        this.pluralName = pluralName;
+        this.defaultManagedObjects = defaultManagedObjects;
     }
 
-
-
-    /**
-     * Adds the default managed object to this set relation definition.
-     *
-     * @param defaultManagedObject
-     *          The default managed object.
-     */
-    public void setDefaultManagedObject(
-        DefaultManagedObject<? extends C, ? extends S> defaultManagedObject)
-    {
-      this.defaultManagedObjects
-          .put(defaultManagedObject.getManagedObjectDefinition()
-              .getName(), defaultManagedObject);
-    }
-
-
-
     /**
      * {@inheritDoc}
      */
     @Override
-    protected SetRelationDefinition<C, S> buildInstance(
-        Common<C, S> common)
-    {
-      return new SetRelationDefinition<C, S>(common, pluralName,
-          defaultManagedObjects);
+    public <R, P> R accept(RelationDefinitionVisitor<R, P> v, P p) {
+        return v.visitSet(this, p);
     }
 
-  }
-
-
-
-  // The plural name of the relation.
-  private final String pluralName;
-
-  // The optional default managed objects associated with this
-  // set relation definition.
-  private final Map<String,
-                    DefaultManagedObject<? extends C, ? extends S>>
-    defaultManagedObjects;
-
-
-
-  // Private constructor.
-  private SetRelationDefinition(
-      Common<C, S> common,
-      String pluralName,
-      Map<String,
-          DefaultManagedObject<? extends C, ? extends S>> defaultManagedObjects)
-  {
-    super(common);
-    this.pluralName = pluralName;
-    this.defaultManagedObjects = defaultManagedObjects;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(RelationDefinitionVisitor<R, P> v, P p)
-  {
-    return v.visitSet(this, p);
-  }
-
-
-
-  /**
-   * Gets the named default managed object associated with this set
-   * relation definition.
-   *
-   * @param name
-   *          The name of the default managed object (for set relations
-   *          this is the type of the default managed object).
-   * @return The named default managed object.
-   * @throws IllegalArgumentException
-   *           If there is no default managed object associated with the
-   *           provided name.
-   */
-  public DefaultManagedObject<? extends C, ? extends S> getDefaultManagedObject(
-      String name) throws IllegalArgumentException
-  {
-    if (!defaultManagedObjects.containsKey(name))
-    {
-      throw new IllegalArgumentException(
-          "unrecognized default managed object \"" + name + "\"");
+    /**
+     * Gets the named default managed object associated with this set relation
+     * definition.
+     *
+     * @param name
+     *            The name of the default managed object (for set relations this
+     *            is the type of the default managed object).
+     * @return The named default managed object.
+     * @throws IllegalArgumentException
+     *             If there is no default managed object associated with the
+     *             provided name.
+     */
+    public DefaultManagedObject<? extends C, ? extends S> getDefaultManagedObject(String name)
+            throws IllegalArgumentException {
+        if (!defaultManagedObjects.containsKey(name)) {
+            throw new IllegalArgumentException("unrecognized default managed object \"" + name + "\"");
+        }
+        return defaultManagedObjects.get(name);
     }
-    return defaultManagedObjects.get(name);
-  }
 
-
-
-  /**
-   * Gets the names of the default managed objects associated with this
-   * set relation definition.
-   *
-   * @return An unmodifiable set containing the names of the default
-   *         managed object.
-   */
-  public Set<String> getDefaultManagedObjectNames()
-  {
-    return Collections.unmodifiableSet(defaultManagedObjects.keySet());
-  }
-
-
-
-  /**
-   * Gets the plural name of the relation.
-   *
-   * @return The plural name of the relation.
-   */
-  public String getPluralName()
-  {
-    return pluralName;
-  }
-
-
-
-  /**
-   * Gets the user friendly plural name of this relation definition in
-   * the default locale.
-   *
-   * @return Returns the user friendly plural name of this relation
-   *         definition in the default locale.
-   */
-  public Message getUserFriendlyPluralName()
-  {
-    return getUserFriendlyPluralName(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the user friendly plural name of this relation definition in
-   * the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the user friendly plural name of this relation
-   *         definition in the specified locale.
-   */
-  public Message getUserFriendlyPluralName(Locale locale)
-  {
-    String property =
-        "relation." + getName() + ".user-friendly-plural-name";
-    return ManagedObjectDefinitionI18NResource.getInstance()
-        .getMessage(getParentDefinition(), property, locale);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void toString(StringBuilder builder)
-  {
-    builder.append("name=");
-    builder.append(getName());
-    builder.append(" type=set parent=");
-    builder.append(getParentDefinition().getName());
-    builder.append(" child=");
-    builder.append(getChildDefinition().getName());
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  protected void initialize() throws Exception
-  {
-    for (DefaultManagedObject<?, ?> dmo : defaultManagedObjects
-        .values())
-    {
-      dmo.initialize();
+    /**
+     * Gets the names of the default managed objects associated with this set
+     * relation definition.
+     *
+     * @return An unmodifiable set containing the names of the default managed
+     *         object.
+     */
+    public Set<String> getDefaultManagedObjectNames() {
+        return Collections.unmodifiableSet(defaultManagedObjects.keySet());
     }
-  }
+
+    /**
+     * Gets the plural name of the relation.
+     *
+     * @return The plural name of the relation.
+     */
+    public String getPluralName() {
+        return pluralName;
+    }
+
+    /**
+     * Gets the user friendly plural name of this relation definition in the
+     * default locale.
+     *
+     * @return Returns the user friendly plural name of this relation definition
+     *         in the default locale.
+     */
+    public LocalizableMessage getUserFriendlyPluralName() {
+        return getUserFriendlyPluralName(Locale.getDefault());
+    }
+
+    /**
+     * Gets the user friendly plural name of this relation definition in the
+     * specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the user friendly plural name of this relation definition
+     *         in the specified locale.
+     */
+    public LocalizableMessage getUserFriendlyPluralName(Locale locale) {
+        String property = "relation." + getName() + ".user-friendly-plural-name";
+        return ManagedObjectDefinitionI18NResource.getInstance().getMessage(getParentDefinition(), property, locale);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void toString(StringBuilder builder) {
+        builder.append("name=");
+        builder.append(getName());
+        builder.append(" type=set parent=");
+        builder.append(getParentDefinition().getName());
+        builder.append(" child=");
+        builder.append(getChildDefinition().getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void initialize() throws Exception {
+        for (DefaultManagedObject<?, ?> dmo : defaultManagedObjects.values()) {
+            dmo.initialize();
+        }
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java
index aa82545..e2f7b40 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/SizePropertyDefinition.java
@@ -27,14 +27,10 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 
-
-
 /**
  * Memory size property definition.
  * <p>
@@ -47,364 +43,309 @@
  */
 public final class SizePropertyDefinition extends PropertyDefinition<Long> {
 
-  // String used to represent unlimited memory sizes.
-  private static final String UNLIMITED = "unlimited";
-
-  // The lower limit of the property value in bytes.
-  private final long lowerLimit;
-
-  // The optional upper limit of the property value in bytes.
-  private final Long upperLimit;
-
-  // Indicates whether this property allows the use of the "unlimited" memory
-  // size value (represented using a -1L or the string "unlimited").
-  private final boolean allowUnlimited;
-
-
-
-  /**
-   * An interface for incrementally constructing memory size property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<Long, SizePropertyDefinition> {
+    // String used to represent unlimited memory sizes.
+    private static final String UNLIMITED = "unlimited";
 
     // The lower limit of the property value in bytes.
-    private long lowerLimit = 0L;
+    private final long lowerLimit;
 
     // The optional upper limit of the property value in bytes.
-    private Long upperLimit = null;
+    private final Long upperLimit;
 
     // Indicates whether this property allows the use of the "unlimited" memory
     // size value (represented using a -1L or the string "unlimited").
-    private boolean allowUnlimited = false;
-
-
-
-    // Private constructor
-    private Builder(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-      super(d, propertyName);
-    }
-
-
+    private final boolean allowUnlimited;
 
     /**
-     * Set the lower limit in bytes.
-     *
-     * @param lowerLimit
-     *          The new lower limit (must be >= 0) in bytes.
-     * @throws IllegalArgumentException
-     *           If a negative lower limit was specified, or if the lower limit
-     *           is greater than the upper limit.
+     * An interface for incrementally constructing memory size property
+     * definitions.
      */
-    public final void setLowerLimit(long lowerLimit)
-        throws IllegalArgumentException {
-      if (lowerLimit < 0) {
-        throw new IllegalArgumentException("Negative lower limit");
-      }
-      if (upperLimit != null && lowerLimit > upperLimit) {
-        throw new IllegalArgumentException(
-            "Lower limit greater than upper limit");
-      }
-      this.lowerLimit = lowerLimit;
-    }
+    public static class Builder extends AbstractBuilder<Long, SizePropertyDefinition> {
 
+        // The lower limit of the property value in bytes.
+        private long lowerLimit = 0L;
 
+        // The optional upper limit of the property value in bytes.
+        private Long upperLimit = null;
 
-    /**
-     * Set the lower limit using a string representation of the limit.
-     *
-     * @param lowerLimit
-     *          The string representation of the new lower limit.
-     * @throws IllegalArgumentException
-     *           If the lower limit could not be parsed, or if a negative lower
-     *           limit was specified, or the lower limit is greater than the
-     *           upper limit.
-     */
-    public final void setLowerLimit(String lowerLimit)
-        throws IllegalArgumentException {
-      setLowerLimit(SizeUnit.parseValue(lowerLimit, SizeUnit.BYTES));
-    }
+        // Indicates whether this property allows the use of the "unlimited"
+        // memory
+        // size value (represented using a -1L or the string "unlimited").
+        private boolean allowUnlimited = false;
 
-
-
-    /**
-     * Set the upper limit in bytes.
-     *
-     * @param upperLimit
-     *          The new upper limit in bytes or <code>null</code> if there is
-     *          no upper limit.
-     * @throws IllegalArgumentException
-     *           If the lower limit is greater than the upper limit.
-     */
-    public final void setUpperLimit(Long upperLimit)
-        throws IllegalArgumentException {
-      if (upperLimit != null) {
-        if (upperLimit < 0) {
-          throw new IllegalArgumentException("Negative upper limit");
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
         }
-        if (lowerLimit > upperLimit) {
-          throw new IllegalArgumentException(
-              "Lower limit greater than upper limit");
+
+        /**
+         * Set the lower limit in bytes.
+         *
+         * @param lowerLimit
+         *            The new lower limit (must be >= 0) in bytes.
+         * @throws IllegalArgumentException
+         *             If a negative lower limit was specified, or if the lower
+         *             limit is greater than the upper limit.
+         */
+        public final void setLowerLimit(long lowerLimit) throws IllegalArgumentException {
+            if (lowerLimit < 0) {
+                throw new IllegalArgumentException("Negative lower limit");
+            }
+            if (upperLimit != null && lowerLimit > upperLimit) {
+                throw new IllegalArgumentException("Lower limit greater than upper limit");
+            }
+            this.lowerLimit = lowerLimit;
         }
-      }
-      this.upperLimit = upperLimit;
+
+        /**
+         * Set the lower limit using a string representation of the limit.
+         *
+         * @param lowerLimit
+         *            The string representation of the new lower limit.
+         * @throws IllegalArgumentException
+         *             If the lower limit could not be parsed, or if a negative
+         *             lower limit was specified, or the lower limit is greater
+         *             than the upper limit.
+         */
+        public final void setLowerLimit(String lowerLimit) throws IllegalArgumentException {
+            setLowerLimit(SizeUnit.parseValue(lowerLimit, SizeUnit.BYTES));
+        }
+
+        /**
+         * Set the upper limit in bytes.
+         *
+         * @param upperLimit
+         *            The new upper limit in bytes or <code>null</code> if there
+         *            is no upper limit.
+         * @throws IllegalArgumentException
+         *             If the lower limit is greater than the upper limit.
+         */
+        public final void setUpperLimit(Long upperLimit) throws IllegalArgumentException {
+            if (upperLimit != null) {
+                if (upperLimit < 0) {
+                    throw new IllegalArgumentException("Negative upper limit");
+                }
+                if (lowerLimit > upperLimit) {
+                    throw new IllegalArgumentException("Lower limit greater than upper limit");
+                }
+            }
+            this.upperLimit = upperLimit;
+        }
+
+        /**
+         * Set the upper limit using a string representation of the limit.
+         *
+         * @param upperLimit
+         *            The string representation of the new upper limit, or
+         *            <code>null</code> if there is no upper limit.
+         * @throws IllegalArgumentException
+         *             If the upper limit could not be parsed, or if the lower
+         *             limit is greater than the upper limit.
+         */
+        public final void setUpperLimit(String upperLimit) throws IllegalArgumentException {
+            if (upperLimit == null) {
+                setUpperLimit((Long) null);
+            } else {
+                setUpperLimit(SizeUnit.parseValue(upperLimit, SizeUnit.BYTES));
+            }
+        }
+
+        /**
+         * Specify whether or not this property definition will allow unlimited
+         * values (default is false).
+         *
+         * @param allowUnlimited
+         *            <code>true</code> if the property will allow unlimited
+         *            values, or <code>false</code> otherwise.
+         */
+        public final void setAllowUnlimited(boolean allowUnlimited) {
+            this.allowUnlimited = allowUnlimited;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected SizePropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<Long> defaultBehavior) {
+            return new SizePropertyDefinition(d, propertyName, options, adminAction, defaultBehavior, lowerLimit,
+                    upperLimit, allowUnlimited);
+        }
+
     }
 
-
-
     /**
-     * Set the upper limit using a string representation of the limit.
+     * Create an memory size property definition builder.
      *
-     * @param upperLimit
-     *          The string representation of the new upper limit, or
-     *          <code>null</code> if there is no upper limit.
-     * @throws IllegalArgumentException
-     *           If the upper limit could not be parsed, or if the lower limit
-     *           is greater than the upper limit.
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new integer property definition builder.
      */
-    public final void setUpperLimit(String upperLimit)
-        throws IllegalArgumentException {
-      if (upperLimit == null) {
-        setUpperLimit((Long) null);
-      } else {
-        setUpperLimit(SizeUnit.parseValue(upperLimit, SizeUnit.BYTES));
-      }
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
     }
 
-
+    // Private constructor.
+    private SizePropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<Long> defaultBehavior, Long lowerLimit, Long upperLimit, boolean allowUnlimited) {
+        super(d, Long.class, propertyName, options, adminAction, defaultBehavior);
+        this.lowerLimit = lowerLimit;
+        this.upperLimit = upperLimit;
+        this.allowUnlimited = allowUnlimited;
+    }
 
     /**
-     * Specify whether or not this property definition will allow unlimited
-     * values (default is false).
+     * Get the lower limit in bytes.
      *
-     * @param allowUnlimited
-     *          <code>true</code> if the property will allow unlimited values,
-     *          or <code>false</code> otherwise.
+     * @return Returns the lower limit in bytes.
      */
-    public final void setAllowUnlimited(boolean allowUnlimited) {
-      this.allowUnlimited = allowUnlimited;
+    public long getLowerLimit() {
+        return lowerLimit;
     }
 
+    /**
+     * Get the upper limit in bytes.
+     *
+     * @return Returns the upper limit in bytes or <code>null</code> if there is
+     *         no upper limit.
+     */
+    public Long getUpperLimit() {
+        return upperLimit;
+    }
 
+    /**
+     * Determine whether this property allows unlimited memory sizes.
+     *
+     * @return Returns <code>true</code> if this this property allows unlimited
+     *         memory sizes.
+     */
+    public boolean isAllowUnlimited() {
+        return allowUnlimited;
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected SizePropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<Long> defaultBehavior) {
-      return new SizePropertyDefinition(d, propertyName, options, adminAction,
-          defaultBehavior, lowerLimit, upperLimit, allowUnlimited);
+    public void validateValue(Long value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        if (!allowUnlimited && value < lowerLimit) {
+            throw new IllegalPropertyValueException(this, value);
+
+            // unlimited allowed
+        } else if (value >= 0 && value < lowerLimit) {
+            throw new IllegalPropertyValueException(this, value);
+        }
+
+        if ((upperLimit != null) && (value > upperLimit)) {
+            throw new IllegalPropertyValueException(this, value);
+        }
     }
 
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String encodeValue(Long value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
 
+        // Make sure that we correctly encode negative values as "unlimited".
+        if (allowUnlimited) {
+            if (value < 0) {
+                return UNLIMITED;
+            }
+        }
 
+        // Encode the size value using the best-fit unit.
+        StringBuilder builder = new StringBuilder();
+        SizeUnit unit = SizeUnit.getBestFitUnitExact(value);
 
-  /**
-   * Create an memory size property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new integer property definition builder.
-   */
-  public static Builder createBuilder(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-
-
-  // Private constructor.
-  private SizePropertyDefinition(
-      AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-      EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<Long> defaultBehavior, Long lowerLimit,
-      Long upperLimit, boolean allowUnlimited) {
-    super(d, Long.class, propertyName, options, adminAction,
-        defaultBehavior);
-    this.lowerLimit = lowerLimit;
-    this.upperLimit = upperLimit;
-    this.allowUnlimited = allowUnlimited;
-  }
-
-
-
-  /**
-   * Get the lower limit in bytes.
-   *
-   * @return Returns the lower limit in bytes.
-   */
-  public long getLowerLimit() {
-    return lowerLimit;
-  }
-
-
-
-  /**
-   * Get the upper limit in bytes.
-   *
-   * @return Returns the upper limit in bytes or <code>null</code> if there is
-   *         no upper limit.
-   */
-  public Long getUpperLimit() {
-    return upperLimit;
-  }
-
-
-
-  /**
-   * Determine whether this property allows unlimited memory sizes.
-   *
-   * @return Returns <code>true</code> if this this property allows unlimited
-   *         memory sizes.
-   */
-  public boolean isAllowUnlimited() {
-    return allowUnlimited;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(Long value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    if (!allowUnlimited && value < lowerLimit) {
-      throw new IllegalPropertyValueException(this, value);
-
-    // unlimited allowed
-    } else if (value >= 0 && value < lowerLimit) {
-      throw new IllegalPropertyValueException(this, value);
+        // Cast to a long to remove fractional part (which should not be there
+        // anyway as the best-fit unit should result in an exact conversion).
+        builder.append((long) unit.fromBytes(value));
+        builder.append(' ');
+        builder.append(unit.toString());
+        return builder.toString();
     }
 
-    if ((upperLimit != null) && (value > upperLimit)) {
-      throw new IllegalPropertyValueException(this, value);
-    }
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Long decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
+        // First check for the special "unlimited" value when necessary.
+        if (allowUnlimited) {
+            if (value.trim().equalsIgnoreCase(UNLIMITED)) {
+                return -1L;
+            }
+        }
 
+        // Decode the value.
+        Long i;
+        try {
+            i = SizeUnit.parseValue(value, SizeUnit.BYTES);
+        } catch (NumberFormatException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String encodeValue(Long value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    // Make sure that we correctly encode negative values as "unlimited".
-    if (allowUnlimited) {
-      if (value < 0) {
-        return UNLIMITED;
-      }
+        try {
+            validateValue(i);
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
+        return i;
     }
 
-    // Encode the size value using the best-fit unit.
-    StringBuilder builder = new StringBuilder();
-    SizeUnit unit = SizeUnit.getBestFitUnitExact(value);
-
-    // Cast to a long to remove fractional part (which should not be there
-    // anyway as the best-fit unit should result in an exact conversion).
-    builder.append((long) unit.fromBytes(value));
-    builder.append(' ');
-    builder.append(unit.toString());
-    return builder.toString();
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public Long decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    // First check for the special "unlimited" value when necessary.
-    if (allowUnlimited) {
-      if (value.trim().equalsIgnoreCase(UNLIMITED)) {
-        return -1L;
-      }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitSize(this, p);
     }
 
-    // Decode the value.
-    Long i;
-    try {
-      i = SizeUnit.parseValue(value, SizeUnit.BYTES);
-    } catch (NumberFormatException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, Long value, P p) {
+        return v.visitSize(this, value, p);
     }
 
-    try {
-      validateValue(i);
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
-    }
-    return i;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void toString(StringBuilder builder) {
+        super.toString(builder);
 
+        builder.append(" lowerLimit=");
+        builder.append(lowerLimit);
 
+        if (upperLimit != null) {
+            builder.append(" upperLimit=");
+            builder.append(upperLimit);
+        }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitSize(this, p);
-  }
+        builder.append(" allowUnlimited=");
+        builder.append(allowUnlimited);
 
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, Long value, P p) {
-    return v.visitSize(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void toString(StringBuilder builder) {
-    super.toString(builder);
-
-    builder.append(" lowerLimit=");
-    builder.append(lowerLimit);
-
-    if (upperLimit != null) {
-      builder.append(" upperLimit=");
-      builder.append(upperLimit);
     }
 
-    builder.append(" allowUnlimited=");
-    builder.append(allowUnlimited);
-
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public int compare(Long o1, Long o2) {
-    return o1.compareTo(o2);
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare(Long o1, Long o2) {
+        return o1.compareTo(o2);
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java
index 56732e1..f68f6d0 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/StringPropertyDefinition.java
@@ -26,11 +26,8 @@
  */
 
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
-
-
-import static org.opends.server.util.Validator.ensureNotNull;
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.EnumSet;
 import java.util.Locale;
@@ -39,297 +36,248 @@
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
-
+import org.forgerock.i18n.LocalizableMessage;
 
 /**
  * String property definition.
  */
 public final class StringPropertyDefinition extends PropertyDefinition<String> {
 
-  /**
-   * An interface for incrementally constructing string property
-   * definitions.
-   */
-  public static class Builder extends
-      AbstractBuilder<String, StringPropertyDefinition> {
+    /**
+     * An interface for incrementally constructing string property definitions.
+     */
+    public static class Builder extends AbstractBuilder<String, StringPropertyDefinition> {
+
+        // Flag indicating whether values of this property are
+        // case-insensitive.
+        private boolean isCaseInsensitive = true;
+
+        // Optional pattern which values of this property must match.
+        private Pattern pattern = null;
+
+        // Pattern usage which provides a user-friendly summary of the
+        // pattern if present.
+        private String patternUsage = null;
+
+        // Private constructor
+        private Builder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+            super(d, propertyName);
+        }
+
+        /**
+         * Set a flag indicating whether values of this property are
+         * case-insensitive.
+         *
+         * @param value
+         *            <code>true</code> if values are case-insensitive, or
+         *            <code>false</code> otherwise.
+         */
+        public final void setCaseInsensitive(boolean value) {
+            isCaseInsensitive = value;
+        }
+
+        /**
+         * Set the regular expression pattern which values of this property must
+         * match. By default there is no pattern defined.
+         *
+         * @param pattern
+         *            The regular expression pattern string, or
+         *            <code>null</code> if there is no pattern.
+         * @param patternUsage
+         *            A user-friendly usage string representing the pattern
+         *            which can be used in error messages and help (e.g. for
+         *            patterns which match a host/port combination, the usage
+         *            string "HOST:PORT" would be appropriate).
+         * @throws PatternSyntaxException
+         *             If the provided regular expression pattern has an invalid
+         *             syntax.
+         */
+        public final void setPattern(String pattern, String patternUsage) throws PatternSyntaxException {
+            if (pattern == null) {
+                this.pattern = null;
+                this.patternUsage = null;
+            } else {
+                this.pattern = Pattern.compile(pattern);
+                this.patternUsage = patternUsage;
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected StringPropertyDefinition buildInstance(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+                EnumSet<PropertyOption> options, AdministratorAction adminAction,
+                DefaultBehaviorProvider<String> defaultBehavior) {
+            return new StringPropertyDefinition(d, propertyName, options, adminAction, defaultBehavior,
+                    isCaseInsensitive, pattern, patternUsage);
+        }
+
+    }
+
+    /**
+     * Create a string property definition builder.
+     *
+     * @param d
+     *            The managed object definition associated with this property
+     *            definition.
+     * @param propertyName
+     *            The property name.
+     * @return Returns the new string property definition builder.
+     */
+    public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d, String propertyName) {
+        return new Builder(d, propertyName);
+    }
 
     // Flag indicating whether values of this property are
     // case-insensitive.
-    private boolean isCaseInsensitive = true;
+    private final boolean isCaseInsensitive;
 
     // Optional pattern which values of this property must match.
-    private Pattern pattern = null;
+    private final Pattern pattern;
 
     // Pattern usage which provides a user-friendly summary of the
     // pattern if present.
-    private String patternUsage = null;
+    private final String patternUsage;
 
-
-
-    // Private constructor
-    private Builder(AbstractManagedObjectDefinition<?, ?> d,
-        String propertyName) {
-      super(d, propertyName);
-    }
-
-
-
-    /**
-     * Set a flag indicating whether values of this property are
-     * case-insensitive.
-     *
-     * @param value
-     *          <code>true</code> if values are case-insensitive, or
-     *          <code>false</code> otherwise.
-     */
-    public final void setCaseInsensitive(boolean value) {
-      isCaseInsensitive = value;
-    }
-
-
-
-    /**
-     * Set the regular expression pattern which values of this
-     * property must match. By default there is no pattern defined.
-     *
-     * @param pattern
-     *          The regular expression pattern string, or
-     *          <code>null</code> if there is no pattern.
-     * @param patternUsage
-     *          A user-friendly usage string representing the pattern
-     *          which can be used in error messages and help (e.g. for
-     *          patterns which match a host/port combination, the
-     *          usage string "HOST:PORT" would be appropriate).
-     * @throws PatternSyntaxException
-     *           If the provided regular expression pattern has an
-     *           invalid syntax.
-     */
-    public final void setPattern(String pattern, String patternUsage)
-        throws PatternSyntaxException {
-      if (pattern == null) {
-        this.pattern = null;
-        this.patternUsage = null;
-      } else {
-        this.pattern = Pattern.compile(pattern);
+    // Private constructor.
+    private StringPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d, String propertyName,
+            EnumSet<PropertyOption> options, AdministratorAction adminAction,
+            DefaultBehaviorProvider<String> defaultBehavior, boolean isCaseInsensitive, Pattern pattern,
+            String patternUsage) {
+        super(d, String.class, propertyName, options, adminAction, defaultBehavior);
+        this.isCaseInsensitive = isCaseInsensitive;
+        this.pattern = pattern;
         this.patternUsage = patternUsage;
-      }
     }
 
-
-
     /**
      * {@inheritDoc}
      */
     @Override
-    protected StringPropertyDefinition buildInstance(
-        AbstractManagedObjectDefinition<?, ?> d, String propertyName,
-        EnumSet<PropertyOption> options,
-        AdministratorAction adminAction,
-        DefaultBehaviorProvider<String> defaultBehavior) {
-      return new StringPropertyDefinition(d, propertyName, options,
-          adminAction, defaultBehavior, isCaseInsensitive, pattern,
-          patternUsage);
+    public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
+        return v.visitString(this, p);
     }
 
-  }
-
-
-
-  /**
-   * Create a string property definition builder.
-   *
-   * @param d
-   *          The managed object definition associated with this
-   *          property definition.
-   * @param propertyName
-   *          The property name.
-   * @return Returns the new string property definition builder.
-   */
-  public static Builder createBuilder(AbstractManagedObjectDefinition<?, ?> d,
-      String propertyName) {
-    return new Builder(d, propertyName);
-  }
-
-  // Flag indicating whether values of this property are
-  // case-insensitive.
-  private final boolean isCaseInsensitive;
-
-  // Optional pattern which values of this property must match.
-  private final Pattern pattern;
-
-  // Pattern usage which provides a user-friendly summary of the
-  // pattern if present.
-  private final String patternUsage;
-
-
-
-  // Private constructor.
-  private StringPropertyDefinition(AbstractManagedObjectDefinition<?, ?> d,
-      String propertyName, EnumSet<PropertyOption> options,
-      AdministratorAction adminAction,
-      DefaultBehaviorProvider<String> defaultBehavior,
-      boolean isCaseInsensitive, Pattern pattern, String patternUsage) {
-    super(d, String.class, propertyName, options, adminAction,
-        defaultBehavior);
-    this.isCaseInsensitive = isCaseInsensitive;
-    this.pattern = pattern;
-    this.patternUsage = patternUsage;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyDefinitionVisitor<R, P> v, P p) {
-    return v.visitString(this, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
-    return v.visitString(this, value, p);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String decodeValue(String value)
-      throws IllegalPropertyValueStringException {
-    ensureNotNull(value);
-
-    try {
-      validateValue(value);
-    } catch (IllegalPropertyValueException e) {
-      throw new IllegalPropertyValueStringException(this, value);
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <R, P> R accept(PropertyValueVisitor<R, P> v, String value, P p) {
+        return v.visitString(this, value, p);
     }
 
-    return value;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String decodeValue(String value) throws IllegalPropertyValueStringException {
+        ensureNotNull(value);
 
+        try {
+            validateValue(value);
+        } catch (IllegalPropertyValueException e) {
+            throw new IllegalPropertyValueStringException(this, value);
+        }
 
-
-  /**
-   * Gets the optional regular expression pattern which values of this
-   * property must match.
-   *
-   * @return Returns the optional regular expression pattern which
-   *         values of this property must match, or <code>null</code>
-   *         if there is no pattern.
-   */
-  public Pattern getPattern() {
-    return pattern;
-  }
-
-
-
-  /**
-   * Gets the pattern synopsis of this string property definition in
-   * the default locale.
-   *
-   * @return Returns the pattern synopsis of this string property
-   *         definition in the default locale, or <code>null</code>
-   *         if there is no pattern synopsis (which is the case when
-   *         there is no pattern matching defined for this string
-   *         property definition).
-   */
-  public Message getPatternSynopsis() {
-    return getPatternSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the optional pattern synopsis of this string property
-   * definition in the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the pattern synopsis of this string property
-   *         definition in the specified locale, or <code>null</code>
-   *         if there is no pattern synopsis (which is the case when
-   *         there is no pattern matching defined for this string
-   *         property definition).
-   */
-  public Message getPatternSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "property." + getName()
-        + ".syntax.string.pattern.synopsis";
-    try {
-      return resource
-          .getMessage(getManagedObjectDefinition(), property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+        return value;
     }
-  }
 
-
-
-  /**
-   * Gets a user-friendly usage string representing the pattern which
-   * can be used in error messages and help (e.g. for patterns which
-   * match a host/port combination, the usage string "HOST:PORT" would
-   * be appropriate).
-   *
-   * @return Returns the user-friendly pattern usage string, or
-   *         <code>null</code> if there is no pattern.
-   */
-  public String getPatternUsage() {
-    return patternUsage;
-  }
-
-
-
-  /**
-   * Query whether values of this property are case-insensitive.
-   *
-   * @return Returns <code>true</code> if values are
-   *         case-insensitive, or <code>false</code> otherwise.
-   */
-  public boolean isCaseInsensitive() {
-    return isCaseInsensitive;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String normalizeValue(String value)
-      throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    if (isCaseInsensitive()) {
-      return value.trim().toLowerCase();
-    } else {
-      return value.trim();
+    /**
+     * Gets the optional regular expression pattern which values of this
+     * property must match.
+     *
+     * @return Returns the optional regular expression pattern which values of
+     *         this property must match, or <code>null</code> if there is no
+     *         pattern.
+     */
+    public Pattern getPattern() {
+        return pattern;
     }
-  }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public void validateValue(String value) throws IllegalPropertyValueException {
-    ensureNotNull(value);
-
-    if (pattern != null) {
-      Matcher matcher = pattern.matcher(value);
-      if (!matcher.matches()) {
-        throw new IllegalPropertyValueException(this, value);
-      }
+    /**
+     * Gets the pattern synopsis of this string property definition in the
+     * default locale.
+     *
+     * @return Returns the pattern synopsis of this string property definition
+     *         in the default locale, or <code>null</code> if there is no
+     *         pattern synopsis (which is the case when there is no pattern
+     *         matching defined for this string property definition).
+     */
+    public LocalizableMessage getPatternSynopsis() {
+        return getPatternSynopsis(Locale.getDefault());
     }
-  }
+
+    /**
+     * Gets the optional pattern synopsis of this string property definition in
+     * the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the pattern synopsis of this string property definition
+     *         in the specified locale, or <code>null</code> if there is no
+     *         pattern synopsis (which is the case when there is no pattern
+     *         matching defined for this string property definition).
+     */
+    public LocalizableMessage getPatternSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "property." + getName() + ".syntax.string.pattern.synopsis";
+        try {
+            return resource.getMessage(getManagedObjectDefinition(), property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Gets a user-friendly usage string representing the pattern which can be
+     * used in error messages and help (e.g. for patterns which match a
+     * host/port combination, the usage string "HOST:PORT" would be
+     * appropriate).
+     *
+     * @return Returns the user-friendly pattern usage string, or
+     *         <code>null</code> if there is no pattern.
+     */
+    public String getPatternUsage() {
+        return patternUsage;
+    }
+
+    /**
+     * Query whether values of this property are case-insensitive.
+     *
+     * @return Returns <code>true</code> if values are case-insensitive, or
+     *         <code>false</code> otherwise.
+     */
+    public boolean isCaseInsensitive() {
+        return isCaseInsensitive;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String normalizeValue(String value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        if (isCaseInsensitive()) {
+            return value.trim().toLowerCase();
+        } else {
+            return value.trim();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void validateValue(String value) throws IllegalPropertyValueException {
+        ensureNotNull(value);
+
+        if (pattern != null) {
+            Matcher matcher = pattern.matcher(value);
+            if (!matcher.matches()) {
+                throw new IllegalPropertyValueException(this, value);
+            }
+        }
+    }
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/Tag.java b/opendj-admin/src/main/java/org/opends/server/admin/Tag.java
index fcc4166..d7481f7 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/Tag.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/Tag.java
@@ -25,9 +25,8 @@
  *      Copyright 2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin;
-import org.opends.messages.Message;
 
-
+import static com.forgerock.opendj.util.Validator.*;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -36,177 +35,151 @@
 import java.util.Map;
 import java.util.MissingResourceException;
 
-import org.opends.server.admin.std.meta.RootCfgDefn;
-import org.opends.server.util.Validator;
-
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.admin.meta.RootCfgDefn;
 
 
 /**
  * An interface for querying the properties of a tag.
  * <p>
- * Tags are used to group related managed objects together into
- * categories.
+ * Tags are used to group related managed objects together into categories.
  */
 public final class Tag implements Comparable<Tag> {
 
-  // All the tags.
-  private static final Map<String, Tag> tags = new HashMap<String, Tag>();
+    // All the tags.
+    private static final Map<String, Tag> tags = new HashMap<String, Tag>();
 
+    /**
+     * Defines a new tag with the specified name.
+     *
+     * @param name
+     *            The name of the new tag.
+     */
+    public static void define(String name) {
+        Tag tag = new Tag(name);
 
-
-  /**
-   * Defines a new tag with the specified name.
-   *
-   * @param name
-   *          The name of the new tag.
-   */
-  public static void define(String name) {
-    Tag tag = new Tag(name);
-
-    // Register the tag.
-    tags.put(name, tag);
-  }
-
-
-
-  /**
-   * Returns the tag associated with the specified name.
-   *
-   * @param name
-   *          The name of the tag.
-   * @return Returns the tag associated with the specified name.
-   * @throws IllegalArgumentException
-   *           If the tag name was not recognized.
-   */
-  public static Tag valueOf(String name) throws IllegalArgumentException {
-    Validator.ensureNotNull(name);
-
-    // Hack to force initialization of the tag definitions.
-    RootCfgDefn.getInstance();
-
-    Tag tag = tags.get(name.toLowerCase());
-
-    if (tag == null) {
-      throw new IllegalArgumentException("Unknown tag \"" + name + "\"");
+        // Register the tag.
+        tags.put(name, tag);
     }
 
-    return tag;
-  }
+    /**
+     * Returns the tag associated with the specified name.
+     *
+     * @param name
+     *            The name of the tag.
+     * @return Returns the tag associated with the specified name.
+     * @throws IllegalArgumentException
+     *             If the tag name was not recognized.
+     */
+    public static Tag valueOf(String name) throws IllegalArgumentException {
+        ensureNotNull(name);
 
+        // Hack to force initialization of the tag definitions.
+        RootCfgDefn.getInstance();
 
+        Tag tag = tags.get(name.toLowerCase());
 
-  /**
-   * Returns an unmodifiable collection view of the set of registered
-   * tags.
-   *
-   * @return Returns an unmodifiable collection view of the set of
-   *         registered tags.
-   */
-  public static Collection<Tag> values() {
-    // Hack to force initialization of the tag definitions.
-    RootCfgDefn.getInstance();
+        if (tag == null) {
+            throw new IllegalArgumentException("Unknown tag \"" + name + "\"");
+        }
 
-    return Collections.unmodifiableCollection(tags.values());
-  }
-
-  // The name of the tag.
-  private final String name;
-
-
-
-  // Private constructor.
-  private Tag(String name) {
-    this.name = name;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  public final int compareTo(Tag o) {
-    return name.compareTo(o.name);
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final boolean equals(Object obj) {
-    if (this == obj) {
-      return true;
+        return tag;
     }
 
-    if (obj instanceof Tag) {
-      Tag other = (Tag) obj;
-      return other.name.equals(this.name);
+    /**
+     * Returns an unmodifiable collection view of the set of registered tags.
+     *
+     * @return Returns an unmodifiable collection view of the set of registered
+     *         tags.
+     */
+    public static Collection<Tag> values() {
+        // Hack to force initialization of the tag definitions.
+        RootCfgDefn.getInstance();
+
+        return Collections.unmodifiableCollection(tags.values());
     }
 
-    return false;
-  }
+    // The name of the tag.
+    private final String name;
 
-
-
-  /**
-   * Gets the name of this tag.
-   *
-   * @return Returns the name of this tag.
-   */
-  public final String getName() {
-    return name;
-  }
-
-
-
-  /**
-   * Gets the synopsis of this tag in the default locale.
-   *
-   * @return Returns the synopsis of this tag in the default locale.
-   */
-  public final Message getSynopsis() {
-    return getSynopsis(Locale.getDefault());
-  }
-
-
-
-  /**
-   * Gets the synopsis of this tag in the specified locale.
-   *
-   * @param locale
-   *          The locale.
-   * @return Returns the synopsis of this tag in the specified locale.
-   */
-  public final Message getSynopsis(Locale locale) {
-    ManagedObjectDefinitionI18NResource resource =
-      ManagedObjectDefinitionI18NResource.getInstance();
-    String property = "tag." + name + ".synopsis";
-    try {
-      return resource.getMessage(RootCfgDefn.getInstance(), property, locale);
-    } catch (MissingResourceException e) {
-      return null;
+    // Private constructor.
+    private Tag(String name) {
+        this.name = name;
     }
-  }
 
+    /**
+     * {@inheritDoc}
+     */
+    public final int compareTo(Tag o) {
+        return name.compareTo(o.name);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final int hashCode() {
-    return name.hashCode();
-  }
+        if (obj instanceof Tag) {
+            Tag other = (Tag) obj;
+            return other.name.equals(this.name);
+        }
 
+        return false;
+    }
 
+    /**
+     * Gets the name of this tag.
+     *
+     * @return Returns the name of this tag.
+     */
+    public final String getName() {
+        return name;
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public final String toString() {
-    return name;
-  }
+    /**
+     * Gets the synopsis of this tag in the default locale.
+     *
+     * @return Returns the synopsis of this tag in the default locale.
+     */
+    public final LocalizableMessage getSynopsis() {
+        return getSynopsis(Locale.getDefault());
+    }
+
+    /**
+     * Gets the synopsis of this tag in the specified locale.
+     *
+     * @param locale
+     *            The locale.
+     * @return Returns the synopsis of this tag in the specified locale.
+     */
+    public final LocalizableMessage getSynopsis(Locale locale) {
+        ManagedObjectDefinitionI18NResource resource = ManagedObjectDefinitionI18NResource.getInstance();
+        String property = "tag." + name + ".synopsis";
+        try {
+            return resource.getMessage(RootCfgDefn.getInstance(), property, locale);
+        } catch (MissingResourceException e) {
+            return null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final int hashCode() {
+        return name.hashCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String toString() {
+        return name;
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/UnknownPropertyDefinitionException.java b/opendj-admin/src/main/java/org/opends/server/admin/UnknownPropertyDefinitionException.java
index a58eda5..89228a8 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/UnknownPropertyDefinitionException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/UnknownPropertyDefinitionException.java
@@ -27,52 +27,41 @@
 
 package org.opends.server.admin;
 
-
-
-import static org.opends.messages.AdminMessages.*;
-
-
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 /**
- * Indicates that an unknown type of property definition was
- * encountered. This can occur as the management prototype develops
- * and new kinds of property definitions are added.
+ * Indicates that an unknown type of property definition was encountered. This
+ * can occur as the management prototype develops and new kinds of property
+ * definitions are added.
  */
-public final class UnknownPropertyDefinitionException
-    extends PropertyException {
+public final class UnknownPropertyDefinitionException extends PropertyException {
 
-  // Generated serialization ID.
-  private static final long serialVersionUID = 7042646409131322385L;
+    // Generated serialization ID.
+    private static final long serialVersionUID = 7042646409131322385L;
 
-  // The visitor parameter if there was one.
-  private Object parameter;
+    // The visitor parameter if there was one.
+    private Object parameter;
 
+    /**
+     * Creates a new unknown property definition exception.
+     *
+     * @param pd
+     *            The unknown property definition.
+     * @param p
+     *            The visitor parameter if there was one.
+     */
+    public UnknownPropertyDefinitionException(PropertyDefinition<?> pd, Object p) {
+        super(pd, ERR_UNKNOWN_PROPERTY_DEFINITION_EXCEPTION.get(pd.getName(), pd.getClass().getName()));
+        this.parameter = p;
+    }
 
-
-  /**
-   * Creates a new unknown property definition exception.
-   *
-   * @param pd
-   *          The unknown property definition.
-   * @param p
-   *          The visitor parameter if there was one.
-   */
-  public UnknownPropertyDefinitionException(PropertyDefinition<?> pd,
-      Object p) {
-    super(pd, ERR_UNKNOWN_PROPERTY_DEFINITION_EXCEPTION.get(pd.getName(), pd
-        .getClass().getName()));
-    this.parameter = p;
-  }
-
-
-
-  /**
-   * Get the visitor parameter if there was one.
-   *
-   * @return Returns the visitor parameter if there was one.
-   */
-  public Object getParameter() {
-    return parameter;
-  }
+    /**
+     * Get the visitor parameter if there was one.
+     *
+     * @return Returns the visitor parameter if there was one.
+     */
+    public Object getParameter() {
+        return parameter;
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/client/ClientConstraintHandler.java b/opendj-admin/src/main/java/org/opends/server/admin/client/ClientConstraintHandler.java
index fac52ab..f9bac2c 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/client/ClientConstraintHandler.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/client/ClientConstraintHandler.java
@@ -30,7 +30,7 @@
 
 import java.util.Collection;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.ManagedObjectPath;
 
 
@@ -87,7 +87,7 @@
    *           from being evaluated.
    */
   public boolean isAddAcceptable(ManagementContext context,
-      ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
+      ManagedObject<?> managedObject, Collection<LocalizableMessage> unacceptableReasons)
       throws AuthorizationException, CommunicationException {
     return true;
   }
@@ -122,7 +122,7 @@
    *           from being evaluated.
    */
   public boolean isModifyAcceptable(ManagementContext context,
-      ManagedObject<?> managedObject, Collection<Message> unacceptableReasons)
+      ManagedObject<?> managedObject, Collection<LocalizableMessage> unacceptableReasons)
       throws AuthorizationException, CommunicationException {
     return true;
   }
@@ -158,7 +158,7 @@
    *           from being evaluated.
    */
   public boolean isDeleteAcceptable(ManagementContext context,
-      ManagedObjectPath<?, ?> path, Collection<Message> unacceptableReasons)
+      ManagedObjectPath<?, ?> path, Collection<LocalizableMessage> unacceptableReasons)
       throws AuthorizationException, CommunicationException {
     return true;
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/package-info.java b/opendj-admin/src/main/java/org/opends/server/admin/package-info.java
index e97e137..b4afd62 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/package-info.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/package-info.java
@@ -33,7 +33,5 @@
  * This package contains administration related classes and interfaces
  * common to both the client and server.
  */
-@org.opends.server.types.PublicAPI(
-     stability=org.opends.server.types.StabilityLevel.PRIVATE)
 package org.opends.server.admin;
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerConstraintHandler.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerConstraintHandler.java
index 944a17b..e2c19e9 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerConstraintHandler.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerConstraintHandler.java
@@ -30,7 +30,7 @@
 
 import java.util.Collection;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.config.ConfigException;
 
 
@@ -91,7 +91,7 @@
    *           from being evaluated.
    */
   public boolean isDeleteAllowed(ServerManagedObject<?> managedObject,
-      Collection<Message> unacceptableReasons) throws ConfigException {
+      Collection<LocalizableMessage> unacceptableReasons) throws ConfigException {
     return true;
   }
 
@@ -124,7 +124,7 @@
    *           from being evaluated.
    */
   public boolean isUsable(ServerManagedObject<?> managedObject,
-      Collection<Message> unacceptableReasons) throws ConfigException {
+      Collection<LocalizableMessage> unacceptableReasons) throws ConfigException {
     return true;
   }
 
diff --git a/opendj-admin/src/main/java/org/opends/server/core/DirectoryServer.java b/opendj-admin/src/main/java/org/opends/server/core/DirectoryServer.java
index a312f73..e759115 100644
--- a/opendj-admin/src/main/java/org/opends/server/core/DirectoryServer.java
+++ b/opendj-admin/src/main/java/org/opends/server/core/DirectoryServer.java
@@ -36,4 +36,12 @@
         throw new RuntimeException("Not implemented");
     }
 
+    public static String getInstanceRoot() {
+        throw new RuntimeException("Not implemented");
+    }
+
+    public static String getServerRoot() {
+        throw new RuntimeException("Not implemented");
+    }
+
 }
diff --git a/opendj-admin/src/main/resources/com/forgerock/opendj/ldap/admin.properties b/opendj-admin/src/main/resources/com/forgerock/opendj/ldap/admin.properties
index 288d7c5..c6244b3 100644
--- a/opendj-admin/src/main/resources/com/forgerock/opendj/ldap/admin.properties
+++ b/opendj-admin/src/main/resources/com/forgerock/opendj/ldap/admin.properties
@@ -41,33 +41,33 @@
 #
 # ORDINAL is an integer unique among other ordinals in this file
 #
-SEVERE_ERR_ADMIN_CANNOT_GET_LISTENER_BASE_1=An error occurred while trying to \
+ERR_ADMIN_CANNOT_GET_LISTENER_BASE_1=An error occurred while trying to \
  retrieve relation configuration entry %s: %s
-SEVERE_ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT_3=An error occurred while trying \
+ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT_3=An error occurred while trying \
  to retrieve the managed object configuration entry %s: %s
-SEVERE_ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST_4=The managed object \
+ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST_4=The managed object \
  configuration entry %s does not appear to exist in the Directory Server \
  configuration. This is a required entry
-SEVERE_ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM_5=An error occurred while \
+ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM_5=An error occurred while \
  trying to decode the managed object configuration entry %s: %s
-SEVERE_ERR_ADMIN_CANNOT_INSTANTIATE_CLASS_6=The Directory Server was unable \
+ERR_ADMIN_CANNOT_INSTANTIATE_CLASS_6=The Directory Server was unable \
  to load class %s and use it to create a component instance as defined in \
  configuration entry %s.  The error that occurred was:  %s.  This component \
  will be disabled
-SEVERE_ERR_ADMIN_CANNOT_OPEN_JAR_FILE_9=The Directory Server jar file %s in \
+ERR_ADMIN_CANNOT_OPEN_JAR_FILE_9=The Directory Server jar file %s in \
  directory %s cannot be loaded because an unexpected error occurred while \
  trying to open the file for reading:  %s
 MILD_ERR_ADMIN_NO_EXTENSIONS_DIR_12=The extensions directory %s does not \
  exist, therefore no extensions will be loaded
-SEVERE_ERR_ADMIN_EXTENSIONS_DIR_NOT_DIRECTORY_13=Unable to read the Directory \
+ERR_ADMIN_EXTENSIONS_DIR_NOT_DIRECTORY_13=Unable to read the Directory \
  Server extensions because the extensions directory %s exists but is not a \
  directory
-SEVERE_ERR_ADMIN_EXTENSIONS_CANNOT_LIST_FILES_14=Unable to read the Directory \
+ERR_ADMIN_EXTENSIONS_CANNOT_LIST_FILES_14=Unable to read the Directory \
  Server extensions from directory %s because an unexpected error occurred \
  while trying to list the files in that directory:  %s
-FATAL_ERR_ADMIN_CANNOT_FIND_CORE_MANIFEST_15=The core administration manifest \
+ERR_ADMIN_CANNOT_FIND_CORE_MANIFEST_15=The core administration manifest \
  file %s cannot be located
-SEVERE_ERR_ADMIN_CANNOT_READ_EXTENSION_MANIFEST_17=The administration \
+ERR_ADMIN_CANNOT_READ_EXTENSION_MANIFEST_17=The administration \
  manifest file %s associated with the extension %s cannot be loaded because an \
  unexpected error occurred while trying to read it:  %s
 INFO_ADMIN_TOOL_DESCRIPTION_18=This utility can be used to perform operations \
@@ -95,30 +95,30 @@
  server group
 INFO_ADMIN_SUBCMD_LIST_MEMBERSHIP_DESCRIPTION_31=List server groups in which \
  the specified server is a member
-FATAL_ERR_ADMIN_CANNOT_CONNECT_TO_ADS_32=Could not connect to %s. Check that \
+ERR_ADMIN_CANNOT_CONNECT_TO_ADS_32=Could not connect to %s. Check that \
  the server is running and that the provided credentials are valid
 INFO_ADMIN_SUBCMD_CREATE_ADS_DESCRIPTION_33=Create a new ADS DN
 INFO_ADMIN_SUBCMD_DELETE_ADS_DESCRIPTION_34=Delete an existing ADS DN
-FATAL_ERR_ADMIN_MISSING_HOSTNAME_35=The host name is missing
-FATAL_ERR_ADMIN_NOVALID_HOSTNAME_36=The host name is not valid
-FATAL_ERR_ADMIN_MISSING_IPATH_37=The installation path is missing
-FATAL_ERR_ADMIN_NOVALID_IPATH_38=The installation path is not valid
-FATAL_ERR_ADMIN_ACCESS_PERMISSION_39=An access permission error occurs
-FATAL_ERR_ADMIN_ALREADY_REGISTERED_40=The entity is already registered
-FATAL_ERR_ADMIN_BROKEN_INSTALL_41=The administrative repository is broken
-FATAL_ERR_ADMIN_NOT_YET_REGISTERED_42=The entity is not yet registered
-FATAL_ERR_ADMIN_MISSING_PORT_43=The port is missing
-FATAL_ERR_ADMIN_NOVALID_PORT_44=The port is not valid
-FATAL_ERR_ADMIN_MISSING_NAME_45=The name is missing
-FATAL_ERR_ADMIN_MISSING_ADMIN_UID_46=The administration UID is missing
-FATAL_ERR_ADMIN_MISSING_ADMIN_PASSWORD_47=The administrator password is \
+ERR_ADMIN_MISSING_HOSTNAME_35=The host name is missing
+ERR_ADMIN_NOVALID_HOSTNAME_36=The host name is not valid
+ERR_ADMIN_MISSING_IPATH_37=The installation path is missing
+ERR_ADMIN_NOVALID_IPATH_38=The installation path is not valid
+ERR_ADMIN_ACCESS_PERMISSION_39=An access permission error occurs
+ERR_ADMIN_ALREADY_REGISTERED_40=The entity is already registered
+ERR_ADMIN_BROKEN_INSTALL_41=The administrative repository is broken
+ERR_ADMIN_NOT_YET_REGISTERED_42=The entity is not yet registered
+ERR_ADMIN_MISSING_PORT_43=The port is missing
+ERR_ADMIN_NOVALID_PORT_44=The port is not valid
+ERR_ADMIN_MISSING_NAME_45=The name is missing
+ERR_ADMIN_MISSING_ADMIN_UID_46=The administration UID is missing
+ERR_ADMIN_MISSING_ADMIN_PASSWORD_47=The administrator password is \
  missing
-FATAL_ERR_ADMIN_ERROR_UNEXPECTED_48=An unexpected error occurs
+ERR_ADMIN_ERROR_UNEXPECTED_48=An unexpected error occurs
 INFO_ADMIN_ERROR_49=[error]
 INFO_ADMIN_SUCCESSFUL_50=The operation has been successfully completed
 INFO_ADMIN_SUCCESSFUL_NOP_51=The operation has been successfully completed, \
  but no action was required
-SEVERE_ERR_ADMIN_NO_MESSAGE_52=
+ERR_ADMIN_NO_MESSAGE_52=
 INFO_ADMIN_ARG_CREATE_GROUP_GROUPNAME_DESCRIPTION_53=The new group's \
  identifier. This is a required argument
 INFO_ADMIN_ARG_GROUPNAME_DESCRIPTION_54=The group's identifier. This is a \
@@ -127,7 +127,7 @@
  required argument
 INFO_ADMIN_ARG_BACKENDNAME_DESCRIPTION_56=The name of the backend in which \
  the admin data will be stored
-SEVERE_ERR_ADMIN_UNABLE_TO_REGISTER_LISTENER_57=Unable to register an \
+ERR_ADMIN_UNABLE_TO_REGISTER_LISTENER_57=Unable to register an \
  add/delete listener against the entry "%s" because it does not exist in the \
  configuration
 INFO_ADMIN_SUBCMD_REGISTER_SERVER_DESCRIPTION_58=Register a server into the \
@@ -144,7 +144,7 @@
  properties
 INFO_ADMIN_ARG_SERVERID_DESCRIPTION_65=The registered server's unique \
  identifier. This is a required argument
-FATAL_ERR_ADMIN_SERVER_NOT_REGISTERED_66=The provided serverId is not \
+ERR_ADMIN_SERVER_NOT_REGISTERED_66=The provided serverId is not \
  registered
 INFO_ADMIN_SUBCMD_CREATE_ADMIN_USER_DESCRIPTION_67=Creates a new \
  administrator
@@ -160,131 +160,131 @@
  administrator's properties
 INFO_ADMIN_ARG_USERID_DESCRIPTION_73=The administrator's unique identifier. \
  This is a required argument
-SEVERE_ERR_OPERATION_REJECTED_DEFAULT_74=Reason unknown
-SEVERE_ERR_SERVER_CONSTRAINT_EXCEPTION_75=A configuration exception \
+ERR_OPERATION_REJECTED_DEFAULT_74=Reason unknown
+ERR_SERVER_CONSTRAINT_EXCEPTION_75=A configuration exception \
  occurred while evaluating a constraint: %s
-SEVERE_ERR_DECODING_EXCEPTION_NO_TYPE_INFO_82=The %s could \
+ERR_DECODING_EXCEPTION_NO_TYPE_INFO_82=The %s could \
  be found but did not contain any type information (e.g. missing object \
  classes in LDAP)
-SEVERE_ERR_DECODING_EXCEPTION_WRONG_TYPE_INFO_83=The %s could \
+ERR_DECODING_EXCEPTION_WRONG_TYPE_INFO_83=The %s could \
  be found but did not contain the expected type information (e.g. incorrect \
  object classes in LDAP)
-SEVERE_ERR_DECODING_EXCEPTION_ABSTRACT_TYPE_INFO_84=The %s \
+ERR_DECODING_EXCEPTION_ABSTRACT_TYPE_INFO_84=The %s \
  could be found but its type resolved to an abstract managed object \
  definition
-SEVERE_ERR_DEFAULT_BEHAVIOR_PROPERTY_EXCEPTION_86=The default values \
+ERR_DEFAULT_BEHAVIOR_PROPERTY_EXCEPTION_86=The default values \
  for the "%s" property could not be determined
-SEVERE_ERR_ILLEGAL_PROPERTY_VALUE_EXCEPTION_87=The value "%s" is not \
+ERR_ILLEGAL_PROPERTY_VALUE_EXCEPTION_87=The value "%s" is not \
  a valid value for the "%s" property, which must have the following \
  syntax: %s
-SEVERE_ERR_ILLEGAL_PROPERTY_VALUE_STRING_EXCEPTION_88=The string value \
+ERR_ILLEGAL_PROPERTY_VALUE_STRING_EXCEPTION_88=The string value \
  "%s" is not a valid value for the "%s" property, which must have the \
  following syntax: %s
-SEVERE_ERR_PROPERTY_IS_MANDATORY_EXCEPTION_89=The "%s" property must be \
+ERR_PROPERTY_IS_MANDATORY_EXCEPTION_89=The "%s" property must be \
  specified as it is mandatory
-SEVERE_ERR_PROPERTY_IS_READ_ONLY_EXCEPTION_90=The "%s" property must not \
+ERR_PROPERTY_IS_READ_ONLY_EXCEPTION_90=The "%s" property must not \
  be modified as it is read-only
-SEVERE_ERR_PROPERTY_IS_SINGLE_VALUED_EXCEPTION_91=The "%s" property \
+ERR_PROPERTY_IS_SINGLE_VALUED_EXCEPTION_91=The "%s" property \
  must not contain more than one value
-SEVERE_ERR_UNKNOWN_PROPERTY_DEFINITION_EXCEPTION_92=An internal error \
+ERR_UNKNOWN_PROPERTY_DEFINITION_EXCEPTION_92=An internal error \
  occurred while processing property "%s": unknown property type "%s"
-SEVERE_ERR_AUTHENTICATION_EXCEPTION_DEFAULT_93=Authentication failure
-SEVERE_ERR_AUTHENTICATION_NOT_SUPPORTED_EXCEPTION_DEFAULT_94=The \
+ERR_AUTHENTICATION_EXCEPTION_DEFAULT_93=Authentication failure
+ERR_AUTHENTICATION_NOT_SUPPORTED_EXCEPTION_DEFAULT_94=The \
  requested authentication mechanism is not supported by the server
-SEVERE_ERR_AUTHORIZATION_EXCEPTION_DEFAULT_95=Authorization failure
-SEVERE_ERR_COMMUNICATION_EXCEPTION_DEFAULT_96=A communication problem \
+ERR_AUTHORIZATION_EXCEPTION_DEFAULT_95=Authorization failure
+ERR_COMMUNICATION_EXCEPTION_DEFAULT_96=A communication problem \
  occurred while contacting the server
-SEVERE_ERR_OPERATION_REJECTED_EXCEPTION_SINGLE_97=The operation was rejected \
+ERR_OPERATION_REJECTED_EXCEPTION_SINGLE_97=The operation was rejected \
  for the following reason: %s
-SEVERE_ERR_OPERATION_REJECTED_EXCEPTION_PLURAL_98=The operation was rejected \
+ERR_OPERATION_REJECTED_EXCEPTION_PLURAL_98=The operation was rejected \
  for the following reasons: %s
-SEVERE_ERR_CONCURRENT_MODIFICATION_EXCEPTION_DEFAULT_99=The operation could \
+ERR_CONCURRENT_MODIFICATION_EXCEPTION_DEFAULT_99=The operation could \
  not be performed because a conflicting change has already occurred. There \
  may be another client administration tool in use
-SEVERE_ERR_MANAGED_OBJECT_DECODING_EXCEPTION_SINGLE_100=The %s could not \
+ERR_MANAGED_OBJECT_DECODING_EXCEPTION_SINGLE_100=The %s could not \
  be decoded due to the following reason: %s
-SEVERE_ERR_MANAGED_OBJECT_DECODING_EXCEPTION_PLURAL_101=The %s could not \
+ERR_MANAGED_OBJECT_DECODING_EXCEPTION_PLURAL_101=The %s could not \
  be decoded due to the following reasons: %s
-SEVERE_ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_EMPTY_102=Empty managed \
+ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_EMPTY_102=Empty managed \
  object names are not permitted
-SEVERE_ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_BLANK_103=Blank managed \
+ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_BLANK_103=Blank managed \
  object names are not permitted
-SEVERE_ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_SYNTAX_104=The managed \
+ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_SYNTAX_104=The managed \
  object name "%s" is not a valid value for the naming property "%s", \
  which must have the following syntax: %s
-SEVERE_ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_OTHER_105=The managed \
+ERR_ILLEGAL_MANAGED_OBJECT_NAME_EXCEPTION_OTHER_105=The managed \
  object name "%s" is not permitted
-SEVERE_ERR_MANAGED_OBJECT_ALREADY_EXISTS_EXCEPTION_106=The managed object \
+ERR_MANAGED_OBJECT_ALREADY_EXISTS_EXCEPTION_106=The managed object \
  could not be created because there is an existing managed object with \
  the same name
-SEVERE_ERR_MANAGED_OBJECT_NOT_FOUND_EXCEPTION_107=The requested managed \
+ERR_MANAGED_OBJECT_NOT_FOUND_EXCEPTION_107=The requested managed \
  object could not be found
-SEVERE_ERR_MISSING_MANDATORY_PROPERTIES_EXCEPTION_SINGLE_108=The "%s" \
+ERR_MISSING_MANDATORY_PROPERTIES_EXCEPTION_SINGLE_108=The "%s" \
  property is mandatory
-SEVERE_ERR_MISSING_MANDATORY_PROPERTIES_EXCEPTION_PLURAL_109=The following \
+ERR_MISSING_MANDATORY_PROPERTIES_EXCEPTION_PLURAL_109=The following \
  properties are mandatory: %s
-SEVERE_ERR_PROPERTY_NOT_FOUND_EXCEPTION_110=The property "%s" was not \
+ERR_PROPERTY_NOT_FOUND_EXCEPTION_110=The property "%s" was not \
  recognized
-SEVERE_ERR_COMMUNICATION_EXCEPTION_DEFAULT_CAUSE_111=A communication problem \
+ERR_COMMUNICATION_EXCEPTION_DEFAULT_CAUSE_111=A communication problem \
  occurred while contacting the server: %s
-SEVERE_ERR_CONSTRAINT_VIOLATION_EXCEPTION_SINGLE_112=The following \
+ERR_CONSTRAINT_VIOLATION_EXCEPTION_SINGLE_112=The following \
  constraint violation occurred: %s
-SEVERE_ERR_CONSTRAINT_VIOLATION_EXCEPTION_PLURAL_113=The following \
+ERR_CONSTRAINT_VIOLATION_EXCEPTION_PLURAL_113=The following \
  constraint violations occurred: %s
-SEVERE_ERR_SERVER_REFINT_DANGLING_REFERENCE_114=The value "%s" in \
+ERR_SERVER_REFINT_DANGLING_REFERENCE_114=The value "%s" in \
  property "%s" in the %s in entry "%s" refers to a non-existent %s \
  in entry "%s"
-SEVERE_ERR_SERVER_REFINT_TARGET_DISABLED_116=The value "%s" in \
+ERR_SERVER_REFINT_TARGET_DISABLED_116=The value "%s" in \
  property "%s" in the %s in entry "%s" refers to a disabled %s in \
  entry "%s"
-SEVERE_ERR_SERVER_REFINT_CANNOT_DELETE_117=The %s in entry "%s" \
+ERR_SERVER_REFINT_CANNOT_DELETE_117=The %s in entry "%s" \
  cannot be deleted because it is referenced by the "%s" property \
  of the %s in entry "%s"
-SEVERE_ERR_SERVER_REFINT_CANNOT_DISABLE_118=The %s in entry "%s" \
+ERR_SERVER_REFINT_CANNOT_DISABLE_118=The %s in entry "%s" \
  cannot be disabled because it is referenced by the "%s" property \
  of the %s in entry "%s"
-SEVERE_ERR_CLASS_LOADER_CANNOT_READ_MANIFEST_FILE_120=An unexpected \
+ERR_CLASS_LOADER_CANNOT_READ_MANIFEST_FILE_120=An unexpected \
  error occurred while reading the manifest file: %s
-SEVERE_ERR_CLASS_LOADER_CANNOT_LOAD_CLASS_121=An error occurred while \
+ERR_CLASS_LOADER_CANNOT_LOAD_CLASS_121=An error occurred while \
  attempting to load class "%s": %s
-SEVERE_ERR_CLASS_LOADER_CANNOT_FIND_GET_INSTANCE_METHOD_122=Unable to \
+ERR_CLASS_LOADER_CANNOT_FIND_GET_INSTANCE_METHOD_122=Unable to \
  to find the getInstance() method in the managed object definition \
  class "%s": %s
-SEVERE_ERR_CLASS_LOADER_CANNOT_INVOKE_GET_INSTANCE_METHOD_123=Unable to \
+ERR_CLASS_LOADER_CANNOT_INVOKE_GET_INSTANCE_METHOD_123=Unable to \
  to invoke the getInstance() method in the managed object definition \
  class "%s": %s
-SEVERE_ERR_CLASS_LOADER_CANNOT_INITIALIZE_DEFN_124=Unable initialize the \
+ERR_CLASS_LOADER_CANNOT_INITIALIZE_DEFN_124=Unable initialize the \
  "%s" managed object definition in class "%s": %s
-SEVERE_ERR_CLASS_LOADER_CANNOT_LOAD_EXTENSION_125=The extension "%s" \
+ERR_CLASS_LOADER_CANNOT_LOAD_EXTENSION_125=The extension "%s" \
  with manifest file %s cannot be loaded because an unexpected error \
  occurred while trying to initialize it: %s
-FATAL_ERR_CLASS_LOADER_CANNOT_LOAD_CORE_126=The core administration \
+ERR_CLASS_LOADER_CANNOT_LOAD_CORE_126=The core administration \
  classes could not be loaded from manifest file %s because an unexpected \
  error occurred: %s
-SEVERE_ERR_CLIENT_REFINT_TARGET_DANGLING_REFERENCE_127=The %s "%s" referenced in \
+ERR_CLIENT_REFINT_TARGET_DANGLING_REFERENCE_127=The %s "%s" referenced in \
  property "%s" does not exist
-SEVERE_ERR_CLIENT_REFINT_TARGET_INVALID_128=The %s "%s" referenced in \
+ERR_CLIENT_REFINT_TARGET_INVALID_128=The %s "%s" referenced in \
  property "%s" exists but has an invalid configuration: %s
-SEVERE_ERR_CLIENT_REFINT_TARGET_DISABLED_129=The %s "%s" referenced in \
+ERR_CLIENT_REFINT_TARGET_DISABLED_129=The %s "%s" referenced in \
  property "%s" is disabled
-SEVERE_ERR_CLIENT_REFINT_CANNOT_DELETE_WITH_NAME_130=The "%s" property \
+ERR_CLIENT_REFINT_CANNOT_DELETE_WITH_NAME_130=The "%s" property \
  in the %s called "%s" references this %s
-SEVERE_ERR_CLIENT_REFINT_CANNOT_DELETE_WITHOUT_NAME_131=The "%s" property \
+ERR_CLIENT_REFINT_CANNOT_DELETE_WITHOUT_NAME_131=The "%s" property \
  in the %s references this %s
-SEVERE_ERR_CLIENT_REFINT_CANNOT_DISABLE_WITH_NAME_132=This %s cannot be \
+ERR_CLIENT_REFINT_CANNOT_DISABLE_WITH_NAME_132=This %s cannot be \
  disabled because it is referenced by the "%s" property in the %s called "%s"
-SEVERE_ERR_CLIENT_REFINT_CANNOT_DISABLE_WITHOUT_NAME_133=This %s cannot be \
+ERR_CLIENT_REFINT_CANNOT_DISABLE_WITHOUT_NAME_133=This %s cannot be \
  disabled because it is referenced by the "%s" property in the %s
-SEVERE_ERR_REFINT_UNABLE_TO_EVALUATE_TARGET_CONDITION_134=An error occurred \
+ERR_REFINT_UNABLE_TO_EVALUATE_TARGET_CONDITION_134=An error occurred \
  while attempting to determine if the %s in entry %s is enabled: %s
-SEVERE_ERR_ADMIN_CERTIFICATE_GENERATION_135=The administration connector \
+ERR_ADMIN_CERTIFICATE_GENERATION_135=The administration connector \
 self-signed certificate cannot be generated because the following error \
 occurred: %s
-SEVERE_ERR_ADMIN_CERTIFICATE_GENERATION_MISSING_FILES_136=The administration \
+ERR_ADMIN_CERTIFICATE_GENERATION_MISSING_FILES_136=The administration \
 connector self-signed certificate cannot be generated because the following \
 files are missing: %s
 SEVERE_WARN_ADMIN_SET_PERMISSIONS_FAILED_137=Failed to set permissions \
  on file %s
-FATAL_ERR_ADMIN_MERGING_138=The registry information of the servers could not \
+ERR_ADMIN_MERGING_138=The registry information of the servers could not \
  be merged
 

--
Gitblit v1.10.0