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

---
 opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java                       | 2815 ++++++++++++++++++++-----------------------
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListener.java        |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigExceptionFactory.java                   |   10 
 opendj-admin/src/main/java/org/opends/server/admin/Constraint.java                                      |  134 -
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListener.java           |    4 
 opendj-admin/src/main/java/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java        |  158 +-
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationChangeListener.java              |    4 
 opendj-admin/src/main/java/org/opends/server/admin/doc/package-info.java                                |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDecodingException.java     |   16 
 opendj-admin/src/main/java/org/opends/server/admin/server/DelayedConfigAddListener.java                 |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigChangeListenerAdaptor.java              |   18 
 opendj-admin/src/main/java/org/opends/server/admin/server/AbstractConfigListenerAdaptor.java            |   10 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationAddListener.java                 |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListenerAdaptor.java    |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListener.java        |    4 
 opendj-admin/src/main/java/org/opends/server/types/DirectoryEnvironmentConfig.java                      |   39 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java                  |    8 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListenerAdaptor.java |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigAddListenerAdaptor.java                 |    8 
 opendj-admin/src/main/java/org/opends/server/api/ConfigChangeListener.java                              |    4 
 opendj-admin/src/main/java/org/opends/server/util/EmbeddedUtils.java                                    |  105 +
 opendj-admin/src/main/java/org/opends/server/admin/ConfigurationClient.java                             |   98 
 opendj-admin/pom.xml                                                                                    |  123 +
 opendj-admin/src/main/java/org/opends/server/admin/DecodingException.java                               |   29 
 opendj-admin/src/main/java/org/opends/server/api/ConfigAddListener.java                                 |    3 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationDeleteListener.java              |    4 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConstraintViolationException.java             |   28 
 opendj-admin/src/main/java/org/opends/server/admin/server/ConfigDeleteListenerAdaptor.java              |   12 
 opendj-admin/src/main/java/org/opends/server/admin/server/package-info.java                             |    2 
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java                      |    8 
 opendj-admin/src/main/java/org/opends/server/api/ConfigDeleteListener.java                              |   10 
 opendj-admin/src/main/java-templates/org/opends/server/util/DynamicConstants.java                       |  183 ++
 opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListenerAdaptor.java |    4 
 33 files changed, 2,027 insertions(+), 1,838 deletions(-)

diff --git a/opendj-admin/pom.xml b/opendj-admin/pom.xml
index b088d74..370aa07 100644
--- a/opendj-admin/pom.xml
+++ b/opendj-admin/pom.xml
@@ -57,6 +57,16 @@
     <adminPackage>org/forgerock/opendj/admin</adminPackage>
     <generatedSourcesDir>${project.build.directory}/generated-sources/admin/${adminPackage}</generatedSourcesDir>
     <xslDir>src/main/resources/stylesheets</xslDir>
+    
+    <!-- properties used to generate DynamicConstant class -->
+    <serverProductName>OpenDJ</serverProductName>
+    <serverShortProductName>OpenDJ</serverShortProductName>
+    <issuesFixIds></issuesFixIds>
+    <isDebugBuild>false</isDebugBuild>
+    <docReferenceHome>http://opendj.forgerock.org/</docReferenceHome>
+    <docReferenceWiki>http://opendj.forgerock.org/docs.html</docReferenceWiki>
+    <docQuickRefGuide>http://opendj.forgerock.org/doc/admin-guide/index.html</docQuickRefGuide>
+    <adminGuideUrl>http://opendj.forgerock.org/doc/admin-guide/index.html</adminGuideUrl>
   </properties>
   <build>
     <plugins>
@@ -350,19 +360,124 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-source-plugin</artifactId>
       </plugin>
+      <!-- Parse the maven version to get version parts (major, minor, ...) -->
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <version>2.4</version>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>1.8</version>
         <executions>
           <execution>
+            <id>parse-version</id>
             <goals>
-              <goal>test-jar</goal>
+              <goal>parse-version</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- Retrieve the SVN revision number and the build timestamp -->
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>buildnumber-maven-plugin</artifactId>
+        <version>1.2</version>
+        <executions>
+          <execution>
+            <id>generate-buildnumber</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>create</goal>
+            </goals>
+            <configuration>
+              <useLastCommittedRevision>true</useLastCommittedRevision>
+              <buildNumberPropertyName>buildRevision</buildNumberPropertyName>
+            </configuration>
+          </execution>
+          <execution>
+            <id>generate-timestamp</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>create</goal>
+            </goals>
+            <configuration>
+              <format>{0,date,yyyyMMddHHmmss}</format>
+              <items>
+                <item>timestamp</item>
+              </items>
+              <buildNumberPropertyName>buildDateTime</buildNumberPropertyName>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- Filter java sources located in src/main/java-templates -->
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>templating-maven-plugin</artifactId>
+        <version>1.0-alpha-3</version>
+        <executions>
+          <execution>
+            <id>filter-src</id>
+            <goals>
+              <goal>filter-sources</goal>
             </goals>
           </execution>
         </executions>
       </plugin>
     </plugins>
+    <pluginManagement>
+      <plugins>
+        <!--This plugin's configuration is used to store Eclipse m2e settings 
+          only. It has no influence on the Maven build itself. -->
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>build-helper-maven-plugin</artifactId>
+                    <versionRange>[1.8,)</versionRange>
+                    <goals>
+                      <goal>parse-version</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore></ignore>
+                  </action>
+                </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>templating-maven-plugin</artifactId>
+                    <versionRange>[1.0-alpha-3,)</versionRange>
+                    <goals>
+                      <goal>filter-sources</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore></ignore>
+                  </action>
+                </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>xml-maven-plugin</artifactId>
+                    <versionRange>[1.0,)</versionRange>
+                    <goals>
+                      <goal>transform</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore></ignore>
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
   </build>
   <reporting>
     <plugins>
diff --git a/opendj-admin/src/main/java-templates/org/opends/server/util/DynamicConstants.java b/opendj-admin/src/main/java-templates/org/opends/server/util/DynamicConstants.java
new file mode 100644
index 0000000..0fe2430
--- /dev/null
+++ b/opendj-admin/src/main/java-templates/org/opends/server/util/DynamicConstants.java
@@ -0,0 +1,183 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2011-2013 ForgeRock AS
+ */
+package org.opends.server.util;
+
+/**
+ * This file contains a number of constants that are used throughout the
+ * Directory Server source. It was dynamically generated as part of the
+ * build process and should not be edited directly.
+ */
+public final class DynamicConstants {
+
+    /**
+     * The official full product name for the Directory Server.
+     */
+    public static String PRODUCT_NAME = "${serverProductName}";
+
+    /**
+     * The short product name for the Directory Server.
+     */
+    public static String SHORT_NAME = "${serverShortProductName}";
+
+    /**
+     * The major version number for the Directory Server.
+     */
+    public static int MAJOR_VERSION = ${parsedVersion.majorVersion};
+
+    /**
+     * The minor version number for the Directory Server.
+     */
+    public static int MINOR_VERSION = ${parsedVersion.minorVersion};
+
+    /**
+     * The point version number for the Directory Server.
+     */
+    public static int POINT_VERSION = ${parsedVersion.incrementalVersion};
+
+    /**
+     * The official build number for the Directory Server.
+     */
+    public static int BUILD_NUMBER = ${parsedVersion.buildNumber};
+
+    /**
+     * The version qualifier string for the Directory Server.
+     */
+    public static String VERSION_QUALIFIER = "${parsedVersion.qualifier}";
+
+    /**
+     * The set of bug IDs for fixes included in this build of the Directory
+     * Server.
+     */
+    public static String FIX_IDS = "${issuesFixIds}";
+
+    /**
+     * The build ID for the generated build of the Directory Server.
+     */
+    public static String BUILD_ID = "${buildDateTime}";
+
+    /**
+     * The username of the user that created this build.
+     */
+    public static String BUILD_USER = "${user.name}";
+
+    /**
+     * The Java version used to generate this build.
+     */
+    public static String BUILD_JAVA_VERSION = "${java.version}";
+
+    /**
+     * The vendor for the Java version used to generate this build.
+     */
+    public static String BUILD_JAVA_VENDOR = "${java.vendor}";
+
+    /**
+     * The JVM version used to generate this build.
+     */
+    public static String BUILD_JVM_VERSION = "${java.vm.version}";
+
+    /**
+     * The vendor for the JVM used to generate this build.
+     */
+    public static String BUILD_JVM_VENDOR = "${java.vm.vendor}";
+
+    /**
+     * The operating system on which this build was generated.
+     */
+    public static String BUILD_OS = "${os.name} ${os.version} ${os.arch}"; 
+
+    /**
+     * Indicates whether this is a debug build of the Directory Server that may
+     * include additional debugging facilities not available in standard release
+     * versions.
+     */
+    public static boolean DEBUG_BUILD = ${isDebugBuild};
+
+    /**
+     * The Subversion revision number on which this build is based.
+     */
+    public static long REVISION_NUMBER = ${buildRevision};
+
+    /**
+     * The Subversion url repository location on which this build is based.
+     */
+    public static String URL_REPOSITORY = "${scm.url}";
+
+    /**
+     * The documentation home.
+     */
+    public static String DOC_REFERENCE_HOME = "${docReferenceHome}";
+
+    /**
+     * The documentation url.
+     */
+    public static String DOC_REFERENCE_WIKI = "${docReferenceWiki}";
+
+    /**
+     * The documentation url.
+     */
+    public static String DOC_QUICK_REFERENCE_GUIDE = "${docQuickRefGuide}";
+
+    /**
+     * The administration guide.
+     */
+    public static String ADMINISTRATION_GUIDE_URL = "${adminGuideUrl}";
+
+    /**
+     * A string representation of the version number.
+     */
+    public static String VERSION_NUMBER_STRING = "${project.version}";
+
+    /**
+     * A string representation of the version number.
+     */
+    public static String OPENDJ_NUMBER_STRING = "${project.version}";
+
+    /**
+     * A string representation of the release version.
+     */
+    public static String RELEASE_VERSION_STRING = OPENDJ_NUMBER_STRING;
+
+    /**
+     * A compact version string for this product, suitable for use in path names
+     * and similar cases.
+     */
+    public static String COMPACT_VERSION_STRING = SHORT_NAME + "-" + VERSION_NUMBER_STRING;
+
+    /**
+     * A full version string for this product.
+     */
+    public static String FULL_VERSION_STRING = PRODUCT_NAME + " " + RELEASE_VERSION_STRING
+            + (((FIX_IDS != null) && (FIX_IDS.length() > 0)) ? "+" + FIX_IDS : "");
+
+    /**
+     * A printable version string for this product.
+     */
+    public static final String PRINTABLE_VERSION_STRING = FULL_VERSION_STRING + System.getProperty("line.separator")
+            + "Build " + BUILD_ID + System.getProperty("line.separator");
+
+}
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java b/opendj-admin/src/main/java/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java
index bd4cb2b..fe4d8e6 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/AbsoluteInheritedDefaultBehaviorProvider.java
@@ -26,106 +26,88 @@
  */
 package org.opends.server.admin;
 
-
-
 /**
- * A default behavior provider which retrieves default values from a
- * managed object in an absolute location. It should be used by
- * properties which inherit their default value(s) from properties
- * held in an other managed object.
+ * A default behavior provider which retrieves default values from a managed
+ * object in an absolute location. It should be used by properties which inherit
+ * their default value(s) from properties held in an other managed object.
  *
  * @param <T>
- *          The type of values represented by this provider.
+ *            The type of values represented by this provider.
  */
-public final class AbsoluteInheritedDefaultBehaviorProvider<T> extends
-    DefaultBehaviorProvider<T> {
+public final class AbsoluteInheritedDefaultBehaviorProvider<T> extends DefaultBehaviorProvider<T> {
 
-  // The absolute path to the managed object containing the property.
-  private ManagedObjectPath<?, ?> path = null;
+    // The absolute path to the managed object containing the property.
+    private ManagedObjectPath<?, ?> path = null;
 
-  // The string representation of the managed object path specifying
-  // the absolute location of the managed object.
-  private final String pathString;
+    // The string representation of the managed object path specifying
+    // the absolute location of the managed object.
+    private final String pathString;
 
-  // The name of the property containing the inherited default values.
-  private final String propertyName;
+    // The name of the property containing the inherited default values.
+    private final String propertyName;
 
+    /**
+     * Create an absolute inherited default behavior provider associated with
+     * the managed object at the specified absolute location.
+     *
+     * @param pathString
+     *            The string representation of the managed object path
+     *            specifying the absolute location of the managed object.
+     * @param propertyName
+     *            The name of the property containing the inherited default
+     *            values.
+     */
+    public AbsoluteInheritedDefaultBehaviorProvider(String pathString, String propertyName) {
+        this.pathString = pathString;
+        this.propertyName = propertyName;
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    public <R, P> R accept(DefaultBehaviorProviderVisitor<T, R, P> v, P p) {
+        return v.visitAbsoluteInherited(this, p);
+    }
 
-  /**
-   * Create an absolute inherited default behavior provider associated
-   * with the managed object at the specified absolute location.
-   *
-   * @param pathString
-   *          The string representation of the managed object path
-   *          specifying the absolute location of the managed object.
-   * @param propertyName
-   *          The name of the property containing the inherited
-   *          default values.
-   */
-  public AbsoluteInheritedDefaultBehaviorProvider(String pathString,
-      String propertyName) {
-    this.pathString = pathString;
-    this.propertyName = propertyName;
-  }
+    /**
+     * Get the definition of the parent managed object containing the inherited
+     * default values.
+     *
+     * @return Returns the definition of the parent managed object containing
+     *         the inherited default values.
+     */
+    public AbstractManagedObjectDefinition<?, ?> getManagedObjectDefinition() {
+        return path.getManagedObjectDefinition();
+    }
 
+    /**
+     * Get the absolute path of the managed object containing the property which
+     * has the default values.
+     *
+     * @return Returns the absolute path of the managed object containing the
+     *         property which has the default values.
+     */
+    public ManagedObjectPath<?, ?> getManagedObjectPath() {
+        return path;
+    }
 
+    /**
+     * Gets the name of the property containing the inherited default values.
+     *
+     * @return Returns the name of the property containing the inherited default
+     *         values.
+     */
+    public String getPropertyName() {
+        return propertyName;
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  public <R, P> R accept(DefaultBehaviorProviderVisitor<T, R, P> v, P p) {
-    return v.visitAbsoluteInherited(this, p);
-  }
-
-
-
-  /**
-   * Get the definition of the parent managed object containing the
-   * inherited default values.
-   *
-   * @return Returns the definition of the parent managed object
-   *         containing the inherited default values.
-   */
-  public AbstractManagedObjectDefinition<?, ?> getManagedObjectDefinition() {
-    return path.getManagedObjectDefinition();
-  }
-
-
-
-  /**
-   * Get the absolute path of the managed object containing the
-   * property which has the default values.
-   *
-   * @return Returns the absolute path of the managed object
-   *         containing the property which has the default values.
-   */
-  public ManagedObjectPath<?, ?> getManagedObjectPath() {
-    return path;
-  }
-
-
-
-  /**
-   * Gets the name of the property containing the inherited default
-   * values.
-   *
-   * @return Returns the name of the property containing the inherited
-   *         default values.
-   */
-  public String getPropertyName() {
-    return propertyName;
-  }
-
-
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  protected void initialize() throws Exception {
-    // Decode the path.
-    path = ManagedObjectPath.valueOf(pathString);
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void initialize() throws Exception {
+        // Decode the path.
+        path = ManagedObjectPath.valueOf(pathString);
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ConfigurationClient.java b/opendj-admin/src/main/java/org/opends/server/admin/ConfigurationClient.java
index e08939f..5dd3ae7 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ConfigurationClient.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ConfigurationClient.java
@@ -27,74 +27,58 @@
 
 package org.opends.server.admin;
 
-
-
 import org.opends.server.admin.client.AuthorizationException;
 import org.opends.server.admin.client.CommunicationException;
 import org.opends.server.admin.client.ConcurrentModificationException;
 import org.opends.server.admin.client.MissingMandatoryPropertiesException;
 import org.opends.server.admin.client.OperationRejectedException;
 
-
-
 /**
- * A common base interface for all managed object configuration
- * clients.
+ * A common base interface for all managed object configuration clients.
  */
 public interface ConfigurationClient {
 
-  /**
-   * Get the configuration definition associated with this
-   * configuration.
-   *
-   * @return Returns the configuration definition associated with this
-   *         configuration.
-   */
-  ManagedObjectDefinition<? extends ConfigurationClient,
-      ? extends Configuration> definition();
+    /**
+     * Get the configuration definition associated with this configuration.
+     *
+     * @return Returns the configuration definition associated with this
+     *         configuration.
+     */
+    ManagedObjectDefinition<? extends ConfigurationClient, ? extends Configuration> definition();
 
+    /**
+     * Get a property provider view of this configuration.
+     *
+     * @return Returns a property provider view of this configuration.
+     */
+    PropertyProvider properties();
 
-
-  /**
-   * Get a property provider view of this configuration.
-   *
-   * @return Returns a property provider view of this configuration.
-   */
-  PropertyProvider properties();
-
-
-
-  /**
-   * If this is a new configuration this method will attempt to add it
-   * to the server, otherwise it will commit any changes made to this
-   * configuration.
-   *
-   * @throws ManagedObjectAlreadyExistsException
-   *           If this is a new configuration but it could not be
-   *           added to the server because it already exists.
-   * @throws MissingMandatoryPropertiesException
-   *           If this configuration contains some mandatory
-   *           properties which have been left undefined.
-   * @throws ConcurrentModificationException
-   *           If this is a new configuration which is being added to
-   *           the server but its parent has been removed by another
-   *           client, or if this configuration is being modified but
-   *           it has been removed from the server by another client.
-   * @throws OperationRejectedException
-   *           If the server refuses to add or modify this
-   *           configuration due to some server-side constraint which
-   *           cannot be satisfied.
-   * @throws AuthorizationException
-   *           If the server refuses to add or modify this
-   *           configuration because the client does not have the
-   *           correct privileges.
-   * @throws CommunicationException
-   *           If the client cannot contact the server due to an
-   *           underlying communication problem.
-   */
-  void commit() throws ManagedObjectAlreadyExistsException,
-      MissingMandatoryPropertiesException, ConcurrentModificationException,
-      OperationRejectedException, AuthorizationException,
-      CommunicationException;
+    /**
+     * If this is a new configuration this method will attempt to add it to the
+     * server, otherwise it will commit any changes made to this configuration.
+     *
+     * @throws ManagedObjectAlreadyExistsException
+     *             If this is a new configuration but it could not be added to
+     *             the server because it already exists.
+     * @throws MissingMandatoryPropertiesException
+     *             If this configuration contains some mandatory properties
+     *             which have been left undefined.
+     * @throws ConcurrentModificationException
+     *             If this is a new configuration which is being added to the
+     *             server but its parent has been removed by another client, or
+     *             if this configuration is being modified but it has been
+     *             removed from the server by another client.
+     * @throws OperationRejectedException
+     *             If the server refuses to add or modify this configuration due
+     *             to some server-side constraint which cannot be satisfied.
+     * @throws AuthorizationException
+     *             If the server refuses to add or modify this configuration
+     *             because the client does not have the correct privileges.
+     * @throws CommunicationException
+     *             If the client cannot contact the server due to an underlying
+     *             communication problem.
+     */
+    void commit() throws ManagedObjectAlreadyExistsException, MissingMandatoryPropertiesException,
+            ConcurrentModificationException, OperationRejectedException, AuthorizationException, CommunicationException;
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/Constraint.java b/opendj-admin/src/main/java/org/opends/server/admin/Constraint.java
index 46ca795..1d5ce6b 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/Constraint.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/Constraint.java
@@ -26,97 +26,79 @@
  */
 package org.opends.server.admin;
 
-
-
 import java.util.Collection;
 import java.util.Collections;
 
 import org.opends.server.admin.client.ClientConstraintHandler;
 import org.opends.server.admin.server.ServerConstraintHandler;
 
-
-
 /**
- * An interface for enforcing constraints and dependencies between
- * managed objects and their properties. Constraints express
- * relationships between managed objects and their properties, for
- * example:
+ * An interface for enforcing constraints and dependencies between managed
+ * objects and their properties. Constraints express relationships between
+ * managed objects and their properties, for example:
  * <ul>
- * <li>referential integrity: where one managed object references
- * another a constraint can enforce referential integrity. The
- * constraint can prevent creation of references to non-existent
- * managed objects, and also prevent deletion of referenced managed
- * objects
+ * <li>referential integrity: where one managed object references another a
+ * constraint can enforce referential integrity. The constraint can prevent
+ * creation of references to non-existent managed objects, and also prevent
+ * deletion of referenced managed objects
  * <li>property dependencies: for example, when a boolean property is
- * <code>true</code>, one or more additional properties must be
- * specified. This is useful for features like SSL, which when
- * enabled, requires that various SSL related configuration options
- * are specified
- * <li>property constraints: for example, when an upper limit
- * property must not have a value which is less than the lower limit
- * property.
+ * <code>true</code>, one or more additional properties must be specified. This
+ * is useful for features like SSL, which when enabled, requires that various
+ * SSL related configuration options are specified
+ * <li>property constraints: for example, when an upper limit property must not
+ * have a value which is less than the lower limit property.
  * </ul>
- * On the client-side constraints are enforced immediately before a
- * write operation is performed. That is to say, immediately before a
- * new managed object is created, changes to a managed object are
- * applied, or an existing managed object is deleted.
+ * On the client-side constraints are enforced immediately before a write
+ * operation is performed. That is to say, immediately before a new managed
+ * object is created, changes to a managed object are applied, or an existing
+ * managed object is deleted.
  */
 public abstract class Constraint {
 
-  /**
-   * Creates a new constraint.
-   */
-  protected Constraint() {
-    // No implementation required.
-  }
+    /**
+     * Creates a new constraint.
+     */
+    protected Constraint() {
+        // No implementation required.
+    }
 
+    /**
+     * Gets the client-side constraint handlers which will be used to enforce
+     * this constraint in client applications. The default implementation is to
+     * return an empty set of client constraint handlers.
+     *
+     * @return Returns the client-side constraint handlers which will be used to
+     *         enforce this constraint in client applications. The returned
+     *         collection must not be <code>null</code> but maybe empty
+     *         (indicating that the constraint can only be enforced on the
+     *         server-side).
+     */
+    public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
+        return Collections.emptySet();
+    }
 
+    /**
+     * Gets the server-side constraint handlers which will be used to enforce
+     * this constraint within the server. The default implementation is to
+     * return an empty set of server constraint handlers.
+     *
+     * @return Returns the server-side constraint handlers which will be used to
+     *         enforce this constraint within the server. The returned
+     *         collection must not be <code>null</code> and must not be empty,
+     *         since constraints must always be enforced on the server.
+     */
+    public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
+        return Collections.emptySet();
+    }
 
-  /**
-   * Gets the client-side constraint handlers which will be used to
-   * enforce this constraint in client applications. The default
-   * implementation is to return an empty set of client constraint
-   * handlers.
-   *
-   * @return Returns the client-side constraint handlers which will be
-   *         used to enforce this constraint in client applications.
-   *         The returned collection must not be <code>null</code>
-   *         but maybe empty (indicating that the constraint can only
-   *         be enforced on the server-side).
-   */
-  public Collection<ClientConstraintHandler> getClientConstraintHandlers() {
-    return Collections.emptySet();
-  }
-
-
-
-  /**
-   * Gets the server-side constraint handlers which will be used to
-   * enforce this constraint within the server. The default
-   * implementation is to return an empty set of server constraint
-   * handlers.
-   *
-   * @return Returns the server-side constraint handlers which will be
-   *         used to enforce this constraint within the server. The
-   *         returned collection must not be <code>null</code> and
-   *         must not be empty, since constraints must always be
-   *         enforced on the server.
-   */
-  public Collection<ServerConstraintHandler> getServerConstraintHandlers() {
-    return Collections.emptySet();
-  }
-
-
-
-  /**
-   * Initializes this constraint. The default implementation is to do
-   * nothing.
-   *
-   * @throws Exception
-   *           If this constraint could not be initialized.
-   */
-  protected void initialize() throws Exception {
-    // Default implementation is to do nothing.
-  }
+    /**
+     * Initializes this constraint. The default implementation is to do nothing.
+     *
+     * @throws Exception
+     *             If this constraint could not be initialized.
+     */
+    protected void initialize() throws Exception {
+        // Default implementation is to do nothing.
+    }
 
 }
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 95b6031..4d7494b 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
@@ -29,27 +29,24 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 
-
 /**
  * The requested managed object was found but it could not be decoded.
  */
 public abstract class DecodingException extends OperationsException {
 
-  /**
-   * Fake serialization ID.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * Fake serialization ID.
+     */
+    private static final long serialVersionUID = 1L;
 
-
-
-  /**
-   * Create a decoding exception with a message.
-   *
-   * @param message
-   *          The message.
-   */
-  protected DecodingException(LocalizableMessage message) {
-    super(message);
-  }
+    /**
+     * Create a decoding exception with a message.
+     *
+     * @param message
+     *            The message.
+     */
+    protected DecodingException(LocalizableMessage message) {
+        super(message);
+    }
 
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java b/opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java
index 7330ba4..4464ca3 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/doc/ConfigGuideGeneration.java
@@ -35,1593 +35,1406 @@
 import java.util.Properties;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import org.opends.messages.Message;
+
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.admin.meta.RootCfgDefn;
 import org.opends.server.admin.ACIPropertyDefinition;
 import org.opends.server.admin.AbsoluteInheritedDefaultBehaviorProvider;
 import org.opends.server.admin.AbstractManagedObjectDefinition;
 import org.opends.server.admin.AdministratorAction.Type;
-import org.opends.server.admin.std.meta.RootCfgDefn;
-import org.opends.server.admin.*;
+import org.opends.server.admin.AggregationPropertyDefinition;
+import org.opends.server.admin.AliasDefaultBehaviorProvider;
+import org.opends.server.admin.AttributeTypePropertyDefinition;
+import org.opends.server.admin.BooleanPropertyDefinition;
+import org.opends.server.admin.ClassLoaderProvider;
+import org.opends.server.admin.ClassPropertyDefinition;
+import org.opends.server.admin.DNPropertyDefinition;
+import org.opends.server.admin.DefaultBehaviorProvider;
+import org.opends.server.admin.DefinedDefaultBehaviorProvider;
+import org.opends.server.admin.DurationPropertyDefinition;
+import org.opends.server.admin.EnumPropertyDefinition;
+import org.opends.server.admin.IPAddressMaskPropertyDefinition;
+import org.opends.server.admin.IPAddressPropertyDefinition;
+import org.opends.server.admin.IntegerPropertyDefinition;
+import org.opends.server.admin.LDAPProfile;
+import org.opends.server.admin.ManagedObjectOption;
+import org.opends.server.admin.PropertyDefinition;
+import org.opends.server.admin.PropertyDefinitionVisitor;
+import org.opends.server.admin.PropertyOption;
+import org.opends.server.admin.RelationDefinition;
+import org.opends.server.admin.RelationOption;
+import org.opends.server.admin.RelativeInheritedDefaultBehaviorProvider;
+import org.opends.server.admin.SizePropertyDefinition;
+import org.opends.server.admin.StringPropertyDefinition;
+import org.opends.server.admin.Tag;
+import org.opends.server.admin.TopCfgDefn;
+import org.opends.server.admin.UndefinedDefaultBehaviorProvider;
 import org.opends.server.types.InitializationException;
-import org.opends.server.util.EmbeddedUtils;
 import org.opends.server.util.DynamicConstants;
+import org.opends.server.util.EmbeddedUtils;
 
 /**
- *  This class allow Configuration Guide documentation generation (html format).
+ * This class allow Configuration Guide documentation generation (html format).
  * It is based on the Admin Framework Introspection API
- *
  */
 public class ConfigGuideGeneration {
 
-  // Note : still to be done :
-  // I18n support. Today all the strings are hardcoded in this file
+    // Note : still to be done :
+    // I18n support. Today all the strings are hardcoded in this file
 
-  private final static String ACI_SYNTAX_REL_URL =
-    "/doc/admin-guide/#about-acis";
-  private final static String DURATION_SYNTAX_REL_URL =
-    "duration-syntax.html";
-  private final String CSS_FILE = "opendj-config.css";
+    private final static String ACI_SYNTAX_REL_URL = "/doc/admin-guide/#about-acis";
+    private final static String DURATION_SYNTAX_REL_URL = "duration-syntax.html";
+    private final String CSS_FILE = "opendj-config.css";
 
-  private final String MAIN_FILE = "index.html";
-  private final String INHERITANCE_TREE_FILE =
-    "ManagedObjectInheritanceTree.html";
-  private final String RELATION_TREE_FILE = "ManagedObjectRelationTree.html";
-  private final String MO_LIST_FILE = "ManagedObjectList.html";
-  private final String PROPERTIES_INDEX_FILE = "PropertiesIndex.html";
-  private final String WELCOME_FILE = "welcome.html";
-  private final String MAINTOP_FILE = "maintop.html";
-  private final String INDEX_FILE = "index.html";
-  private final String FAVICON = "http://forgerock.org/favicon.ico";
+    private final String MAIN_FILE = "index.html";
+    private final String INHERITANCE_TREE_FILE = "ManagedObjectInheritanceTree.html";
+    private final String RELATION_TREE_FILE = "ManagedObjectRelationTree.html";
+    private final String MO_LIST_FILE = "ManagedObjectList.html";
+    private final String PROPERTIES_INDEX_FILE = "PropertiesIndex.html";
+    private final String WELCOME_FILE = "welcome.html";
+    private final String MAINTOP_FILE = "maintop.html";
+    private final String INDEX_FILE = "index.html";
+    private final String FAVICON = "http://forgerock.org/favicon.ico";
 
-  private static final String CONFIG_GUIDE_DIR = "opendj_config_guide";
-  private final String MAIN_FRAME = "mainFrame";
+    private static final String CONFIG_GUIDE_DIR = "opendj_config_guide";
+    private final String MAIN_FRAME = "mainFrame";
 
-  /**
-   * Entry point for documentation generation.
-   *
-   * Properties:
-   * GenerationDir - The directory where the doc is generated
-   *              (default is /var/tmp/[CONFIG_GUIDE_DIR>])
-   * LdapMapping - Presence means that the LDAP mapping section is to be
-   *               generated (default is no)
-   * OpenDJWiki - The URL of the OpenDJ Wiki
-   *              (default is
-   *              "http://wikis.forgerock.org/confluence/display/OPENDJ")
-   * OpenDJHome - The URL of the OpenDJ project Home page
-   *              (default is "http://opendj.forgerock.org")
-   *
-   * @param args none.
-   */
-  public static void main(String[] args) {
-    Properties properties = System.getProperties();
-    generationDir = properties.getProperty("GenerationDir");
-    if (generationDir == null) {
-      // Default dir is prefixed by the system-dependent default temporary dir
-      generationDir = System.getProperty("java.io.tmpdir") + File.separator +
-        CONFIG_GUIDE_DIR;
-    }
-    // Create new dir if necessary
-    try {
-      (new File(generationDir)).mkdir();
-    } catch (Exception e) {
-      e.printStackTrace();
-      System.exit(1);
-    }
-    System.out.println("Generation directory is : " + generationDir);
-
-    if (properties.getProperty("LdapMapping") != null) {
-      ldapMapping = true;
-    }
-
-    OpenDJWiki = properties.getProperty("OpenDJWiki");
-    if (OpenDJWiki == null) {
-      // Default is current wiki
-      OpenDJWiki = "http://wikis.forgerock.org/confluence/display/OPENDJ";
-    }
-
-    OpenDJHome = properties.getProperty("OpenDJHome");
-    if (OpenDJHome == null) {
-      // Default is current OpenDJ project home
-      OpenDJHome = "http://opendj.forgerock.org";
-    }
-
-    aciSyntaxPage = OpenDJHome + ACI_SYNTAX_REL_URL;
-    durationSyntaxPage = DURATION_SYNTAX_REL_URL;
-
-    ConfigGuideGeneration myGen = new ConfigGuideGeneration();
-    myGen.generate();
-  }
-
-  private void generate() {
-    init();
-
-    // Generate the relation tree of all the managed objects
-    genManagedObjectRelationTree(catTopRelList);
-
-    // Generate the inheritance tree of all the managed objects
-    genManagedObjectInheritanceTree(catTopMoList);
-
-    // Generate all the managed objects and their children
-    genAllManagedObject(topMoList);
-
-    // Generate a list of managed objects
-    genManagedObjectList(moList);
-
-    // Generate an index of properties
-    genPropertiesIndex();
-
-    // Generate the Index page
-    genIndexPage();
-
-    // Generate the Main Top page
-    genMainTopPage();
-
-    // Generate the Welcome page
-    genWelcomePage();
-   }
-
-  private void init() {
-
-    // Build a list of top relations
-    RootCfgDefn rootCfg = RootCfgDefn.getInstance();
-    for (RelationDefinition rel : rootCfg.getAllRelationDefinitions()) {
-      topRelList.put(rel.getChildDefinition().getName(), rel);
-    }
-
-    // Enable the client-side class loader to explicitly load classes
-    // which are not directly reachable from the root configuration
-    EmbeddedUtils.initializeForClientUse();
-    // Bootstrap definition classes.
-    try {
-      ClassLoaderProvider.getInstance().enable();
-    } catch (InitializationException e) {
-      System.err.println("ERROR : Cannot enable the client-side class loader.");
-      e.printStackTrace();
-      System.exit(1);
-    }
-    // Switch off class name validation in client.
-    ClassPropertyDefinition.setAllowClassValidation(false);
-    // Switch off attribute type name validation in client.
-    AttributeTypePropertyDefinition.setCheckSchema(false);
-
-    // Build a sorted list of top managed objects
-    TopCfgDefn topCfg = TopCfgDefn.getInstance();
-    Collection<AbstractManagedObjectDefinition<?, ?>> topObjects =
-      topCfg.getChildren();
-    for (AbstractManagedObjectDefinition topObject : topObjects) {
-      if (topObject.getName().equals("")) {
-        // root
-        continue;
-      }
-      if (topObject.hasOption(ManagedObjectOption.HIDDEN))
-      {
-        continue;
-      }
-      topMoList.put(topObject.getName(), topObject);
-    }
-
-
-    // Build a list of top relations by category (core, database, ...)
-    for (RelationDefinition rel : topRelList.values()) {
-      AbstractManagedObjectDefinition<?, ?> mo = rel.getChildDefinition();
-      Collection<Tag> tags = mo.getAllTags();
-      for (Tag tag : tags) {
-        TreeMap<String, RelationDefinition> catMap =
-          catTopRelList.get(tag.getName());
-        if (catMap == null) {
-          catMap = new TreeMap<String, RelationDefinition>();
-          catTopRelList.put(tag.getName(), catMap);
+    /**
+     * Entry point for documentation generation. Properties: GenerationDir - The
+     * directory where the doc is generated (default is
+     * /var/tmp/[CONFIG_GUIDE_DIR>]) LdapMapping - Presence means that the LDAP
+     * mapping section is to be generated (default is no) OpenDJWiki - The URL
+     * of the OpenDJ Wiki (default is
+     * "http://wikis.forgerock.org/confluence/display/OPENDJ") OpenDJHome - The
+     * URL of the OpenDJ project Home page (default is
+     * "http://opendj.forgerock.org")
+     *
+     * @param args
+     *            none.
+     */
+    public static void main(String[] args) {
+        Properties properties = System.getProperties();
+        generationDir = properties.getProperty("GenerationDir");
+        if (generationDir == null) {
+            // Default dir is prefixed by the system-dependent default temporary
+            // dir
+            generationDir = System.getProperty("java.io.tmpdir") + File.separator + CONFIG_GUIDE_DIR;
         }
-        catMap.put(mo.getName(), rel);
-      }
+        // Create new dir if necessary
+        try {
+            (new File(generationDir)).mkdir();
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+        System.out.println("Generation directory is : " + generationDir);
+
+        if (properties.getProperty("LdapMapping") != null) {
+            ldapMapping = true;
+        }
+
+        OpenDJWiki = properties.getProperty("OpenDJWiki");
+        if (OpenDJWiki == null) {
+            // Default is current wiki
+            OpenDJWiki = "http://wikis.forgerock.org/confluence/display/OPENDJ";
+        }
+
+        OpenDJHome = properties.getProperty("OpenDJHome");
+        if (OpenDJHome == null) {
+            // Default is current OpenDJ project home
+            OpenDJHome = "http://opendj.forgerock.org";
+        }
+
+        aciSyntaxPage = OpenDJHome + ACI_SYNTAX_REL_URL;
+        durationSyntaxPage = DURATION_SYNTAX_REL_URL;
+
+        ConfigGuideGeneration myGen = new ConfigGuideGeneration();
+        myGen.generate();
     }
 
-    // Build a list of top managed objects by category (core, database, ...)
-    for (AbstractManagedObjectDefinition<?, ?> topObject : topMoList.values()) {
-      Collection<Tag> tags = topObject.getAllTags();
-      for (Tag tag : tags) {
-        TreeMap<String, AbstractManagedObjectDefinition> catMap =
-          catTopMoList.get(tag.getName());
-        if (catMap == null) {
-          catMap = new TreeMap<String, AbstractManagedObjectDefinition>();
-          catTopMoList.put(tag.getName(), catMap);
-        }
-        catMap.put(topObject.getName(), topObject);
-      }
+    private void generate() {
+        init();
+
+        // Generate the relation tree of all the managed objects
+        genManagedObjectRelationTree(catTopRelList);
+
+        // Generate the inheritance tree of all the managed objects
+        genManagedObjectInheritanceTree(catTopMoList);
+
+        // Generate all the managed objects and their children
+        genAllManagedObject(topMoList);
+
+        // Generate a list of managed objects
+        genManagedObjectList(moList);
+
+        // Generate an index of properties
+        genPropertiesIndex();
+
+        // Generate the Index page
+        genIndexPage();
+
+        // Generate the Main Top page
+        genMainTopPage();
+
+        // Generate the Welcome page
+        genWelcomePage();
     }
 
-  }
+    private void init() {
 
-  /**
-   * Generate the inheritance tree of all the managed objects.
-   */
-  @SuppressWarnings("unchecked")
-  private void genManagedObjectInheritanceTree(
-    TreeMap<String, TreeMap<String, AbstractManagedObjectDefinition>> list) {
-
-    htmlHeader(DynamicConstants.PRODUCT_NAME + " " +
-            "Configuration Reference - Inheritance View");
-    tabMenu(INHERITANCE_TREE_FILE);
-    viewHelp("This view represents the inheritance relationships between " +
-      "configuration components.");
-    jumpSection();
-
-    for (String catName : list.keySet()) {
-      heading3(getFriendlyName(catName));
-      // Get the list of the category
-      TreeMap<String, AbstractManagedObjectDefinition> catList =
-        list.get(catName);
-      for (AbstractManagedObjectDefinition mo : catList.values()) {
-        if ((relList.get(mo.getName()) != null) &&
-          (relList.get(mo.getName()).hasOption(RelationOption.HIDDEN))) {
-          continue;
+        // Build a list of top relations
+        RootCfgDefn rootCfg = RootCfgDefn.getInstance();
+        for (RelationDefinition rel : rootCfg.getAllRelationDefinitions()) {
+            topRelList.put(rel.getChildDefinition().getName(), rel);
         }
-        paragraph(
-          getLink(mo.getUserFriendlyName().toString(),
-          mo.getName() + ".html", MAIN_FRAME));
+
+        // Enable the client-side class loader to explicitly load classes
+        // which are not directly reachable from the root configuration
+        EmbeddedUtils.initializeForClientUse();
+        // Bootstrap definition classes.
+        try {
+            ClassLoaderProvider.getInstance().enable();
+        } catch (InitializationException e) {
+            System.err.println("ERROR : Cannot enable the client-side class loader.");
+            e.printStackTrace();
+            System.exit(1);
+        }
+        // Switch off class name validation in client.
+        ClassPropertyDefinition.setAllowClassValidation(false);
+        // Switch off attribute type name validation in client.
+        AttributeTypePropertyDefinition.setCheckSchema(false);
+
+        // Build a sorted list of top managed objects
+        TopCfgDefn topCfg = TopCfgDefn.getInstance();
+        Collection<AbstractManagedObjectDefinition<?, ?>> topObjects = topCfg.getChildren();
+        for (AbstractManagedObjectDefinition topObject : topObjects) {
+            if (topObject.getName().equals("")) {
+                // root
+                continue;
+            }
+            if (topObject.hasOption(ManagedObjectOption.HIDDEN)) {
+                continue;
+            }
+            topMoList.put(topObject.getName(), topObject);
+        }
+
+        // Build a list of top relations by category (core, database, ...)
+        for (RelationDefinition rel : topRelList.values()) {
+            AbstractManagedObjectDefinition<?, ?> mo = rel.getChildDefinition();
+            Collection<Tag> tags = mo.getAllTags();
+            for (Tag tag : tags) {
+                TreeMap<String, RelationDefinition> catMap = catTopRelList.get(tag.getName());
+                if (catMap == null) {
+                    catMap = new TreeMap<String, RelationDefinition>();
+                    catTopRelList.put(tag.getName(), catMap);
+                }
+                catMap.put(mo.getName(), rel);
+            }
+        }
+
+        // Build a list of top managed objects by category (core, database, ...)
+        for (AbstractManagedObjectDefinition<?, ?> topObject : topMoList.values()) {
+            Collection<Tag> tags = topObject.getAllTags();
+            for (Tag tag : tags) {
+                TreeMap<String, AbstractManagedObjectDefinition> catMap = catTopMoList.get(tag.getName());
+                if (catMap == null) {
+                    catMap = new TreeMap<String, AbstractManagedObjectDefinition>();
+                    catTopMoList.put(tag.getName(), catMap);
+                }
+                catMap.put(topObject.getName(), topObject);
+            }
+        }
+
+    }
+
+    /**
+     * Generate the inheritance tree of all the managed objects.
+     */
+    @SuppressWarnings("unchecked")
+    private void genManagedObjectInheritanceTree(TreeMap<String, TreeMap<String, AbstractManagedObjectDefinition>> list) {
+
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " " + "Configuration Reference - Inheritance View");
+        tabMenu(INHERITANCE_TREE_FILE);
+        viewHelp("This view represents the inheritance relationships between " + "configuration components.");
+        jumpSection();
+
+        for (String catName : list.keySet()) {
+            heading3(getFriendlyName(catName));
+            // Get the list of the category
+            TreeMap<String, AbstractManagedObjectDefinition> catList = list.get(catName);
+            for (AbstractManagedObjectDefinition mo : catList.values()) {
+                if ((relList.get(mo.getName()) != null) && (relList.get(mo.getName()).hasOption(RelationOption.HIDDEN))) {
+                    continue;
+                }
+                paragraph(getLink(mo.getUserFriendlyName().toString(), mo.getName() + ".html", MAIN_FRAME));
+                if (mo.hasChildren()) {
+                    genMoInheritanceTree(makeMOTreeMap(mo.getChildren()));
+                }
+            }
+        }
+
+        htmlFooter();
+        generateFile(INHERITANCE_TREE_FILE);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void genMoInheritanceTree(TreeMap<String, AbstractManagedObjectDefinition> catList) {
+
+        beginList();
+        for (AbstractManagedObjectDefinition mo : catList.values()) {
+            link(mo.getUserFriendlyName().toString(), mo.getName() + ".html", MAIN_FRAME);
+            if (mo.hasChildren()) {
+                genMoInheritanceTree(makeMOTreeMap(mo.getChildren()));
+            }
+        }
+        endList();
+    }
+
+    private void jumpSection() {
+        htmlBuff.append("<p class=\"category-index\">" + "<strong>Jump To:</strong><br>\n");
+
+        String[] catNames = catTopMoList.keySet().toArray(new String[0]);
+        for (int ii = 0; ii < catNames.length; ii++) {
+            if (ii != 0) {
+                htmlBuff.append(", ");
+            }
+            String catFriendlyName = getFriendlyName(catNames[ii]);
+            htmlBuff.append(getLink(catFriendlyName, "#" + catFriendlyName));
+        }
+        htmlBuff.append("</p>\n");
+    }
+
+    /**
+     * Generate the relation tree of all the managed objects.
+     */
+    private void genManagedObjectRelationTree(TreeMap<String, TreeMap<String, RelationDefinition>> list) {
+
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " Configuration Reference - Structure View");
+        tabMenu(RELATION_TREE_FILE);
+        viewHelp("This view represents the structural relationships between "
+                + "components and indicates how certain components can exist only within " + "container components.");
+        jumpSection();
+
+        for (String catName : list.keySet()) {
+            heading3(getFriendlyName(catName));
+            // Get the list of the category
+            TreeMap<String, RelationDefinition> catList = list.get(catName);
+            genMORelationTree(catList);
+        }
+
+        htmlFooter();
+        generateFile(RELATION_TREE_FILE);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void genMORelationTree(TreeMap<String, RelationDefinition> list) {
+        for (RelationDefinition rel : list.values()) {
+            AbstractManagedObjectDefinition childMo = rel.getChildDefinition();
+            AbstractManagedObjectDefinition parentMo = rel.getParentDefinition();
+            // Does not generate several entry for the same relation
+            if (relList.put(childMo.getName(), rel) != null) {
+                continue;
+            }
+            if (rel.hasOption(RelationOption.HIDDEN)) {
+                continue;
+            }
+            String linkStr = getLink(childMo.getUserFriendlyName().toString(), childMo.getName() + ".html", MAIN_FRAME);
+            String fromStr = "";
+            if (!parentMo.getName().equals("")) {
+                fromStr = " (from "
+                        + getLink(parentMo.getUserFriendlyName().toString(), parentMo.getName() + ".html", MAIN_FRAME)
+                        + ")";
+            }
+            if (!inList) {
+                paragraph(linkStr + fromStr);
+            } else {
+                bullet(linkStr + fromStr);
+            }
+            genMORelationSubTree(makeRelTreeMap(childMo.getAllRelationDefinitions()));
+            if (childMo.hasChildren()) {
+                for (Iterator<AbstractManagedObjectDefinition> it = childMo.getChildren().iterator(); it.hasNext();) {
+
+                    AbstractManagedObjectDefinition mo = it.next();
+                    if (mo.hasOption(ManagedObjectOption.HIDDEN)) {
+                        continue;
+                    }
+                    genMORelationSubTree(makeRelTreeMap(mo.getAllRelationDefinitions()));
+                }
+            }
+        }
+    }
+
+    private void genMORelationSubTree(TreeMap<String, RelationDefinition> list) {
+        if (!list.values().isEmpty()) {
+            beginList();
+            genMORelationTree(list);
+            endList();
+        }
+    }
+
+    /**
+     * Generate all the managed objects HTML pages.
+     */
+    @SuppressWarnings("unchecked")
+    private void genAllManagedObject(TreeMap<String, AbstractManagedObjectDefinition> list) {
+
+        for (AbstractManagedObjectDefinition mo : list.values()) {
+            if ((relList.get(mo.getName()) != null) && (relList.get(mo.getName()).hasOption(RelationOption.HIDDEN))) {
+                continue;
+            }
+            moList.put(mo.getName(), mo);
+            genManagedObject(mo);
+            if (mo.hasChildren()) {
+                genAllManagedObject(makeMOTreeMap(mo.getChildren()));
+            }
+        }
+    }
+
+    private void genManagedObject(AbstractManagedObjectDefinition mo) {
+        // ------------------------------------------------------------------------
+        // Header
+        // ------------------------------------------------------------------------
+
+        homeLink();
+        String title = mo.getUserFriendlyName().toString();
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " - " + title);
+
+        // title
+        heading2(title);
+
+        // Abstract notice
         if (mo.hasChildren()) {
-          genMoInheritanceTree(makeMOTreeMap(mo.getChildren()));
+            paragraph("Note: this is an abstract component, that cannot be instantiated.", TextStyle.ITALIC);
         }
-      }
-    }
 
-    htmlFooter();
-    generateFile(INHERITANCE_TREE_FILE);
-  }
+        // description
+        paragraph(mo.getSynopsis());
+        paragraph(mo.getDescription());
 
-  @SuppressWarnings("unchecked")
-  private void genMoInheritanceTree(
-    TreeMap<String, AbstractManagedObjectDefinition> catList) {
+        // sub-components
+        if (mo.hasChildren()) {
+            heading3("Direct Subcomponents");
+            paragraph("The following " + mo.getUserFriendlyPluralName() + " are available in the server :");
+            beginList();
+            @SuppressWarnings("unchecked")
+            TreeMap<String, AbstractManagedObjectDefinition> children = makeMOTreeMap(mo.getChildren());
+            for (AbstractManagedObjectDefinition child : children.values()) {
+                link(child.getUserFriendlyName().toString(), child.getName() + ".html");
+            }
+            endList();
 
-    beginList();
-    for (AbstractManagedObjectDefinition mo : catList.values()) {
-      link(mo.getUserFriendlyName().toString(), mo.getName() + ".html",
-        MAIN_FRAME);
-      if (mo.hasChildren()) {
-        genMoInheritanceTree(makeMOTreeMap(mo.getChildren()));
-      }
-    }
-    endList();
-  }
-
-   private void jumpSection() {
-     htmlBuff.append("<p class=\"category-index\">" +
-       "<strong>Jump To:</strong><br>\n");
-
-     String[] catNames = catTopMoList.keySet().toArray(new String[0]);
-    for (int ii=0; ii < catNames.length; ii++) {
-      if (ii != 0) {
-        htmlBuff.append(", ");
-      }
-      String catFriendlyName = getFriendlyName(catNames[ii]);
-      htmlBuff.append(getLink(catFriendlyName, "#" + catFriendlyName));
-    }
-    htmlBuff.append("</p>\n");
-   }
-
-
-  /**
-   * Generate the relation tree of all the managed objects.
-   */
-  private void genManagedObjectRelationTree(
-    TreeMap <String, TreeMap<String, RelationDefinition>> list) {
-
-    htmlHeader(DynamicConstants.PRODUCT_NAME +
-            " Configuration Reference - Structure View");
-    tabMenu(RELATION_TREE_FILE);
-    viewHelp("This view represents the structural relationships between " +
-      "components and indicates how certain components can exist only within " +
-      "container components.");
-    jumpSection();
-
-    for (String catName : list.keySet()) {
-      heading3(getFriendlyName(catName));
-      // Get the list of the category
-      TreeMap<String, RelationDefinition> catList = list.get(catName);
-      genMORelationTree(catList);
-    }
-
-    htmlFooter();
-    generateFile(RELATION_TREE_FILE);
-  }
-
-
-  @SuppressWarnings("unchecked")
-  private void genMORelationTree(TreeMap<String, RelationDefinition> list) {
-    for (RelationDefinition rel : list.values()) {
-      AbstractManagedObjectDefinition childMo = rel.getChildDefinition();
-      AbstractManagedObjectDefinition parentMo = rel.getParentDefinition();
-      // Does not generate several entry for the same relation
-      if (relList.put(childMo.getName(), rel) != null) {
-       continue;
-      }
-      if (rel.hasOption(RelationOption.HIDDEN)) {
-        continue;
-      }
-      String linkStr = getLink(childMo.getUserFriendlyName().toString(),
-        childMo.getName() + ".html", MAIN_FRAME);
-      String fromStr = "";
-      if (!parentMo.getName().equals("")) {
-        fromStr = " (from " +
-          getLink(parentMo.getUserFriendlyName().toString(),
-          parentMo.getName() + ".html", MAIN_FRAME) + ")";
-      }
-      if (!inList) {
-        paragraph(linkStr + fromStr);
-      } else {
-        bullet(linkStr + fromStr);
-      }
-      genMORelationSubTree(makeRelTreeMap(childMo.getAllRelationDefinitions()));
-      if (childMo.hasChildren()) {
-        for (Iterator<AbstractManagedObjectDefinition> it =
-          childMo.getChildren().iterator(); it.hasNext();) {
-
-          AbstractManagedObjectDefinition mo = it.next();
-          if (mo.hasOption(ManagedObjectOption.HIDDEN))
-          {
-            continue;
-          }
-          genMORelationSubTree(makeRelTreeMap(mo.getAllRelationDefinitions()));
+            paragraph("These " + mo.getUserFriendlyPluralName() + " inherit from the properties described below.");
         }
-      }
-    }
-  }
 
+        // Parent
+        if (!mo.getParent().isTop()) {
+            heading3("Parent Component");
+            paragraph("The " + mo.getUserFriendlyName() + " component inherits from the "
+                    + getLink(mo.getParent().getUserFriendlyName().toString(), mo.getParent().getName() + ".html"));
+        }
 
-  private void genMORelationSubTree(TreeMap<String, RelationDefinition> list) {
-    if (!list.values().isEmpty()) {
-      beginList();
-      genMORelationTree(list);
-      endList();
-    }
-  }
+        // Relations
+        generateRelationsSection(mo);
 
+        // Page links in case of LDAP mapping
+        if (ldapMapping) {
+            newline();
+            horizontalLine();
+            newline();
+            paragraph("This page describes the " + mo.getUserFriendlyName() + ":");
+            beginList();
+            link("Properties", "#Properties");
+            link("LDAP Mapping", "#LDAP Mapping");
+            endList();
+            newline();
+        }
 
-  /**
-   * Generate all the managed objects HTML pages.
-   */
-  @SuppressWarnings("unchecked")
-  private void genAllManagedObject(
-    TreeMap<String, AbstractManagedObjectDefinition> list) {
+        // ------------------------------------------------------------------------
+        // Properties
+        // ------------------------------------------------------------------------
 
-    for (AbstractManagedObjectDefinition mo : list.values()) {
-      if ((relList.get(mo.getName()) != null) &&
-        (relList.get(mo.getName()).hasOption(RelationOption.HIDDEN))) {
-        continue;
-      }
-      moList.put(mo.getName(), mo);
-      genManagedObject(mo);
-      if (mo.hasChildren()) {
-        genAllManagedObject(makeMOTreeMap(mo.getChildren()));
-      }
-    }
-  }
+        heading3("Properties");
 
-  private void genManagedObject(AbstractManagedObjectDefinition mo) {
-    //------------------------------------------------------------------------
-    // Header
-    //------------------------------------------------------------------------
-
-    homeLink();
-    String title = mo.getUserFriendlyName().toString();
-    htmlHeader(DynamicConstants.PRODUCT_NAME + " - " + title);
-
-    // title
-    heading2(title);
-
-    // Abstract notice
-    if (mo.hasChildren()) {
-      paragraph(
-        "Note: this is an abstract component, that cannot be instantiated.",
-        TextStyle.ITALIC);
-    }
-
-    // description
-    paragraph(mo.getSynopsis());
-    paragraph(mo.getDescription());
-
-    // sub-components
-    if (mo.hasChildren()) {
-      heading3("Direct Subcomponents");
-      paragraph("The following " + mo.getUserFriendlyPluralName() +
-        " are available in the server :");
-      beginList();
-      @SuppressWarnings("unchecked")
-      TreeMap<String, AbstractManagedObjectDefinition> children =
-        makeMOTreeMap(mo.getChildren());
-      for ( AbstractManagedObjectDefinition child : children.values()) {
-        link(child.getUserFriendlyName().toString(), child.getName() + ".html");
-      }
-      endList();
-
-      paragraph("These " + mo.getUserFriendlyPluralName() +
-        " inherit from the properties described below.");
-    }
-
-    // Parent
-    if (!mo.getParent().isTop()) {
-      heading3("Parent Component");
-      paragraph("The " + mo.getUserFriendlyName() +
-        " component inherits from the " +
-        getLink(mo.getParent().getUserFriendlyName().toString(),
-        mo.getParent().getName() + ".html"));
-    }
-
-    // Relations
-    generateRelationsSection(mo);
-
-    // Page links in case of LDAP mapping
-    if (ldapMapping) {
-      newline();
-      horizontalLine();
-      newline();
-      paragraph("This page describes the " + mo.getUserFriendlyName() + ":");
-      beginList();
-      link("Properties", "#Properties");
-      link("LDAP Mapping", "#LDAP Mapping");
-      endList();
-      newline();
-    }
-
-
-    //------------------------------------------------------------------------
-    // Properties
-    //------------------------------------------------------------------------
-
-    heading3("Properties");
-
-    paragraph("A description of each property follows.");
-    newline();
-
-    TreeMap<String, PropertyDefinition> basicProps =
-      new TreeMap<String, PropertyDefinition>();
-    TreeMap<String, PropertyDefinition> advancedProps =
-      new TreeMap<String, PropertyDefinition>();
-    // Properties actually defined in this managed object
-    @SuppressWarnings("unchecked")
-    Collection<PropertyDefinition> props = mo.getAllPropertyDefinitions();
-    for ( PropertyDefinition prop : props) {
-      if (prop.hasOption(PropertyOption.ADVANCED)) {
-        advancedProps.put(prop.getName(), prop);
-      } else {
-        basicProps.put(prop.getName(), prop);
-      }
-    }
-
-    propertiesLinkTable(basicProps, advancedProps);
-
-    // basic properties
-    if (basicProps.size() > 0) {
-      heading4("Basic Properties");
-      for ( PropertyDefinition prop : basicProps.values()) {
-        generateProperty(mo, prop);
+        paragraph("A description of each property follows.");
         newline();
-      }
-      newline();
-    }
 
-    // advanced properties
-    if (advancedProps.size() > 0) {
-      heading4("Advanced Properties");
-      for ( PropertyDefinition prop : advancedProps.values()) {
-        generateProperty(mo, prop);
-        newline();
-      }
-      newline();
-    }
-
-    if (ldapMapping) {
-      genLdapMapping(mo);
-    }
-
-    htmlFooter();
-
-    generateFile(mo.getName() + ".html");
-  }
-
-
-  private TreeMap<String, PropertyDefinition>
-    getPropertyList(AbstractManagedObjectDefinition mo) {
-
-    @SuppressWarnings("unchecked")
-    Collection<PropertyDefinition> props = mo.getAllPropertyDefinitions();
-    return makePropTreeMap(props);
-  }
-
-  private void homeLink() {
-    htmlBuff.append("<div style=\"font-size:11px;margin-top:-10px;" +
-      "margin-bottom:-10px; text-align:right\"><a href=\"" +
-      MAIN_FILE +
-      "\" target=\"_top\">Configuration Reference Home</a></div>");
-  }
-
-
-  private void generateRelationsSection(AbstractManagedObjectDefinition mo) {
-    // Composition relations
-    @SuppressWarnings("unchecked")
-    Collection<RelationDefinition> compRels = mo.getRelationDefinitions();
-    @SuppressWarnings("unchecked")
-    Collection<RelationDefinition> reverseCompRels =
-      mo.getReverseRelationDefinitions();
-    // Aggregation properties
-    @SuppressWarnings("unchecked")
-    Collection<AggregationPropertyDefinition> aggregProps =
-      mo.getAggregationPropertyDefinitions();
-    @SuppressWarnings("unchecked")
-    Collection<AggregationPropertyDefinition> reverseAggregProps =
-      mo.getReverseAggregationPropertyDefinitions();
-
-
-    // Check if something to print in composition relations
-    // (even if the list not empty, it may contain only hidden relations)
-    boolean isCompRelsEmpty = true;
-    if (!compRels.isEmpty()) {
-      for (RelationDefinition rel : compRels) {
-        if (rel.hasOption(RelationOption.HIDDEN)) {
-          continue;
-        }
-        isCompRelsEmpty = false;
-      }
-    }
-    boolean isReverseCompRelsEmpty = true;
-    if (!reverseCompRels.isEmpty()) {
-      for (RelationDefinition rel : reverseCompRels) {
-        if (rel.hasOption(RelationOption.HIDDEN)) {
-          continue;
-        }
-        // check if it is not root
-        if (rel.getParentDefinition().getName().equals("")) {
-          continue;
-        }
-        isReverseCompRelsEmpty = false;
-      }
-    }
-
-    // Check if something to print in reverse aggregation relations
-    // (even if the list not empty, it may contain only relations from
-    // hidden component)
-    boolean isReverseAggregPropsEmpty = true;
-    if (!reverseAggregProps.isEmpty()) {
-      for (AggregationPropertyDefinition agg : reverseAggregProps) {
-        AbstractManagedObjectDefinition fromMo =
-          agg.getManagedObjectDefinition();
+        TreeMap<String, PropertyDefinition> basicProps = new TreeMap<String, PropertyDefinition>();
+        TreeMap<String, PropertyDefinition> advancedProps = new TreeMap<String, PropertyDefinition>();
+        // Properties actually defined in this managed object
         @SuppressWarnings("unchecked")
-        Collection<RelationDefinition> rels =
-          fromMo.getAllReverseRelationDefinitions();
-        for (RelationDefinition rel : rels) {
-          if (rel.hasOption(RelationOption.HIDDEN)) {
-            continue;
-          }
-          isReverseAggregPropsEmpty = false;
+        Collection<PropertyDefinition> props = mo.getAllPropertyDefinitions();
+        for (PropertyDefinition prop : props) {
+            if (prop.hasOption(PropertyOption.ADVANCED)) {
+                advancedProps.put(prop.getName(), prop);
+            } else {
+                basicProps.put(prop.getName(), prop);
+            }
         }
-      }
-    }
 
+        propertiesLinkTable(basicProps, advancedProps);
 
-    //
-    // Relations FROM this component
-    //
-
-    if (!isCompRelsEmpty || !aggregProps.isEmpty()) {
-        heading3("Relations From this Component");
-    }
-
-    if (!isCompRelsEmpty) {
-      paragraph(
-        "The following components have a direct COMPOSITION relation FROM " +
-        mo.getUserFriendlyPluralName() + " :");
-      for ( RelationDefinition rel : compRels) {
-        if (rel.hasOption(RelationOption.HIDDEN)) {
-          continue;
+        // basic properties
+        if (basicProps.size() > 0) {
+            heading4("Basic Properties");
+            for (PropertyDefinition prop : basicProps.values()) {
+                generateProperty(mo, prop);
+                newline();
+            }
+            newline();
         }
-        beginList();
-        AbstractManagedObjectDefinition childRel = rel.getChildDefinition();
-        link(childRel.getUserFriendlyName().toString(), childRel.getName() +
-          ".html");
-        endList();
-      }
-    }
-    if (!aggregProps.isEmpty()) {
-      paragraph(
-        "The following components have a direct AGGREGATION relation FROM " +
-        mo.getUserFriendlyPluralName() + " :");
-      TreeMap<String, AbstractManagedObjectDefinition> componentList =
-        new TreeMap<String, AbstractManagedObjectDefinition>();
-      for ( AggregationPropertyDefinition agg : aggregProps) {
-        RelationDefinition rel = agg.getRelationDefinition();
-        AbstractManagedObjectDefinition childRel = rel.getChildDefinition();
-        componentList.put(childRel.getName(), childRel);
-      }
-      for (AbstractManagedObjectDefinition component : componentList.values()) {
-        beginList();
-        link(component.getUserFriendlyName().toString(), component.getName() +
-          ".html");
-        endList();
-      }
-    }
 
-
-    //
-    // Relations TO this component
-    //
-
-    if (!isReverseCompRelsEmpty || !isReverseAggregPropsEmpty) {
-        heading3("Relations To this Component");
-    }
-
-    if (!mo.getReverseRelationDefinitions().isEmpty()) {
-      if (!isReverseCompRelsEmpty) {
-        paragraph(
-          "The following components have a direct COMPOSITION relation TO " +
-          mo.getUserFriendlyPluralName() + " :");
-        for ( RelationDefinition rel : reverseCompRels) {
-          beginList();
-          AbstractManagedObjectDefinition childRel = rel.getParentDefinition();
-          link(childRel.getUserFriendlyName().toString(), childRel.getName() +
-            ".html");
-          endList();
+        // advanced properties
+        if (advancedProps.size() > 0) {
+            heading4("Advanced Properties");
+            for (PropertyDefinition prop : advancedProps.values()) {
+                generateProperty(mo, prop);
+                newline();
+            }
+            newline();
         }
-      }
-    }
-    if (!isReverseAggregPropsEmpty) {
-      paragraph(
-        "The following components have a direct AGGREGATION relation TO " +
-        mo.getUserFriendlyPluralName() + " :");
-      TreeMap<String, AbstractManagedObjectDefinition> componentList =
-        new TreeMap<String, AbstractManagedObjectDefinition>();
-      for ( AggregationPropertyDefinition agg : reverseAggregProps) {
-        AbstractManagedObjectDefinition fromMo =
-          agg.getManagedObjectDefinition();
-        componentList.put(fromMo.getName(), fromMo);
-      }
-      for (AbstractManagedObjectDefinition component : componentList.values()) {
-        beginList();
-        link(component.getUserFriendlyName().toString(), component.getName() +
-          ".html");
-        endList();
 
-      }
+        if (ldapMapping) {
+            genLdapMapping(mo);
+        }
+
+        htmlFooter();
+
+        generateFile(mo.getName() + ".html");
     }
 
-  }
+    private TreeMap<String, PropertyDefinition> getPropertyList(AbstractManagedObjectDefinition mo) {
 
-  private void generateProperty(
-    AbstractManagedObjectDefinition mo, PropertyDefinition prop) {
-
-    // Property name
-    paragraph(getAnchor(prop.getName()) + prop.getName(), TextStyle.STANDARD,
-      "propertyname");
-
-    // Property table
-    startTable();
-    tableRow("Description",
-      ((prop.getSynopsis() != null) ? prop.getSynopsis().toString()+ " " : "") +
-      ((prop.getDescription() != null) ?
-        prop.getDescription().toString() : ""));
-
-    // Default value
-    String defValueStr = getDefaultBehaviorString(prop);
-    tableRow("Default Value", defValueStr);
-
-    tableRow("Allowed Values", getSyntaxStr(prop));
-
-    tableRow("Multi-valued",
-      (prop.hasOption(PropertyOption.MULTI_VALUED) ? "Yes" : "No"));
-
-    if (prop.hasOption(PropertyOption.MANDATORY)) {
-      tableRow("Required", "Yes");
-    } else {
-      tableRow("Required", "No");
+        @SuppressWarnings("unchecked")
+        Collection<PropertyDefinition> props = mo.getAllPropertyDefinitions();
+        return makePropTreeMap(props);
     }
 
-    String action = "None";
-    if (prop.getAdministratorAction() != null) {
-      Message synopsis = prop.getAdministratorAction().getSynopsis();
-      Type actionType = prop.getAdministratorAction().getType();
-      String actionStr = "";
-      if (actionType == Type.COMPONENT_RESTART) {
-        actionStr = "The " + mo.getUserFriendlyName() +
-          " must be disabled and re-enabled for changes to this setting " +
-          "to take effect";
-      } else if (actionType == Type.SERVER_RESTART) {
-        actionStr = "Restart the server";
-      } else if (actionType == Type.NONE) {
-        actionStr = "None";
-      }
-      String dot = (actionStr.equals("") ? "" : ". ");
-      action = actionStr +
-        ((synopsis != null) ? dot + synopsis : "");
-    }
-    tableRow("Admin Action Required", action);
-
-    if (prop.hasOption(PropertyOption.ADVANCED)) {
-      tableRow("Advanced Property", "Yes");
-    } else {
-      tableRow("Advanced Property", "No");
+    private void homeLink() {
+        htmlBuff.append("<div style=\"font-size:11px;margin-top:-10px;"
+                + "margin-bottom:-10px; text-align:right\"><a href=\"" + MAIN_FILE
+                + "\" target=\"_top\">Configuration Reference Home</a></div>");
     }
 
-    if (prop.hasOption(PropertyOption.READ_ONLY)) {
-      tableRow("Read-only", "Yes");
-    } else {
-      tableRow("Read-only", "No");
+    private void generateRelationsSection(AbstractManagedObjectDefinition mo) {
+        // Composition relations
+        @SuppressWarnings("unchecked")
+        Collection<RelationDefinition> compRels = mo.getRelationDefinitions();
+        @SuppressWarnings("unchecked")
+        Collection<RelationDefinition> reverseCompRels = mo.getReverseRelationDefinitions();
+        // Aggregation properties
+        @SuppressWarnings("unchecked")
+        Collection<AggregationPropertyDefinition> aggregProps = mo.getAggregationPropertyDefinitions();
+        @SuppressWarnings("unchecked")
+        Collection<AggregationPropertyDefinition> reverseAggregProps = mo.getReverseAggregationPropertyDefinitions();
+
+        // Check if something to print in composition relations
+        // (even if the list not empty, it may contain only hidden relations)
+        boolean isCompRelsEmpty = true;
+        if (!compRels.isEmpty()) {
+            for (RelationDefinition rel : compRels) {
+                if (rel.hasOption(RelationOption.HIDDEN)) {
+                    continue;
+                }
+                isCompRelsEmpty = false;
+            }
+        }
+        boolean isReverseCompRelsEmpty = true;
+        if (!reverseCompRels.isEmpty()) {
+            for (RelationDefinition rel : reverseCompRels) {
+                if (rel.hasOption(RelationOption.HIDDEN)) {
+                    continue;
+                }
+                // check if it is not root
+                if (rel.getParentDefinition().getName().equals("")) {
+                    continue;
+                }
+                isReverseCompRelsEmpty = false;
+            }
+        }
+
+        // Check if something to print in reverse aggregation relations
+        // (even if the list not empty, it may contain only relations from
+        // hidden component)
+        boolean isReverseAggregPropsEmpty = true;
+        if (!reverseAggregProps.isEmpty()) {
+            for (AggregationPropertyDefinition agg : reverseAggregProps) {
+                AbstractManagedObjectDefinition fromMo = agg.getManagedObjectDefinition();
+                @SuppressWarnings("unchecked")
+                Collection<RelationDefinition> rels = fromMo.getAllReverseRelationDefinitions();
+                for (RelationDefinition rel : rels) {
+                    if (rel.hasOption(RelationOption.HIDDEN)) {
+                        continue;
+                    }
+                    isReverseAggregPropsEmpty = false;
+                }
+            }
+        }
+
+        //
+        // Relations FROM this component
+        //
+
+        if (!isCompRelsEmpty || !aggregProps.isEmpty()) {
+            heading3("Relations From this Component");
+        }
+
+        if (!isCompRelsEmpty) {
+            paragraph("The following components have a direct COMPOSITION relation FROM "
+                    + mo.getUserFriendlyPluralName() + " :");
+            for (RelationDefinition rel : compRels) {
+                if (rel.hasOption(RelationOption.HIDDEN)) {
+                    continue;
+                }
+                beginList();
+                AbstractManagedObjectDefinition childRel = rel.getChildDefinition();
+                link(childRel.getUserFriendlyName().toString(), childRel.getName() + ".html");
+                endList();
+            }
+        }
+        if (!aggregProps.isEmpty()) {
+            paragraph("The following components have a direct AGGREGATION relation FROM "
+                    + mo.getUserFriendlyPluralName() + " :");
+            TreeMap<String, AbstractManagedObjectDefinition> componentList = new TreeMap<String, AbstractManagedObjectDefinition>();
+            for (AggregationPropertyDefinition agg : aggregProps) {
+                RelationDefinition rel = agg.getRelationDefinition();
+                AbstractManagedObjectDefinition childRel = rel.getChildDefinition();
+                componentList.put(childRel.getName(), childRel);
+            }
+            for (AbstractManagedObjectDefinition component : componentList.values()) {
+                beginList();
+                link(component.getUserFriendlyName().toString(), component.getName() + ".html");
+                endList();
+            }
+        }
+
+        //
+        // Relations TO this component
+        //
+
+        if (!isReverseCompRelsEmpty || !isReverseAggregPropsEmpty) {
+            heading3("Relations To this Component");
+        }
+
+        if (!mo.getReverseRelationDefinitions().isEmpty()) {
+            if (!isReverseCompRelsEmpty) {
+                paragraph("The following components have a direct COMPOSITION relation TO "
+                        + mo.getUserFriendlyPluralName() + " :");
+                for (RelationDefinition rel : reverseCompRels) {
+                    beginList();
+                    AbstractManagedObjectDefinition childRel = rel.getParentDefinition();
+                    link(childRel.getUserFriendlyName().toString(), childRel.getName() + ".html");
+                    endList();
+                }
+            }
+        }
+        if (!isReverseAggregPropsEmpty) {
+            paragraph("The following components have a direct AGGREGATION relation TO "
+                    + mo.getUserFriendlyPluralName() + " :");
+            TreeMap<String, AbstractManagedObjectDefinition> componentList = new TreeMap<String, AbstractManagedObjectDefinition>();
+            for (AggregationPropertyDefinition agg : reverseAggregProps) {
+                AbstractManagedObjectDefinition fromMo = agg.getManagedObjectDefinition();
+                componentList.put(fromMo.getName(), fromMo);
+            }
+            for (AbstractManagedObjectDefinition component : componentList.values()) {
+                beginList();
+                link(component.getUserFriendlyName().toString(), component.getName() + ".html");
+                endList();
+
+            }
+        }
+
     }
 
-    endTable();
+    private void generateProperty(AbstractManagedObjectDefinition mo, PropertyDefinition prop) {
 
-  }
+        // Property name
+        paragraph(getAnchor(prop.getName()) + prop.getName(), TextStyle.STANDARD, "propertyname");
 
+        // Property table
+        startTable();
+        tableRow("Description",
+                ((prop.getSynopsis() != null) ? prop.getSynopsis().toString() + " " : "")
+                        + ((prop.getDescription() != null) ? prop.getDescription().toString() : ""));
 
-  private void propertiesLinkTable(TreeMap<String,
-    PropertyDefinition> basicProps,
-    TreeMap<String, PropertyDefinition> advancedProps) {
-    htmlBuff.append(
-      "<table border=\"0\" cellspacing=\"0\" class=\"jump-table\">\n" +
-      "  <tr>\n" +
-      "    <th>Basic Properties:</th>\n" +
-      "    <th>Advanced Properties:</th>\n" +
-      "  </tr>\n");
+        // Default value
+        String defValueStr = getDefaultBehaviorString(prop);
+        tableRow("Default Value", defValueStr);
 
-    PropertyDefinition[] basicPropsArray =
-      basicProps.values().toArray(new PropertyDefinition[0]);
-    PropertyDefinition[] advancedPropsArray =
-      advancedProps.values().toArray(new PropertyDefinition[0]);
+        tableRow("Allowed Values", getSyntaxStr(prop));
 
-    for (int ii=0;
-        (ii < basicPropsArray.length) || (ii < advancedPropsArray.length);
-        ii++) {
-      String basicPropName =
-        ii < basicPropsArray.length ? basicPropsArray[ii].getName() : null;
-      String advancedPropName =
-        ii < advancedPropsArray.length ?
-          advancedPropsArray[ii].getName() : null;
+        tableRow("Multi-valued", (prop.hasOption(PropertyOption.MULTI_VALUED) ? "Yes" : "No"));
 
-      String basicHtmlCell = "";
-      if (basicPropName != null) {
-        basicHtmlCell = "  <td>&darr;&nbsp;<a href=\"#" + basicPropName + "\">"
-          + basicPropName + "</a></td>\n";
-      } else if ((basicPropsArray.length == 0) && (ii == 0)) {
-        basicHtmlCell = "  <td>&nbsp;None</td>\n";
-      } else if (ii >= basicPropsArray.length) {
-        // Case of nb of basic props < nb of advanced props
-        basicHtmlCell = "  <td></td>\n";
-      }
-
-      String advancedHtmlCell = "";
-      if (advancedPropName != null) {
-        advancedHtmlCell = "  <td>&darr;&nbsp;<a href=\"#" + advancedPropName +
-          "\">" + advancedPropName + "</a></td>\n";
-      } else if ((advancedPropsArray.length == 0) && (ii == 0)) {
-        advancedHtmlCell = "  <td>&nbsp;None</td>\n";
-      }
-
-      htmlBuff.append("<tr>\n");
-      htmlBuff.append(basicHtmlCell + advancedHtmlCell);
-      htmlBuff.append("</tr>\n");
-    }
-    htmlBuff.append("</table>\n");
-  }
-
-
-  private void genLdapMapping(AbstractManagedObjectDefinition mo) {
-    //------------------------------------------------------------------------
-    // LDAP mapping
-    //------------------------------------------------------------------------
-
-    heading3("LDAP Mapping");
-    paragraph(
-      "Each configuration property can be mapped to a specific " +
-      "LDAP attribute under the \"cn=config\" entry. " +
-      "The mappings that follow are provided for information only. " +
-      "In general, you should avoid changing the server configuration " +
-      "by manipulating the LDAP attributes directly.");
-
-    // Managed object table
-    startTable();
-
-    LDAPProfile ldapProfile = LDAPProfile.getInstance();
-    tableRow("Base DN", getBaseDN(mo, ldapProfile));
-
-    tableRow("objectclass name", ldapProfile.getObjectClass(mo));
-    if (mo.getParent().getName() != null) {
-      String superior = "";
-      if (mo.getParent().getName().equals("top")) {
-        superior = "top";
-      } else {
-        if (moList.get(mo.getParent().getName()) != null) {
-          superior =
-            ldapProfile.getObjectClass(moList.get(mo.getParent().getName()));
+        if (prop.hasOption(PropertyOption.MANDATORY)) {
+            tableRow("Required", "Yes");
         } else {
-          System.err.println(
-            "Error: managed object " + mo.getName() + " not found.");
+            tableRow("Required", "No");
         }
-      }
-      tableRow("objectclass superior", superior);
-    } else {
-      System.err.println(
-        "Error: objectclass superior not found for " + mo.getName());
-    }
-    endTable();
 
-    newline();
-    // Properties table
-    startTable();
-    tableRow("Property", "LDAP attribute");
-    for ( PropertyDefinition prop : getPropertyList(mo).values()) {
-      tableRow(prop.getName(), ldapProfile.getAttributeName(mo, prop));
+        String action = "None";
+        if (prop.getAdministratorAction() != null) {
+            LocalizableMessage synopsis = prop.getAdministratorAction().getSynopsis();
+            Type actionType = prop.getAdministratorAction().getType();
+            String actionStr = "";
+            if (actionType == Type.COMPONENT_RESTART) {
+                actionStr = "The " + mo.getUserFriendlyName()
+                        + " must be disabled and re-enabled for changes to this setting " + "to take effect";
+            } else if (actionType == Type.SERVER_RESTART) {
+                actionStr = "Restart the server";
+            } else if (actionType == Type.NONE) {
+                actionStr = "None";
+            }
+            String dot = (actionStr.equals("") ? "" : ". ");
+            action = actionStr + ((synopsis != null) ? dot + synopsis : "");
+        }
+        tableRow("Admin Action Required", action);
+
+        if (prop.hasOption(PropertyOption.ADVANCED)) {
+            tableRow("Advanced Property", "Yes");
+        } else {
+            tableRow("Advanced Property", "No");
+        }
+
+        if (prop.hasOption(PropertyOption.READ_ONLY)) {
+            tableRow("Read-only", "Yes");
+        } else {
+            tableRow("Read-only", "No");
+        }
+
+        endTable();
+
     }
 
-    endTable();
+    private void propertiesLinkTable(TreeMap<String, PropertyDefinition> basicProps,
+            TreeMap<String, PropertyDefinition> advancedProps) {
+        htmlBuff.append("<table border=\"0\" cellspacing=\"0\" class=\"jump-table\">\n" + "  <tr>\n"
+                + "    <th>Basic Properties:</th>\n" + "    <th>Advanced Properties:</th>\n" + "  </tr>\n");
 
-  }
+        PropertyDefinition[] basicPropsArray = basicProps.values().toArray(new PropertyDefinition[0]);
+        PropertyDefinition[] advancedPropsArray = advancedProps.values().toArray(new PropertyDefinition[0]);
 
-  private void genManagedObjectList(
-    TreeMap<String, AbstractManagedObjectDefinition> list) {
+        for (int ii = 0; (ii < basicPropsArray.length) || (ii < advancedPropsArray.length); ii++) {
+            String basicPropName = ii < basicPropsArray.length ? basicPropsArray[ii].getName() : null;
+            String advancedPropName = ii < advancedPropsArray.length ? advancedPropsArray[ii].getName() : null;
 
-    htmlHeader(DynamicConstants.PRODUCT_NAME
-            + " Configuration Reference - Components View");
-    tabMenu(MO_LIST_FILE);
-    viewHelp("This view provides a list of all configuration components, " +
-      "in alphabetical order.");
+            String basicHtmlCell = "";
+            if (basicPropName != null) {
+                basicHtmlCell = "  <td>&darr;&nbsp;<a href=\"#" + basicPropName + "\">" + basicPropName + "</a></td>\n";
+            } else if ((basicPropsArray.length == 0) && (ii == 0)) {
+                basicHtmlCell = "  <td>&nbsp;None</td>\n";
+            } else if (ii >= basicPropsArray.length) {
+                // Case of nb of basic props < nb of advanced props
+                basicHtmlCell = "  <td></td>\n";
+            }
 
-    newline();
-    StringBuffer moPointers = new StringBuffer();
-    String lettersPointers = "";
-    String firstChar = ".";
-    for (AbstractManagedObjectDefinition mo : list.values()) {
-      if (!mo.getName().startsWith(firstChar)) {
-        firstChar = mo.getName().substring(0, 1);
-        String letter = firstChar.toUpperCase();
-        moPointers.append(getAnchor(letter) + getHeading2(letter));
-        lettersPointers += getLink(letter, "#" + letter) + " ";
-      }
-      moPointers.append(
-        "<p> " +
-        getLink(mo.getUserFriendlyName().toString(), mo.getName() + ".html",
-        MAIN_FRAME) +
-        "</p>\n");
-    }
-    paragraph(lettersPointers);
-    htmlBuff.append(moPointers);
-    htmlFooter();
-    generateFile(MO_LIST_FILE);
-  }
+            String advancedHtmlCell = "";
+            if (advancedPropName != null) {
+                advancedHtmlCell = "  <td>&darr;&nbsp;<a href=\"#" + advancedPropName + "\">" + advancedPropName
+                        + "</a></td>\n";
+            } else if ((advancedPropsArray.length == 0) && (ii == 0)) {
+                advancedHtmlCell = "  <td>&nbsp;None</td>\n";
+            }
 
-  private void genPropertiesIndex() {
-
-    // Build a sorted list of (property name + its managed object name)
-    TreeSet<String> propMoList = new TreeSet<String>();
-    for (AbstractManagedObjectDefinition<?, ?> mo : moList.values()) {
-      for (PropertyDefinition<?> prop : mo.getPropertyDefinitions()) {
-        propMoList.add(
-          prop.getName() + "," + prop.getManagedObjectDefinition().getName());
-      }
+            htmlBuff.append("<tr>\n");
+            htmlBuff.append(basicHtmlCell + advancedHtmlCell);
+            htmlBuff.append("</tr>\n");
+        }
+        htmlBuff.append("</table>\n");
     }
 
-    String lettersPointers = "";
-    String firstChar = ".";
-    for (String propMoStr : propMoList) {
-      String[] propMoArray = propMoStr.split(",");
-      String propName = propMoArray[0];
-      AbstractManagedObjectDefinition mo = moList.get(propMoArray[1]);
-      if (!propName.startsWith(firstChar)) {
-        firstChar = propName.substring(0, 1);
-        String letter = firstChar.toUpperCase();
-        htmlBuff.append(getAnchor(letter) + getHeading2(letter));
-        lettersPointers += getLink(letter, "#" + letter) + " ";
-      }
-      String propLink = getLink(propName,
-        mo.getName() + ".html" + "#" + propName, MAIN_FRAME);
-      String moLink =
-        getLink(mo.getUserFriendlyName().toString(), mo.getName() + ".html",
-        MAIN_FRAME, "#666");
-      paragraph(propLink + "  [ " + moLink + " ]");
+    private void genLdapMapping(AbstractManagedObjectDefinition mo) {
+        // ------------------------------------------------------------------------
+        // LDAP mapping
+        // ------------------------------------------------------------------------
+
+        heading3("LDAP Mapping");
+        paragraph("Each configuration property can be mapped to a specific "
+                + "LDAP attribute under the \"cn=config\" entry. "
+                + "The mappings that follow are provided for information only. "
+                + "In general, you should avoid changing the server configuration "
+                + "by manipulating the LDAP attributes directly.");
+
+        // Managed object table
+        startTable();
+
+        LDAPProfile ldapProfile = LDAPProfile.getInstance();
+        tableRow("Base DN", getBaseDN(mo, ldapProfile));
+
+        tableRow("objectclass name", ldapProfile.getObjectClass(mo));
+        if (mo.getParent().getName() != null) {
+            String superior = "";
+            if (mo.getParent().getName().equals("top")) {
+                superior = "top";
+            } else {
+                if (moList.get(mo.getParent().getName()) != null) {
+                    superior = ldapProfile.getObjectClass(moList.get(mo.getParent().getName()));
+                } else {
+                    System.err.println("Error: managed object " + mo.getName() + " not found.");
+                }
+            }
+            tableRow("objectclass superior", superior);
+        } else {
+            System.err.println("Error: objectclass superior not found for " + mo.getName());
+        }
+        endTable();
+
+        newline();
+        // Properties table
+        startTable();
+        tableRow("Property", "LDAP attribute");
+        for (PropertyDefinition prop : getPropertyList(mo).values()) {
+            tableRow(prop.getName(), ldapProfile.getAttributeName(mo, prop));
+        }
+
+        endTable();
+
     }
 
-    String indexBody = htmlBuff.toString();
-    htmlBuff = new StringBuffer();
-    htmlHeader(DynamicConstants.PRODUCT_NAME +
-            " Configuration Reference - Properties View");
-    tabMenu(PROPERTIES_INDEX_FILE);
-    viewHelp("This view provides a list of all configuration properties, " +
-      "in alphabetical order, and indicates the configuration component to " +
-      "which each property applies.");
+    private void genManagedObjectList(TreeMap<String, AbstractManagedObjectDefinition> list) {
 
-    newline();
-    paragraph(lettersPointers);
-    htmlBuff.append(indexBody);
-    htmlFooter();
-    generateFile(PROPERTIES_INDEX_FILE);
-  }
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " Configuration Reference - Components View");
+        tabMenu(MO_LIST_FILE);
+        viewHelp("This view provides a list of all configuration components, " + "in alphabetical order.");
+
+        newline();
+        StringBuffer moPointers = new StringBuffer();
+        String lettersPointers = "";
+        String firstChar = ".";
+        for (AbstractManagedObjectDefinition mo : list.values()) {
+            if (!mo.getName().startsWith(firstChar)) {
+                firstChar = mo.getName().substring(0, 1);
+                String letter = firstChar.toUpperCase();
+                moPointers.append(getAnchor(letter) + getHeading2(letter));
+                lettersPointers += getLink(letter, "#" + letter) + " ";
+            }
+            moPointers.append("<p> " + getLink(mo.getUserFriendlyName().toString(), mo.getName() + ".html", MAIN_FRAME)
+                    + "</p>\n");
+        }
+        paragraph(lettersPointers);
+        htmlBuff.append(moPointers);
+        htmlFooter();
+        generateFile(MO_LIST_FILE);
+    }
+
+    private void genPropertiesIndex() {
+
+        // Build a sorted list of (property name + its managed object name)
+        TreeSet<String> propMoList = new TreeSet<String>();
+        for (AbstractManagedObjectDefinition<?, ?> mo : moList.values()) {
+            for (PropertyDefinition<?> prop : mo.getPropertyDefinitions()) {
+                propMoList.add(prop.getName() + "," + prop.getManagedObjectDefinition().getName());
+            }
+        }
+
+        String lettersPointers = "";
+        String firstChar = ".";
+        for (String propMoStr : propMoList) {
+            String[] propMoArray = propMoStr.split(",");
+            String propName = propMoArray[0];
+            AbstractManagedObjectDefinition mo = moList.get(propMoArray[1]);
+            if (!propName.startsWith(firstChar)) {
+                firstChar = propName.substring(0, 1);
+                String letter = firstChar.toUpperCase();
+                htmlBuff.append(getAnchor(letter) + getHeading2(letter));
+                lettersPointers += getLink(letter, "#" + letter) + " ";
+            }
+            String propLink = getLink(propName, mo.getName() + ".html" + "#" + propName, MAIN_FRAME);
+            String moLink = getLink(mo.getUserFriendlyName().toString(), mo.getName() + ".html", MAIN_FRAME, "#666");
+            paragraph(propLink + "  [ " + moLink + " ]");
+        }
+
+        String indexBody = htmlBuff.toString();
+        htmlBuff = new StringBuffer();
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " Configuration Reference - Properties View");
+        tabMenu(PROPERTIES_INDEX_FILE);
+        viewHelp("This view provides a list of all configuration properties, "
+                + "in alphabetical order, and indicates the configuration component to "
+                + "which each property applies.");
+
+        newline();
+        paragraph(lettersPointers);
+        htmlBuff.append(indexBody);
+        htmlFooter();
+        generateFile(PROPERTIES_INDEX_FILE);
+    }
 
     private void genWelcomePage() {
-    htmlHeader(DynamicConstants.PRODUCT_NAME +
-            " Configuration Reference - Welcome");
-    heading2("About This Reference");
-    paragraph("This reference " +
-      "describes the " + DynamicConstants.PRODUCT_NAME +
-      " configuration properties that can be manipulated " +
-      "with the dsconfig command.");
-    paragraph("Configuration components are grouped according to the area of " +
-      "the server in which they are used, as follows:");
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " Configuration Reference - Welcome");
+        heading2("About This Reference");
+        paragraph("This reference " + "describes the " + DynamicConstants.PRODUCT_NAME
+                + " configuration properties that can be manipulated " + "with the dsconfig command.");
+        paragraph("Configuration components are grouped according to the area of "
+                + "the server in which they are used, as follows:");
 
-    beginList();
-    for (String catName : catTopMoList.keySet()) {
-      bullet(getFriendlyName(catName));
-    }
-    endList();
-
-    paragraph(
-      "For ease of reference, the configuration is described on multiple " +
-      "tabs. These tabs provide alternative views of the configuration " +
-      "components:");
-    beginList();
-    bullet("The <strong>Inheritance</strong> view represents the inheritance " +
-      "relationships between configuration components. A sub-component " +
-      "inherits all of the properties of its parent component.");
-    bullet("The <strong>Structure</strong> view represents the structural " +
-      "relationships between components and indicates how certain components " +
-      "can exist only within container components. When a container " +
-      "component is deleted, all of the components within it are also " +
-      "deleted.");
-    bullet(
-      "The <strong>Components</strong> view provides an alphabetical list " +
-      "of all configuration components.");
-    bullet(
-      "The <strong>Properties</strong> view provides an alphabetical list " +
-      "of all configuration properties, and indicates the configuration " +
-      "component to which each property applies.");
-    endList();
-
-    newline();
-    paragraph("When you set up " +
-            DynamicConstants.PRODUCT_NAME +
-            ", certain components are created in the " +
-      "configuration by default. These components are configured with " +
-      "specific values, which are not necessarily the same as the " +
-      "\"default values\" of new components that you create using dsconfig. " +
-      "The \"default values\" listed in this document refer to the values " +
-      "of the new components that you create using dsconfig.");
-
-    htmlFooter();
-    generateFile(WELCOME_FILE);
-
-  }
-
-  private void genMainTopPage() {
-    htmlHeader(DynamicConstants.PRODUCT_NAME +
-            " Configuration Reference - Main Top");
-    htmlBuff.append("<div class=\"breadcrumb\"><span class=\"pageactions\">" +
-      "<a href=\"" + OpenDJHome + "\" target=\"_parent\">" +
-      "<span style=\"font-size: 12px;\">&laquo;&nbsp;&nbsp;</span>" +
-      "Back to " +
-      DynamicConstants.PRODUCT_NAME + " Home</a></span>&nbsp;&nbsp;</div>\n");
-    htmlBuff.append("<table class=\"titletable\" cellspacing=\"0\" " +
-      "width=\"100%\">\n");
-    htmlBuff.append("<tbody><tr>\n");
-    htmlBuff.append("  <td><h2>"+
-            DynamicConstants.PRODUCT_NAME +
-            " Configuration Reference</h2></td>\n");
-    htmlBuff.append("  <td valign=\"bottom\" width=\"10%\">" +
-      "<a href=\"" + OpenDJHome + "\" target=\"_parent\">" +
-      "<img src=\"opendj_logo_sm.png\" alt=\"OpenDJ Logo\" align=\"bottom\" " +
-      "border=\"0\" height=\"33\" width=\"114\"></a></td>\n");
-    htmlBuff.append("</tr>\n");
-    htmlBuff.append("</tbody></table>\n");
-
-    htmlFooter();
-    generateFile(MAINTOP_FILE);
-
-  }
-
-  private void genIndexPage() {
-    htmlBuff.append(getHtmlHeader(
-            DynamicConstants.PRODUCT_NAME + " Configuration Reference"));
-
-    htmlBuff.append("<frameset rows=\"80,*\" framespacing=\"1\" " +
-      "frameborder=\"yes\" border=\"1\" bordercolor=\"#333333\">\n");
-    htmlBuff.append("  <frame src=\"" + MAINTOP_FILE + "\" name=\"topFrame\" " +
-      "id=\"topFrame\" border=\"1\" title=\"topFrame\" scrolling=\"no\">\n");
-    htmlBuff.append("  <frameset cols=\"375,*\" frameborder=\"yes\" " +
-      "border=\"1\" " +
-      "framespacing=\"1\">\n");
-    htmlBuff.append("     <frame src=\"" + INHERITANCE_TREE_FILE + "\" " +
-      "name=\"leftFrame\" id=\"leftFrame\" title=\"leftFrame\" " +
-      "scrolling=\"auto\">\n");
-    htmlBuff.append("     <frame src=\"" + WELCOME_FILE +
-      "\" name=\"mainFrame\" " +
-      "id=\"mainFrame\" title=\"mainFrame\" scrolling=\"auto\">\n");
-    htmlBuff.append("   </frameset>\n");
-    htmlBuff.append("</frameset>\n");
-    htmlBuff.append("<noframes><body>\n");
-    htmlBuff.append("</body>\n");
-    htmlBuff.append("</noframes>\n");
-    htmlBuff.append("</html>\n");
-
-    generateFile(INDEX_FILE);
-  }
-
-  private String getBaseDN(
-    AbstractManagedObjectDefinition mo, LDAPProfile ldapProfile) {
-
-    RelationDefinition rel = relList.get(mo.getName());
-    if (rel != null) {
-      String baseDn = ldapProfile.getRelationRDNSequence(rel);
-      if (!baseDn.equals("")) {
-        return baseDn;
-      } else {
-        // Check the parent relation
-        return getBaseDN(rel.getParentDefinition(), ldapProfile);
-      }
-    } else if (moList.get(mo.getParent().getName()) != null) {
-      // check its superior
-      return getBaseDN(moList.get(mo.getParent().getName()), ldapProfile);
-    } else {
-      System.err.println("Error: Base DN not found for " + mo.getName());
-    }
-    return null;
-  }
-
-  @SuppressWarnings("unchecked")
-  private String getSyntaxStr(PropertyDefinition prop) {
-    // Create a visitor for performing syntax specific processing.
-    PropertyDefinitionVisitor<String, Void> visitor =
-      new PropertyDefinitionVisitor<String, Void>() {
-
-      @Override
-      public String visitACI(ACIPropertyDefinition prop, Void p) {
-        return getLink("An ACI Syntax", aciSyntaxPage);
-      }
-
-      @Override
-      public String visitAggregation(
-        AggregationPropertyDefinition prop, Void p) {
-
-        RelationDefinition rel = prop.getRelationDefinition();
-        String linkStr = getLink(rel.getUserFriendlyName().toString(),
-          rel.getName() + ".html");
-      return "The DN of any " +  linkStr + ". " +
-        ((prop.getSourceConstraintSynopsis() != null) ?
-          prop.getSourceConstraintSynopsis().toString() : "");
-      }
-
-      @Override
-      public String visitAttributeType(
-        AttributeTypePropertyDefinition prop, Void p) {
-        return "The name of an attribute type defined in the server schema.";
-      }
-
-      @Override
-      public String visitBoolean(BooleanPropertyDefinition prop, Void p) {
-        return "true" + getNewLine() + "false";
-      }
-
-      @Override
-      public String visitClass(ClassPropertyDefinition prop, Void p) {
-        String classStr =
-          "A java class that implements or extends the class(es) :";
-        for (String clazz : prop.getInstanceOfInterface()) {
-          classStr += getNewLine() + clazz;
+        beginList();
+        for (String catName : catTopMoList.keySet()) {
+            bullet(getFriendlyName(catName));
         }
-        return classStr;
-      }
+        endList();
 
-      @Override
-      public String visitDN(DNPropertyDefinition prop, Void p) {
-        String retStr = "A valid DN.";
-        if (prop.getBaseDN() != null) {
-          retStr += prop.getBaseDN().toString();
+        paragraph("For ease of reference, the configuration is described on multiple "
+                + "tabs. These tabs provide alternative views of the configuration " + "components:");
+        beginList();
+        bullet("The <strong>Inheritance</strong> view represents the inheritance "
+                + "relationships between configuration components. A sub-component "
+                + "inherits all of the properties of its parent component.");
+        bullet("The <strong>Structure</strong> view represents the structural "
+                + "relationships between components and indicates how certain components "
+                + "can exist only within container components. When a container "
+                + "component is deleted, all of the components within it are also " + "deleted.");
+        bullet("The <strong>Components</strong> view provides an alphabetical list "
+                + "of all configuration components.");
+        bullet("The <strong>Properties</strong> view provides an alphabetical list "
+                + "of all configuration properties, and indicates the configuration "
+                + "component to which each property applies.");
+        endList();
+
+        newline();
+        paragraph("When you set up " + DynamicConstants.PRODUCT_NAME + ", certain components are created in the "
+                + "configuration by default. These components are configured with "
+                + "specific values, which are not necessarily the same as the "
+                + "\"default values\" of new components that you create using dsconfig. "
+                + "The \"default values\" listed in this document refer to the values "
+                + "of the new components that you create using dsconfig.");
+
+        htmlFooter();
+        generateFile(WELCOME_FILE);
+
+    }
+
+    private void genMainTopPage() {
+        htmlHeader(DynamicConstants.PRODUCT_NAME + " Configuration Reference - Main Top");
+        htmlBuff.append("<div class=\"breadcrumb\"><span class=\"pageactions\">" + "<a href=\"" + OpenDJHome
+                + "\" target=\"_parent\">" + "<span style=\"font-size: 12px;\">&laquo;&nbsp;&nbsp;</span>" + "Back to "
+                + DynamicConstants.PRODUCT_NAME + " Home</a></span>&nbsp;&nbsp;</div>\n");
+        htmlBuff.append("<table class=\"titletable\" cellspacing=\"0\" " + "width=\"100%\">\n");
+        htmlBuff.append("<tbody><tr>\n");
+        htmlBuff.append("  <td><h2>" + DynamicConstants.PRODUCT_NAME + " Configuration Reference</h2></td>\n");
+        htmlBuff.append("  <td valign=\"bottom\" width=\"10%\">" + "<a href=\"" + OpenDJHome + "\" target=\"_parent\">"
+                + "<img src=\"opendj_logo_sm.png\" alt=\"OpenDJ Logo\" align=\"bottom\" "
+                + "border=\"0\" height=\"33\" width=\"114\"></a></td>\n");
+        htmlBuff.append("</tr>\n");
+        htmlBuff.append("</tbody></table>\n");
+
+        htmlFooter();
+        generateFile(MAINTOP_FILE);
+
+    }
+
+    private void genIndexPage() {
+        htmlBuff.append(getHtmlHeader(DynamicConstants.PRODUCT_NAME + " Configuration Reference"));
+
+        htmlBuff.append("<frameset rows=\"80,*\" framespacing=\"1\" "
+                + "frameborder=\"yes\" border=\"1\" bordercolor=\"#333333\">\n");
+        htmlBuff.append("  <frame src=\"" + MAINTOP_FILE + "\" name=\"topFrame\" "
+                + "id=\"topFrame\" border=\"1\" title=\"topFrame\" scrolling=\"no\">\n");
+        htmlBuff.append("  <frameset cols=\"375,*\" frameborder=\"yes\" " + "border=\"1\" " + "framespacing=\"1\">\n");
+        htmlBuff.append("     <frame src=\"" + INHERITANCE_TREE_FILE + "\" "
+                + "name=\"leftFrame\" id=\"leftFrame\" title=\"leftFrame\" " + "scrolling=\"auto\">\n");
+        htmlBuff.append("     <frame src=\"" + WELCOME_FILE + "\" name=\"mainFrame\" "
+                + "id=\"mainFrame\" title=\"mainFrame\" scrolling=\"auto\">\n");
+        htmlBuff.append("   </frameset>\n");
+        htmlBuff.append("</frameset>\n");
+        htmlBuff.append("<noframes><body>\n");
+        htmlBuff.append("</body>\n");
+        htmlBuff.append("</noframes>\n");
+        htmlBuff.append("</html>\n");
+
+        generateFile(INDEX_FILE);
+    }
+
+    private String getBaseDN(AbstractManagedObjectDefinition mo, LDAPProfile ldapProfile) {
+
+        RelationDefinition rel = relList.get(mo.getName());
+        if (rel != null) {
+            String baseDn = ldapProfile.getRelationRDNSequence(rel);
+            if (!baseDn.equals("")) {
+                return baseDn;
+            } else {
+                // Check the parent relation
+                return getBaseDN(rel.getParentDefinition(), ldapProfile);
+            }
+        } else if (moList.get(mo.getParent().getName()) != null) {
+            // check its superior
+            return getBaseDN(moList.get(mo.getParent().getName()), ldapProfile);
+        } else {
+            System.err.println("Error: Base DN not found for " + mo.getName());
+        }
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    private String getSyntaxStr(PropertyDefinition prop) {
+        // Create a visitor for performing syntax specific processing.
+        PropertyDefinitionVisitor<String, Void> visitor = new PropertyDefinitionVisitor<String, Void>() {
+
+            @Override
+            public String visitACI(ACIPropertyDefinition prop, Void p) {
+                return getLink("An ACI Syntax", aciSyntaxPage);
+            }
+
+            @Override
+            public String visitAggregation(AggregationPropertyDefinition prop, Void p) {
+
+                RelationDefinition rel = prop.getRelationDefinition();
+                String linkStr = getLink(rel.getUserFriendlyName().toString(), rel.getName() + ".html");
+                return "The DN of any "
+                        + linkStr
+                        + ". "
+                        + ((prop.getSourceConstraintSynopsis() != null) ? prop.getSourceConstraintSynopsis().toString()
+                                : "");
+            }
+
+            @Override
+            public String visitAttributeType(AttributeTypePropertyDefinition prop, Void p) {
+                return "The name of an attribute type defined in the server schema.";
+            }
+
+            @Override
+            public String visitBoolean(BooleanPropertyDefinition prop, Void p) {
+                return "true" + getNewLine() + "false";
+            }
+
+            @Override
+            public String visitClass(ClassPropertyDefinition prop, Void p) {
+                String classStr = "A java class that implements or extends the class(es) :";
+                for (String clazz : prop.getInstanceOfInterface()) {
+                    classStr += getNewLine() + clazz;
+                }
+                return classStr;
+            }
+
+            @Override
+            public String visitDN(DNPropertyDefinition prop, Void p) {
+                String retStr = "A valid DN.";
+                if (prop.getBaseDN() != null) {
+                    retStr += prop.getBaseDN().toString();
+                }
+                return retStr;
+            }
+
+            @Override
+            public String visitDuration(DurationPropertyDefinition prop, Void p) {
+                String durationStr = "";
+
+                durationStr += getLink("A duration Syntax", durationSyntaxPage) + ". ";
+                if (prop.isAllowUnlimited()) {
+                    durationStr += "A value of \"-1\" or \"unlimited\" for no limit. ";
+                }
+                if (prop.getMaximumUnit() != null) {
+                    durationStr += "Maximum unit is \"" + prop.getMaximumUnit().getLongName() + "\". ";
+                }
+                long lowerLimitStr = new Double(prop.getBaseUnit().fromMilliSeconds(prop.getLowerLimit())).longValue();
+                durationStr += "Lower limit is " + lowerLimitStr + " " + prop.getBaseUnit().getLongName() + ". ";
+                if (prop.getUpperLimit() != null) {
+                    long upperLimitStr = new Double(prop.getBaseUnit().fromMilliSeconds(prop.getUpperLimit()))
+                            .longValue();
+                    durationStr += "Upper limit is " + upperLimitStr + " " + prop.getBaseUnit().getLongName() + ". ";
+                }
+
+                return durationStr;
+            }
+
+            @Override
+            public String visitEnum(EnumPropertyDefinition prop, Void p) {
+                String enumStr = "";
+                Class en = prop.getEnumClass();
+                for (Object cst : en.getEnumConstants()) {
+                    enumStr += cst.toString();
+                    if (prop.getValueSynopsis((Enum) cst) != null) {
+                        enumStr += " - " + prop.getValueSynopsis((Enum) cst).toString();
+                    }
+                    enumStr += getNewLine() + getNewLine();
+                }
+                return enumStr;
+            }
+
+            @Override
+            public String visitInteger(IntegerPropertyDefinition prop, Void p) {
+                String intStr = "An integer value.";
+                intStr += " Lower value is " + prop.getLowerLimit() + ".";
+                if (prop.getUpperLimit() != null) {
+                    intStr += " Upper value is " + prop.getUpperLimit() + " .";
+                }
+                if (prop.isAllowUnlimited()) {
+                    intStr += " A value of \"-1\" or \"unlimited\" for no limit.";
+                }
+                if (prop.getUnitSynopsis() != null) {
+                    intStr += " Unit is " + prop.getUnitSynopsis() + ".";
+                }
+                return intStr;
+            }
+
+            @Override
+            public String visitIPAddress(IPAddressPropertyDefinition prop, Void p) {
+                return "An IP address";
+            }
+
+            @Override
+            public String visitIPAddressMask(IPAddressMaskPropertyDefinition prop, Void p) {
+
+                return "An IP address mask";
+            }
+
+            @Override
+            public String visitSize(SizePropertyDefinition prop, Void p) {
+                String sizeStr = "A positive integer representing a size.";
+                if (prop.getLowerLimit() != 0) {
+                    sizeStr += " Lower value is " + prop.getLowerLimit() + ".";
+                }
+                if (prop.getUpperLimit() != null) {
+                    sizeStr += " Upper value is " + prop.getUpperLimit() + " .";
+                }
+                if (prop.isAllowUnlimited()) {
+                    sizeStr += " A value of \"-1\" or \"unlimited\" for no limit.";
+                }
+                return sizeStr;
+            }
+
+            @Override
+            public String visitString(StringPropertyDefinition prop, Void p) {
+                String retStr = "A String";
+                if (prop.getPatternSynopsis() != null) {
+                    retStr = prop.getPatternSynopsis().toString();
+                }
+                return retStr;
+            }
+
+            @Override
+            public String visitUnknown(PropertyDefinition prop, Void p) {
+                return "Unknown";
+            }
+        };
+
+        // Invoke the visitor against the property definition.
+        return (String) prop.accept(visitor, null);
+
+    }
+
+    @SuppressWarnings("unchecked")
+    private String getDefaultBehaviorString(PropertyDefinition prop) {
+        DefaultBehaviorProvider defaultBehav = prop.getDefaultBehaviorProvider();
+        String defValueStr = "";
+        if (defaultBehav instanceof UndefinedDefaultBehaviorProvider) {
+            defValueStr = "None";
+        } else if (defaultBehav instanceof DefinedDefaultBehaviorProvider) {
+            DefinedDefaultBehaviorProvider defBehav = (DefinedDefaultBehaviorProvider) defaultBehav;
+            for (Iterator<String> it = defBehav.getDefaultValues().iterator(); it.hasNext();) {
+
+                String str = it.next();
+                defValueStr += str + (it.hasNext() ? "\n" : "");
+            }
+        } else if (defaultBehav instanceof AliasDefaultBehaviorProvider) {
+            AliasDefaultBehaviorProvider aliasBehav = (AliasDefaultBehaviorProvider) defaultBehav;
+            defValueStr = aliasBehav.getSynopsis().toString();
+        } else if (defaultBehav instanceof RelativeInheritedDefaultBehaviorProvider) {
+            RelativeInheritedDefaultBehaviorProvider relativBehav = (RelativeInheritedDefaultBehaviorProvider) defaultBehav;
+            defValueStr = getDefaultBehaviorString(relativBehav.getManagedObjectDefinition().getPropertyDefinition(
+                    relativBehav.getPropertyName()));
+        } else if (defaultBehav instanceof AbsoluteInheritedDefaultBehaviorProvider) {
+            AbsoluteInheritedDefaultBehaviorProvider absoluteBehav = (AbsoluteInheritedDefaultBehaviorProvider) defaultBehav;
+            defValueStr = getDefaultBehaviorString(absoluteBehav.getManagedObjectDefinition().getPropertyDefinition(
+                    absoluteBehav.getPropertyName()));
+        }
+        return defValueStr;
+    }
+
+    private TreeMap<String, AbstractManagedObjectDefinition> makeMOTreeMap(
+            Collection<AbstractManagedObjectDefinition> coll) {
+
+        if (coll == null) {
+            return null;
+        }
+        TreeMap<String, AbstractManagedObjectDefinition> map = new TreeMap<String, AbstractManagedObjectDefinition>();
+        for (AbstractManagedObjectDefinition mo : coll) {
+            if (mo.hasOption(ManagedObjectOption.HIDDEN)) {
+                continue;
+            }
+            map.put(mo.getName(), mo);
+        }
+        return map;
+    }
+
+    private TreeMap<String, RelationDefinition> makeRelTreeMap(Collection<RelationDefinition> coll) {
+
+        if (coll == null) {
+            return null;
+        }
+        TreeMap<String, RelationDefinition> map = new TreeMap<String, RelationDefinition>();
+        for (RelationDefinition rel : coll) {
+            map.put(rel.getChildDefinition().getName(), rel);
+        }
+        return map;
+    }
+
+    private TreeMap<String, PropertyDefinition> makePropTreeMap(Collection<PropertyDefinition> coll) {
+
+        if (coll == null) {
+            return null;
+        }
+        TreeMap<String, PropertyDefinition> map = new TreeMap<String, PropertyDefinition>();
+        for (PropertyDefinition prop : coll) {
+            map.put(prop.getName(), prop);
+        }
+        return map;
+    }
+
+    private void horizontalLine() {
+        htmlBuff.append("<hr style=\"width: 100%; height: 2px;\">");
+    }
+
+    private void endTable() {
+        htmlBuff.append("</tbody>\n");
+        htmlBuff.append("</table>\n");
+    }
+
+    private void bullet(String str) {
+        htmlBuff.append("<li>" + str + "</li>\n");
+    }
+
+    private void heading2(String string) {
+        heading(string, 2);
+    }
+
+    private void heading3(String string) {
+        heading(string, 3);
+    }
+
+    private void heading4(String string) {
+        heading(string, 4);
+    }
+
+    private void heading(String str, int level) {
+        htmlBuff.append(getHeading(str, level));
+    }
+
+    private String getHeading(String str, int level) {
+        String strLevel = (new Integer(level)).toString();
+        return "<h" + strLevel + ">" + "<a name=\"" + str + "\"></a>" + str + "</h" + strLevel + ">\n";
+    }
+
+    private String getHeading2(String str) {
+        return getHeading(str, 2);
+    }
+
+    private String getAnchor(String str) {
+        return "<a name=\"" + str + "\"></a>";
+    }
+
+    private void htmlHeader(String pageTitle) {
+        htmlBuff.append(getHtmlHeader(pageTitle) + "<body>\n");
+
+    }
+
+    private final String Now = new Date().toString();
+
+    private String getHtmlHeader(String pageTitle) {
+        return ("<html>\n" + "<head>\n" + "<meta http-equiv=\"content-type\"\n"
+                + "content=\"text/html; charset=ISO-8859-1\">\n" + "<title>" + pageTitle + "</title>\n"
+                + "<link rel=\"stylesheet\" type=\"text/css\"\n" + "href=\"" + CSS_FILE + "\">\n"
+                + "<link rel=\"shortcut icon\" href=\"" + FAVICON + "\">\n"
+                + "<meta name=\"date generated\" content=\"" + Now + "\">\n" + "</head>\n");
+    }
+
+    // Add a Tab Menu, the active tab is the one given as parameter
+    private void tabMenu(String activeTab) {
+        htmlBuff.append("<div class=\"tabmenu\"> " +
+
+        "<span><a " + (activeTab.equals(INHERITANCE_TREE_FILE) ? "class=\"activetab\" " : "") + "href=\""
+                + INHERITANCE_TREE_FILE + "\"" + " title=\"Inheritance View of Components\">Inheritance</a></span> " +
+
+                "<span><a " + (activeTab.equals(RELATION_TREE_FILE) ? "class=\"activetab\" " : "") + "href=\""
+                + RELATION_TREE_FILE + "\"" + " title=\"Relational View of Components\">Structure</a></span> " +
+
+                "<span><a " + (activeTab.equals(MO_LIST_FILE) ? "class=\"activetab\" " : "") + "href=\"" + MO_LIST_FILE
+                + "\"" + " title=\"Alphabetical Index of Components\">Components</a></span> " +
+
+                "<span><a " + (activeTab.equals(PROPERTIES_INDEX_FILE) ? "class=\"activetab\" " : "") + "href=\""
+                + PROPERTIES_INDEX_FILE + "\"" + " title=\"Alphabetical Index of Properties\" >Properties</a></span>" +
+
+                "</div>" + "\n");
+    }
+
+    private String getLink(String str, String link) {
+        return getLink(str, link, null, null);
+    }
+
+    private String getLink(String str, String link, String target) {
+        return getLink(str, link, target, null);
+    }
+
+    private String getLink(String str, String link, String target, String color) {
+        return "<a " + (color != null ? "style=\"color:" + color + "\" " : "") + "href=\"" + link + "\""
+                + (target == null ? "" : " target=\"" + target + "\"") + ">" + str + "</a>";
+    }
+
+    private void link(String str, String link) {
+        link(str, link, null, null);
+    }
+
+    private void link(String str, String link, String target) {
+        link(str, link, target, null);
+    }
+
+    private void link(String str, String link, String target, String color) {
+        String htmlStr = "";
+        if (!inList && getIndentPixels() > 0) {
+            htmlStr += "<div style=\"margin-left: " + getIndentPixels() + "px;\">";
+        } else if (inList) {
+            htmlStr += "<li>";
+        }
+        htmlStr += getLink(str, link, target, color);
+        if (!inList && getIndentPixels() > 0) {
+            htmlStr += "</div>";
+        } else if (inList) {
+            htmlStr += "</li>";
+        }
+        if (!inList) {
+            htmlStr += "<br>";
+        }
+        htmlBuff.append(htmlStr + "\n");
+    }
+
+    private void newline() {
+        htmlBuff.append(getNewLine());
+    }
+
+    private String getNewLine() {
+        return "<br>\n";
+    }
+
+    private void paragraph(LocalizableMessage description) {
+        if (description != null) {
+            paragraph(description.toString());
+        }
+    }
+
+    private void paragraph(String description) {
+        paragraph(description, TextStyle.STANDARD, null);
+    }
+
+    private void paragraph(String description, TextStyle style) {
+        paragraph(description, style, null);
+    }
+
+    private void paragraph(String description, TextStyle style, String pClass) {
+        String indentStr = "";
+        String styleStr = "";
+        String classStr = "";
+        if (getIndentPixels() > 0) {
+            indentStr = "style=\"margin-left: " + getIndentPixels() + "px;\"";
+        }
+        if (style == TextStyle.BOLD) {
+            styleStr = "style=\"font-weight: bold;\"";
+        } else if (style == TextStyle.ITALIC) {
+            styleStr = "style=\"font-style: italic;\"";
+        }
+        if (pClass != null) {
+            classStr = "class=" + pClass;
+        }
+
+        htmlBuff.append("<p " + indentStr + " " + styleStr + " " + classStr + ">" + description + "</p>\n");
+    }
+
+    private int getIndentPixels() {
+        return (ind * 40);
+    }
+
+    private void startTable() {
+        htmlBuff.append("<table " + "style=\"width: 100%; text-align: left;\"" + "border=\"1\"" + "cellpadding=\"1\""
+                + "cellspacing=\"0\"" + ">\n");
+
+        htmlBuff.append("<tbody>\n");
+    }
+
+    /*
+     * Generate a "friendly" name from a string : '-' and '_' replaced by space
+     * first letter of a word in uppercase
+     */
+    private String getFriendlyName(String str) {
+        String retStr = "";
+        String[] words = str.split("\\p{Punct}");
+        for (int ii = 0; ii < words.length; ii++) {
+            if (ii > 0) {
+                retStr += " ";
+            }
+            String word = words[ii];
+            String firstChar = word.substring(0, 1).toUpperCase();
+            retStr += firstChar + word.substring(1, word.length());
         }
         return retStr;
-      }
+    }
 
-      @Override
-      public String visitDuration(DurationPropertyDefinition prop, Void p) {
-        String durationStr = "";
-
-        durationStr += getLink("A duration Syntax", durationSyntaxPage) +
-          ". ";
-        if (prop.isAllowUnlimited()) {
-          durationStr += "A value of \"-1\" or \"unlimited\" for no limit. ";
+    private void tableRow(String... strings) {
+        htmlBuff.append("<tr>\n");
+        for (int ii = 0; ii < strings.length; ii++) {
+            String string = strings[ii];
+            htmlBuff.append("<td style=\"" + "vertical-align: top; " + ((ii == 0) ? "width: 20%;" : "") + "\">"
+                    + string + "<br></td>");
         }
-        if (prop.getMaximumUnit() != null) {
-          durationStr += "Maximum unit is \"" +
-            prop.getMaximumUnit().getLongName() + "\". ";
+        htmlBuff.append("</tr>\n");
+    }
+
+    /**
+     * Text style.
+     */
+    private enum TextStyle {
+
+        STANDARD, BOLD, ITALIC, UNDERLINE, FIXED_WIDTH
+    }
+
+    private void beginList() {
+        inList = true;
+        listLevel++;
+        htmlBuff.append("<ul>\n");
+    }
+
+    private void endList() {
+        listLevel--;
+        if (listLevel == 0) {
+            inList = false;
         }
-        long lowerLimitStr = new Double(prop.getBaseUnit().
-          fromMilliSeconds(prop.getLowerLimit())).longValue();
-        durationStr += "Lower limit is " + lowerLimitStr +
-          " " + prop.getBaseUnit().getLongName() + ". ";
-        if (prop.getUpperLimit() != null) {
-          long upperLimitStr = new Double(prop.getBaseUnit().
-            fromMilliSeconds(prop.getUpperLimit())).longValue();
-          durationStr += "Upper limit is " + upperLimitStr +
-            " " + prop.getBaseUnit().getLongName() + ". ";
+        htmlBuff.append("</ul>\n");
+    }
+
+    private void htmlFooter() {
+        htmlBuff.append("</body>\n" + "</html>\n");
+    }
+
+    private void viewHelp(String helpStr) {
+        htmlBuff.append("<p class=\"view-help\" >" + helpStr + "</p>" + "\n");
+    }
+
+    private void generateFile(String fileName) {
+        // Write the html buffer in a file
+        try {
+            PrintWriter file = new java.io.PrintWriter(
+                    new java.io.FileWriter(generationDir + File.separator + fileName));
+            file.write(htmlBuff.toString());
+            file.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(1);
         }
-
-        return durationStr;
-      }
-
-      @Override
-      public String visitEnum(EnumPropertyDefinition prop, Void p) {
-        String enumStr = "";
-        Class en = prop.getEnumClass();
-        for (Object cst : en.getEnumConstants()) {
-          enumStr += cst.toString();
-          if (prop.getValueSynopsis((Enum) cst) != null) {
-            enumStr += " - " + prop.getValueSynopsis((Enum) cst).toString();
-          }
-          enumStr += getNewLine() + getNewLine();
-        }
-        return enumStr;
-      }
-
-      @Override
-      public String visitInteger(IntegerPropertyDefinition prop, Void p) {
-        String intStr = "An integer value.";
-        intStr += " Lower value is " + prop.getLowerLimit() + ".";
-        if (prop.getUpperLimit() != null) {
-          intStr += " Upper value is " + prop.getUpperLimit() + " .";
-        }
-        if (prop.isAllowUnlimited()) {
-          intStr += " A value of \"-1\" or \"unlimited\" for no limit.";
-        }
-        if (prop.getUnitSynopsis() != null) {
-          intStr += " Unit is " + prop.getUnitSynopsis() + ".";
-        }
-        return intStr;
-      }
-
-      @Override
-      public String visitIPAddress(IPAddressPropertyDefinition prop, Void p) {
-        return "An IP address";
-      }
-
-      @Override
-      public String visitIPAddressMask(
-        IPAddressMaskPropertyDefinition prop, Void p) {
-
-        return "An IP address mask";
-      }
-
-      @Override
-      public String visitSize(SizePropertyDefinition prop, Void p) {
-        String sizeStr = "A positive integer representing a size.";
-        if (prop.getLowerLimit() != 0) {
-          sizeStr += " Lower value is " + prop.getLowerLimit() + ".";
-        }
-        if (prop.getUpperLimit() != null) {
-          sizeStr += " Upper value is " + prop.getUpperLimit() + " .";
-        }
-        if (prop.isAllowUnlimited()) {
-          sizeStr += " A value of \"-1\" or \"unlimited\" for no limit.";
-        }
-        return sizeStr;
-      }
-
-      @Override
-      public String visitString(StringPropertyDefinition prop, Void p) {
-        String retStr = "A String";
-        if (prop.getPatternSynopsis() != null) {
-          retStr = prop.getPatternSynopsis().toString();
-        }
-        return retStr;
-      }
-
-      @Override
-      public String visitUnknown(PropertyDefinition prop, Void p) {
-        return "Unknown";
-      }
-    };
-
-    // Invoke the visitor against the property definition.
-    return (String) prop.accept(visitor, null);
-
-  }
-
-  @SuppressWarnings("unchecked")
-  private String getDefaultBehaviorString(PropertyDefinition prop) {
-    DefaultBehaviorProvider defaultBehav = prop.getDefaultBehaviorProvider();
-    String defValueStr = "";
-    if (defaultBehav instanceof UndefinedDefaultBehaviorProvider) {
-      defValueStr = "None";
-    } else if (defaultBehav instanceof DefinedDefaultBehaviorProvider) {
-      DefinedDefaultBehaviorProvider defBehav =
-        (DefinedDefaultBehaviorProvider) defaultBehav;
-      for (Iterator<String> it = defBehav.getDefaultValues().iterator();
-      it.hasNext();) {
-
-        String str = it.next();
-        defValueStr += str + (it.hasNext() ? "\n" : "");
-      }
-    } else if (defaultBehav instanceof AliasDefaultBehaviorProvider) {
-      AliasDefaultBehaviorProvider aliasBehav = (
-        AliasDefaultBehaviorProvider) defaultBehav;
-      defValueStr = aliasBehav.getSynopsis().toString();
-    } else if
-      (defaultBehav instanceof RelativeInheritedDefaultBehaviorProvider) {
-      RelativeInheritedDefaultBehaviorProvider relativBehav =
-        (RelativeInheritedDefaultBehaviorProvider) defaultBehav;
-      defValueStr = getDefaultBehaviorString(
-        relativBehav.getManagedObjectDefinition().
-        getPropertyDefinition(relativBehav.getPropertyName()));
-    } else if
-      (defaultBehav instanceof AbsoluteInheritedDefaultBehaviorProvider) {
-      AbsoluteInheritedDefaultBehaviorProvider absoluteBehav =
-        (AbsoluteInheritedDefaultBehaviorProvider) defaultBehav;
-      defValueStr = getDefaultBehaviorString(
-        absoluteBehav.getManagedObjectDefinition().
-        getPropertyDefinition(absoluteBehav.getPropertyName()));
-    }
-    return defValueStr;
-  }
-
-  private TreeMap<String, AbstractManagedObjectDefinition> makeMOTreeMap(
-    Collection<AbstractManagedObjectDefinition> coll) {
-
-    if (coll == null) {
-      return null;
-    }
-    TreeMap<String, AbstractManagedObjectDefinition> map =
-      new TreeMap<String, AbstractManagedObjectDefinition>();
-    for (AbstractManagedObjectDefinition mo : coll) {
-      if (mo.hasOption(ManagedObjectOption.HIDDEN))
-      {
-        continue;
-      }
-      map.put(mo.getName(), mo);
-    }
-    return map;
-  }
-
-  private TreeMap<String, RelationDefinition> makeRelTreeMap(
-    Collection<RelationDefinition> coll) {
-
-    if (coll == null) {
-      return null;
-    }
-    TreeMap<String, RelationDefinition> map =
-      new TreeMap<String, RelationDefinition>();
-    for (RelationDefinition rel : coll) {
-      map.put(rel.getChildDefinition().getName(), rel);
-    }
-    return map;
-  }
-
-  private TreeMap<String, PropertyDefinition> makePropTreeMap(
-    Collection<PropertyDefinition> coll) {
-
-    if (coll == null) {
-      return null;
-    }
-    TreeMap<String, PropertyDefinition> map =
-      new TreeMap<String, PropertyDefinition>();
-    for (PropertyDefinition prop : coll) {
-      map.put(prop.getName(), prop);
-    }
-    return map;
-  }
-
-  private void horizontalLine() {
-    htmlBuff.append("<hr style=\"width: 100%; height: 2px;\">");
-  }
-
-  private void endTable() {
-    htmlBuff.append("</tbody>\n");
-    htmlBuff.append("</table>\n");
-  }
-
-  private void bullet(String str) {
-    htmlBuff.append(
-      "<li>" +
-      str +
-      "</li>\n");
-  }
-
-  private void heading2(String string) {
-    heading(string, 2);
-  }
-
-  private void heading3(String string) {
-    heading(string, 3);
-  }
-
-  private void heading4(String string) {
-    heading(string, 4);
-  }
-
-  private void heading(String str, int level) {
-    htmlBuff.append(getHeading(str, level));
-  }
-
-  private String getHeading(String str, int level) {
-    String strLevel = (new Integer(level)).toString();
-    return "<h" + strLevel + ">" +
-      "<a name=\"" + str + "\"></a>" +
-      str +
-      "</h" + strLevel + ">\n";
-  }
-
-  private String getHeading2(String str) {
-    return getHeading(str, 2);
-  }
-
-  private String getAnchor(String str) {
-    return "<a name=\"" + str + "\"></a>";
-  }
-
-  private void htmlHeader(String pageTitle) {
-    htmlBuff.append(getHtmlHeader(pageTitle) +
-      "<body>\n");
-
-  }
-
-  private final String Now = new Date().toString();
-  private String getHtmlHeader(String pageTitle) {
-    return ("<html>\n" +
-      "<head>\n" +
-      "<meta http-equiv=\"content-type\"\n" +
-      "content=\"text/html; charset=ISO-8859-1\">\n" +
-      "<title>" + pageTitle + "</title>\n" +
-      "<link rel=\"stylesheet\" type=\"text/css\"\n" +
-      "href=\"" + CSS_FILE + "\">\n" +
-      "<link rel=\"shortcut icon\" href=\"" + FAVICON + "\">\n" +
-      "<meta name=\"date generated\" content=\"" + Now + "\">\n" +
-      "</head>\n");
-  }
-
-  // Add a Tab Menu, the active tab is the one given as parameter
-  private void tabMenu(String activeTab) {
-    htmlBuff.append(
-      "<div class=\"tabmenu\"> " +
-
-      "<span><a " +
-      (activeTab.equals(INHERITANCE_TREE_FILE) ? "class=\"activetab\" " : "") +
-      "href=\"" + INHERITANCE_TREE_FILE + "\"" +
-      " title=\"Inheritance View of Components\">Inheritance</a></span> " +
-
-      "<span><a " +
-      (activeTab.equals(RELATION_TREE_FILE) ? "class=\"activetab\" " : "") +
-      "href=\"" + RELATION_TREE_FILE + "\"" +
-      " title=\"Relational View of Components\">Structure</a></span> " +
-
-      "<span><a " +
-      (activeTab.equals(MO_LIST_FILE) ? "class=\"activetab\" " : "") +
-      "href=\"" + MO_LIST_FILE + "\"" +
-      " title=\"Alphabetical Index of Components\">Components</a></span> " +
-
-      "<span><a " +
-      (activeTab.equals(PROPERTIES_INDEX_FILE) ? "class=\"activetab\" " : "") +
-      "href=\"" + PROPERTIES_INDEX_FILE + "\"" +
-      " title=\"Alphabetical Index of Properties\" >Properties</a></span>" +
-
-      "</div>" +
-      "\n"
-      );
-  }
-
-  private String getLink(String str, String link) {
-    return getLink(str, link, null, null);
-  }
-
-  private String getLink(String str, String link, String target) {
-    return getLink(str, link, target, null);
-  }
-
-  private String getLink(String str, String link, String target, String color) {
-    return "<a " +
-      (color != null ? "style=\"color:" + color + "\" " : "") +
-      "href=\"" + link + "\"" +
-      (target == null ? "" : " target=\"" + target + "\"") +
-      ">"
-      + str + "</a>";
-  }
-
-  private void link(String str, String link) {
-    link(str, link, null, null);
-  }
-
-  private void link(String str, String link, String target) {
-    link(str, link, target, null);
-  }
-
-  private void link(String str, String link, String target, String color) {
-    String htmlStr = "";
-    if (!inList && getIndentPixels() > 0) {
-      htmlStr += "<div style=\"margin-left: " + getIndentPixels() + "px;\">";
-    } else if (inList) {
-      htmlStr += "<li>";
-    }
-    htmlStr += getLink(str, link, target, color);
-    if (!inList && getIndentPixels() > 0) {
-      htmlStr += "</div>";
-    } else if (inList) {
-      htmlStr += "</li>";
-    }
-    if (!inList) {
-      htmlStr += "<br>";
-    }
-    htmlBuff.append(htmlStr + "\n");
-  }
-
-  private void newline() {
-    htmlBuff.append(
-      getNewLine());
-  }
-
-  private String getNewLine() {
-    return "<br>\n";
-  }
-
-  private void paragraph(Message description) {
-    if (description != null) {
-      paragraph(description.toString());
-    }
-  }
-
-  private void paragraph(String description) {
-    paragraph(description, TextStyle.STANDARD, null);
-  }
-
-  private void paragraph(String description, TextStyle style) {
-    paragraph(description, style, null);
-  }
-
-  private void paragraph(String description, TextStyle style, String pClass) {
-    String indentStr = "";
-    String styleStr = "";
-    String classStr = "";
-    if (getIndentPixels() > 0) {
-      indentStr = "style=\"margin-left: " + getIndentPixels() + "px;\"";
-    }
-    if (style == TextStyle.BOLD) {
-      styleStr = "style=\"font-weight: bold;\"";
-    } else if (style == TextStyle.ITALIC) {
-      styleStr = "style=\"font-style: italic;\"";
-    }
-    if (pClass != null) {
-      classStr = "class=" + pClass;
+        // re-init html buffer
+        htmlBuff = new StringBuffer();
     }
 
-    htmlBuff.append(
-      "<p " +
-      indentStr + " " +
-      styleStr + " " +
-      classStr +
-      ">" +
-      description +
-      "</p>\n");
-  }
-
-  private int getIndentPixels() {
-    return (ind * 40);
-  }
-
-  private void startTable() {
-    htmlBuff.append(
-      "<table " +
-      "style=\"width: 100%; text-align: left;\"" +
-      "border=\"1\"" +
-      "cellpadding=\"1\"" +
-      "cellspacing=\"0\"" +
-      ">\n");
-
-    htmlBuff.append("<tbody>\n");
-  }
-
-  /*
-   * Generate a "friendly" name from a string :
-   * '-' and '_' replaced by space
-   * first letter of a word in uppercase
-   */
-  private String getFriendlyName(String str) {
-    String retStr = "";
-    String[] words = str.split("\\p{Punct}");
-    for (int ii = 0; ii < words.length; ii++) {
-      if (ii>0) {
-        retStr += " ";
-      }
-      String word = words[ii];
-       String firstChar = word.substring(0, 1).toUpperCase();
-       retStr += firstChar + word.substring(1, word.length());
-    }
-    return retStr;
-  }
-
-  private void tableRow(String... strings) {
-    htmlBuff.append(
-      "<tr>\n");
-    for (int ii = 0; ii < strings.length; ii++) {
-      String string = strings[ii];
-      htmlBuff.append(
-        "<td style=\"" +
-        "vertical-align: top; " +
-        ((ii == 0) ? "width: 20%;" : "") +
-        "\">" +
-        string +
-        "<br></td>");
-    }
-    htmlBuff.append(
-      "</tr>\n");
-  }
-
-  /**
-   * Text style.
-   */
-  private enum TextStyle {
-
-    STANDARD, BOLD, ITALIC, UNDERLINE, FIXED_WIDTH
-  }
-
-  private void beginList() {
-    inList = true;
-    listLevel++;
-    htmlBuff.append(
-      "<ul>\n");
-  }
-
-  private void endList() {
-    listLevel--;
-    if (listLevel == 0) {
-      inList = false;
-    }
-    htmlBuff.append(
-      "</ul>\n");
-  }
-
-  private void htmlFooter() {
-    htmlBuff.append(
-      "</body>\n" +
-      "</html>\n");
-  }
-
-  private void viewHelp(String helpStr) {
-    htmlBuff.append(
-      "<p class=\"view-help\" >" +
-      helpStr +
-      "</p>" +
-      "\n"
-      );
-  }
-
-  private void generateFile(String fileName) {
-    // Write the html buffer in a file
-    try {
-      PrintWriter file = new java.io.PrintWriter(
-        new java.io.FileWriter(generationDir + File.separator + fileName));
-      file.write(htmlBuff.toString());
-      file.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      System.exit(1);
-    }
-    // re-init html buffer
-    htmlBuff = new StringBuffer();
-  }
-
-  // Relation List from RootConfiguration
-  private final TreeMap<String, RelationDefinition> topRelList =
-    new TreeMap<String, RelationDefinition>();
-  private final TreeMap<String, RelationDefinition> relList =
-    new TreeMap<String, RelationDefinition>();
-  private final TreeMap<String, TreeMap<String, RelationDefinition>>
-    catTopRelList = new TreeMap<String, TreeMap<String, RelationDefinition>>();
-  // managed object list
-  private final TreeMap<String, AbstractManagedObjectDefinition> moList =
-    new TreeMap<String, AbstractManagedObjectDefinition>();
-  private final TreeMap<String, AbstractManagedObjectDefinition> topMoList =
-    new TreeMap<String, AbstractManagedObjectDefinition>();
-  private final TreeMap<String,
-                        TreeMap<String, AbstractManagedObjectDefinition>>
-    catTopMoList =
-      new TreeMap<String, TreeMap<String, AbstractManagedObjectDefinition>>();
-  private final int ind = 0;
-  private StringBuffer htmlBuff = new StringBuffer();
-  private static String generationDir;
-  private static boolean ldapMapping = false;
-  private static String OpenDJWiki;
-  private static String OpenDJHome;
-  private static String aciSyntaxPage;
-  private static String durationSyntaxPage;
-  private boolean inList = false;
-  private int listLevel = 0;
+    // Relation List from RootConfiguration
+    private final TreeMap<String, RelationDefinition> topRelList = new TreeMap<String, RelationDefinition>();
+    private final TreeMap<String, RelationDefinition> relList = new TreeMap<String, RelationDefinition>();
+    private final TreeMap<String, TreeMap<String, RelationDefinition>> catTopRelList = new TreeMap<String, TreeMap<String, RelationDefinition>>();
+    // managed object list
+    private final TreeMap<String, AbstractManagedObjectDefinition> moList = new TreeMap<String, AbstractManagedObjectDefinition>();
+    private final TreeMap<String, AbstractManagedObjectDefinition> topMoList = new TreeMap<String, AbstractManagedObjectDefinition>();
+    private final TreeMap<String, TreeMap<String, AbstractManagedObjectDefinition>> catTopMoList = new TreeMap<String, TreeMap<String, AbstractManagedObjectDefinition>>();
+    private final int ind = 0;
+    private StringBuffer htmlBuff = new StringBuffer();
+    private static String generationDir;
+    private static boolean ldapMapping = false;
+    private static String OpenDJWiki;
+    private static String OpenDJHome;
+    private static String aciSyntaxPage;
+    private static String durationSyntaxPage;
+    private boolean inList = false;
+    private int listLevel = 0;
 }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/doc/package-info.java b/opendj-admin/src/main/java/org/opends/server/admin/doc/package-info.java
index 0b78245..09d8147 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/doc/package-info.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/doc/package-info.java
@@ -25,14 +25,10 @@
  *      Copyright 2007-2008 Sun Microsystems, Inc.
  */
 
-
-
 /**
  * Administration documentation classes.
  * <p>
  * This package contains classes used to generate administration documentation.
  */
-@org.opends.server.types.PublicAPI(
-     stability=org.opends.server.types.StabilityLevel.PRIVATE)
 package org.opends.server.admin.doc;
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/AbstractConfigListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/AbstractConfigListenerAdaptor.java
index fc1e3ea..014b9af 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/AbstractConfigListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/AbstractConfigListenerAdaptor.java
@@ -30,8 +30,8 @@
 
 import java.util.Collection;
 
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 
 
 
@@ -57,10 +57,10 @@
    * @param unacceptableReason
    *          The single message to which messages should be appended.
    */
-  protected final void generateUnacceptableReason(Collection<Message> reasons,
-      MessageBuilder unacceptableReason) {
+  protected final void generateUnacceptableReason(Collection<LocalizableMessage> reasons,
+      LocalizableMessageBuilder unacceptableReason) {
     boolean isFirst = true;
-    for (Message reason : reasons) {
+    for (LocalizableMessage reason : reasons) {
       if (isFirst) {
         isFirst = false;
       } else {
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigAddListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigAddListenerAdaptor.java
index 9a8c29b..95418ae 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigAddListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigAddListenerAdaptor.java
@@ -33,8 +33,8 @@
 import java.util.LinkedList;
 import java.util.List;
 
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.opends.server.admin.Configuration;
 import org.opends.server.admin.Constraint;
 import org.opends.server.admin.DecodingException;
@@ -213,7 +213,7 @@
    * {@inheritDoc}
    */
   public boolean configAddIsAcceptable(ConfigEntry configEntry,
-      MessageBuilder unacceptableReason) {
+      LocalizableMessageBuilder unacceptableReason) {
     DN dn = configEntry.getDN();
     AttributeValue av = dn.getRDN().getAttributeValue(0);
     String name = av.getValue().toString().trim();
@@ -257,7 +257,7 @@
     }
 
     // Let the add listener decide.
-    List<Message> reasons = new LinkedList<Message>();
+    List<LocalizableMessage> reasons = new LinkedList<Message>();
     if (listener.isConfigurationAddAcceptable(cachedManagedObject, reasons)) {
       return true;
     } else {
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigChangeListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigChangeListenerAdaptor.java
index 467f403..a71ed59 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigChangeListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigChangeListenerAdaptor.java
@@ -37,8 +37,8 @@
 import java.util.Set;
 
 import org.opends.messages.AdminMessages;
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.opends.server.admin.AbsoluteInheritedDefaultBehaviorProvider;
 import org.opends.server.admin.AbstractManagedObjectDefinition;
 import org.opends.server.admin.AliasDefaultBehaviorProvider;
@@ -262,7 +262,7 @@
 
 
       public boolean configChangeIsAcceptable(ConfigEntry configEntry,
-          MessageBuilder unacceptableReason) {
+          LocalizableMessageBuilder unacceptableReason) {
         ConfigEntry dependentConfigEntry = getConfigEntry(dn);
         if (dependentConfigEntry != null) {
           return ConfigChangeListenerAdaptor.this.configChangeIsAcceptable(
@@ -310,7 +310,7 @@
 
 
       public boolean configDeleteIsAcceptable(ConfigEntry configEntry,
-          MessageBuilder unacceptableReason) {
+          LocalizableMessageBuilder unacceptableReason) {
         // Always acceptable.
         return true;
       }
@@ -369,7 +369,7 @@
    * {@inheritDoc}
    */
   public boolean configChangeIsAcceptable(ConfigEntry configEntry,
-      MessageBuilder unacceptableReason) {
+      LocalizableMessageBuilder unacceptableReason) {
     return configChangeIsAcceptable(configEntry, unacceptableReason,
         configEntry);
   }
@@ -396,7 +396,7 @@
    *         does not.
    */
   public boolean configChangeIsAcceptable(ConfigEntry configEntry,
-      MessageBuilder unacceptableReason, ConfigEntry newConfigEntry) {
+      LocalizableMessageBuilder unacceptableReason, ConfigEntry newConfigEntry) {
     try {
       ServerManagementContext context = ServerManagementContext.getInstance();
       cachedManagedObject = context.decode(path, configEntry, newConfigEntry);
@@ -414,7 +414,7 @@
     }
 
     // Let the change listener decide.
-    List<Message> reasons = new LinkedList<Message>();
+    List<LocalizableMessage> reasons = new LinkedList<Message>();
     if (listener.isConfigurationChangeAcceptable(cachedManagedObject,reasons)) {
       return true;
     } else {
@@ -471,7 +471,7 @@
       if (configEntry != null) {
         return configEntry;
       } else {
-        Message message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST
+        LocalizableMessage message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST
             .get(String.valueOf(dn));
         ErrorLogger.logError(message);
       }
@@ -481,7 +481,7 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      Message message = AdminMessages.ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT.get(
+      LocalizableMessage message = AdminMessages.ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT.get(
           String.valueOf(dn), StaticUtils.getExceptionMessage(e));
       ErrorLogger.logError(message);
     }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigDeleteListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigDeleteListenerAdaptor.java
index 10b8246..06d231f 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigDeleteListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigDeleteListenerAdaptor.java
@@ -28,14 +28,14 @@
 
 
 
-import static org.opends.messages.AdminMessages.*;
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 import static org.opends.server.loggers.debug.DebugLogger.*;
 
 import java.util.LinkedList;
 import java.util.List;
 
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.opends.server.admin.Configuration;
 import org.opends.server.admin.Constraint;
 import org.opends.server.admin.DecodingException;
@@ -214,7 +214,7 @@
    * {@inheritDoc}
    */
   public boolean configDeleteIsAcceptable(ConfigEntry configEntry,
-      MessageBuilder unacceptableReason) {
+      LocalizableMessageBuilder unacceptableReason) {
     DN dn = configEntry.getDN();
     AttributeValue av = dn.getRDN().getAttributeValue(0);
     String name = av.getValue().toString().trim();
@@ -249,7 +249,7 @@
       return false;
     }
 
-    List<Message> reasons = new LinkedList<Message>();
+    List<LocalizableMessage> reasons = new LinkedList<Message>();
 
     // Enforce any constraints.
     boolean isDeleteAllowed = true;
@@ -263,7 +263,7 @@
             isDeleteAllowed = false;
           }
         } catch (ConfigException e) {
-          Message message = ERR_SERVER_CONSTRAINT_EXCEPTION.get(e
+          LocalizableMessage message = ERR_SERVER_CONSTRAINT_EXCEPTION.get(e
               .getMessageObject());
           reasons.add(message);
           isDeleteAllowed = false;
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigExceptionFactory.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigExceptionFactory.java
index 4e71cd9..738f0b9 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigExceptionFactory.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigExceptionFactory.java
@@ -25,7 +25,7 @@
  *      Copyright 2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin.server;
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 
 
@@ -78,7 +78,7 @@
    */
   public ConfigException createDecodingExceptionAdaptor(DN dn,
       DefinitionDecodingException e) {
-    Message message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM.
+    LocalizableMessage message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM.
         get(String.valueOf(dn), stackTraceToSingleLineString(e));
     return new ConfigException(message, e);
   }
@@ -97,7 +97,7 @@
   public ConfigException createDecodingExceptionAdaptor(
       ServerManagedObjectDecodingException e) {
     DN dn = e.getPartialManagedObject().getDN();
-    Message message =
+    LocalizableMessage message =
             AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM.get(
                     String.valueOf(dn),
         stackTraceToSingleLineString(e));
@@ -117,7 +117,7 @@
   public ConfigException createDecodingExceptionAdaptor(
       ConstraintViolationException e) {
     DN dn = e.getManagedObject().getDN();
-    Message message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM
+    LocalizableMessage message = AdminMessages.ERR_ADMIN_MANAGED_OBJECT_DECODING_PROBLEM
         .get(String.valueOf(dn), stackTraceToSingleLineString(e));
     return new ConfigException(message, e);
   }
@@ -140,7 +140,7 @@
 
   public ConfigException createClassLoadingExceptionAdaptor(DN dn,
       String className, Exception e) {
-    Message message = AdminMessages.ERR_ADMIN_CANNOT_INSTANTIATE_CLASS.
+    LocalizableMessage message = AdminMessages.ERR_ADMIN_CANNOT_INSTANTIATE_CLASS.
         get(String.valueOf(className), String.valueOf(dn),
             stackTraceToSingleLineString(e));
     return new ConfigException(message, e);
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationAddListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationAddListener.java
index b38ebe5..a3ceb23 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationAddListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationAddListener.java
@@ -25,7 +25,7 @@
  *      Copyright 2007-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin.server;
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 
 
@@ -60,7 +60,7 @@
    *         acceptable, or <code>false</code> if it is not.
    */
   public boolean isConfigurationAddAcceptable(T configuration,
-      List<Message> unacceptableReasons);
+      List<LocalizableMessage> unacceptableReasons);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationChangeListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationChangeListener.java
index b2c7abe..dd85724 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationChangeListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationChangeListener.java
@@ -25,7 +25,7 @@
  *      Copyright 2007-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin.server;
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 
 
@@ -61,7 +61,7 @@
    *         acceptable, or <code>false</code> if it is not.
    */
   public boolean isConfigurationChangeAcceptable(T configuration,
-      List<Message> unacceptableReasons);
+      List<LocalizableMessage> unacceptableReasons);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationDeleteListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationDeleteListener.java
index aaa4b3f..0bb2290 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationDeleteListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConfigurationDeleteListener.java
@@ -25,7 +25,7 @@
  *      Copyright 2007-2008 Sun Microsystems, Inc.
  */
 package org.opends.server.admin.server;
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 
 
@@ -60,7 +60,7 @@
    *         acceptable, or <code>false</code> if it is not.
    */
   public boolean isConfigurationDeleteAcceptable(T configuration,
-      List<Message> unacceptableReasons);
+      List<LocalizableMessage> unacceptableReasons);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ConstraintViolationException.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ConstraintViolationException.java
index e630cd5..71a2081 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ConstraintViolationException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ConstraintViolationException.java
@@ -29,16 +29,16 @@
 
 
 
-import static org.opends.messages.AdminMessages.*;
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.opends.server.admin.DecodingException;
-import org.opends.server.util.Validator;
+import static com.forgerock.opendj.util.Validator.*;
 
 
 
@@ -60,7 +60,7 @@
 
 
   // Gets the default message.
-  private static Message getDefaultMessage(Collection<Message> messages) {
+  private static LocalizableMessage getDefaultMessage(Collection<Message> messages) {
     Validator.ensureNotNull(messages);
     Validator.ensureTrue(!messages.isEmpty());
 
@@ -76,14 +76,14 @@
 
 
   // Merge the messages into a single message.
-  private static Message getSingleMessage(Collection<Message> messages) {
+  private static LocalizableMessage getSingleMessage(Collection<Message> messages) {
     if (messages.size() == 1) {
       return messages.iterator().next();
     } else {
-      MessageBuilder builder = new MessageBuilder();
+      LocalizableMessageBuilder builder = new MessageBuilder();
 
       boolean isFirst = true;
-      for (Message m : messages) {
+      for (LocalizableMessage m : messages) {
         if (!isFirst) {
           builder.append(";  ");
         }
@@ -96,7 +96,7 @@
   }
 
   // The messages describing the constraint violations that occurred.
-  private final Collection<Message> messages;
+  private final Collection<LocalizableMessage> messages;
 
 
 
@@ -113,11 +113,11 @@
    *          non-empty).
    */
   public ConstraintViolationException(ServerManagedObject<?> managedObject,
-      Collection<Message> messages) {
+      Collection<LocalizableMessage> messages) {
     super(getDefaultMessage(messages));
 
     this.managedObject = managedObject;
-    this.messages = new ArrayList<Message>(messages);
+    this.messages = new ArrayList<LocalizableMessage>(messages);
   }
 
 
@@ -134,7 +134,7 @@
    *          occurred.
    */
   public ConstraintViolationException(ServerManagedObject<?> managedObject,
-      Message message) {
+      LocalizableMessage message) {
     this(managedObject, Collections.singleton(message));
   }
 
@@ -147,7 +147,7 @@
    * @return Returns an unmodifiable collection view of the messages
    *         describing the constraint violations that occurred.
    */
-  public Collection<Message> getMessages() {
+  public Collection<LocalizableMessage> getMessages() {
     return Collections.unmodifiableCollection(messages);
   }
 
@@ -160,7 +160,7 @@
    * @return Returns a single message listing all the messages
    *         combined into a single list separated by semi-colons.
    */
-  public Message getMessagesAsSingleMessage() {
+  public LocalizableMessage getMessagesAsSingleMessage() {
     return getSingleMessage(messages);
   }
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/DelayedConfigAddListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/DelayedConfigAddListener.java
index 5bedaec..cf32ac4 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/DelayedConfigAddListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/DelayedConfigAddListener.java
@@ -40,7 +40,7 @@
 import org.forgerock.opendj.ldap.DN;
 import org.opends.server.types.DebugLogLevel;
 import org.opends.server.types.ResultCode;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 
 
 /**
@@ -155,7 +155,7 @@
    * {@inheritDoc}
    */
   public boolean configAddIsAcceptable(ConfigEntry configEntry,
-      MessageBuilder unacceptableReason) {
+      LocalizableMessageBuilder unacceptableReason) {
     // Always acceptable.
     return true;
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java
index 7ad7b9c..431ac69 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObject.java
@@ -1165,7 +1165,7 @@
   void ensureIsUsable() throws ConstraintViolationException {
     // Enforce any constraints.
     boolean isUsable = true;
-    List<Message> reasons = new LinkedList<Message>();
+    List<LocalizableMessage> reasons = new LinkedList<Message>();
     for (Constraint constraint : definition.getAllConstraints()) {
       for (ServerConstraintHandler handler : constraint
           .getServerConstraintHandlers()) {
@@ -1174,7 +1174,7 @@
             isUsable = false;
           }
         } catch (ConfigException e) {
-          Message message = ERR_SERVER_CONSTRAINT_EXCEPTION.get(e
+          LocalizableMessage message = ERR_SERVER_CONSTRAINT_EXCEPTION.get(e
               .getMessageObject());
           reasons.add(message);
           isUsable = false;
@@ -1356,7 +1356,7 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      Message message = ERR_ADMIN_CANNOT_GET_LISTENER_BASE.get(
+      LocalizableMessage message = ERR_ADMIN_CANNOT_GET_LISTENER_BASE.get(
           String.valueOf(dn), stackTraceToSingleLineString(e));
       throw new ConfigException(message, e);
     }
@@ -1402,7 +1402,7 @@
     }
 
     // No parent entry could be found.
-    Message message = ERR_ADMIN_UNABLE_TO_REGISTER_LISTENER
+    LocalizableMessage message = ERR_ADMIN_UNABLE_TO_REGISTER_LISTENER
         .get(String.valueOf(baseDN));
     throw new ConfigException(message);
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListener.java
index c3bd1d0..2f463bf 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListener.java
@@ -28,7 +28,7 @@
 
 
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 import java.util.List;
 
@@ -61,7 +61,7 @@
    *         acceptable, or <code>false</code> if it is not.
    */
   public boolean isConfigurationAddAcceptable(
-      ServerManagedObject<? extends T> mo, List<Message> unacceptableReasons);
+      ServerManagedObject<? extends T> mo, List<LocalizableMessage> unacceptableReasons);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListenerAdaptor.java
index 35a1cee..9506d56 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectAddListenerAdaptor.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.Configuration;
 import org.opends.server.types.ConfigChangeResult;
 
@@ -92,7 +92,7 @@
    * {@inheritDoc}
    */
   public boolean isConfigurationAddAcceptable(
-      ServerManagedObject<? extends T> mo, List<Message> unacceptableReasons) {
+      ServerManagedObject<? extends T> mo, List<LocalizableMessage> unacceptableReasons) {
     return listener.isConfigurationAddAcceptable(mo.getConfiguration(),
         unacceptableReasons);
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListener.java
index 4ca64f4..35020f4 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListener.java
@@ -28,7 +28,7 @@
 
 
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 import java.util.List;
 
@@ -62,7 +62,7 @@
    *         acceptable, or <code>false</code> if it is not.
    */
   public boolean isConfigurationChangeAcceptable(
-      ServerManagedObject<? extends T> mo, List<Message> unacceptableReasons);
+      ServerManagedObject<? extends T> mo, List<LocalizableMessage> unacceptableReasons);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListenerAdaptor.java
index 0539f6a..ee4233b 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectChangeListenerAdaptor.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.Configuration;
 import org.opends.server.types.ConfigChangeResult;
 
@@ -94,7 +94,7 @@
    * {@inheritDoc}
    */
   public boolean isConfigurationChangeAcceptable(
-      ServerManagedObject<? extends T> mo, List<Message> unacceptableReasons) {
+      ServerManagedObject<? extends T> mo, List<LocalizableMessage> unacceptableReasons) {
     return listener.isConfigurationChangeAcceptable(mo.getConfiguration(),
         unacceptableReasons);
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDecodingException.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDecodingException.java
index aa36dbf..a2cc3cb 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDecodingException.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDecodingException.java
@@ -29,18 +29,18 @@
 
 
 
-import static org.opends.messages.AdminMessages.*;
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 
-import org.opends.messages.Message;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.opends.server.admin.DecodingException;
 import org.opends.server.admin.ManagedObjectDefinition;
 import org.opends.server.admin.PropertyException;
-import org.opends.server.util.Validator;
+import static com.forgerock.opendj.util.Validator.*;
 
 
 
@@ -58,11 +58,11 @@
 
 
   // Create the message.
-  private static Message createMessage(
+  private static LocalizableMessage createMessage(
       ServerManagedObject<?> partialManagedObject,
       Collection<PropertyException> causes) {
-    Validator.ensureNotNull(causes);
-    Validator.ensureTrue(!causes.isEmpty());
+    ensureNotNull(causes);
+    ensureTrue(!causes.isEmpty(), "causes should nnot be empty");
 
     ManagedObjectDefinition<?, ?> d = partialManagedObject
         .getManagedObjectDefinition();
@@ -70,7 +70,7 @@
       return ERR_MANAGED_OBJECT_DECODING_EXCEPTION_SINGLE.get(d
           .getUserFriendlyName(), causes.iterator().next().getMessageObject());
     } else {
-      MessageBuilder builder = new MessageBuilder();
+      LocalizableMessageBuilder builder = new MessageBuilder();
 
       boolean isFirst = true;
       for (PropertyException cause : causes) {
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListener.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListener.java
index ac238a6..f86ea29 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListener.java
@@ -28,7 +28,7 @@
 
 
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 
 import java.util.List;
 
@@ -62,7 +62,7 @@
    *         acceptable, or <code>false</code> if it is not.
    */
   public boolean isConfigurationDeleteAcceptable(
-      ServerManagedObject<? extends T> mo, List<Message> unacceptableReasons);
+      ServerManagedObject<? extends T> mo, List<LocalizableMessage> unacceptableReasons);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListenerAdaptor.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListenerAdaptor.java
index 7f9dca6..6b8007a 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListenerAdaptor.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagedObjectDeleteListenerAdaptor.java
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.Configuration;
 import org.opends.server.types.ConfigChangeResult;
 
@@ -93,7 +93,7 @@
    * {@inheritDoc}
    */
   public boolean isConfigurationDeleteAcceptable(
-      ServerManagedObject<? extends T> mo, List<Message> unacceptableReasons) {
+      ServerManagedObject<? extends T> mo, List<LocalizableMessage> unacceptableReasons) {
     return listener.isConfigurationDeleteAcceptable(mo.getConfiguration(),
         unacceptableReasons);
   }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java
index 045d3ad..e982e4d 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/ServerManagementContext.java
@@ -29,7 +29,7 @@
 
 
 
-import static org.opends.messages.AdminMessages.*;
+import static com.forgerock.opendj.ldap.AdminMessages.*;
 import static org.opends.server.loggers.debug.DebugLogger.*;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -44,7 +44,7 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 
-import org.opends.messages.Message;
+import org.forgerock.i18n.LocalizableMessage;
 import org.opends.server.admin.AbsoluteInheritedDefaultBehaviorProvider;
 import org.opends.server.admin.AbstractManagedObjectDefinition;
 import org.opends.server.admin.AggregationPropertyDefinition;
@@ -955,7 +955,7 @@
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      Message message = ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT.get(
+      LocalizableMessage message = ERR_ADMIN_CANNOT_GET_MANAGED_OBJECT.get(
           String.valueOf(dn), stackTraceToSingleLineString(e));
       throw new ConfigException(message, e);
     }
@@ -963,7 +963,7 @@
     // The configuration handler is free to return null indicating
     // that the entry does not exist.
     if (configEntry == null) {
-      Message message = ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST
+      LocalizableMessage message = ERR_ADMIN_MANAGED_OBJECT_DOES_NOT_EXIST
           .get(String.valueOf(dn));
       throw new ConfigException(message);
     }
diff --git a/opendj-admin/src/main/java/org/opends/server/admin/server/package-info.java b/opendj-admin/src/main/java/org/opends/server/admin/server/package-info.java
index 45f84ff..dbf8776 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/server/package-info.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/server/package-info.java
@@ -35,7 +35,5 @@
  * access the server's current configuration and register
  * to be notified when the configuration changes.
  */
-@org.opends.server.types.PublicAPI(
-     stability=org.opends.server.types.StabilityLevel.PRIVATE)
 package org.opends.server.admin.server;
 
diff --git a/opendj-admin/src/main/java/org/opends/server/api/ConfigAddListener.java b/opendj-admin/src/main/java/org/opends/server/api/ConfigAddListener.java
index ecb27f1..2968838 100644
--- a/opendj-admin/src/main/java/org/opends/server/api/ConfigAddListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/api/ConfigAddListener.java
@@ -26,6 +26,7 @@
  */
 package org.opends.server.api;
 
+import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.opends.server.types.ConfigChangeResult;
 
 /**
@@ -47,7 +48,7 @@
      * @return {@code true} if the proposed entry contains an acceptable
      *         configuration, or {@code false} if it does not.
      */
-    public boolean configAddIsAcceptable(ConfigEntry configEntry, MessageBuilder unacceptableReason);
+    public boolean configAddIsAcceptable(ConfigEntry configEntry, LocalizableMessageBuilder unacceptableReason);
 
     /**
      * Attempts to apply a new configuration based on the provided added entry.
diff --git a/opendj-admin/src/main/java/org/opends/server/api/ConfigChangeListener.java b/opendj-admin/src/main/java/org/opends/server/api/ConfigChangeListener.java
index 8200ffe..bec1995 100644
--- a/opendj-admin/src/main/java/org/opends/server/api/ConfigChangeListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/api/ConfigChangeListener.java
@@ -30,7 +30,7 @@
 
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.types.ConfigChangeResult;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 
 
 /**
@@ -61,7 +61,7 @@
    *          not.
    */
   public boolean configChangeIsAcceptable(ConfigEntry configEntry,
-                      MessageBuilder unacceptableReason);
+                      LocalizableMessageBuilder unacceptableReason);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/api/ConfigDeleteListener.java b/opendj-admin/src/main/java/org/opends/server/api/ConfigDeleteListener.java
index ea13246..d34bdb7 100644
--- a/opendj-admin/src/main/java/org/opends/server/api/ConfigDeleteListener.java
+++ b/opendj-admin/src/main/java/org/opends/server/api/ConfigDeleteListener.java
@@ -28,9 +28,8 @@
 
 
 
-import org.opends.server.config.ConfigEntry;
 import org.opends.server.types.ConfigChangeResult;
-import org.opends.messages.MessageBuilder;
+import org.forgerock.i18n.LocalizableMessageBuilder;
 
 
 /**
@@ -38,11 +37,6 @@
  * component should implement if it wishes to be able to receive
  * notification if entries below a configuration entry are removed.
  */
-@org.opends.server.types.PublicAPI(
-     stability=org.opends.server.types.StabilityLevel.VOLATILE,
-     mayInstantiate=false,
-     mayExtend=true,
-     mayInvoke=false)
 public interface ConfigDeleteListener
 {
   /**
@@ -60,7 +54,7 @@
    *          the configuration, or {@code false} if not.
    */
   public boolean configDeleteIsAcceptable(ConfigEntry configEntry,
-                      MessageBuilder unacceptableReason);
+                      LocalizableMessageBuilder unacceptableReason);
 
 
 
diff --git a/opendj-admin/src/main/java/org/opends/server/types/DirectoryEnvironmentConfig.java b/opendj-admin/src/main/java/org/opends/server/types/DirectoryEnvironmentConfig.java
new file mode 100644
index 0000000..ad55627
--- /dev/null
+++ b/opendj-admin/src/main/java/org/opends/server/types/DirectoryEnvironmentConfig.java
@@ -0,0 +1,39 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2008-2010 Sun Microsystems, Inc.
+ *      Portions Copyright 2013 ForgeRock AS.
+ */
+package org.opends.server.types;
+
+/**
+ * This class provides a set of properties that may control various aspects of
+ * the server environment. Note that these properties may only be altered before
+ * the Directory Server is started. Any attempt to change an environment
+ * configuration property while the server is running will be rejected.
+ */
+public final class DirectoryEnvironmentConfig {
+
+    // TODO : implements
+}
diff --git a/opendj-admin/src/main/java/org/opends/server/util/EmbeddedUtils.java b/opendj-admin/src/main/java/org/opends/server/util/EmbeddedUtils.java
new file mode 100644
index 0000000..db09e2d
--- /dev/null
+++ b/opendj-admin/src/main/java/org/opends/server/util/EmbeddedUtils.java
@@ -0,0 +1,105 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2008 Sun Microsystems, Inc.
+ */
+package org.opends.server.util;
+
+import org.forgerock.i18n.LocalizableMessage;
+import org.opends.server.config.ConfigException;
+import org.opends.server.types.DirectoryEnvironmentConfig;
+import org.opends.server.types.InitializationException;
+
+/**
+ * This class provides a number of utility methods for using OpenDS in an
+ * embedded manner (i.e., running within the same JVM as another application and
+ * controlled by that application).
+ */
+public final class EmbeddedUtils {
+    /**
+     * Indicates whether the Directory Server is currently running.
+     *
+     * @return {@code true} if the server is currently running, or {@code false}
+     *         if not.
+     */
+    public static boolean isRunning() {
+        throw new RuntimeException("not implemented");
+    }
+
+    /**
+     * Attempts to start the Directory Server.
+     *
+     * @param config
+     *            The environment configuration to use for the server.
+     * @throws ConfigException
+     *             If a configuration problem is detected during the server
+     *             initialization or startup process.
+     * @throws InitializationException
+     *             If the Directory Server is already running, or if an error
+     *             occurs during server initialization or startup.
+     */
+    public static void startServer(DirectoryEnvironmentConfig config) throws ConfigException, InitializationException {
+        throw new RuntimeException("not implemented");
+    }
+
+    /**
+     * Attempts to stop the Directory Server.
+     *
+     * @param className
+     *            The name of the class that initiated the shutdown.
+     * @param reason
+     *            A message explaining the reason for the shutdown.
+     */
+    public static void stopServer(String className, LocalizableMessage reason) {
+        throw new RuntimeException("not implemented");
+    }
+
+    /**
+     * Attempts to restart the Directory Server. This will perform an in-core
+     * restart in which the existing server instance will be shut down, a new
+     * instance will be created, and it will be reinitialized and restarted.
+     *
+     * @param className
+     *            The name of the class that initiated the restart.
+     * @param reason
+     *            A message explaining the reason for the retart.
+     * @param config
+     *            The environment configuration to use for the new server
+     *            instance.
+     */
+    public static void restartServer(String className, LocalizableMessage reason, DirectoryEnvironmentConfig config) {
+        throw new RuntimeException("not implemented");
+    }
+
+    /**
+     * Sets up a number of internal server data structures to ensure that they
+     * are properly initialized for use. This is necessary if server libraries
+     * are going to be used without the server running (e.g., to facilitate use
+     * in an LDAP client API, for DN processing, etc.). This will have no effect
+     * if the server has already been initialized for client use.
+     */
+    public static void initializeForClientUse() {
+        throw new RuntimeException("not implemented");
+    }
+}

--
Gitblit v1.10.0