From df993e4e7a2b5af0c8e0907a80e1a4cef10ee56d Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Thu, 11 Feb 2016 14:17:18 +0000
Subject: [PATCH] OPENDJSDK-42 cli arguments fluent builder

---
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DeleteSubCommandHandler.java              |   10 
 opendj-server-legacy/src/main/java/org/opends/server/util/cli/LDAPConnectionConsoleInteraction.java        |   26 
 opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java                                      |   81 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java                                 |  612 ++--
 opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java                                     |  309 +-
 opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesToolArgumentParser.java           |   32 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java                                 |  418 +--
 opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java           |  192 
 opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallerArgumentParser.java          |  123 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java                                   |  127 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java                                 |  147 
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SubCommandHandler.java                    |   89 
 opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java                             |   54 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java                                 |  210 
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/HelpSubCommandHandler.java                |   31 
 opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDSArgumentParser.java                    |  362 +-
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendStat.java                   |  178 
 opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java                          |   66 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java                                 |  340 +-
 opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java                                  |   80 
 opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskScheduleUserData.java                 |   21 
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SetPropSubCommandHandler.java             |  162 
 opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java                        |    4 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java                                |   61 
 opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java                   |   23 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java                                |  367 +-
 opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java                             |  112 
 opendj-server-legacy/src/main/java/org/opends/server/util/StaticUtils.java                                 |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java                                 |   76 
 opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java                 |    8 
 opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java                             |  148 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java                               |   60 
 opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java                            |    4 
 opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java                         |  337 +-
 opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java                          |   90 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java                    |   39 
 opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java                                |   73 
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelArgumentParser.java        |    3 
 opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java                                   |  163 
 opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java                             |   11 
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java                         |   18 
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java                             |   63 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java                                 |  297 +-
 opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/TaskScheduleArgs.java                |   85 
 opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java                               |   86 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java                                |  235 +
 opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java                           |   12 
 opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java                                |   84 
 opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java                              |  310 +-
 opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCliArgumentParser.java             |   13 
 opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java |  513 +--
 opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/CreateSubCommandHandler.java              |   99 
 opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java         |   83 
 opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java                                  |   88 
 54 files changed, 3,491 insertions(+), 3,747 deletions(-)

diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/CreateSubCommandHandler.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/CreateSubCommandHandler.java
index ca65b3d..abb0bc0 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/CreateSubCommandHandler.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/CreateSubCommandHandler.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2013-2015 ForgeRock AS
+ *      Portions Copyright 2013-2016 ForgeRock AS
  */
 package org.forgerock.opendj.config.dsconfig;
 
@@ -917,32 +917,34 @@
         // Build the -t option usage.
         this.typeUsage = getSubTypesUsage(r.getChildDefinition());
 
-        // Create the --property argument which is used to specify
-        // property values.
-        this.propertySetArgument = new StringArgument(OPTION_DSCFG_LONG_SET, OPTION_DSCFG_SHORT_SET,
-                OPTION_DSCFG_LONG_SET, false, true, true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
-        this.subCommand.addArgument(this.propertySetArgument);
+        // Create the --property argument which is used to specify property values.
+        this.propertySetArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_SET)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_SET)
+                        .description(INFO_DSCFG_DESCRIPTION_PROP_VAL.get())
+                        .multiValued()
+                        .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
+
+        final StringArgument.Builder typeArgumentBuilder = StringArgument.builder(OPTION_DSCFG_LONG_TYPE)
+                .shortIdentifier(OPTION_DSCFG_SHORT_TYPE)
+                .valuePlaceholder(INFO_TYPE_PLACEHOLDER.get());
 
         if (!types.containsKey(DSConfig.GENERIC_TYPE)) {
             // The option is mandatory when non-interactive.
-            this.typeArgument = new StringArgument("type", OPTION_DSCFG_SHORT_TYPE, OPTION_DSCFG_LONG_TYPE, false,
-                    false, true, INFO_TYPE_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_TYPE.get(r
-                            .getChildDefinition().getUserFriendlyName(), typeUsage));
+            typeArgumentBuilder.description(INFO_DSCFG_DESCRIPTION_TYPE.get(
+                    r.getChildDefinition().getUserFriendlyName(), typeUsage));
         } else {
             // The option has a sensible default "generic".
-            this.typeArgument = new StringArgument("type", OPTION_DSCFG_SHORT_TYPE, OPTION_DSCFG_LONG_TYPE, false,
-                    false, true, INFO_TYPE_PLACEHOLDER.get(), DSConfig.GENERIC_TYPE, null,
-                    INFO_DSCFG_DESCRIPTION_TYPE_DEFAULT.get(r.getChildDefinition().getUserFriendlyName(),
-                            DSConfig.GENERIC_TYPE, typeUsage));
-
-            // Hide the option if it defaults to generic and generic is the
-            // only possible value.
+            typeArgumentBuilder.description(INFO_DSCFG_DESCRIPTION_TYPE_DEFAULT.get(
+                                       r.getChildDefinition().getUserFriendlyName(), DSConfig.GENERIC_TYPE, typeUsage))
+                               .defaultValue(DSConfig.GENERIC_TYPE);
+            // Hide the option if it defaults to generic and generic is the only possible value.
             if (types.size() == 1) {
-                this.typeArgument.setHidden(true);
+                typeArgumentBuilder.hidden();
             }
         }
-        this.subCommand.addArgument(this.typeArgument);
+        typeArgument = typeArgumentBuilder.buildAndAddToSubCommand(subCommand);
 
         // Register the tags associated with the child managed objects.
         addTags(relation.getChildDefinition().getAllTags());
@@ -1144,9 +1146,13 @@
             commandBuilder.addArgument(typeArgument);
         } else {
             // Set the type provided by the user
-            StringArgument arg = new StringArgument(typeArgument.getName(), OPTION_DSCFG_SHORT_TYPE,
-                    OPTION_DSCFG_LONG_TYPE, false, false, true, INFO_TYPE_PLACEHOLDER.get(),
-                    typeArgument.getDefaultValue(), typeArgument.getPropertyName(), typeArgument.getDescription());
+            StringArgument arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_TYPE)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_TYPE)
+                            .description(typeArgument.getDescription())
+                            .defaultValue(typeArgument.getDefaultValue())
+                            .valuePlaceholder(INFO_TYPE_PLACEHOLDER.get())
+                            .buildArgument();
             arg.addValue(getTypeName(d));
             commandBuilder.addArgument(arg);
         }
@@ -1155,9 +1161,13 @@
              * We might have some conflicts in terms of arguments: the user might have provided some values that
              * were not good and then these have overwritten when asking for them interactively: filter them
              */
-            StringArgument filteredArg = new StringArgument(OPTION_DSCFG_LONG_SET, OPTION_DSCFG_SHORT_SET,
-                    OPTION_DSCFG_LONG_SET, false, true, true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                    INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
+            StringArgument filteredArg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_SET)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_SET)
+                            .description(INFO_DSCFG_DESCRIPTION_PROP_VAL.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                            .buildArgument();
             for (String value : propertySetArgument.getValues()) {
                 if (canAddValue(commandBuilder, value)) {
                     filteredArg.addValue(value);
@@ -1172,16 +1182,18 @@
         List<Argument> argsCopy = new LinkedList<>(commandBuilder.getArguments());
         for (Argument arg : argsCopy) {
             if (arg != null
-                    && (OPTION_DSCFG_LONG_RESET.equals(arg.getName())
-                            || OPTION_DSCFG_LONG_REMOVE.equals(arg.getName()))) {
+                    && (OPTION_DSCFG_LONG_RESET.equals(arg.getLongIdentifier())
+                            || OPTION_DSCFG_LONG_REMOVE.equals(arg.getLongIdentifier()))) {
                 commandBuilder.removeArgument(arg);
             }
         }
 
         if (isNameProvidedInteractively) {
-            StringArgument arg = new StringArgument(providedNamingArgName, null, providedNamingArgName, false,
-                    true, INFO_NAME_PLACEHOLDER.get(), INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d
-                            .getUserFriendlyName()));
+            StringArgument arg =
+                    StringArgument.builder(providedNamingArgName)
+                            .description(INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()))
+                            .valuePlaceholder(INFO_NAME_PLACEHOLDER.get())
+                            .buildArgument();
             arg.addValue(child.getManagedObjectPath().getName());
             commandBuilder.addArgument(arg);
         } else {
@@ -1201,7 +1213,7 @@
         String propName = value.substring(0, index);
         for (Argument arg : commandBuilder.getArguments()) {
             for (String value2 : arg.getValues()) {
-                String prop2Name = getPropName(arg.getName(), value2);
+                String prop2Name = getPropName(arg.getLongIdentifier(), value2);
                 if (propName.equalsIgnoreCase(prop2Name)) {
                     return false;
                 }
@@ -1245,18 +1257,31 @@
         switch (mod.getType()) {
         case ADD:
         case SET:
-            arg = new StringArgument(OPTION_DSCFG_LONG_SET, OPTION_DSCFG_SHORT_SET, OPTION_DSCFG_LONG_SET, false, true,
-                    true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_SET)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_SET)
+                            .description(INFO_DSCFG_DESCRIPTION_PROP_VAL.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                            .buildArgument();
             addValues(mod, arg);
             return arg;
         case RESET:
-            arg = new StringArgument(OPTION_DSCFG_LONG_RESET, null, OPTION_DSCFG_LONG_RESET, false, true, true,
-                    INFO_PROPERTY_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_RESET_PROP.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_RESET)
+                            .description(INFO_DSCFG_DESCRIPTION_RESET_PROP.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_PROPERTY_PLACEHOLDER.get())
+                            .buildArgument();
             arg.addValue(mod.getPropertyDefinition().getName());
             return arg;
         case REMOVE:
-            arg = new StringArgument(OPTION_DSCFG_LONG_REMOVE, null, OPTION_DSCFG_LONG_REMOVE, false, true, true,
-                    INFO_VALUE_SET_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_REMOVE)
+                            .description(INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                            .buildArgument();
             addValues(mod, arg);
             return arg;
         default:
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
index 7dba81f..ca0cc8b 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS.
+ *      Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.forgerock.opendj.config.dsconfig;
 
@@ -943,29 +943,36 @@
             advancedModeArgument = CommonArguments.getAdvancedMode();
             showUsageArgument = CommonArguments.getShowUsage();
 
-            batchArgument = new BooleanArgument(OPTION_LONG_BATCH, null, OPTION_LONG_BATCH,
-                    INFO_DESCRIPTION_BATCH.get());
-
-            batchFileArgument = new StringArgument(OPTION_LONG_BATCH_FILE_PATH, OPTION_SHORT_BATCH_FILE_PATH,
-                    OPTION_LONG_BATCH_FILE_PATH, false, false, true, INFO_BATCH_FILE_PATH_PLACEHOLDER.get(), null,
-                    null, INFO_DESCRIPTION_BATCH_FILE_PATH.get());
-
-            displayEquivalentArgument = new BooleanArgument(OPTION_LONG_DISPLAY_EQUIVALENT, null,
-                    OPTION_LONG_DISPLAY_EQUIVALENT, INFO_DSCFG_DESCRIPTION_DISPLAY_EQUIVALENT.get());
-
-            equivalentCommandFileArgument = new StringArgument(OPTION_LONG_EQUIVALENT_COMMAND_FILE_PATH, null,
-                    OPTION_LONG_EQUIVALENT_COMMAND_FILE_PATH, false, false, true, INFO_PATH_PLACEHOLDER.get(), null,
-                    null, INFO_DSCFG_DESCRIPTION_EQUIVALENT_COMMAND_FILE_PATH.get());
-
-            propertiesFileArgument = new StringArgument("propertiesFilePath", null, OPTION_LONG_PROP_FILE_PATH, false,
-                    false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-                    INFO_DESCRIPTION_PROP_FILE_PATH.get());
-
-            noPropertiesFileArgument = new BooleanArgument("noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-                    INFO_DESCRIPTION_NO_PROP_FILE.get());
+            batchArgument =
+                    BooleanArgument.builder(OPTION_LONG_BATCH)
+                            .description(INFO_DESCRIPTION_BATCH.get())
+                            .buildArgument();
+            batchFileArgument =
+                    StringArgument.builder(OPTION_LONG_BATCH_FILE_PATH)
+                            .shortIdentifier(OPTION_SHORT_BATCH_FILE_PATH)
+                            .description(INFO_DESCRIPTION_BATCH_FILE_PATH.get())
+                            .valuePlaceholder(INFO_BATCH_FILE_PATH_PLACEHOLDER.get())
+                            .buildArgument();
+            displayEquivalentArgument =
+                    BooleanArgument.builder(OPTION_LONG_DISPLAY_EQUIVALENT)
+                            .description(INFO_DSCFG_DESCRIPTION_DISPLAY_EQUIVALENT.get())
+                            .buildArgument();
+            equivalentCommandFileArgument =
+                    StringArgument.builder(OPTION_LONG_EQUIVALENT_COMMAND_FILE_PATH)
+                            .description(INFO_DSCFG_DESCRIPTION_EQUIVALENT_COMMAND_FILE_PATH.get())
+                            .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                            .buildArgument();
+            propertiesFileArgument =
+                    StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                            .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                            .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                            .buildArgument();
+            noPropertiesFileArgument =
+                    BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                            .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                            .buildArgument();
 
             // Register the global arguments.
-
             ArgumentGroup toolOptionsGroup = new ArgumentGroup(INFO_DSCFG_DESCRIPTION_OPTIONS_ARGS.get(), 2);
             parser.addGlobalArgument(advancedModeArgument, toolOptionsGroup);
 
@@ -1033,8 +1040,10 @@
 
                 String option = OPTION_LONG_HELP + "-" + tag.getName();
                 String synopsis = tag.getSynopsis().toString().toLowerCase();
-                BooleanArgument arg = new BooleanArgument(option, null, option,
-                        INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE.get(synopsis));
+                BooleanArgument arg =
+                        BooleanArgument.builder(option)
+                                .description(INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE.get(synopsis))
+                                .buildArgument();
 
                 parser.addGlobalArgument(arg);
                 parser.setUsageGroupArgument(arg, subCommands);
@@ -1042,8 +1051,10 @@
 
             // Register the --help-all argument.
             String option = OPTION_LONG_HELP + "-all";
-            BooleanArgument arg = new BooleanArgument(option, null, option,
-                    INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_ALL.get());
+            BooleanArgument arg =
+                    BooleanArgument.builder(option)
+                            .description(INFO_DSCFG_DESCRIPTION_SHOW_GROUP_USAGE_ALL.get())
+                            .buildArgument();
 
             parser.addGlobalArgument(arg);
             parser.setUsageGroupArgument(arg, allSubCommands);
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DeleteSubCommandHandler.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DeleteSubCommandHandler.java
index dfbc298..4d64ed6 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DeleteSubCommandHandler.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DeleteSubCommandHandler.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
- *      Portions Copyright 2014 ForgeRock AS
+ *      Portions Copyright 2014-2016 ForgeRock AS
  */
 package org.forgerock.opendj.config.dsconfig;
 
@@ -167,9 +167,11 @@
         this.namingArgs = createNamingArgs(subCommand, c, false);
 
         // Create the --force argument which is used to force deletion.
-        this.forceArgument = new BooleanArgument(OPTION_DSCFG_LONG_FORCE, OPTION_DSCFG_SHORT_FORCE,
-                OPTION_DSCFG_LONG_FORCE, INFO_DSCFG_DESCRIPTION_FORCE.get(ufpn));
-        subCommand.addArgument(forceArgument);
+        this.forceArgument =
+                BooleanArgument.builder(OPTION_DSCFG_LONG_FORCE)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_FORCE)
+                        .description(INFO_DSCFG_DESCRIPTION_FORCE.get(ufpn))
+                        .buildAndAddToSubCommand(subCommand);
 
         // Register the tags associated with the child managed objects.
         addTags(relation.getChildDefinition().getAllTags());
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/HelpSubCommandHandler.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/HelpSubCommandHandler.java
index 9b120fc..a863a5e 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/HelpSubCommandHandler.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/HelpSubCommandHandler.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2008 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  */
 package org.forgerock.opendj.config.dsconfig;
 
@@ -620,18 +620,23 @@
         LocalizableMessage desc = INFO_DSCFG_DESCRIPTION_SUBCMD_HELPPROP.get();
         this.subCommand = new SubCommand(parser, name, false, 0, 0, null, desc);
 
-        this.categoryArgument = new StringArgument(OPTION_DSCFG_LONG_CATEGORY, OPTION_DSCFG_SHORT_CATEGORY,
-                OPTION_DSCFG_LONG_CATEGORY, false, false, true, INFO_CATEGORY_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_HELP_CATEGORY.get());
-        this.subCommand.addArgument(this.categoryArgument);
-
-        this.typeArgument = new StringArgument(OPTION_DSCFG_LONG_TYPE, OPTION_DSCFG_SHORT_TYPE, OPTION_DSCFG_LONG_TYPE,
-                false, false, true, INFO_TYPE_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_HELP_TYPE.get());
-        this.subCommand.addArgument(this.typeArgument);
-
-        this.inheritedModeArgument = new BooleanArgument(OPTION_DSCFG_LONG_INHERITED, OPTION_DSCFG_SHORT_INHERITED,
-                OPTION_DSCFG_LONG_INHERITED, INFO_DSCFG_DESCRIPTION_HELP_INHERITED.get());
-        subCommand.addArgument(inheritedModeArgument);
+        categoryArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_CATEGORY)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_CATEGORY)
+                        .description(INFO_DSCFG_DESCRIPTION_HELP_CATEGORY.get())
+                        .valuePlaceholder(INFO_CATEGORY_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
+        typeArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_TYPE)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_TYPE)
+                        .description(INFO_DSCFG_DESCRIPTION_HELP_TYPE.get())
+                        .valuePlaceholder(INFO_TYPE_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
+        inheritedModeArgument =
+                BooleanArgument.builder(OPTION_DSCFG_LONG_INHERITED)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_INHERITED)
+                        .description(INFO_DSCFG_DESCRIPTION_HELP_INHERITED.get())
+                        .buildAndAddToSubCommand(subCommand);
 
         // Register common arguments.
         registerPropertyNameArgument(this.subCommand);
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SetPropSubCommandHandler.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SetPropSubCommandHandler.java
index dd9a010..ca04562 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SetPropSubCommandHandler.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SetPropSubCommandHandler.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  *      Portions Copyright 2012 profiq, s.r.o.
  */
 package org.forgerock.opendj.config.dsconfig;
@@ -80,7 +80,7 @@
 
 /**
  * A sub-command handler which is used to modify the properties of a managed object.
- * <p>
+ * <p/>
  * This sub-command implements the various set-xxx-prop sub-commands.
  */
 final class SetPropSubCommandHandler extends SubCommandHandler {
@@ -149,14 +149,14 @@
      * Creates a new set-xxx-prop sub-command for an instantiable relation.
      *
      * @param parser
-     *            The sub-command argument parser.
+     *         The sub-command argument parser.
      * @param path
-     *            The parent managed object path.
+     *         The parent managed object path.
      * @param r
-     *            The instantiable relation.
+     *         The instantiable relation.
      * @return Returns the new set-xxx-prop sub-command.
      * @throws ArgumentException
-     *             If the sub-command could not be created successfully.
+     *         If the sub-command could not be created successfully.
      */
     public static SetPropSubCommandHandler create(SubCommandArgumentParser parser, ManagedObjectPath<?, ?> path,
             InstantiableRelationDefinition<?, ?> r) throws ArgumentException {
@@ -167,14 +167,14 @@
      * Creates a new set-xxx-prop sub-command for an optional relation.
      *
      * @param parser
-     *            The sub-command argument parser.
+     *         The sub-command argument parser.
      * @param path
-     *            The parent managed object path.
+     *         The parent managed object path.
      * @param r
-     *            The optional relation.
+     *         The optional relation.
      * @return Returns the new set-xxx-prop sub-command.
      * @throws ArgumentException
-     *             If the sub-command could not be created successfully.
+     *         If the sub-command could not be created successfully.
      */
     public static SetPropSubCommandHandler create(SubCommandArgumentParser parser, ManagedObjectPath<?, ?> path,
             OptionalRelationDefinition<?, ?> r) throws ArgumentException {
@@ -185,14 +185,14 @@
      * Creates a new set-xxx-prop sub-command for a set relation.
      *
      * @param parser
-     *            The sub-command argument parser.
+     *         The sub-command argument parser.
      * @param path
-     *            The parent managed object path.
+     *         The parent managed object path.
      * @param r
-     *            The set relation.
+     *         The set relation.
      * @return Returns the new set-xxx-prop sub-command.
      * @throws ArgumentException
-     *             If the sub-command could not be created successfully.
+     *         If the sub-command could not be created successfully.
      */
     public static SetPropSubCommandHandler create(SubCommandArgumentParser parser, ManagedObjectPath<?, ?> path,
             SetRelationDefinition<?, ?> r) throws ArgumentException {
@@ -203,14 +203,14 @@
      * Creates a new set-xxx-prop sub-command for a singleton relation.
      *
      * @param parser
-     *            The sub-command argument parser.
+     *         The sub-command argument parser.
      * @param path
-     *            The parent managed object path.
+     *         The parent managed object path.
      * @param r
-     *            The singleton relation.
+     *         The singleton relation.
      * @return Returns the new set-xxx-prop sub-command.
      * @throws ArgumentException
-     *             If the sub-command could not be created successfully.
+     *         If the sub-command could not be created successfully.
      */
     public static SetPropSubCommandHandler create(SubCommandArgumentParser parser, ManagedObjectPath<?, ?> path,
             SingletonRelationDefinition<?, ?> r) throws ArgumentException {
@@ -222,20 +222,20 @@
      * object.
      *
      * @param app
-     *            The console application.
+     *         The console application.
      * @param context
-     *            The management context.
+     *         The management context.
      * @param mo
-     *            The managed object to be configured.
+     *         The managed object to be configured.
      * @param handler
-     *            The SubCommandHandler whose command builder properties must be updated.
+     *         The SubCommandHandler whose command builder properties must be updated.
      * @return Returns a MenuResult.success() if the managed object was configured successfully, or MenuResult.quit(),
-     *         or MenuResult.cancel(), if the managed object was edited interactively and the user chose to quit or
-     *         cancel.
+     * or MenuResult.cancel(), if the managed object was edited interactively and the user chose to quit or
+     * cancel.
      * @throws ClientException
-     *             If an unrecoverable client exception occurred whilst interacting with the server.
+     *         If an unrecoverable client exception occurred whilst interacting with the server.
      * @throws ClientException
-     *             If an error occurred whilst interacting with the console.
+     *         If an error occurred whilst interacting with the console.
      */
     public static MenuResult<Void> modifyManagedObject(ConsoleApplication app, ManagementContext context,
             ManagedObject<?> mo, SubCommandHandler handler) throws ClientException {
@@ -414,9 +414,12 @@
                                                 String argName = CLIProfile.getInstance().getNamingArgument(
                                                         path.getRelationDefinition());
                                                 try {
-                                                    StringArgument arg = new StringArgument(argName, null, argName,
-                                                            false, true, INFO_NAME_PLACEHOLDER.get(),
-                                                            INFO_DSCFG_DESCRIPTION_NAME.get(d.getUserFriendlyName()));
+                                                    StringArgument arg =
+                                                            StringArgument.builder(argName)
+                                                                    .description(INFO_DSCFG_DESCRIPTION_NAME.get(
+                                                                            d.getUserFriendlyName()))
+                                                                    .valuePlaceholder(INFO_NAME_PLACEHOLDER.get())
+                                                                    .buildArgument();
                                                     arg.addValue(name);
                                                     builder.addArgument(arg);
                                                 } catch (Throwable t) {
@@ -426,10 +429,13 @@
                                             }
 
                                             try {
-                                                StringArgument arg = new StringArgument(OPTION_DSCFG_LONG_SET,
-                                                        OPTION_DSCFG_SHORT_SET, OPTION_DSCFG_LONG_SET, false, true,
-                                                        true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                                                        INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
+                                                StringArgument arg =
+                                                        StringArgument.builder(OPTION_DSCFG_LONG_SET)
+                                                                .shortIdentifier(OPTION_DSCFG_SHORT_SET)
+                                                                .description(INFO_DSCFG_DESCRIPTION_PROP_VAL.get())
+                                                                .multiValued()
+                                                                .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                                                                .buildArgument();
                                                 PropertyDefinition<?> propertyDefinition = cvc.getPropertyDefinition();
                                                 arg.addValue(propertyDefinition.getName() + ':'
                                                         + castAndGetArgumentValue(propertyDefinition, cvc.getValue()));
@@ -567,28 +573,37 @@
         this.namingArgs = createNamingArgs(subCommand, path, false);
 
         // Create the --set argument.
-        this.propertySetArgument = new StringArgument(OPTION_DSCFG_LONG_SET, OPTION_DSCFG_SHORT_SET,
-                OPTION_DSCFG_LONG_SET, false, true, true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
-        this.subCommand.addArgument(this.propertySetArgument);
-
+        propertySetArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_SET)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_SET)
+                        .description(INFO_DSCFG_DESCRIPTION_PROP_VAL.get())
+                        .multiValued()
+                        .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
         // Create the --reset argument.
-        this.propertyResetArgument = new StringArgument(OPTION_DSCFG_LONG_RESET, OPTION_DSCFG_SHORT_RESET,
-                OPTION_DSCFG_LONG_RESET, false, true, true, INFO_PROPERTY_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_RESET_PROP.get());
-        this.subCommand.addArgument(this.propertyResetArgument);
-
+        propertyResetArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_RESET)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_RESET)
+                        .description(INFO_DSCFG_DESCRIPTION_RESET_PROP.get())
+                        .multiValued()
+                        .valuePlaceholder(INFO_PROPERTY_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
         // Create the --add argument.
-        this.propertyAddArgument = new StringArgument(OPTION_DSCFG_LONG_ADD, OPTION_DSCFG_SHORT_ADD,
-                OPTION_DSCFG_LONG_ADD, false, true, true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_ADD_PROP_VAL.get());
-        this.subCommand.addArgument(this.propertyAddArgument);
-
+        this.propertyAddArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_ADD)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_ADD)
+                        .description(INFO_DSCFG_DESCRIPTION_ADD_PROP_VAL.get())
+                        .multiValued()
+                        .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
         // Create the --remove argument.
-        this.propertyRemoveArgument = new StringArgument(OPTION_DSCFG_LONG_REMOVE, OPTION_DSCFG_SHORT_REMOVE,
-                OPTION_DSCFG_LONG_REMOVE, false, true, true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL.get());
-        this.subCommand.addArgument(this.propertyRemoveArgument);
+        this.propertyRemoveArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_REMOVE)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_REMOVE)
+                        .description(INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL.get())
+                        .multiValued()
+                        .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(this.subCommand);
 
         // Register the tags associated with the child managed objects.
         addTags(path.getManagedObjectDefinition().getAllTags());
@@ -864,12 +879,12 @@
      * modification proposed by the user in the provided PropertyEditorModification object.
      *
      * @param mod
-     *            the object describing the modification made.
+     *         the object describing the modification made.
      * @param <T>
-     *            the type of the property to be retrieved.
+     *         the type of the property to be retrieved.
      * @return the argument representing the modification.
      * @throws ArgumentException
-     *             if there is a problem creating the argument.
+     *         if there is a problem creating the argument.
      */
     private static <T> Argument createArgument(PropertyEditorModification<T> mod) throws ArgumentException {
         StringArgument arg;
@@ -879,28 +894,47 @@
 
         switch (mod.getType()) {
         case RESET:
-            arg = new StringArgument(OPTION_DSCFG_LONG_RESET, OPTION_DSCFG_SHORT_RESET, OPTION_DSCFG_LONG_RESET, false,
-                    true, true, INFO_PROPERTY_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_RESET_PROP.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_RESET)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_RESET)
+                            .description(INFO_DSCFG_DESCRIPTION_RESET_PROP.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_PROPERTY_PLACEHOLDER.get())
+                            .buildArgument();
             arg.addValue(propName);
             break;
         case REMOVE:
-            arg = new StringArgument(OPTION_DSCFG_LONG_REMOVE, OPTION_DSCFG_SHORT_REMOVE, OPTION_DSCFG_LONG_REMOVE,
-                    false, true, true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null,
-                    INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_REMOVE)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_REMOVE)
+                            .description(INFO_DSCFG_DESCRIPTION_REMOVE_PROP_VAL.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                            .buildArgument();
             for (T value : mod.getModificationValues()) {
                 arg.addValue(propName + ':' + getArgumentValue(propertyDefinition, value));
             }
             break;
         case ADD:
-            arg = new StringArgument(OPTION_DSCFG_LONG_ADD, OPTION_DSCFG_SHORT_ADD, OPTION_DSCFG_LONG_ADD, false, true,
-                    true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_ADD_PROP_VAL.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_ADD)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_ADD)
+                            .description(INFO_DSCFG_DESCRIPTION_ADD_PROP_VAL.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                            .buildArgument();
             for (T value : mod.getModificationValues()) {
                 arg.addValue(propName + ':' + getArgumentValue(propertyDefinition, value));
             }
             break;
         case SET:
-            arg = new StringArgument(OPTION_DSCFG_LONG_SET, OPTION_DSCFG_SHORT_SET, OPTION_DSCFG_LONG_SET, false, true,
-                    true, INFO_VALUE_SET_PLACEHOLDER.get(), null, null, INFO_DSCFG_DESCRIPTION_PROP_VAL.get());
+            arg =
+                    StringArgument.builder(OPTION_DSCFG_LONG_SET)
+                            .shortIdentifier(OPTION_DSCFG_SHORT_SET)
+                            .description(INFO_DSCFG_DESCRIPTION_PROP_VAL.get())
+                            .multiValued()
+                            .valuePlaceholder(INFO_VALUE_SET_PLACEHOLDER.get())
+                            .buildArgument();
             for (T value : mod.getModificationValues()) {
                 arg.addValue(propName + ':' + getArgumentValue(propertyDefinition, value));
             }
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SubCommandHandler.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SubCommandHandler.java
index bb66501..2cc5b83 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SubCommandHandler.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/SubCommandHandler.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  */
 package org.forgerock.opendj.config.dsconfig;
 
@@ -494,28 +494,29 @@
             StringArgument arg;
 
             try {
+                final StringArgument.Builder argBuilder = StringArgument.builder(argName);
                 if (isCreate && sz == 0) {
                     // The final path element in create-xxx sub-commands should
                     // have a different usage.
                     PropertyDefinition<?> pd = r.getNamingPropertyDefinition();
-
                     if (pd != null) {
                         // Use syntax and description from naming property.
                         PropertyDefinitionUsageBuilder b = new PropertyDefinitionUsageBuilder(false);
                         LocalizableMessage usage = LocalizableMessage.raw("{" + b.getUsage(pd) + "}");
-                        arg = new StringArgument(argName, null, argName, false, true, usage,
-                                INFO_DSCFG_DESCRIPTION_NAME_CREATE_EXT.get(d.getUserFriendlyName(), pd.getName(),
-                                        pd.getSynopsis()));
+                        argBuilder.description(INFO_DSCFG_DESCRIPTION_NAME_CREATE_EXT.get(
+                                        d.getUserFriendlyName(), pd.getName(), pd.getSynopsis()))
+                                  .valuePlaceholder(usage);
                     } else {
-                        arg = new StringArgument(argName, null, argName, false, true, INFO_NAME_PLACEHOLDER.get(),
-                                INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()));
+                        argBuilder.description(INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()))
+                                  .valuePlaceholder(INFO_NAME_PLACEHOLDER.get());
                     }
                 } else {
                     // A normal naming argument.
-                    arg = new StringArgument(argName, null, argName, false, true, INFO_NAME_PLACEHOLDER.get(),
-                            INFO_DSCFG_DESCRIPTION_NAME.get(d.getUserFriendlyName()));
+                    argBuilder.description(INFO_DSCFG_DESCRIPTION_NAME.get(d.getUserFriendlyName()))
+                              .valuePlaceholder(INFO_NAME_PLACEHOLDER.get())
+                              .buildArgument();
                 }
-                subCommand.addArgument(arg);
+                arg = argBuilder.buildAndAddToSubCommand(subCommand);
                 arguments.add(arg);
             } catch (ArgumentException e) {
                 this.e = e;
@@ -542,13 +543,12 @@
             }
 
             String argName = CLIProfile.getInstance().getNamingArgument(r);
-            StringArgument arg;
 
             try {
-                arg = new StringArgument(argName, null, argName, false, true, INFO_NAME_PLACEHOLDER.get(),
-                        INFO_DSCFG_DESCRIPTION_NAME.get(d.getUserFriendlyName()));
-                subCommand.addArgument(arg);
-                arguments.add(arg);
+                arguments.add(StringArgument.builder(argName)
+                        .description(INFO_DSCFG_DESCRIPTION_NAME.get(d.getUserFriendlyName()))
+                        .valuePlaceholder(INFO_NAME_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand));
             } catch (ArgumentException e) {
                 this.e = e;
             }
@@ -985,9 +985,11 @@
             if (app.confirmAction(msg, true)) {
                 try {
                     String argName = CLIProfile.getInstance().getNamingArgument(r);
-                    StringArgument arg = new StringArgument(argName, null, argName, false, true,
-                            INFO_NAME_PLACEHOLDER.get(),
-                            INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()));
+                    StringArgument arg =
+                            StringArgument.builder(argName)
+                                    .description(INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()))
+                                    .valuePlaceholder(INFO_NAME_PLACEHOLDER.get())
+                                    .buildArgument();
                     if (r instanceof InstantiableRelationDefinition) {
                         arg.addValue(children.get(children.firstKey()));
                     } else {
@@ -1041,8 +1043,11 @@
                     return MenuResult.cancel();
                 }
                 String argName = CLIProfile.getInstance().getNamingArgument(r);
-                StringArgument arg = new StringArgument(argName, null, argName, false, true,
-                        INFO_NAME_PLACEHOLDER.get(), INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()));
+                StringArgument arg =
+                        StringArgument.builder(argName)
+                                .description(INFO_DSCFG_DESCRIPTION_NAME_CREATE.get(d.getUserFriendlyName()))
+                                .valuePlaceholder(INFO_NAME_PLACEHOLDER.get())
+                                .buildArgument();
                 if (r instanceof InstantiableRelationDefinition) {
                     arg.addValue(result.getValue());
                 } else {
@@ -1095,10 +1100,13 @@
      *             If the property name argument could not be registered.
      */
     protected final void registerPropertyNameArgument(SubCommand subCommand) throws ArgumentException {
-        this.propertyArgument = new StringArgument(OPTION_DSCFG_LONG_PROPERTY, OPTION_DSCFG_SHORT_PROPERTY,
-                OPTION_DSCFG_LONG_PROPERTY, false, true, true, INFO_PROPERTY_PLACEHOLDER.get(), null, null,
-                INFO_DSCFG_DESCRIPTION_PROP.get());
-        subCommand.addArgument(propertyArgument);
+        propertyArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_PROPERTY)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_PROPERTY)
+                        .description(INFO_DSCFG_DESCRIPTION_PROP.get())
+                        .multiValued()
+                        .valuePlaceholder(INFO_PROPERTY_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
     }
 
     /**
@@ -1110,10 +1118,11 @@
      *             If the record mode argument could not be registered.
      */
     protected final void registerRecordModeArgument(SubCommand subCommand) throws ArgumentException {
-        this.recordModeArgument = new BooleanArgument(OPTION_DSCFG_LONG_RECORD, OPTION_DSCFG_SHORT_RECORD,
-                OPTION_DSCFG_LONG_RECORD, INFO_DSCFG_DESCRIPTION_RECORD.get());
-        this.recordModeArgument.setPropertyName(OPTION_DSCFG_LONG_RECORD);
-        subCommand.addArgument(recordModeArgument);
+        recordModeArgument =
+                BooleanArgument.builder(OPTION_DSCFG_LONG_RECORD)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_RECORD)
+                        .description(INFO_DSCFG_DESCRIPTION_RECORD.get())
+                        .buildAndAddToSubCommand(subCommand);
     }
 
     /**
@@ -1125,12 +1134,12 @@
      *             If the unit-size argument could not be registered.
      */
     protected final void registerUnitSizeArgument(SubCommand subCommand) throws ArgumentException {
-        this.unitSizeArgument = new StringArgument(OPTION_DSCFG_LONG_UNIT_SIZE, OPTION_DSCFG_SHORT_UNIT_SIZE,
-                OPTION_DSCFG_LONG_UNIT_SIZE, false, true, INFO_UNIT_PLACEHOLDER.get(),
-                INFO_DSCFG_DESCRIPTION_UNIT_SIZE.get());
-        this.unitSizeArgument.setPropertyName(OPTION_DSCFG_LONG_UNIT_SIZE);
-
-        subCommand.addArgument(unitSizeArgument);
+        unitSizeArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_UNIT_SIZE)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_UNIT_SIZE)
+                        .description(INFO_DSCFG_DESCRIPTION_UNIT_SIZE.get())
+                        .valuePlaceholder(INFO_UNIT_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
     }
 
     /**
@@ -1142,12 +1151,12 @@
      *             If the unit-time argument could not be registered.
      */
     protected final void registerUnitTimeArgument(SubCommand subCommand) throws ArgumentException {
-        this.unitTimeArgument = new StringArgument(OPTION_DSCFG_LONG_UNIT_TIME, OPTION_DSCFG_SHORT_UNIT_TIME,
-                OPTION_DSCFG_LONG_UNIT_TIME, false, true, INFO_UNIT_PLACEHOLDER.get(),
-                INFO_DSCFG_DESCRIPTION_UNIT_TIME.get());
-        this.unitTimeArgument.setPropertyName(OPTION_DSCFG_LONG_UNIT_TIME);
-
-        subCommand.addArgument(unitTimeArgument);
+        unitTimeArgument =
+                StringArgument.builder(OPTION_DSCFG_LONG_UNIT_TIME)
+                        .shortIdentifier(OPTION_DSCFG_SHORT_UNIT_TIME)
+                        .description(INFO_DSCFG_DESCRIPTION_UNIT_TIME.get())
+                        .valuePlaceholder(INFO_UNIT_PLACEHOLDER.get())
+                        .buildAndAddToSubCommand(subCommand);
     }
 
     /**
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelArgumentParser.java
index 0a7f654..a9f9872 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ControlPanelArgumentParser.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2009-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS.
+ *      Portions Copyright 2011-2016 ForgeRock AS.
  */
 package org.opends.guitools.controlpanel;
 
@@ -133,7 +133,6 @@
     addArgument(remoteArg);
 
     connectTimeoutArg = CommonArguments.getConnectTimeOut();
-    connectTimeoutArg.setHidden(false);
     addArgument(connectTimeoutArg);
 
     showUsageArg = CommonArguments.getShowUsage();
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
index 7c17739..40a2997 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallCliHelper.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2014-2015 ForgeRock AS
+ *      Portions Copyright 2014-2016 ForgeRock AS
  */
 package org.opends.guitools.uninstaller;
 
@@ -1266,7 +1266,7 @@
         {
           println();
           printErrorMessage(ERR_UNINSTALL_ERROR_UPDATING_REMOTE_FORCE.get(
-              "--"+parser.getSecureArgsList().adminUidArg.getLongIdentifier(),
+              "--"+parser.getSecureArgsList().adminUidHiddenArg.getLongIdentifier(),
               "--"+OPTION_LONG_BINDPWD,
               "--"+OPTION_LONG_BINDPWD_FILE,
               exceptionMsg));
@@ -1277,7 +1277,7 @@
           throw new UserDataException(null,
               ERR_UNINSTALL_ERROR_UPDATING_REMOTE_NO_FORCE.get(
                   "--"+
-                  parser.getSecureArgsList().adminUidArg.getLongIdentifier(),
+                  parser.getSecureArgsList().adminUidHiddenArg.getLongIdentifier(),
                   "--"+OPTION_LONG_BINDPWD,
                   "--"+OPTION_LONG_BINDPWD_FILE,
                   "--"+parser.forceOnErrorArg.getLongIdentifier(),
@@ -1431,7 +1431,7 @@
           LocalizableMessage msg =
             ERR_UNINSTALL_ERROR_UPDATING_REMOTE_NO_FORCE.get(
               "--"+
-              parser.getSecureArgsList().adminUidArg.getLongIdentifier(),
+              parser.getSecureArgsList().adminUidHiddenArg.getLongIdentifier(),
               "--"+OPTION_LONG_BINDPWD,
               "--"+OPTION_LONG_BINDPWD_FILE,
               "--"+parser.forceOnErrorArg.getLongIdentifier(),
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java
index b79319a..bfe2397 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/Uninstaller.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2014-2015 ForgeRock AS
+ *      Portions Copyright 2014-2016 ForgeRock AS
  */
 package org.opends.guitools.uninstaller;
 
@@ -1962,7 +1962,7 @@
           LocalizableMessage msg =
             ERR_UNINSTALL_ERROR_UPDATING_REMOTE_NO_FORCE.get(
               "--"+
-              parser.getSecureArgsList().adminUidArg.getLongIdentifier(),
+              parser.getSecureArgsList().adminUidHiddenArg.getLongIdentifier(),
               "--"+OPTION_LONG_BINDPWD,
               "--"+OPTION_LONG_BINDPWD_FILE,
               "--"+parser.forceOnErrorArg.getLongIdentifier(),
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallerArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallerArgumentParser.java
index 40e0c3a..a641b9b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallerArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/uninstaller/UninstallerArgumentParser.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2014-2015 ForgeRock AS.
+ *      Portions Copyright 2014-2016 ForgeRock AS.
  */
 package org.opends.guitools.uninstaller;
 
@@ -64,6 +64,7 @@
   private BooleanArgument removeLDIFFilesArg;
 
   private StringArgument referencedHostNameArg;
+  private StringArgument adminUidArg;
 
   /** This CLI is always using the administration connector with SSL. */
   private final boolean alwaysSSL = true;
@@ -103,98 +104,92 @@
   throws ArgumentException
   {
     LinkedHashSet<Argument> args = new LinkedHashSet<>();
+    adminUidArg = CommonArguments.getAdminUid(INFO_DESCRIPTION_ADMIN_UID.get());
     cliArg = CommonArguments.getCLI();
     args.add(cliArg);
 
-    removeAllArg = new BooleanArgument(
-        "remove-all",
-        'a',
-        "remove-all",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_ALL.get()
-        );
+    removeAllArg =
+            BooleanArgument.builder("remove-all")
+                    .shortIdentifier('a')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_ALL.get())
+                    .buildArgument();
     args.add(removeAllArg);
-    removeServerLibrariesArg = new BooleanArgument(
-        "server-libraries",
-        'l',
-        "server-libraries",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_SERVER_LIBRARIES.get()
-        );
+
+    removeServerLibrariesArg =
+            BooleanArgument.builder("server-libraries")
+                    .shortIdentifier('l')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_SERVER_LIBRARIES.get())
+                    .buildArgument();
     args.add(removeServerLibrariesArg);
-    removeDatabasesArg = new BooleanArgument(
-        "databases",
-        'd',
-        "databases",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_DATABASES.get()
-        );
+
+    removeDatabasesArg =
+            BooleanArgument.builder("databases")
+                    .shortIdentifier('d')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_DATABASES.get())
+                    .buildArgument();
     args.add(removeDatabasesArg);
-    removeLogFilesArg = new BooleanArgument(
-        "log-files",
-        'L',
-        "log-files",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LOG_FILES.get()
-        );
+
+    removeLogFilesArg =
+            BooleanArgument.builder("log-files")
+                    .shortIdentifier('L')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LOG_FILES.get())
+                    .buildArgument();
     args.add(removeLogFilesArg);
-    removeConfigurationFilesArg = new BooleanArgument(
-        "configuration-files",
-        'c',
-        "configuration-files",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_CONFIGURATION_FILES.get()
-        );
+
+    removeConfigurationFilesArg =
+            BooleanArgument.builder("configuration-files")
+                    .shortIdentifier('c')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_CONFIGURATION_FILES.get())
+                    .buildArgument();
     args.add(removeConfigurationFilesArg);
-    removeBackupFilesArg = new BooleanArgument(
-        "backup-files",
-        'b',
-        "backup-files",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_BACKUP_FILES.get()
-        );
+
+    removeBackupFilesArg =
+            BooleanArgument.builder("backup-files")
+                    .shortIdentifier('b')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_BACKUP_FILES.get())
+                    .buildArgument();
     args.add(removeBackupFilesArg);
-    removeLDIFFilesArg = new BooleanArgument(
-        "ldif-files",
-        'e',
-        "ldif-files",
-        INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LDIF_FILES.get()
-        );
+
+    removeLDIFFilesArg =
+            BooleanArgument.builder("ldif-files")
+                    .shortIdentifier('e')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LDIF_FILES.get())
+                    .buildArgument();
     args.add(removeLDIFFilesArg);
 
     noPromptArg = CommonArguments.getNoPrompt();
     args.add(noPromptArg);
 
-    forceOnErrorArg = new BooleanArgument(
-        "forceOnError",
-        'f',
-        "forceOnError",
-        INFO_UNINSTALLDS_DESCRIPTION_FORCE.get(
-            "--"+noPromptArg.getLongIdentifier()));
+    forceOnErrorArg =
+            BooleanArgument.builder("forceOnError")
+                    .shortIdentifier('f')
+                    .description(INFO_UNINSTALLDS_DESCRIPTION_FORCE.get("--" + noPromptArg.getLongIdentifier()))
+                    .buildArgument();
     args.add(forceOnErrorArg);
 
     quietArg = CommonArguments.getQuiet();
     args.add(quietArg);
 
-    for (Argument arg : args)
-    {
-      arg.setPropertyName(arg.getLongIdentifier());
-    }
-
     ArrayList<Argument> defaultArgs = new ArrayList<>(createGlobalArguments(outStream, alwaysSSL));
     int index = defaultArgs.indexOf(secureArgsList.bindDnArg);
     if (index != -1)
     {
-      defaultArgs.add(index, secureArgsList.adminUidArg);
+      defaultArgs.add(index, adminUidArg);
       defaultArgs.remove(secureArgsList.bindDnArg);
     }
     else
     {
-      defaultArgs.add(secureArgsList.adminUidArg);
+      defaultArgs.add(adminUidArg);
     }
-    secureArgsList.adminUidArg.setHidden(false);
     defaultArgs.remove(secureArgsList.hostNameArg);
     defaultArgs.remove(secureArgsList.portArg);
-    referencedHostNameArg = new StringArgument("referencedHostName",
-        OPTION_SHORT_HOST,
-        OPTION_LONG_REFERENCED_HOST_NAME, false, false, true,
-        INFO_HOST_PLACEHOLDER.get(),
-        UserData.getDefaultHostName(), OPTION_LONG_REFERENCED_HOST_NAME,
-        INFO_DESCRIPTION_REFERENCED_HOST.get());
+    referencedHostNameArg =
+            StringArgument.builder(OPTION_LONG_REFERENCED_HOST_NAME)
+                    .shortIdentifier(OPTION_SHORT_HOST)
+                    .description(INFO_DESCRIPTION_REFERENCED_HOST.get())
+                    .defaultValue(UserData.getDefaultHostName())
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
     defaultArgs.add(referencedHostNameArg);
 
     args.addAll(defaultArgs);
@@ -329,7 +324,7 @@
    */
   public String getDefaultAdministratorUID()
   {
-    return secureArgsList.adminUidArg.getDefaultValue();
+    return adminUidArg.getDefaultValue();
   }
 
   /**
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java b/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java
index 59edce7..72392c6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/SecureConnectionCliArgs.java
@@ -22,11 +22,10 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  */
 package org.opends.server.admin.client.cli;
 
-import static com.forgerock.opendj.cli.ArgumentConstants.*;
 import static com.forgerock.opendj.cli.CliMessages.*;
 import static com.forgerock.opendj.cli.ReturnCode.*;
 import static com.forgerock.opendj.cli.Utils.*;
@@ -44,6 +43,7 @@
 import java.util.List;
 import java.util.Set;
 
+import com.forgerock.opendj.cli.ArgumentParser;
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg1;
@@ -84,7 +84,7 @@
   /** The 'bindDN' global argument. */
   public StringArgument bindDnArg;
   /** The 'adminUID' global argument. */
-  public StringArgument adminUidArg;
+  public StringArgument adminUidHiddenArg;
   /** The 'bindPasswordFile' global argument. */
   public FileBasedArgument bindPasswordFileArg;
   /** The 'bindPassword' global argument. */
@@ -166,11 +166,11 @@
    */
   public String getAdministratorUID()
   {
-    if (adminUidArg.isPresent())
+    if (adminUidHiddenArg.isPresent())
     {
-      return adminUidArg.getValue();
+      return adminUidHiddenArg.getValue();
     }
-    return adminUidArg.getDefaultValue();
+    return adminUidHiddenArg.getDefaultValue();
   }
 
   /**
@@ -182,7 +182,7 @@
    */
   public boolean useAdminUID()
   {
-    return !adminUidArg.isHidden();
+    return !adminUidHiddenArg.isHidden();
   }
 
   /**
@@ -229,32 +229,17 @@
       argList.add(useStartTLSArg);
     }
 
-    String defaultHostName;
-    try
-    {
-      defaultHostName = InetAddress.getLocalHost().getHostName();
-    }
-    catch (Exception e)
-    {
-      defaultHostName = "Unknown (" + e + ")";
-    }
-    hostNameArg = CommonArguments.getHostName(defaultHostName);
+    hostNameArg = CommonArguments.getHostName(getDefaultHostName());
     argList.add(hostNameArg);
 
-    portArg = CommonArguments.getPort(AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT,
-                                      alwaysSSL ? INFO_DESCRIPTION_ADMIN_PORT.get() : INFO_DESCRIPTION_PORT.get());
+    portArg = createPortArgument(AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT);
     argList.add(portArg);
 
     bindDnArg = CommonArguments.getBindDN(CliConstants.DEFAULT_ROOT_USER_DN);
     argList.add(bindDnArg);
 
-    // It is up to the classes that required admin UID to make this argument
-    // visible and add it.
-    adminUidArg = new StringArgument("adminUID", 'I', OPTION_LONG_ADMIN_UID, false, false, true,
-                                     INFO_ADMINUID_PLACEHOLDER.get(), CliConstants.GLOBAL_ADMIN_UID,
-                                     null, INFO_DESCRIPTION_ADMIN_UID.get());
-    adminUidArg.setPropertyName(OPTION_LONG_ADMIN_UID);
-    adminUidArg.setHidden(true);
+    // Classes that required admin UID to be not hidden must use CommonsArguments.getAdminUid().
+    adminUidHiddenArg = CommonArguments.getAdminUidHidden(INFO_DESCRIPTION_ADMIN_UID.get());
 
     bindPasswordArg = CommonArguments.getBindPassword();
     argList.add(bindPasswordArg);
@@ -290,7 +275,6 @@
     argList.add(certNicknameArg);
 
     connectTimeoutArg = CommonArguments.getConnectTimeOut();
-    connectTimeoutArg.setHidden(false);
     argList.add(connectTimeoutArg);
 
     return argList;
@@ -312,6 +296,23 @@
   }
 
   /**
+   * Returns the current hostname.
+   *
+   * If the hostname resolution fails, this method returns {@literal "localhost"}.
+   * @return the current hostname
+     */
+  public String getDefaultHostName() {
+    try
+    {
+      return InetAddress.getLocalHost().getHostName();
+    }
+    catch (Exception e)
+    {
+      return "localhost";
+    }
+  }
+
+  /**
    * Get the port which has to be used for the command.
    *
    * @return The port specified by the command line argument, or the default
@@ -636,17 +637,27 @@
    * Updates the default values of the port and the trust store with what is
    * read in the configuration.
    *
-   * @throws ConfigException
-   *           if there is an error reading the configuration.
+   * @param parser
+   *        The argument parser where the secure connection arguments were added.
    */
-  public void initArgumentsWithConfiguration() throws ConfigException
-  {
-    portArg.setDefaultValue(String.valueOf(getPortFromConfig()));
-
-    String truststoreFileAbsolute = getTruststoreFileFromConfig();
-    if (truststoreFileAbsolute != null)
+  public void initArgumentsWithConfiguration(final ArgumentParser parser) {
+    try
     {
-      trustStorePathArg.setDefaultValue(truststoreFileAbsolute);
+      portArg = createPortArgument(getPortFromConfig());
+      trustStorePathArg = CommonArguments.getTrustStorePathArgument(getTruststoreFileFromConfig());
+      parser.replaceArgument(portArg);
+      parser.replaceArgument(trustStorePathArg);
     }
+    catch (ConfigException | ArgumentException e)
+    {
+      logger.error(LocalizableMessage.raw(
+              "Internal error while reading arguments of this program from configuration"), e);
+    }
+  }
+
+  private IntegerArgument createPortArgument(final int defaultValue) throws ArgumentException
+  {
+    return CommonArguments.getPort(
+            defaultValue, alwaysSSL ? INFO_DESCRIPTION_ADMIN_PORT.get() : INFO_DESCRIPTION_PORT.get());
   }
 }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/TaskScheduleArgs.java b/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/TaskScheduleArgs.java
index 70cce69..42a851b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/TaskScheduleArgs.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/admin/client/cli/TaskScheduleArgs.java
@@ -108,50 +108,49 @@
 
   private void createTaskArguments() throws ArgumentException
   {
-    startArg = new StringArgument(OPTION_LONG_START_DATETIME,
-        OPTION_SHORT_START_DATETIME, OPTION_LONG_START_DATETIME, false, false,
-        true, INFO_START_DATETIME_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_START_DATETIME.get());
+    startArg =
+            StringArgument.builder(OPTION_LONG_START_DATETIME)
+                    .shortIdentifier(OPTION_SHORT_START_DATETIME)
+                    .description(INFO_DESCRIPTION_START_DATETIME.get())
+                    .valuePlaceholder(INFO_START_DATETIME_PLACEHOLDER.get())
+                    .buildArgument();
+    recurringArg =
+            StringArgument.builder(OPTION_LONG_RECURRING_TASK)
+                    .shortIdentifier(OPTION_SHORT_RECURRING_TASK)
+                    .description(INFO_DESCRIPTION_RECURRING_TASK.get())
+                    .valuePlaceholder(INFO_RECURRING_TASK_PLACEHOLDER.get())
+                    .buildArgument();
+    completionNotificationArg =
+            StringArgument.builder(OPTION_LONG_COMPLETION_NOTIFICATION_EMAIL)
+                    .shortIdentifier(OPTION_SHORT_COMPLETION_NOTIFICATION_EMAIL)
+                    .description(INFO_DESCRIPTION_TASK_COMPLETION_NOTIFICATION.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_EMAIL_ADDRESS_PLACEHOLDER.get())
+                    .buildArgument();
+    errorNotificationArg =
+            StringArgument.builder(OPTION_LONG_ERROR_NOTIFICATION_EMAIL)
+                    .shortIdentifier(OPTION_SHORT_ERROR_NOTIFICATION_EMAIL)
+                    .description(INFO_DESCRIPTION_TASK_ERROR_NOTIFICATION.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_EMAIL_ADDRESS_PLACEHOLDER.get())
+                    .buildArgument();
+    dependencyArg =
+            StringArgument.builder(OPTION_LONG_DEPENDENCY)
+                    .shortIdentifier(OPTION_SHORT_DEPENDENCY)
+                    .description(INFO_DESCRIPTION_TASK_DEPENDENCY_ID.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_TASK_ID_PLACEHOLDER.get())
+                    .buildArgument();
 
-    recurringArg = new StringArgument(OPTION_LONG_RECURRING_TASK,
-        OPTION_SHORT_RECURRING_TASK, OPTION_LONG_RECURRING_TASK, false, false,
-        true, INFO_RECURRING_TASK_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_RECURRING_TASK.get());
-
-    completionNotificationArg = new StringArgument(
-        OPTION_LONG_COMPLETION_NOTIFICATION_EMAIL,
-        OPTION_SHORT_COMPLETION_NOTIFICATION_EMAIL,
-        OPTION_LONG_COMPLETION_NOTIFICATION_EMAIL, false, true, true,
-        INFO_EMAIL_ADDRESS_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_TASK_COMPLETION_NOTIFICATION.get());
-
-    errorNotificationArg = new StringArgument(
-        OPTION_LONG_ERROR_NOTIFICATION_EMAIL,
-        OPTION_SHORT_ERROR_NOTIFICATION_EMAIL,
-        OPTION_LONG_ERROR_NOTIFICATION_EMAIL, false, true, true,
-        INFO_EMAIL_ADDRESS_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_TASK_ERROR_NOTIFICATION.get());
-
-    dependencyArg = new StringArgument(OPTION_LONG_DEPENDENCY,
-        OPTION_SHORT_DEPENDENCY, OPTION_LONG_DEPENDENCY, false, true, true,
-        INFO_TASK_ID_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_TASK_DEPENDENCY_ID.get());
-
-    Set<FailedDependencyAction> fdaValSet =
-      EnumSet.allOf(FailedDependencyAction.class);
-    failedDependencyActionArg = new StringArgument(
-        OPTION_LONG_FAILED_DEPENDENCY_ACTION,
-        OPTION_SHORT_FAILED_DEPENDENCY_ACTION,
-        OPTION_LONG_FAILED_DEPENDENCY_ACTION, false, true, true,
-        INFO_ACTION_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_TASK_FAILED_DEPENDENCY_ACTION.get(
-            Utils.joinAsString(",", fdaValSet),
-            FailedDependencyAction.defaultValue().name()));
-
-    for (Argument arg : getArguments())
-    {
-      arg.setPropertyName(arg.getLongIdentifier());
-    }
+    final Set<FailedDependencyAction> fdaValSet = EnumSet.allOf(FailedDependencyAction.class);
+    failedDependencyActionArg =
+            StringArgument.builder(OPTION_LONG_FAILED_DEPENDENCY_ACTION)
+            .shortIdentifier(OPTION_SHORT_FAILED_DEPENDENCY_ACTION)
+            .description(INFO_DESCRIPTION_TASK_FAILED_DEPENDENCY_ACTION.get(
+                    Utils.joinAsString(",", fdaValSet), FailedDependencyAction.defaultValue().name()))
+            .multiValued()
+            .valuePlaceholder(INFO_ACTION_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   /**
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendStat.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendStat.java
index 77afc72..77cacd3 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendStat.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendStat.java
@@ -21,7 +21,7 @@
  * CDDL HEADER END
  *
  *
- *      Portions Copyright 2015 ForgeRock AS.
+ *      Portions Copyright 2015-2016 ForgeRock AS.
  */
 package org.opends.server.backends.pluggable;
 
@@ -362,15 +362,22 @@
     if (!globalArgumentsInitialized)
     {
       configClass =
-          new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS, OPTION_LONG_CONFIG_CLASS, true, false, true,
-              INFO_CONFIGCLASS_PLACEHOLDER.get(), ConfigFileHandler.class.getName(), null,
-              INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildArgument();
       configFile =
-          new StringArgument("configfile", 'f', "configFile", true, false, true, INFO_CONFIGFILE_PLACEHOLDER.get(),
-              null, null, INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildArgument();
 
       showUsageArgument = CommonArguments.getShowUsage();
 
@@ -398,47 +405,60 @@
                            INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_BACKENDS.get());
 
       // list-base-dns
-      SubCommand sub = new SubCommand(parser, LIST_BASE_DNS,
-                                      INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS.get());
-      addBackendArgument(sub);
+      addBackendArgument(new SubCommand(
+              parser, LIST_BASE_DNS, INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS.get()));
 
       // list-indexes
-      sub = new SubCommand(parser, LIST_INDEXES, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEXES.get());
-      addBackendBaseDNArguments(sub, false, false, true);
+      final SubCommand listIndexes = new SubCommand(
+              parser, LIST_INDEXES, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEXES.get());
+      addBackendBaseDNArguments(listIndexes, false, false);
 
       // show-index-status
-      sub = new SubCommand(parser, SHOW_INDEX_STATUS, INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS.get());
-      sub.setDocDescriptionSupplement(SUPPLEMENT_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEX_STATUS.get());
-      addBackendBaseDNArguments(sub, true, true, true);
+      final SubCommand showIndexStatus = new SubCommand(
+              parser, SHOW_INDEX_STATUS, INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS.get());
+      showIndexStatus.setDocDescriptionSupplement(SUPPLEMENT_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEX_STATUS.get());
+      addBackendBaseDNArguments(showIndexStatus, true, true);
 
       // dump-index
-      sub = new SubCommand(parser, DUMP_INDEX, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_INDEX.get());
-      addBackendBaseDNArguments(sub, true, false, true);
-      sub.addArgument(new StringArgument(INDEXNAME_NAME, 'i', INDEXNAME, true, false, true,
-                                         INFO_INDEX_NAME_PLACEHOLDER.get(), null, null,
-                                         INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME.get()));
-      addDumpSubCommandArguments(sub);
-      BooleanArgument skipDecode =
-          new BooleanArgument(SKIPDECODE_NAME, 'p', SKIPDECODE, INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE.get());
-      sub.addArgument(skipDecode);
+      final SubCommand dumpIndex = new SubCommand(
+              parser, DUMP_INDEX, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_INDEX.get());
+      addBackendBaseDNArguments(dumpIndex, true, false);
+      dumpIndex.addArgument(StringArgument.builder(INDEXNAME)
+              .shortIdentifier('i')
+              .description(INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME.get())
+              .required()
+              .valuePlaceholder(INFO_INDEX_NAME_PLACEHOLDER.get())
+              .buildArgument());
+      addDumpSubCommandArguments(dumpIndex);
+      dumpIndex.addArgument(BooleanArgument.builder(SKIPDECODE)
+              .shortIdentifier('p')
+              .description(INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE.get())
+              .buildArgument());
 
       // list-raw-dbs
-      sub = new SubCommand(parser, LIST_RAW_DBS, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_RAW_DBS.get());
-      addBackendArgument(sub);
-      BooleanArgument useSIUnits =
-          new BooleanArgument(USESIUNITS_NAME, 'u', USESIUNITS, INFO_DESCRIPTION_BACKEND_TOOL_USE_SI_UNITS.get());
-      sub.addArgument(useSIUnits);
+      final SubCommand listRawDBs = new SubCommand(
+              parser, LIST_RAW_DBS, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_RAW_DBS.get());
+      addBackendArgument(listRawDBs);
+      listRawDBs.addArgument(BooleanArgument.builder(USESIUNITS)
+              .shortIdentifier('u')
+              .description(INFO_DESCRIPTION_BACKEND_TOOL_USE_SI_UNITS.get())
+              .buildArgument());
 
       // dump-raw-db
-      sub = new SubCommand(parser, DUMP_RAW_DB, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_RAW_DB.get());
-      addBackendArgument(sub);
-      sub.addArgument(new StringArgument(DBNAME_NAME, 'd', DBNAME, true, false, true,
-                                         INFO_DATABASE_NAME_PLACEHOLDER.get(), null, null,
-                                         INFO_DESCRIPTION_BACKEND_DEBUG_RAW_DB_NAME.get()));
-      addDumpSubCommandArguments(sub);
-      BooleanArgument singleLine =
-          new BooleanArgument(SINGLELINE_NAME, 'l', SINGLELINE, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_SINGLE_LINE.get());
-      sub.addArgument(singleLine);
+      final SubCommand dumbRawDB = new SubCommand(
+              parser, DUMP_RAW_DB, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_RAW_DB.get());
+      addBackendArgument(dumbRawDB);
+      dumbRawDB.addArgument(StringArgument.builder(DBNAME)
+              .shortIdentifier('d')
+              .description(INFO_DESCRIPTION_BACKEND_DEBUG_RAW_DB_NAME.get())
+              .required()
+              .valuePlaceholder(INFO_DATABASE_NAME_PLACEHOLDER.get())
+              .buildArgument());
+      addDumpSubCommandArguments(dumbRawDB);
+      dumbRawDB.addArgument(BooleanArgument.builder(SINGLELINE)
+              .shortIdentifier('l')
+              .description(INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_SINGLE_LINE.get())
+              .buildArgument());
 
       subCommandsInitialized = true;
     }
@@ -447,44 +467,84 @@
   private void addBackendArgument(SubCommand sub) throws ArgumentException
   {
     sub.addArgument(
-        new StringArgument(BACKENDID_NAME, 'n', BACKENDID, true, false, true, INFO_BACKENDNAME_PLACEHOLDER.get(), null,
-            null, INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get()));
+            StringArgument.builder(BACKENDID)
+                    .shortIdentifier('n')
+                    .description(INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get())
+                    .required()
+                    .valuePlaceholder(INFO_BACKENDNAME_PLACEHOLDER.get())
+                    .buildArgument());
   }
 
-  private void addBackendBaseDNArguments(SubCommand sub, boolean isRequired, boolean isMultiValued, boolean needsValue)
+  private void addBackendBaseDNArguments(SubCommand sub, boolean isRequired, boolean isMultiValued)
       throws ArgumentException
   {
     addBackendArgument(sub);
-    sub.addArgument(new StringArgument(BASEDN_NAME, 'b', BASEDN, isRequired, isMultiValued, needsValue,
-        INFO_BASEDN_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN.get()));
+    final StringArgument.Builder builder = StringArgument.builder(BASEDN)
+            .shortIdentifier('b')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN.get())
+            .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get());
+    if (isMultiValued)
+    {
+      builder.multiValued();
+    }
+    if (isRequired) {
+      builder.required();
+    }
+    sub.addArgument(builder.buildArgument());
   }
 
   private void addDumpSubCommandArguments(SubCommand sub) throws ArgumentException
   {
-    sub.addArgument(new BooleanArgument(STATSONLY_NAME, 'q', STATSONLY,
-        INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY.get()));
+    sub.addArgument(BooleanArgument.builder(STATSONLY)
+            .shortIdentifier('q')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY.get())
+            .buildArgument());
+
     sub.addArgument(newMaxKeyValueArg());
     sub.addArgument(newMinKeyValueArg());
-    sub.addArgument(new StringArgument(MAXHEXKEYVALUE_NAME, 'X', MAXHEXKEYVALUE, false, false, true,
-        INFO_MAX_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get()));
-    sub.addArgument(new StringArgument(MINHEXKEYVALUE_NAME, 'x', MINHEXKEYVALUE, false, false, true,
-        INFO_MIN_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get()));
-    sub.addArgument(new IntegerArgument(MAXDATASIZE_NAME, 'S', MAXDATASIZE, false, false, true,
-        INFO_MAX_DATA_SIZE_PLACEHOLDER.get(), -1, null, INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE.get()));
-    sub.addArgument(new IntegerArgument(MINDATASIZE_NAME, 's', MINDATASIZE, false, false, true,
-        INFO_MIN_DATA_SIZE_PLACEHOLDER.get(), -1, null, INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE.get()));
+    sub.addArgument(StringArgument.builder(MAXHEXKEYVALUE)
+            .shortIdentifier('X')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get())
+            .valuePlaceholder(INFO_MAX_KEY_VALUE_PLACEHOLDER.get())
+            .buildArgument());
+
+    sub.addArgument(StringArgument.builder(MINHEXKEYVALUE)
+            .shortIdentifier('x')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get())
+            .valuePlaceholder(INFO_MIN_KEY_VALUE_PLACEHOLDER.get())
+            .buildArgument());
+
+    sub.addArgument(IntegerArgument.builder(MAXDATASIZE)
+            .shortIdentifier('S')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE.get())
+            .defaultValue(-1)
+            .valuePlaceholder(INFO_MAX_DATA_SIZE_PLACEHOLDER.get())
+            .buildArgument());
+
+    sub.addArgument(IntegerArgument.builder(MINDATASIZE)
+            .shortIdentifier('s')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE.get())
+            .defaultValue(-1)
+            .valuePlaceholder(INFO_MIN_DATA_SIZE_PLACEHOLDER.get())
+            .buildArgument());
   }
 
   private StringArgument newMinKeyValueArg() throws ArgumentException
   {
-    return new StringArgument(MINKEYVALUE_NAME, 'k', MINKEYVALUE, false, false, true,
-        INFO_MIN_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get());
+    return StringArgument.builder(MINKEYVALUE)
+            .shortIdentifier('k')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get())
+            .valuePlaceholder(INFO_MIN_KEY_VALUE_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   private StringArgument newMaxKeyValueArg() throws ArgumentException
   {
-    return new StringArgument(MAXKEYVALUE_NAME, 'K', MAXKEYVALUE, false, false, true,
-        INFO_MAX_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get());
+    return StringArgument.builder(MAXKEYVALUE)
+            .shortIdentifier('K')
+            .description(INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get())
+            .valuePlaceholder(INFO_MAX_KEY_VALUE_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   /**
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
index c9fd068..44828ad 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
@@ -6831,11 +6831,10 @@
   public static void main(String[] args)
   {
     // Define the arguments that may be provided to the server.
+    final BooleanArgument displayUsage;
     BooleanArgument checkStartability      = null;
     BooleanArgument quietMode              = null;
     IntegerArgument timeout                = null;
-    BooleanArgument windowsNetStart        = null;
-    BooleanArgument displayUsage           = null;
     BooleanArgument fullVersion            = null;
     BooleanArgument noDetach               = null;
     BooleanArgument systemInfo             = null;
@@ -6853,64 +6852,67 @@
     // Initialize all the command-line argument types and register them with the parser.
     try
     {
-      configClass = new StringArgument("configclass", 'C', "configClass",
-                                       true, false, true,
-                                       INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                                       ConfigFileHandler.class.getName(), null,
-                                       INFO_DSCORE_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-      configFile = new StringArgument("configfile", 'f', "configFile",
-                                      true, false, true,
-                                      INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_DSCORE_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-      checkStartability = new BooleanArgument("checkstartability", null,
-                              "checkStartability",
-                              INFO_DSCORE_DESCRIPTION_CHECK_STARTABILITY.get());
-      checkStartability.setHidden(true);
-      argParser.addArgument(checkStartability);
-
-      windowsNetStart = new BooleanArgument("windowsnetstart", null, "windowsNetStart",
-                              INFO_DSCORE_DESCRIPTION_WINDOWS_NET_START.get());
-      windowsNetStart.setHidden(true);
-      argParser.addArgument(windowsNetStart);
-
-      fullVersion = new BooleanArgument("fullversion", 'F', "fullVersion",
-                                        INFO_DSCORE_DESCRIPTION_FULLVERSION.get());
-      fullVersion.setHidden(true);
-      argParser.addArgument(fullVersion);
-
-      systemInfo = new BooleanArgument("systeminfo", 's', "systemInfo",
-                                       INFO_DSCORE_DESCRIPTION_SYSINFO.get());
-      argParser.addArgument(systemInfo);
-
+      BooleanArgument.builder("windowsNetStart")
+              .description(INFO_DSCORE_DESCRIPTION_WINDOWS_NET_START.get())
+              .hidden()
+              .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder("configClass")
+                      .shortIdentifier('C')
+                      .description(INFO_DSCORE_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DSCORE_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      checkStartability =
+              BooleanArgument.builder("checkStartability")
+                      .description(INFO_DSCORE_DESCRIPTION_CHECK_STARTABILITY.get())
+                      .hidden()
+                      .buildAndAddToParser(argParser);
+      fullVersion =
+              BooleanArgument.builder("fullVersion")
+                      .shortIdentifier('F')
+                      .description(INFO_DSCORE_DESCRIPTION_FULLVERSION.get())
+                      .hidden()
+                      .buildAndAddToParser(argParser);
+      systemInfo =
+              BooleanArgument.builder("systemInfo")
+                      .shortIdentifier('s')
+                      .description(INFO_DSCORE_DESCRIPTION_SYSINFO.get())
+                      .buildAndAddToParser(argParser);
       useLastKnownGoodConfig =
-           new BooleanArgument("lastknowngoodconfig", 'L',
-                               "useLastKnownGoodConfig",
-                               INFO_DSCORE_DESCRIPTION_LASTKNOWNGOODCFG.get());
-      argParser.addArgument(useLastKnownGoodConfig);
-
-      noDetach = new BooleanArgument("nodetach", 'N', "nodetach",
-                                     INFO_DSCORE_DESCRIPTION_NODETACH.get());
-      argParser.addArgument(noDetach);
+              BooleanArgument.builder("useLastKnownGoodConfig")
+                      .shortIdentifier('L')
+                      .description(INFO_DSCORE_DESCRIPTION_LASTKNOWNGOODCFG.get())
+                      .buildAndAddToParser(argParser);
+      noDetach =
+              BooleanArgument.builder("nodetach")
+                      .shortIdentifier('N')
+                      .description(INFO_DSCORE_DESCRIPTION_NODETACH.get())
+                      .buildAndAddToParser(argParser);
 
       quietMode = CommonArguments.getQuiet();
       argParser.addArgument(quietMode);
 
-      // Not used in this class, but required by the start-ds script
-      // (see issue #3814)
-      timeout = new IntegerArgument("timeout", 't', "timeout", true, false,
-                                    true, INFO_SECONDS_PLACEHOLDER.get(),
-                                    DEFAULT_TIMEOUT,
-                                    null, true, 0, false,
-                                    0, INFO_DSCORE_DESCRIPTION_TIMEOUT.get());
-      argParser.addArgument(timeout);
-
+      // Not used in this class, but required by the start-ds script (see issue #3814)
+      timeout =
+              IntegerArgument.builder("timeout")
+                      .shortIdentifier('t')
+                      .description(INFO_DSCORE_DESCRIPTION_TIMEOUT.get())
+                      .required()
+                      .lowerBound(0)
+                      .defaultValue(DEFAULT_TIMEOUT)
+                      .valuePlaceholder(INFO_SECONDS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
       argParser.setUsageArgument(displayUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java b/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java
index 033ee2c..bcd468d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/plugins/profiler/ProfileViewer.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS
+ *      Portions Copyright 2012-2016 ForgeRock AS
  */
 package org.opends.server.plugins.profiler;
 
@@ -121,15 +121,18 @@
     try
     {
       fileNames =
-        new StringArgument("filenames", 'f', "fileName", true, true, true,
-                           INFO_FILE_PLACEHOLDER.get(), null, null,
-                           INFO_PROFILEVIEWER_DESCRIPTION_FILENAMES.get());
-      argParser.addArgument(fileNames);
-
-      useGUI = new BooleanArgument(
-              "usegui", 'g', "useGUI",
-              INFO_PROFILEVIEWER_DESCRIPTION_USE_GUI.get());
-      argParser.addArgument(useGUI);
+              StringArgument.builder("fileName")
+                      .shortIdentifier('f')
+                      .description(INFO_PROFILEVIEWER_DESCRIPTION_FILENAMES.get())
+                      .multiValued()
+                      .required()
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      useGUI =
+              BooleanArgument.builder("useGUI")
+                      .shortIdentifier('g')
+                      .description(INFO_PROFILEVIEWER_DESCRIPTION_USE_GUI.get())
+                      .buildAndAddToParser(argParser);
 
       displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java
index 114420a..346fd7d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/BackUpDB.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2013-2015 ForgeRock AS.
+ *      Portions Copyright 2013-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
@@ -143,7 +143,6 @@
   /** Define the command-line arguments that may be used with this program. */
   private BooleanArgument backUpAll;
   private BooleanArgument compress;
-  private BooleanArgument displayUsage;
   private BooleanArgument encrypt;
   private BooleanArgument hash;
   private BooleanArgument incremental;
@@ -174,97 +173,80 @@
     try
     {
       configClass =
-           new StringArgument(
-                   "configclass", OPTION_SHORT_CONFIG_CLASS,
-                   OPTION_LONG_CONFIG_CLASS, true, false,
-                   true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                   ConfigFileHandler.class.getName(), null,
-                   INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       configFile =
-           new StringArgument(
-                   "configfile", 'f', "configFile", true, false,
-                   true, INFO_CONFIGFILE_PLACEHOLDER.get(), null, null,
-                   INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       backendID =
-           new StringArgument(
-                   "backendid", 'n', "backendID", false, true, true,
-                   INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
-                   INFO_BACKUPDB_DESCRIPTION_BACKEND_ID.get());
-      argParser.addArgument(backendID);
-
-
-      backUpAll = new BooleanArgument(
-                  "backupall", 'a', "backUpAll",
-                  INFO_BACKUPDB_DESCRIPTION_BACKUP_ALL.get());
-      argParser.addArgument(backUpAll);
-
-
+              StringArgument.builder("backendID")
+                      .shortIdentifier('n')
+                      .description(INFO_BACKUPDB_DESCRIPTION_BACKEND_ID.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BACKENDNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      backUpAll =
+              BooleanArgument.builder("backUpAll")
+                      .shortIdentifier('a')
+                      .description(INFO_BACKUPDB_DESCRIPTION_BACKUP_ALL.get())
+                      .buildAndAddToParser(argParser);
       backupIDString =
-           new StringArgument(
-                   "backupid", 'I', "backupID", false, false, true,
-                   INFO_BACKUPID_PLACEHOLDER.get(), null, null,
-                   INFO_BACKUPDB_DESCRIPTION_BACKUP_ID.get());
-      argParser.addArgument(backupIDString);
-
-
+              StringArgument.builder("backupID")
+                      .shortIdentifier('I')
+                      .description(INFO_BACKUPDB_DESCRIPTION_BACKUP_ID.get())
+                      .valuePlaceholder(INFO_BACKUPID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       backupDirectory =
-           new StringArgument(
-                   "backupdirectory", 'd', "backupDirectory", true,
-                   false, true, INFO_BACKUPDIR_PLACEHOLDER.get(), null, null,
-                   INFO_BACKUPDB_DESCRIPTION_BACKUP_DIR.get());
-      argParser.addArgument(backupDirectory);
-
-
-      incremental = new BooleanArgument(
-                  "incremental", 'i', "incremental",
-                  INFO_BACKUPDB_DESCRIPTION_INCREMENTAL.get());
-      argParser.addArgument(incremental);
-
-
+              StringArgument.builder("backupDirectory")
+                      .shortIdentifier('d')
+                      .description(INFO_BACKUPDB_DESCRIPTION_BACKUP_DIR.get())
+                      .required()
+                      .valuePlaceholder(INFO_BACKUPDIR_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      incremental =
+              BooleanArgument.builder("incremental")
+                      .shortIdentifier('i')
+                      .description(INFO_BACKUPDB_DESCRIPTION_INCREMENTAL.get())
+                      .buildAndAddToParser(argParser);
       incrementalBaseID =
-           new StringArgument(
-                   "incrementalbaseid", 'B', "incrementalBaseID",
-                   false, false, true, INFO_BACKUPID_PLACEHOLDER.get(), null,
-                   null,
-                   INFO_BACKUPDB_DESCRIPTION_INCREMENTAL_BASE_ID.get());
-      argParser.addArgument(incrementalBaseID);
-
-
-      compress = new BooleanArgument(
-                  "compress", OPTION_SHORT_COMPRESS,
-                  OPTION_LONG_COMPRESS,
-                  INFO_BACKUPDB_DESCRIPTION_COMPRESS.get());
-      argParser.addArgument(compress);
-
-
-      encrypt = new BooleanArgument(
-                  "encrypt", 'y', "encrypt",
-                  INFO_BACKUPDB_DESCRIPTION_ENCRYPT.get());
-      argParser.addArgument(encrypt);
-
-
-      hash = new BooleanArgument(
-                  "hash", 'A', "hash",
-                  INFO_BACKUPDB_DESCRIPTION_HASH.get());
-      argParser.addArgument(hash);
-
-
+              StringArgument.builder("incrementalBaseID")
+                      .shortIdentifier('B')
+                      .description(INFO_BACKUPDB_DESCRIPTION_INCREMENTAL_BASE_ID.get())
+                      .valuePlaceholder(INFO_BACKUPID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      compress =
+              BooleanArgument.builder(OPTION_LONG_COMPRESS)
+                      .shortIdentifier(OPTION_SHORT_COMPRESS)
+                      .description(INFO_BACKUPDB_DESCRIPTION_COMPRESS.get())
+                      .buildAndAddToParser(argParser);
+      encrypt =
+              BooleanArgument.builder("encrypt")
+                      .shortIdentifier('y')
+                      .description(INFO_BACKUPDB_DESCRIPTION_ENCRYPT.get())
+                      .buildAndAddToParser(argParser);
+      hash =
+              BooleanArgument.builder("hash")
+                      .shortIdentifier('A')
+                      .description(INFO_BACKUPDB_DESCRIPTION_HASH.get())
+                      .buildAndAddToParser(argParser);
       signHash =
-           new BooleanArgument(
-                   "signhash", 's', "signHash",
-                   INFO_BACKUPDB_DESCRIPTION_SIGN_HASH.get());
-      argParser.addArgument(signHash);
+              BooleanArgument.builder("signHash")
+                      .shortIdentifier('s')
+                      .description(INFO_BACKUPDB_DESCRIPTION_SIGN_HASH.get())
+                      .buildAndAddToParser(argParser);
 
-
-      displayUsage = CommonArguments.getShowUsage();
+      final BooleanArgument displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
       argParser.setUsageArgument(displayUsage);
     }
@@ -275,14 +257,7 @@
     }
 
     // Init the default values so that they can appear also on the usage.
-    try
-    {
-      argParser.getArguments().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ce)
-    {
-      // Ignore.
-    }
+    argParser.getArguments().initArgumentsWithConfiguration(argParser);
 
     // Parse the command-line arguments provided to this program.
     try
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
index 3d1685d..1bf4e79 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
@@ -22,10 +22,13 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS.
+ *      Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.INFO_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_JMXPORT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_PORT_PLACEHOLDER;
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.messages.ExtensionMessages.*;
 import static org.opends.messages.ProtocolMessages.*;
@@ -365,19 +368,22 @@
   {
     try
     {
-      configFile = new StringArgument(
-          "configfile", 'c', "configFile",
-          true, false, true, INFO_CONFIGFILE_PLACEHOLDER.get(),
-          null, null, INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-      configClass = new StringArgument(
-          "configclass", OPTION_SHORT_CONFIG_CLASS, OPTION_LONG_CONFIG_CLASS,
-          false, false, true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-          ConfigFileHandler.class.getName(), null, INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       String defaultHostName;
       try
@@ -390,106 +396,117 @@
         defaultHostName = "localhost";
       }
 
-      hostName = new StringArgument(
-          OPTION_LONG_HOST.toLowerCase(), OPTION_SHORT_HOST, OPTION_LONG_HOST,
-          false, false, true, INFO_HOST_PLACEHOLDER.get(),
-          defaultHostName, null, INFO_INSTALLDS_DESCRIPTION_HOST_NAME.get());
-      argParser.addArgument(hostName);
-
-      ldapPort = new IntegerArgument(
-          "ldapport", OPTION_SHORT_PORT, "ldapPort",
-          false, false, true, INFO_LDAPPORT_PLACEHOLDER.get(),
-          389, null, true, 1, true, 65535, INFO_CONFIGDS_DESCRIPTION_LDAP_PORT.get());
-      argParser.addArgument(ldapPort);
-
-      adminConnectorPort = new IntegerArgument(
-          "adminConnectorPort".toLowerCase(), null, "adminConnectorPort",
-          false, false, true, INFO_PORT_PLACEHOLDER.get(),
-          4444, "adminConnectorPort", true, 1, true, 65535, INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT.get());
-      argParser.addArgument(adminConnectorPort);
-
-      ldapsPort = new IntegerArgument(
-          "ldapsPort", 'P', "ldapsPort",
-          false, false, true, INFO_LDAPPORT_PLACEHOLDER.get(),
-          636, null, true, 1, true, 65535, INFO_CONFIGDS_DESCRIPTION_LDAPS_PORT.get());
-      argParser.addArgument(ldapsPort);
-
-      enableStartTLS = new BooleanArgument(
-          "enableStartTLS", OPTION_SHORT_START_TLS, "enableStartTLS",
-          INFO_CONFIGDS_DESCRIPTION_ENABLE_START_TLS.get());
-      argParser.addArgument(enableStartTLS);
-
-      jmxPort = new IntegerArgument(
-          "jmxport", 'x', "jmxPort",
-          false, false, true, INFO_JMXPORT_PLACEHOLDER.get(),
-          CliConstants.DEFAULT_JMX_PORT, null, true, 1, true, 65535, INFO_CONFIGDS_DESCRIPTION_JMX_PORT.get());
-      argParser.addArgument(jmxPort);
-
-      keyManagerProviderDN = new StringArgument(
-          "keymanagerproviderdn", 'k', "keyManagerProviderDN",
-          false, false, true, INFO_KEY_MANAGER_PROVIDER_DN_PLACEHOLDER.get(),
-          null, null, INFO_CONFIGDS_DESCRIPTION_KEYMANAGER_PROVIDER_DN.get());
-      argParser.addArgument(keyManagerProviderDN);
-
-      trustManagerProviderDN = new StringArgument(
-          "trustmanagerproviderdn", 't', "trustManagerProviderDN",
-          false, false, true, INFO_TRUST_MANAGER_PROVIDER_DN_PLACEHOLDER.get(),
-          null, null, INFO_CONFIGDS_DESCRIPTION_TRUSTMANAGER_PROVIDER_DN.get());
-      argParser.addArgument(trustManagerProviderDN);
-
-      keyManagerPath = new StringArgument(
-          "keymanagerpath", 'm', "keyManagerPath",
-          false, false, true, INFO_KEY_MANAGER_PATH_PLACEHOLDER.get(),
-          null, null, INFO_CONFIGDS_DESCRIPTION_KEYMANAGER_PATH.get());
-      argParser.addArgument(keyManagerPath);
-
-      certNickNames = new StringArgument(
-          "certnickname", 'a', "certNickName",
-          false, true, true, INFO_NICKNAME_PLACEHOLDER.get(),
-          null, null, INFO_CONFIGDS_DESCRIPTION_CERTNICKNAME.get());
-      argParser.addArgument(certNickNames);
-
-      baseDNString = new StringArgument(
-          "basedn", OPTION_SHORT_BASEDN, OPTION_LONG_BASEDN,
-          false, true, true, INFO_BASEDN_PLACEHOLDER.get(),
-          "dc=example,dc=com", null, INFO_CONFIGDS_DESCRIPTION_BASE_DN.get());
-      argParser.addArgument(baseDNString);
-
-      rootDNString = new StringArgument(
-          "rootdn", OPTION_SHORT_ROOT_USER_DN, OPTION_LONG_ROOT_USER_DN,
-          false, false, true, INFO_ROOT_USER_DN_PLACEHOLDER.get(),
-          "cn=Directory Manager", null, INFO_CONFIGDS_DESCRIPTION_ROOT_DN.get());
-      argParser.addArgument(rootDNString);
-
-      rootPassword = new StringArgument(
-          "rootpw", OPTION_SHORT_BINDPWD, "rootPassword",
-          false, false, true, INFO_ROOT_USER_PWD_PLACEHOLDER.get(),
-          null, null, INFO_CONFIGDS_DESCRIPTION_ROOT_PW.get());
-      argParser.addArgument(rootPassword);
-
-      rootPasswordFile = new FileBasedArgument(
-          "rootpwfile", OPTION_SHORT_BINDPWD_FILE, "rootPasswordFile",
-          false, false, INFO_FILE_PLACEHOLDER.get(),
-          null, null, INFO_CONFIGDS_DESCRIPTION_ROOT_PW_FILE.get());
-      argParser.addArgument(rootPasswordFile);
+      hostName =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_INSTALLDS_DESCRIPTION_HOST_NAME.get())
+                      .defaultValue(defaultHostName)
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      ldapPort =
+              IntegerArgument.builder("ldapPort")
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_CONFIGDS_DESCRIPTION_LDAP_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(389)
+                      .valuePlaceholder(INFO_LDAPPORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      adminConnectorPort =
+              IntegerArgument.builder("adminConnectorPort")
+                      .description(INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT.get())
+                      .range(1, 65535)
+                      .defaultValue(4444)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      ldapsPort =
+              IntegerArgument.builder("ldapsPort")
+                      .shortIdentifier('P')
+                      .description(INFO_CONFIGDS_DESCRIPTION_LDAPS_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(636)
+                      .valuePlaceholder(INFO_LDAPPORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      enableStartTLS =
+              BooleanArgument.builder("enableStartTLS")
+                      .shortIdentifier(OPTION_SHORT_START_TLS)
+                      .description(INFO_CONFIGDS_DESCRIPTION_ENABLE_START_TLS.get())
+                      .buildAndAddToParser(argParser);
+      jmxPort =
+              IntegerArgument.builder("jmxPort")
+                      .shortIdentifier('x')
+                      .description(INFO_CONFIGDS_DESCRIPTION_JMX_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(CliConstants.DEFAULT_JMX_PORT)
+                      .valuePlaceholder(INFO_JMXPORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      keyManagerProviderDN =
+              StringArgument.builder("keyManagerProviderDN")
+                      .shortIdentifier('k')
+                      .description(INFO_CONFIGDS_DESCRIPTION_KEYMANAGER_PROVIDER_DN.get())
+                      .valuePlaceholder(INFO_KEY_MANAGER_PROVIDER_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustManagerProviderDN =
+              StringArgument.builder("trustManagerProviderDN")
+                      .shortIdentifier('t')
+                      .description(INFO_CONFIGDS_DESCRIPTION_TRUSTMANAGER_PROVIDER_DN.get())
+                      .valuePlaceholder(INFO_TRUST_MANAGER_PROVIDER_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      keyManagerPath =
+              StringArgument.builder("keyManagerPath")
+                      .shortIdentifier('m')
+                      .description(INFO_CONFIGDS_DESCRIPTION_KEYMANAGER_PATH.get())
+                      .valuePlaceholder(INFO_KEY_MANAGER_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      certNickNames =
+              StringArgument.builder("certNickName")
+                      .shortIdentifier('a')
+                      .description(INFO_CONFIGDS_DESCRIPTION_CERTNICKNAME.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      baseDNString =
+              StringArgument.builder(OPTION_LONG_BASEDN)
+                      .shortIdentifier(OPTION_SHORT_BASEDN)
+                      .description(INFO_CONFIGDS_DESCRIPTION_BASE_DN.get())
+                      .multiValued()
+                      .defaultValue("dc=example,dc=com")
+                      .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      rootDNString =
+              StringArgument.builder(OPTION_LONG_ROOT_USER_DN)
+                      .shortIdentifier(OPTION_SHORT_ROOT_USER_DN)
+                      .description(INFO_CONFIGDS_DESCRIPTION_ROOT_DN.get())
+                      .defaultValue("cn=Directory Manager")
+                      .valuePlaceholder(INFO_ROOT_USER_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      rootPassword =
+              StringArgument.builder("rootPassword")
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_CONFIGDS_DESCRIPTION_ROOT_PW.get())
+                      .valuePlaceholder(INFO_ROOT_USER_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      rootPasswordFile =
+              FileBasedArgument.builder("rootPasswordFile")
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_CONFIGDS_DESCRIPTION_ROOT_PW_FILE.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
       argParser.setUsageArgument(showUsage);
 
-      serverRoot = new StringArgument(
-          "serverRoot", OPTION_SHORT_SERVER_ROOT, OPTION_LONG_SERVER_ROOT,
-          false, false, true, INFO_SERVER_ROOT_DIR_PLACEHOLDER.get(),
-          null, null, null);
-      serverRoot.setHidden(true);
-      argParser.addArgument(serverRoot);
-
-      backendType = new StringArgument(
-          OPTION_LONG_BACKEND_TYPE.toLowerCase(), null, OPTION_LONG_BACKEND_TYPE,
-          false, false, true, INFO_INSTALLDS_BACKEND_TYPE_PLACEHOLDER.get(),
-          null, OPTION_LONG_BACKEND_TYPE, INFO_INSTALLDS_DESCRIPTION_BACKEND_TYPE.get()
-      );
-      argParser.addArgument(backendType);
+      serverRoot =
+              StringArgument.builder(OPTION_LONG_SERVER_ROOT)
+                      .shortIdentifier(OPTION_SHORT_SERVER_ROOT)
+                      .hidden()
+                      .valuePlaceholder(INFO_SERVER_ROOT_DIR_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      backendType =
+              StringArgument.builder(OPTION_LONG_BACKEND_TYPE)
+                      .description(INFO_INSTALLDS_DESCRIPTION_BACKEND_TYPE.get())
+                      .valuePlaceholder(INFO_INSTALLDS_BACKEND_TYPE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
     }
     catch (final ArgumentException ae)
     {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java
index f26a417..2e74804 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureWindowsService.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS.
+ *      Portions Copyright 2011-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
@@ -172,22 +172,27 @@
 
     try
     {
-      enableService = new BooleanArgument("enableservice", 'e', "enableService",
-          INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_ENABLE.get());
-      argParser.addArgument(enableService);
-
-      disableService = new BooleanArgument("disableservice", 'd', "disableService",
-          INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_DISABLE.get());
-      argParser.addArgument(disableService);
-
-      serviceState = new BooleanArgument("servicestate", 's', "serviceState",
-          INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_STATE.get());
-      argParser.addArgument(serviceState);
-
-      cleanupService = new StringArgument("cleanupservice", 'c', "cleanupService", false, false, true,
-          INFO_SERVICE_NAME_PLACEHOLDER.get(), null, null,
-          INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_CLEANUP.get());
-      argParser.addArgument(cleanupService);
+      enableService =
+              BooleanArgument.builder("enableService")
+                      .shortIdentifier('e')
+                      .description(INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_ENABLE.get())
+                      .buildAndAddToParser(argParser);
+      disableService =
+              BooleanArgument.builder("disableService")
+                      .shortIdentifier('d')
+                      .description(INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_DISABLE.get())
+                      .buildAndAddToParser(argParser);
+      serviceState =
+              BooleanArgument.builder("serviceState")
+                      .shortIdentifier('s')
+                      .description(INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_STATE.get())
+                      .buildAndAddToParser(argParser);
+      cleanupService =
+              StringArgument.builder("cleanupService")
+                      .shortIdentifier('c')
+                      .description(INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_CLEANUP.get())
+                      .valuePlaceholder(INFO_SERVICE_NAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java
index 38b639d..c128880 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/CreateRCScript.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
- *      Portions Copyright 2010-2015 ForgeRock AS.
+ *      Portions Copyright 2010-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
@@ -121,33 +121,31 @@
 
     try
     {
-      outputFile = new StringArgument("outputfile", 'f', "outputFile", true,
-                                      false, true, INFO_PATH_PLACEHOLDER.get(),
-                                      null, null,
-                                      INFO_CREATERC_OUTFILE_DESCRIPTION.get());
-      argParser.addArgument(outputFile);
-
-
-      userName = new StringArgument("username", 'u', "userName", false, false,
-                                    true, INFO_USER_NAME_PLACEHOLDER.get(),
-                                    null, null,
-                                    INFO_CREATERC_USER_DESCRIPTION.get());
-      argParser.addArgument(userName);
-
-
-      javaHome = new StringArgument("javahome", 'j', "javaHome", false, false,
-                                    true, INFO_PATH_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_CREATERC_JAVA_HOME_DESCRIPTION.get());
-      argParser.addArgument(javaHome);
-
-
-      javaArgs = new StringArgument("javaargs", 'J', "javaArgs", false, false,
-                                    true, INFO_ARGS_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_CREATERC_JAVA_ARGS_DESCRIPTION.get());
-      argParser.addArgument(javaArgs);
-
+      outputFile =
+              StringArgument.builder("outputFile")
+                      .shortIdentifier('f')
+                      .description(INFO_CREATERC_OUTFILE_DESCRIPTION.get())
+                      .required()
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      userName =
+              StringArgument.builder("userName")
+                      .shortIdentifier('u')
+                      .description(INFO_CREATERC_USER_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_USER_NAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      javaHome =
+              StringArgument.builder("javaHome")
+                      .shortIdentifier('j')
+                      .description(INFO_CREATERC_JAVA_HOME_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      javaArgs =
+              StringArgument.builder("javaArgs")
+                      .shortIdentifier('J')
+                      .description(INFO_CREATERC_JAVA_ARGS_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_ARGS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java
index 28aec95..ad37764 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/EncodePassword.java
@@ -22,11 +22,12 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS.
+ *      Portions Copyright 2011-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_FILE_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ConfigMessages.*;
@@ -159,91 +160,76 @@
     argParser.setShortToolDescription(REF_SHORT_DESC_ENCODE_PASSWORD.get());
     argParser.setVersionHandler(new DirectoryServerVersionHandler());
 
-    // Initialize all the command-line argument types and register them with the
-    // parser.
+    // Initialize all the command-line argument types and register them with the parser.
     try
     {
-      listSchemes = new BooleanArgument(
-              "listschemes", 'l', "listSchemes",
-              INFO_ENCPW_DESCRIPTION_LISTSCHEMES.get());
-      argParser.addArgument(listSchemes);
-
-      interactivePassword = new BooleanArgument(
-              "interactivePassword", 'i',
-              "interactivePassword",
-              INFO_ENCPW_DESCRIPTION_INPUT_PW.get());
-      argParser.addArgument(interactivePassword);
-
-      clearPassword = new StringArgument("clearpw", 'c', "clearPassword", false,
-                                         false, true, INFO_CLEAR_PWD.get(),
-                                         null, null,
-                                         INFO_ENCPW_DESCRIPTION_CLEAR_PW.get());
-      argParser.addArgument(clearPassword);
-
-
+      listSchemes =
+              BooleanArgument.builder("listSchemes")
+                      .shortIdentifier('l')
+                      .description(INFO_ENCPW_DESCRIPTION_LISTSCHEMES.get())
+                      .buildAndAddToParser(argParser);
+      interactivePassword =
+              BooleanArgument.builder("interactivePassword")
+                      .shortIdentifier('i')
+                      .description(INFO_ENCPW_DESCRIPTION_INPUT_PW.get())
+                      .buildAndAddToParser(argParser);
+      clearPassword =
+              StringArgument.builder("clearPassword")
+                      .shortIdentifier('c')
+                      .description(INFO_ENCPW_DESCRIPTION_CLEAR_PW.get())
+                      .valuePlaceholder(INFO_CLEAR_PWD.get())
+                      .buildAndAddToParser(argParser);
       clearPasswordFile =
-           new FileBasedArgument("clearpwfile", 'f', "clearPasswordFile", false,
-                                 false, INFO_FILE_PLACEHOLDER.get(), null, null,
-                                 INFO_ENCPW_DESCRIPTION_CLEAR_PW_FILE.get());
-      argParser.addArgument(clearPasswordFile);
-
-
-      encodedPassword = new StringArgument(
-              "encodedpw", 'e', "encodedPassword",
-              false, false, true, INFO_ENCODED_PWD_PLACEHOLDER.get(),
-              null, null,
-              INFO_ENCPW_DESCRIPTION_ENCODED_PW.get());
-      argParser.addArgument(encodedPassword);
-
-
+              FileBasedArgument.builder("clearPasswordFile")
+                      .shortIdentifier('f')
+                      .description(INFO_ENCPW_DESCRIPTION_CLEAR_PW_FILE.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      encodedPassword =
+              StringArgument.builder("encodedPassword")
+                      .shortIdentifier('e')
+                      .description(INFO_ENCPW_DESCRIPTION_ENCODED_PW.get())
+                      .valuePlaceholder(INFO_ENCODED_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       encodedPasswordFile =
-           new FileBasedArgument("encodedpwfile", 'E', "encodedPasswordFile",
-                                 false, false, INFO_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_ENCPW_DESCRIPTION_ENCODED_PW_FILE.get());
-      argParser.addArgument(encodedPasswordFile);
-
-
-      configClass = new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                                       OPTION_LONG_CONFIG_CLASS,
-                                       true, false, true,
-                                       INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                                       ConfigFileHandler.class.getName(), null,
-                                       INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
-      configFile = new StringArgument("configfile", 'F', "configFile",
-                                      true, false, true,
-                                      INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
-      schemeName = new StringArgument("scheme", 's', "storageScheme", false,
-                                      false, true,
-                                      INFO_STORAGE_SCHEME_PLACEHOLDER.get(),
-                                      null, null,
-                                      INFO_ENCPW_DESCRIPTION_SCHEME.get());
-      argParser.addArgument(schemeName);
-
-
-      authPasswordSyntax = new BooleanArgument(
-              "authpasswordsyntax", 'a',
-              "authPasswordSyntax",
-              INFO_ENCPW_DESCRIPTION_AUTHPW.get());
-      argParser.addArgument(authPasswordSyntax);
-
-
+              FileBasedArgument.builder("encodedPasswordFile")
+                      .shortIdentifier('E')
+                      .description(INFO_ENCPW_DESCRIPTION_ENCODED_PW_FILE.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('F')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      schemeName =
+              StringArgument.builder("storageScheme")
+                      .shortIdentifier('s')
+                      .description(INFO_ENCPW_DESCRIPTION_SCHEME.get())
+                      .valuePlaceholder(INFO_STORAGE_SCHEME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      authPasswordSyntax =
+              BooleanArgument.builder("authPasswordSyntax")
+                      .shortIdentifier('a')
+                      .description(INFO_ENCPW_DESCRIPTION_AUTHPW.get())
+                      .buildAndAddToParser(argParser);
       useCompareResultCode =
-           new BooleanArgument("usecompareresultcode", 'r',
-                               "useCompareResultCode",
-                               INFO_ENCPW_DESCRIPTION_USE_COMPARE_RESULT.get());
-      argParser.addArgument(useCompareResultCode);
-
+              BooleanArgument.builder("useCompareResultCode")
+                      .shortIdentifier('r')
+                      .description(INFO_ENCPW_DESCRIPTION_USE_COMPARE_RESULT.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
index 31e00f3..e7be627 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ExportLDIF.java
@@ -175,129 +175,112 @@
     try
     {
       configClass =
-           new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                              OPTION_LONG_CONFIG_CLASS, true, false,
-                              true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                              ConfigFileHandler.class.getName(), null,
-                              INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       configFile =
-           new StringArgument("configfile", 'f', "configFile", true, false,
-                              true, INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       ldifFile =
-           new StringArgument("ldiffile", OPTION_SHORT_LDIF_FILE,
-                              OPTION_LONG_LDIF_FILE,true, false, true,
-                              INFO_LDIFFILE_PLACEHOLDER.get(), null, null,
-                              INFO_LDIFEXPORT_DESCRIPTION_LDIF_FILE.get());
-      argParser.addArgument(ldifFile);
-
-
-      appendToLDIF = new BooleanArgument(
-                   "appendldif", 'a', "appendToLDIF",
-                   INFO_LDIFEXPORT_DESCRIPTION_APPEND_TO_LDIF.get());
-      argParser.addArgument(appendToLDIF);
-
-
+              StringArgument.builder(OPTION_LONG_LDIF_FILE)
+                      .shortIdentifier(OPTION_SHORT_LDIF_FILE)
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_LDIF_FILE.get())
+                      .required()
+                      .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      appendToLDIF =
+              BooleanArgument.builder("appendToLDIF")
+                      .shortIdentifier('a')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_APPEND_TO_LDIF.get())
+                      .buildAndAddToParser(argParser);
       backendID =
-           new StringArgument("backendid", 'n', "backendID", true, false, true,
-                              INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
-                              INFO_LDIFEXPORT_DESCRIPTION_BACKEND_ID.get());
-      argParser.addArgument(backendID);
-
-
+              StringArgument.builder("backendID")
+                      .shortIdentifier('n')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_BACKEND_ID.get())
+                      .required()
+                      .valuePlaceholder(INFO_BACKENDNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       includeBranchStrings =
-           new StringArgument("includebranch", 'b', "includeBranch", false,
-                              true, true, INFO_BRANCH_DN_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFEXPORT_DESCRIPTION_INCLUDE_BRANCH.get());
-      argParser.addArgument(includeBranchStrings);
-
-
+              StringArgument.builder("includeBranch")
+                      .shortIdentifier('b')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_INCLUDE_BRANCH.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BRANCH_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeBranchStrings =
-           new StringArgument("excludebranch", 'B', "excludeBranch", false,
-                              true, true, INFO_BRANCH_DN_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_BRANCH.get());
-      argParser.addArgument(excludeBranchStrings);
-
-
+              StringArgument.builder("excludeBranch")
+                      .shortIdentifier('B')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_BRANCH.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BRANCH_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       includeAttributeStrings =
-           new StringArgument(
-                   "includeattribute", 'i', "includeAttribute",
-                   false, true, true, INFO_ATTRIBUTE_PLACEHOLDER.get(), null,
-                   null,
-                   INFO_LDIFEXPORT_DESCRIPTION_INCLUDE_ATTRIBUTE.get());
-      argParser.addArgument(includeAttributeStrings);
-
-
+              StringArgument.builder("includeAttribute")
+                      .shortIdentifier('i')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_INCLUDE_ATTRIBUTE.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_ATTRIBUTE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeAttributeStrings =
-           new StringArgument(
-                   "excludeattribute", 'e', "excludeAttribute",
-                   false, true, true, INFO_ATTRIBUTE_PLACEHOLDER.get(), null,
-                   null,
-                   INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_ATTRIBUTE.get());
-      argParser.addArgument(excludeAttributeStrings);
-
-
+              StringArgument.builder("excludeAttribute")
+                      .shortIdentifier('e')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_ATTRIBUTE.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_ATTRIBUTE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       includeFilterStrings =
-           new StringArgument("includefilter", 'I', "includeFilter",
-                              false, true, true, INFO_FILTER_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFEXPORT_DESCRIPTION_INCLUDE_FILTER.get());
-      argParser.addArgument(includeFilterStrings);
-
-
+              StringArgument.builder("includeFilter")
+                      .shortIdentifier('I')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_INCLUDE_FILTER.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeFilterStrings =
-           new StringArgument("excludefilter", 'E', "excludeFilter",
-                              false, true, true, INFO_FILTER_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_FILTER.get());
-      argParser.addArgument(excludeFilterStrings);
-
-
+              StringArgument.builder("excludeFilter")
+                      .shortIdentifier('E')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_FILTER.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeOperationalAttrs =
-           new BooleanArgument("excludeoperational", 'O', "excludeOperational",
-                    INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_OPERATIONAL.get());
-      argParser.addArgument(excludeOperationalAttrs);
-
-
+              BooleanArgument.builder("excludeOperational")
+                      .shortIdentifier('O')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_OPERATIONAL.get())
+                      .buildAndAddToParser(argParser);
       wrapColumn =
-           new IntegerArgument("wrapcolumn", null, "wrapColumn", false, false,
-                               true, INFO_WRAP_COLUMN_PLACEHOLDER.get(), 0,
-                               null, true, 0, false, 0,
-                               INFO_LDIFEXPORT_DESCRIPTION_WRAP_COLUMN.get());
-      argParser.addArgument(wrapColumn);
-
-
+              IntegerArgument.builder("wrapColumn")
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_WRAP_COLUMN.get())
+                      .lowerBound(0)
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_WRAP_COLUMN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       compressLDIF =
-           new BooleanArgument("compressldif", OPTION_SHORT_COMPRESS,
-                               OPTION_LONG_COMPRESS,
-                               INFO_LDIFEXPORT_DESCRIPTION_COMPRESS_LDIF.get());
-      argParser.addArgument(compressLDIF);
-
-
+              BooleanArgument.builder(OPTION_LONG_COMPRESS)
+                      .shortIdentifier(OPTION_SHORT_COMPRESS)
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_COMPRESS_LDIF.get())
+                      .buildAndAddToParser(argParser);
       encryptLDIF =
-           new BooleanArgument("encryptldif", 'y', "encryptLDIF",
-                               INFO_LDIFEXPORT_DESCRIPTION_ENCRYPT_LDIF.get());
-      encryptLDIF.setHidden(true); // See issue #27
-      argParser.addArgument(encryptLDIF);
-
-
+              BooleanArgument.builder("encryptLDIF")
+                      .shortIdentifier('y')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_ENCRYPT_LDIF.get())
+                      .hidden() // See issue #27
+                      .buildAndAddToParser(argParser);
       signHash =
-           new BooleanArgument("signhash", 's', "signHash",
-                               INFO_LDIFEXPORT_DESCRIPTION_SIGN_HASH.get());
-      signHash.setHidden(true); // See issue #28
-      argParser.addArgument(signHash);
-
+              BooleanArgument.builder("signHash")
+                      .shortIdentifier('s')
+                      .description(INFO_LDIFEXPORT_DESCRIPTION_SIGN_HASH.get())
+                      .hidden() // See issue #28
+                      .buildAndAddToParser(argParser);
 
       displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
@@ -311,14 +294,7 @@
 
 
     // Init the default values so that they can appear also on the usage.
-    try
-    {
-      argParser.getArguments().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ce)
-    {
-      // Ignore.
-    }
+    argParser.getArguments().initArgumentsWithConfiguration(argParser);
 
     // Parse the command-line arguments provided to this program.
     try
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
index ef3f13b..fbbd1bc 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ImportLDIF.java
@@ -26,9 +26,11 @@
  */
 package org.opends.server.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.INFO_SEED_PLACEHOLDER;
 import static org.opends.messages.ToolMessages.*;
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.util.StaticUtils.*;
+import static com.forgerock.opendj.cli.CommonArguments.*;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
 import static com.forgerock.opendj.cli.Utils.*;
@@ -149,7 +151,6 @@
 
   /** Define the command-line arguments that may be used with this program. */
   private BooleanArgument countRejects;
-  private BooleanArgument displayUsage;
   private BooleanArgument isCompressed;
   private BooleanArgument isEncrypted;
   private BooleanArgument overwrite;
@@ -202,14 +203,7 @@
     }
 
     // Init the default values so that they can appear also on the usage.
-    try
-    {
-      argParser.getArguments().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ce)
-    {
-      // Ignore.
-    }
+    argParser.getArguments().initArgumentsWithConfiguration(argParser);
 
     // Parse the command-line arguments provided to this program.
     try
@@ -295,186 +289,155 @@
   private void createArguments(LDAPConnectionArgumentParser argParser) throws ArgumentException
   {
       configClass =
-           new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                              OPTION_LONG_CONFIG_CLASS, true, false,
-                              true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                              ConfigFileHandler.class.getName(), null,
-                              INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       configFile =
-           new StringArgument("configfile", 'f', "configFile", true, false,
-                              true, INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       ldifFiles =
-           new StringArgument("ldiffile", OPTION_SHORT_LDIF_FILE,
-                              OPTION_LONG_LDIF_FILE, false, true, true,
-                              INFO_LDIFFILE_PLACEHOLDER.get(), null, null,
-                              INFO_LDIFIMPORT_DESCRIPTION_LDIF_FILE.get());
-      argParser.addArgument(ldifFiles);
-
-
+              StringArgument.builder(OPTION_LONG_LDIF_FILE)
+                      .shortIdentifier(OPTION_SHORT_LDIF_FILE)
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_LDIF_FILE.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       templateFile =
-           new StringArgument("templatefile", 'A', "templateFile", false, false,
-                              true, INFO_TEMPLATE_FILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_LDIFIMPORT_DESCRIPTION_TEMPLATE_FILE.get());
-      argParser.addArgument(templateFile);
-
+              StringArgument.builder("templateFile")
+                      .shortIdentifier('A')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_TEMPLATE_FILE.get())
+                      .valuePlaceholder(INFO_TEMPLATE_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       backendID =
-           new StringArgument("backendid", 'n', "backendID", false, false, true,
-                              INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
-                              INFO_LDIFIMPORT_DESCRIPTION_BACKEND_ID.get());
-      argParser.addArgument(backendID);
-
+              StringArgument.builder("backendID")
+                      .shortIdentifier('n')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_BACKEND_ID.get())
+                      .valuePlaceholder(INFO_BACKENDNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       clearBackend =
-          new BooleanArgument("clearbackend", 'F', "clearBackend",
-                              INFO_LDIFIMPORT_DESCRIPTION_CLEAR_BACKEND.get());
-      argParser.addArgument(clearBackend);
-
-
+              BooleanArgument.builder("clearBackend")
+                      .shortIdentifier('F')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_CLEAR_BACKEND.get())
+                      .buildAndAddToParser(argParser);
       includeBranchStrings =
-           new StringArgument("includebranch", 'b', "includeBranch", false,
-                              true, true, INFO_BRANCH_DN_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFIMPORT_DESCRIPTION_INCLUDE_BRANCH.get());
-      argParser.addArgument(includeBranchStrings);
-
-
+              StringArgument.builder("includeBranch")
+                      .shortIdentifier('b')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_INCLUDE_BRANCH.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BRANCH_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeBranchStrings =
-           new StringArgument("excludebranch", 'B', "excludeBranch", false,
-                              true, true, INFO_BRANCH_DN_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_BRANCH.get());
-      argParser.addArgument(excludeBranchStrings);
-
-
+              StringArgument.builder("excludeBranch")
+                      .shortIdentifier('B')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_BRANCH.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BRANCH_DN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       includeAttributeStrings =
-           new StringArgument(
-                   "includeattribute", 'i', "includeAttribute",
-                   false, true, true, INFO_ATTRIBUTE_PLACEHOLDER.get(), null,
-                   null,
-                   INFO_LDIFIMPORT_DESCRIPTION_INCLUDE_ATTRIBUTE.get());
-      argParser.addArgument(includeAttributeStrings);
-
-
+              StringArgument.builder("includeAttribute")
+                      .shortIdentifier('i')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_INCLUDE_ATTRIBUTE.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_ATTRIBUTE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeAttributeStrings =
-           new StringArgument(
-                   "excludeattribute", 'e', "excludeAttribute",
-                   false, true, true, INFO_ATTRIBUTE_PLACEHOLDER.get(), null,
-                   null,
-                   INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_ATTRIBUTE.get());
-      argParser.addArgument(excludeAttributeStrings);
-
-
+              StringArgument.builder("excludeAttribute")
+                      .shortIdentifier('e')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_ATTRIBUTE.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_ATTRIBUTE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       includeFilterStrings =
-           new StringArgument(
-                   "includefilter", 'I', "includeFilter",
-                   false, true, true, INFO_FILTER_PLACEHOLDER.get(), null, null,
-                   INFO_LDIFIMPORT_DESCRIPTION_INCLUDE_FILTER.get());
-      argParser.addArgument(includeFilterStrings);
-
-
+              StringArgument.builder("includeFilter")
+                      .shortIdentifier('I')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_INCLUDE_FILTER.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       excludeFilterStrings =
-           new StringArgument("excludefilter", 'E', "excludeFilter",
-                              false, true, true, INFO_FILTER_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_FILTER.get());
-      argParser.addArgument(excludeFilterStrings);
-
-
+              StringArgument.builder("excludeFilter")
+                      .shortIdentifier('E')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_FILTER.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       rejectFile =
-           new StringArgument("rejectfile", 'R', "rejectFile", false, false,
-                              true, INFO_REJECT_FILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_LDIFIMPORT_DESCRIPTION_REJECT_FILE.get());
-      argParser.addArgument(rejectFile);
-
-
+              StringArgument.builder("rejectFile")
+                      .shortIdentifier('R')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_REJECT_FILE.get())
+                      .valuePlaceholder(INFO_REJECT_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       skipFile =
-           new StringArgument("skipfile", null, "skipFile", false, false,
-                              true, INFO_SKIP_FILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_LDIFIMPORT_DESCRIPTION_SKIP_FILE.get());
-      argParser.addArgument(skipFile);
-
-
+              StringArgument.builder("skipFile")
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_SKIP_FILE.get())
+                      .valuePlaceholder(INFO_SKIP_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       overwrite =
-           new BooleanArgument("overwrite", 'O', "overwrite",
-                               INFO_LDIFIMPORT_DESCRIPTION_OVERWRITE.get());
-      argParser.addArgument(overwrite);
-
-
+              BooleanArgument.builder("overwrite")
+                      .shortIdentifier('O')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_OVERWRITE.get())
+                      .buildAndAddToParser(argParser);
       randomSeed =
-           new IntegerArgument("randomseed", OPTION_SHORT_RANDOM_SEED,
-                               OPTION_LONG_RANDOM_SEED, false, false,
-                               true, INFO_SEED_PLACEHOLDER.get(),
-                               0, null, false, 0, false, 0,
-                               INFO_LDIFIMPORT_DESCRIPTION_RANDOM_SEED.get());
-      argParser.addArgument(randomSeed);
-
-
+              IntegerArgument.builder(OPTION_LONG_RANDOM_SEED)
+                      .shortIdentifier(OPTION_SHORT_RANDOM_SEED)
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_RANDOM_SEED.get())
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_SEED_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       skipSchemaValidation =
-           new BooleanArgument("skipschema", 'S', "skipSchemaValidation",
-                    INFO_LDIFIMPORT_DESCRIPTION_SKIP_SCHEMA_VALIDATION.get());
-      argParser.addArgument(skipSchemaValidation);
-
-
+              BooleanArgument.builder("skipSchemaValidation")
+                      .shortIdentifier('S')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_SKIP_SCHEMA_VALIDATION.get())
+                      .buildAndAddToParser(argParser);
       skipDNValidation =
-           new BooleanArgument("skipDNValidation", null, "skipDNValidation",
-                    INFO_LDIFIMPORT_DESCRIPTION_DN_VALIDATION.get());
-      argParser.addArgument(skipDNValidation);
-
-
-      threadCount = new IntegerArgument("threadCount", null, "threadCount",
-              false, false, true,
-              INFO_LDIFIMPORT_THREAD_COUNT_PLACEHOLDER.get(),
-              0, null,
-              true, 1, true, Integer.MAX_VALUE,
-              INFO_LDIFIMPORT_DESCRIPTION_THREAD_COUNT.get());
-      argParser.addArgument(threadCount);
-
+              BooleanArgument.builder("skipDNValidation")
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_DN_VALIDATION.get())
+                      .buildAndAddToParser(argParser);
+      threadCount =
+              IntegerArgument.builder("threadCount")
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_THREAD_COUNT.get())
+                      .lowerBound(1)
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_LDIFIMPORT_THREAD_COUNT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       tmpDirectory =
-           new StringArgument("tmpdirectory", null, "tmpdirectory", false,
-                   false, true, INFO_LDIFIMPORT_TEMP_DIR_PLACEHOLDER.get(),
-                   "import-tmp",
-                    null, INFO_LDIFIMPORT_DESCRIPTION_TEMP_DIRECTORY.get());
-      argParser.addArgument(tmpDirectory);
-
-
+              StringArgument.builder("tmpdirectory")
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_TEMP_DIRECTORY.get())
+                      .defaultValue("import-tmp")
+                      .valuePlaceholder(INFO_LDIFIMPORT_TEMP_DIR_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       countRejects =
-           new BooleanArgument("countrejects", null, "countRejects",
-                               INFO_LDIFIMPORT_DESCRIPTION_COUNT_REJECTS.get());
-      argParser.addArgument(countRejects);
-
-
+              BooleanArgument.builder("countRejects")
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_COUNT_REJECTS.get())
+                      .buildAndAddToParser(argParser);
       isCompressed =
-           new BooleanArgument("iscompressed", 'c', "isCompressed",
-                               INFO_LDIFIMPORT_DESCRIPTION_IS_COMPRESSED.get());
-      argParser.addArgument(isCompressed);
-
-
+              BooleanArgument.builder("isCompressed")
+                      .shortIdentifier('c')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_IS_COMPRESSED.get())
+                      .buildAndAddToParser(argParser);
       isEncrypted =
-           new BooleanArgument("isencrypted", 'y', "isEncrypted",
-                               INFO_LDIFIMPORT_DESCRIPTION_IS_ENCRYPTED.get());
-      isEncrypted.setHidden(true); //See issue #27
-      argParser.addArgument(isEncrypted);
+              BooleanArgument.builder("isEncrypted")
+                      .shortIdentifier('y')
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_IS_ENCRYPTED.get())
+                      .hidden() //See issue #27
+                      .buildAndAddToParser(argParser);
+      quietMode =
+              BooleanArgument.builder(OPTION_LONG_QUIET)
+                      .shortIdentifier(OPTION_SHORT_QUIET)
+                      .description(INFO_LDIFIMPORT_DESCRIPTION_QUIET.get())
+                      .buildAndAddToParser(argParser);
 
-
-      quietMode = new BooleanArgument("quietmode", OPTION_SHORT_QUIET,
-                                      OPTION_LONG_QUIET,
-                                      INFO_LDIFIMPORT_DESCRIPTION_QUIET.get());
-      argParser.addArgument(quietMode);
-
-
-      displayUsage = CommonArguments.getShowUsage();
+    final BooleanArgument displayUsage = showUsageArgument();
       argParser.addArgument(displayUsage);
       argParser.setUsageArgument(displayUsage);
   }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java
index 59c2e72..f69e233 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDS.java
@@ -210,28 +210,32 @@
 
   private final BackendTypeHelper backendTypeHelper = new BackendTypeHelper();
 
+  /** The argument parser. */
+  private InstallDSArgumentParser argParser;
+
   /** Different variables we use when the user decides to provide data again. */
   private NewSuffixOptions.Type lastResetPopulateOption;
   private ManagedObjectDefinition<? extends BackendCfgClient, ? extends BackendCfg> lastResetBackendType;
-
   private String lastResetImportFile;
   private String lastResetRejectedFile;
   private String lastResetSkippedFile;
-
   private Integer lastResetNumEntries;
   private Boolean lastResetEnableSSL;
   private Boolean lastResetEnableStartTLS;
-
   private SecurityOptions.CertificateType lastResetCertType;
   private String lastResetKeyStorePath;
-
   private Boolean lastResetEnableWindowsService;
   private Boolean lastResetStartServer;
+  private String lastResetBaseDN = Installation.DEFAULT_INTERACTIVE_BASE_DN;
+  private String lastResetDirectoryManagerDN;
+  private Integer lastResetLdapPort;
+  private Integer lastResetLdapsPort;
+  private Integer lastResetAdminConnectorPort;
+  private Integer lastResetJmxPort;
+
 
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
-  /** The argument parser. */
-  private InstallDSArgumentParser argParser;
 
   /**
    * Constructor for the InstallDS object.
@@ -338,6 +342,12 @@
       return InstallReturnCode.ERROR_UNEXPECTED.getReturnCode();
     }
 
+    lastResetDirectoryManagerDN = argParser.directoryManagerDNArg.getDefaultValue();
+    lastResetLdapPort = Integer.parseInt(argParser.ldapPortArg.getDefaultValue());
+    lastResetLdapsPort = Integer.parseInt(argParser.ldapsPortArg.getDefaultValue());
+    lastResetAdminConnectorPort = Integer.parseInt(argParser.adminConnectorPortArg.getDefaultValue());
+    lastResetJmxPort = Integer.parseInt(argParser.jmxPortArg.getDefaultValue());
+
     // Validate user provided data
     try
     {
@@ -983,7 +993,7 @@
   private void promptIfRequiredForDirectoryManager(UserData uData) throws UserDataException, ClientException
   {
     final LinkedList<String> dns = promptIfRequiredForDNs(
-        argParser.directoryManagerDNArg, INFO_INSTALLDS_PROMPT_ROOT_DN.get(), true);
+            argParser.directoryManagerDNArg, lastResetDirectoryManagerDN, INFO_INSTALLDS_PROMPT_ROOT_DN.get(), true);
     uData.setDirectoryManagerDn(dns.getFirst());
 
     int nTries = 0;
@@ -1028,6 +1038,8 @@
    *
    * @param arg
    *          the Argument that the user provided to specify the DNs.
+   * @param valueToSuggest
+   *          the value to suggest by default on prompt.
    * @param promptMsg
    *          the prompt message to be displayed.
    * @param includeLineBreak
@@ -1036,8 +1048,8 @@
    * @throws UserDataException
    *           if something went wrong checking the data.
    */
-  private LinkedList<String> promptIfRequiredForDNs(StringArgument arg,
-      LocalizableMessage promptMsg, boolean includeLineBreak) throws UserDataException
+  private LinkedList<String> promptIfRequiredForDNs(StringArgument arg, String valueToSuggest,
+          LocalizableMessage promptMsg, boolean includeLineBreak) throws UserDataException
   {
     final LinkedList<String> dns = new LinkedList<>();
 
@@ -1059,7 +1071,7 @@
         }
         try
         {
-          final String dn = readInput(promptMsg, arg.getDefaultValue());
+          final String dn = readInput(promptMsg, valueToSuggest);
           firstPrompt = false;
           dns.add(dn);
           prompted = true;
@@ -1120,20 +1132,20 @@
 
     final List<Integer> usedPorts = new LinkedList<>();
     //  Determine the LDAP port number.
-    final int ldapPort = promptIfRequiredForPortData(argParser.ldapPortArg,
-        INFO_INSTALLDS_PROMPT_LDAPPORT.get(), usedPorts, true);
+    final int ldapPort = promptIfRequiredForPortData(
+            argParser.ldapPortArg, lastResetLdapPort, INFO_INSTALLDS_PROMPT_LDAPPORT.get(), usedPorts, true);
     uData.setServerPort(ldapPort);
     usedPorts.add(ldapPort);
 
     //  Determine the Admin Connector port number.
     final int adminConnectorPort = promptIfRequiredForPortData(argParser.adminConnectorPortArg,
-        INFO_INSTALLDS_PROMPT_ADMINCONNECTORPORT.get(), usedPorts, true);
+            lastResetAdminConnectorPort, INFO_INSTALLDS_PROMPT_ADMINCONNECTORPORT.get(), usedPorts, true);
     uData.setAdminConnectorPort(adminConnectorPort);
     usedPorts.add(adminConnectorPort);
 
     if (argParser.jmxPortArg.isPresent())
     {
-      final int jmxPort = promptIfRequiredForPortData(argParser.jmxPortArg,
+      final int jmxPort = promptIfRequiredForPortData(argParser.jmxPortArg, lastResetJmxPort,
           INFO_INSTALLDS_PROMPT_JMXPORT.get(), usedPorts, true);
       uData.setServerJMXPort(jmxPort);
     }
@@ -1150,6 +1162,8 @@
    *
    * @param portArg
    *          the Argument that the user provided to specify the port.
+   * @param valueToSuggest
+   *          the value to suggest by default on prompt.
    * @param promptMsg
    *          the prompt message to be displayed.
    * @param usedPorts
@@ -1159,7 +1173,7 @@
    *          whether to include a line break before the first prompt or not.
    * @return a valid port number.
    */
-  private int promptIfRequiredForPortData(IntegerArgument portArg, LocalizableMessage promptMsg,
+  private int promptIfRequiredForPortData(IntegerArgument portArg, Integer valueToSuggest, LocalizableMessage promptMsg,
       Collection<Integer> usedPorts, boolean includeLineBreak)
   {
     int portNumber = -1;
@@ -1172,11 +1186,6 @@
         boolean prompted = false;
         if (usedProvided || !portArg.isPresent())
         {
-          int defaultValue = -1;
-          if (portArg.getDefaultValue() != null)
-          {
-            defaultValue = Integer.parseInt(portArg.getDefaultValue());
-          }
           if (firstPrompt && includeLineBreak)
           {
             println();
@@ -1186,7 +1195,7 @@
           {
             try
             {
-              portNumber = readPort(promptMsg, defaultValue);
+              portNumber = readPort(promptMsg, valueToSuggest);
             }
             catch (final ClientException ce)
             {
@@ -1267,14 +1276,9 @@
     }
 
     uData.setBackendType(getOrPromptForBackendType());
-
-    // Add default value for base DN on first prompt
-    if (argParser.baseDNArg.getDefaultValue() == null)
-    {
-      argParser.baseDNArg.setDefaultValue(Installation.DEFAULT_INTERACTIVE_BASE_DN);
-    }
     // Check the validity of the base DNs
-    final List<String> baseDNs = promptIfRequiredForDNs(argParser.baseDNArg, INFO_INSTALLDS_PROMPT_BASEDN.get(), true);
+    final List<String> baseDNs = promptIfRequiredForDNs(
+            argParser.baseDNArg, lastResetBaseDN, INFO_INSTALLDS_PROMPT_BASEDN.get(), true);
     return promptIfRequiredForDataOptions(baseDNs);
 
   }
@@ -1600,8 +1604,8 @@
         enableSSL = confirmAction(INFO_INSTALLDS_PROMPT_ENABLE_SSL.get(), defaultValue);
         if (enableSSL)
         {
-          ldapsPort = promptIfRequiredForPortData(argParser.ldapsPortArg,
-              INFO_INSTALLDS_PROMPT_LDAPSPORT.get(), usedPorts, false);
+          ldapsPort = promptIfRequiredForPortData(
+                  argParser.ldapsPortArg, lastResetLdapsPort, INFO_INSTALLDS_PROMPT_LDAPSPORT.get(), usedPorts, false);
         }
       }
       catch (final ClientException ce)
@@ -1611,8 +1615,8 @@
     }
     else
     {
-      ldapsPort = promptIfRequiredForPortData(argParser.ldapsPortArg,
-          INFO_INSTALLDS_PROMPT_LDAPSPORT.get(), usedPorts, true);
+      ldapsPort = promptIfRequiredForPortData(
+              argParser.ldapsPortArg, lastResetLdapsPort, INFO_INSTALLDS_PROMPT_LDAPSPORT.get(), usedPorts, true);
       enableSSL = true;
     }
 
@@ -2541,20 +2545,20 @@
     try
     {
       argParser.initializeArguments();
-      argParser.directoryManagerDNArg.setDefaultValue(uData.getDirectoryManagerDn());
-      argParser.ldapPortArg.setDefaultValue(String.valueOf(uData.getServerPort()));
-      argParser.adminConnectorPortArg.setDefaultValue(String.valueOf(uData.getAdminConnectorPort()));
+      lastResetDirectoryManagerDN = uData.getDirectoryManagerDn();
+      lastResetLdapPort = uData.getServerPort();
+      lastResetAdminConnectorPort = uData.getAdminConnectorPort();
 
       final int jmxPort = uData.getServerJMXPort();
       if (jmxPort != -1)
       {
-        argParser.jmxPortArg.setDefaultValue(String.valueOf(jmxPort));
+        lastResetJmxPort = jmxPort;
       }
 
       final LinkedList<String> baseDNs = uData.getNewSuffixOptions().getBaseDns();
       if (!baseDNs.isEmpty())
       {
-        argParser.baseDNArg.setDefaultValue(baseDNs.getFirst());
+        lastResetBaseDN = baseDNs.getFirst();
       }
 
       final NewSuffixOptions suffixOptions = uData.getNewSuffixOptions();
@@ -2574,7 +2578,7 @@
       final SecurityOptions sec = uData.getSecurityOptions();
       if (sec.getEnableSSL())
       {
-        argParser.ldapsPortArg.setDefaultValue(String.valueOf(sec.getSslPort()));
+        lastResetLdapsPort = sec.getSslPort();
       }
       lastResetEnableSSL = sec.getEnableSSL();
       lastResetEnableStartTLS = sec.getEnableStartTLS();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDSArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDSArgumentParser.java
index 433352b..6f1a1ea 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDSArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/InstallDSArgumentParser.java
@@ -26,6 +26,11 @@
  */
 package org.opends.server.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.INFO_JMXPORT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_KEYSTORE_PWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_NUM_ENTRIES_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_PORT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_ROOT_USER_PWD_FILE_PLACEHOLDER;
 import static org.opends.messages.ToolMessages.*;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
@@ -126,23 +131,23 @@
    */
   public void initializeArguments() throws ArgumentException
   {
-    testOnlyArg = new BooleanArgument(
-            OPTION_LONG_TESTONLY_ARGUMENT.toLowerCase(), null,
-            OPTION_LONG_TESTONLY_ARGUMENT,
-            INFO_ARGUMENT_DESCRIPTION_TESTONLY.get());
-    testOnlyArg.setHidden(true);
-    testOnlyArg.setPropertyName(OPTION_LONG_TESTONLY_ARGUMENT);
+    testOnlyArg =
+            BooleanArgument.builder(OPTION_LONG_TESTONLY_ARGUMENT)
+                    .description(INFO_ARGUMENT_DESCRIPTION_TESTONLY.get())
+                    .hidden()
+                    .buildArgument();
     addArgument(testOnlyArg);
 
     cliArg = CommonArguments.getCLI();
     addArgument(cliArg);
 
-    String defaultProgName = Installation.getSetupFileName();
-    progNameArg = new StringArgument(
-        "programName".toLowerCase(), 'P', "programName", false,
-        false, true, INFO_PROGRAM_NAME_PLACEHOLDER.get(), defaultProgName,
-        "programName", INFO_INSTALLDS_DESCRIPTION_PROGNAME.get());
-    progNameArg.setHidden(true);
+    progNameArg = StringArgument.builder("programName")
+            .shortIdentifier('P')
+            .description(INFO_INSTALLDS_DESCRIPTION_PROGNAME.get())
+            .hidden()
+            .defaultValue(Installation.getSetupFileName())
+            .valuePlaceholder(INFO_PROGRAM_NAME_PLACEHOLDER.get())
+            .buildArgument();
     addArgument(progNameArg);
 
     noPromptArg = CommonArguments.getNoPrompt();
@@ -154,59 +159,69 @@
     verboseArg = CommonArguments.getVerbose();
     addArgument(verboseArg);
 
-    propertiesFileArgument = new StringArgument(
-        OPTION_LONG_PROP_FILE_PATH.toLowerCase(), null,
-        OPTION_LONG_PROP_FILE_PATH, false,
-        false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_PROP_FILE_PATH.get());
+    propertiesFileArgument =
+            StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                    .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                    .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(propertiesFileArgument);
     setFilePropertiesArgument(propertiesFileArgument);
 
-    noPropertiesFileArgument = new BooleanArgument(
-        OPTION_LONG_NO_PROP_FILE.toLowerCase(), null, OPTION_LONG_NO_PROP_FILE,
-        INFO_DESCRIPTION_NO_PROP_FILE.get());
+    noPropertiesFileArgument =
+            BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                    .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                    .buildArgument();
     addArgument(noPropertiesFileArgument);
     setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-    baseDNArg = new StringArgument(
-        OPTION_LONG_BASEDN.toLowerCase(), OPTION_SHORT_BASEDN,
-        OPTION_LONG_BASEDN, false, true, true,
-        INFO_BASEDN_PLACEHOLDER.get(),
-        null, OPTION_LONG_BASEDN,
-        INFO_INSTALLDS_DESCRIPTION_BASEDN.get());
+    baseDNArg =
+            StringArgument.builder(OPTION_LONG_BASEDN)
+                    .shortIdentifier(OPTION_SHORT_BASEDN)
+                    .description(INFO_INSTALLDS_DESCRIPTION_BASEDN.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(baseDNArg);
 
-    addBaseEntryArg = new BooleanArgument(
-        "addBaseEntry".toLowerCase(), 'a', "addBaseEntry",
-        INFO_INSTALLDS_DESCRIPTION_ADDBASE.get());
-    addBaseEntryArg.setPropertyName("addBaseEntry");
+    addBaseEntryArg =
+            BooleanArgument.builder("addBaseEntry")
+                    .shortIdentifier('a')
+                    .description(INFO_INSTALLDS_DESCRIPTION_ADDBASE.get())
+                    .buildArgument();
     addArgument(addBaseEntryArg);
 
-    importLDIFArg = new StringArgument(
-        OPTION_LONG_LDIF_FILE.toLowerCase(), OPTION_SHORT_LDIF_FILE,
-        OPTION_LONG_LDIF_FILE, false,
-        true, true, INFO_LDIFFILE_PLACEHOLDER.get(),
-        null, OPTION_LONG_LDIF_FILE,
-        INFO_INSTALLDS_DESCRIPTION_IMPORTLDIF.get());
+    importLDIFArg =
+            StringArgument.builder(OPTION_LONG_LDIF_FILE)
+                    .shortIdentifier(OPTION_SHORT_LDIF_FILE)
+                    .description(INFO_INSTALLDS_DESCRIPTION_IMPORTLDIF.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(importLDIFArg);
 
-    rejectedImportFileArg = new StringArgument(
-        "rejectFile".toLowerCase(), 'R', "rejectFile", false, false,
-        true, INFO_REJECT_FILE_PLACEHOLDER.get(), null, "rejectFile",
-        INFO_INSTALLDS_DESCRIPTION_REJECTED_FILE.get());
+    rejectedImportFileArg =
+            StringArgument.builder("rejectFile")
+                    .shortIdentifier('R')
+                    .description(INFO_INSTALLDS_DESCRIPTION_REJECTED_FILE.get())
+                    .valuePlaceholder(INFO_REJECT_FILE_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(rejectedImportFileArg);
 
-    skippedImportFileArg = new StringArgument(
-        "skipFile".toLowerCase(), null, "skipFile", false, false,
-        true, INFO_SKIP_FILE_PLACEHOLDER.get(), null, "skipFile",
-        INFO_INSTALLDS_DESCRIPTION_SKIPPED_FILE.get());
+    skippedImportFileArg =
+            StringArgument.builder("skipFile")
+                    .description(INFO_INSTALLDS_DESCRIPTION_SKIPPED_FILE.get())
+                    .valuePlaceholder(INFO_SKIP_FILE_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(skippedImportFileArg);
 
-    sampleDataArg = new IntegerArgument(
-        "sampleData".toLowerCase(), 'd', "sampleData", false,
-        false, true, INFO_NUM_ENTRIES_PLACEHOLDER.get(), 0, "sampleData",
-        true, 0, false, 0,
-        INFO_INSTALLDS_DESCRIPTION_SAMPLE_DATA.get());
+    sampleDataArg =
+            IntegerArgument.builder("sampleData")
+                    .shortIdentifier('d')
+                    .description(INFO_INSTALLDS_DESCRIPTION_SAMPLE_DATA.get())
+                    .lowerBound(0)
+                    .defaultValue(0)
+                    .valuePlaceholder(INFO_NUM_ENTRIES_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(sampleDataArg);
 
     int defaultLdapPort = UserData.getDefaultPort();
@@ -214,12 +229,15 @@
     {
       defaultLdapPort = 389;
     }
-    ldapPortArg = new IntegerArgument(
-        "ldapPort".toLowerCase(), OPTION_SHORT_PORT,
-        "ldapPort", false, false,
-        true, INFO_PORT_PLACEHOLDER.get(), defaultLdapPort,
-        "ldapPort", true, 1, true, 65535,
-        INFO_INSTALLDS_DESCRIPTION_LDAPPORT.get());
+
+    ldapPortArg =
+            IntegerArgument.builder("ldapPort")
+                    .shortIdentifier(OPTION_SHORT_PORT)
+                    .description(INFO_INSTALLDS_DESCRIPTION_LDAPPORT.get())
+                    .range(1, 65535)
+                    .defaultValue(defaultLdapPort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(ldapPortArg);
 
     int defaultAdminPort = UserData.getDefaultAdminConnectorPort();
@@ -228,75 +246,80 @@
       defaultAdminPort =
         AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT;
     }
-    adminConnectorPortArg = new IntegerArgument(
-        "adminConnectorPort".toLowerCase(), null,
-        "adminConnectorPort", false, false,
-        true, INFO_PORT_PLACEHOLDER.get(), defaultAdminPort,
-        "adminConnectorPort", true, 1, true, 65535,
-        INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT.get());
+
+    adminConnectorPortArg =
+            IntegerArgument.builder("adminConnectorPort")
+                    .description(INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT.get())
+                    .range(1, 65535)
+                    .defaultValue(defaultAdminPort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(adminConnectorPortArg);
 
-    jmxPortArg = new IntegerArgument(
-        "jmxPort".toLowerCase(), 'x', "jmxPort", false, false,
-        true, INFO_JMXPORT_PLACEHOLDER.get(),
-        CliConstants.DEFAULT_JMX_PORT, "jmxPort", true,
-        1, true, 65535,
-        INFO_INSTALLDS_DESCRIPTION_JMXPORT.get());
+    jmxPortArg =
+            IntegerArgument.builder("jmxPort")
+                    .shortIdentifier('x')
+                    .description(INFO_INSTALLDS_DESCRIPTION_JMXPORT.get())
+                    .range(1, 65535)
+                    .defaultValue(CliConstants.DEFAULT_JMX_PORT)
+                    .valuePlaceholder(INFO_JMXPORT_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(jmxPortArg);
 
-    skipPortCheckArg = new BooleanArgument(
-        "skipPortCheck".toLowerCase(), 'S', "skipPortCheck",
-        INFO_INSTALLDS_DESCRIPTION_SKIPPORT.get());
-    skipPortCheckArg.setPropertyName("skipPortCheck");
+    skipPortCheckArg =
+            BooleanArgument.builder("skipPortCheck")
+                    .shortIdentifier('S')
+                    .description(INFO_INSTALLDS_DESCRIPTION_SKIPPORT.get())
+                    .buildArgument();
     addArgument(skipPortCheckArg);
 
-    directoryManagerDNArg = new StringArgument(
-        OPTION_LONG_ROOT_USER_DN.toLowerCase(), OPTION_SHORT_ROOT_USER_DN,
-        OPTION_LONG_ROOT_USER_DN, false, false,
-        true, INFO_ROOT_USER_DN_PLACEHOLDER.get(),
-        "cn=Directory Manager",
-        OPTION_LONG_ROOT_USER_DN, INFO_INSTALLDS_DESCRIPTION_ROOTDN.get());
+    directoryManagerDNArg =
+            StringArgument.builder(OPTION_LONG_ROOT_USER_DN)
+                    .shortIdentifier(OPTION_SHORT_ROOT_USER_DN)
+                    .description(INFO_INSTALLDS_DESCRIPTION_ROOTDN.get())
+                    .defaultValue("cn=Directory Manager")
+                    .valuePlaceholder(INFO_ROOT_USER_DN_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(directoryManagerDNArg);
 
-    directoryManagerPwdStringArg = new StringArgument(
-        "rootUserPassword".toLowerCase(), OPTION_SHORT_BINDPWD,
-        "rootUserPassword",
-        false, false, true,
-        INFO_ROOT_USER_PWD_PLACEHOLDER.get(), null,
-        "rootUserPassword",
-        INFO_INSTALLDS_DESCRIPTION_ROOTPW.get());
+    directoryManagerPwdStringArg =
+            StringArgument.builder("rootUserPassword")
+                    .shortIdentifier(OPTION_SHORT_BINDPWD)
+                    .description(INFO_INSTALLDS_DESCRIPTION_ROOTPW.get())
+                    .valuePlaceholder(INFO_ROOT_USER_PWD_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(directoryManagerPwdStringArg);
 
-    directoryManagerPwdFileArg = new FileBasedArgument(
-        "rootUserPasswordFile".toLowerCase(),
-        OPTION_SHORT_BINDPWD_FILE,
-        "rootUserPasswordFile", false, false,
-        INFO_ROOT_USER_PWD_FILE_PLACEHOLDER.get(),
-        null, "rootUserPasswordFile",
-        INFO_INSTALLDS_DESCRIPTION_ROOTPWFILE.get());
+    directoryManagerPwdFileArg =
+            FileBasedArgument.builder("rootUserPasswordFile")
+                    .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                    .description(INFO_INSTALLDS_DESCRIPTION_ROOTPWFILE.get())
+                    .valuePlaceholder(INFO_ROOT_USER_PWD_FILE_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(directoryManagerPwdFileArg);
 
-    enableWindowsServiceArg = new BooleanArgument(
-        "enableWindowsService".toLowerCase(), 'e',
-        "enableWindowsService",
-        INFO_INSTALLDS_DESCRIPTION_ENABLE_WINDOWS_SERVICE.get());
-    enableWindowsServiceArg.setPropertyName("enableWindowsService");
+    enableWindowsServiceArg =
+            BooleanArgument.builder("enableWindowsService")
+                    .shortIdentifier('e')
+                    .description(INFO_INSTALLDS_DESCRIPTION_ENABLE_WINDOWS_SERVICE.get())
+                    .buildArgument();
     if (isWindows())
     {
       addArgument(enableWindowsServiceArg);
     }
 
-    doNotStartArg = new BooleanArgument(
-        "doNotStart".toLowerCase(), 'O', "doNotStart",
-        INFO_INSTALLDS_DESCRIPTION_DO_NOT_START.get());
-    doNotStartArg.setPropertyName("doNotStart");
+    doNotStartArg =
+            BooleanArgument.builder("doNotStart")
+                    .shortIdentifier('O')
+                    .description(INFO_INSTALLDS_DESCRIPTION_DO_NOT_START.get())
+                    .buildArgument();
     addArgument(doNotStartArg);
 
-    enableStartTLSArg = new BooleanArgument(
-        "enableStartTLS".toLowerCase(), OPTION_SHORT_START_TLS,
-        "enableStartTLS",
-        INFO_INSTALLDS_DESCRIPTION_ENABLE_STARTTLS.get());
-    enableStartTLSArg.setPropertyName("enableStartTLS");
+    enableStartTLSArg =
+            BooleanArgument.builder("enableStartTLS")
+                    .shortIdentifier(OPTION_SHORT_START_TLS)
+                    .description(INFO_INSTALLDS_DESCRIPTION_ENABLE_STARTTLS.get())
+                    .buildArgument();
     addArgument(enableStartTLSArg);
 
     int defaultSecurePort = UserData.getDefaultSslPort(defaultLdapPort);
@@ -304,79 +327,85 @@
     {
       defaultSecurePort = 636;
     }
-    ldapsPortArg = new IntegerArgument(
-        "ldapsPort".toLowerCase(), OPTION_SHORT_USE_SSL,
-        "ldapsPort", false, false,
-        true, INFO_PORT_PLACEHOLDER.get(), defaultSecurePort,
-        "ldapsPort", true, 1, true, 65535,
-        INFO_INSTALLDS_DESCRIPTION_LDAPSPORT.get());
+
+    ldapsPortArg =
+            IntegerArgument.builder("ldapsPort")
+                    .shortIdentifier(OPTION_SHORT_USE_SSL)
+                    .description(INFO_INSTALLDS_DESCRIPTION_LDAPSPORT.get())
+                    .range(1, 65535)
+                    .defaultValue(defaultSecurePort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(ldapsPortArg);
 
-    generateSelfSignedCertificateArg = new BooleanArgument(
-        "generateSelfSignedCertificate".toLowerCase(),
-        null, "generateSelfSignedCertificate",
-        INFO_INSTALLDS_DESCRIPTION_USE_SELF_SIGNED.get());
-    generateSelfSignedCertificateArg.setPropertyName(
-        "generateSelfSignedCertificate");
+    generateSelfSignedCertificateArg =
+            BooleanArgument.builder("generateSelfSignedCertificate")
+                    .description(INFO_INSTALLDS_DESCRIPTION_USE_SELF_SIGNED.get())
+                    .buildArgument();
     addArgument(generateSelfSignedCertificateArg);
 
-    hostNameArg = new StringArgument(OPTION_LONG_HOST.toLowerCase(),
-        OPTION_SHORT_HOST,
-        OPTION_LONG_HOST, false, false, true, INFO_HOST_PLACEHOLDER.get(),
-        UserData.getDefaultHostName(),
-        null, INFO_INSTALLDS_DESCRIPTION_HOST_NAME.get());
-    hostNameArg.setPropertyName(OPTION_LONG_HOST);
+    hostNameArg =
+            StringArgument.builder(OPTION_LONG_HOST)
+                    .shortIdentifier(OPTION_SHORT_HOST)
+                    .description(INFO_INSTALLDS_DESCRIPTION_HOST_NAME.get())
+                    .defaultValue(UserData.getDefaultHostName())
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
     addDefaultArgument(hostNameArg);
 
-    usePkcs11Arg = new BooleanArgument("usePkcs11Keystore".toLowerCase(),
-        null, "usePkcs11Keystore",
-        INFO_INSTALLDS_DESCRIPTION_USE_PKCS11.get());
-    usePkcs11Arg.setPropertyName("usePkcs11Keystore");
+    usePkcs11Arg =
+            BooleanArgument.builder("usePkcs11Keystore")
+                    .description(INFO_INSTALLDS_DESCRIPTION_USE_PKCS11.get())
+                    .buildArgument();
     addArgument(usePkcs11Arg);
 
-    useJavaKeyStoreArg = new StringArgument("useJavaKeystore".toLowerCase(),
-        null, "useJavaKeystore", false, false,
-        true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "useJavaKeystore",
-        INFO_INSTALLDS_DESCRIPTION_USE_JAVAKEYSTORE.get());
+    useJavaKeyStoreArg =
+            StringArgument.builder("useJavaKeystore")
+                    .description(INFO_INSTALLDS_DESCRIPTION_USE_JAVAKEYSTORE.get())
+                    .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(useJavaKeyStoreArg);
 
-    useJCEKSArg = new StringArgument("useJCEKS".toLowerCase(),
-        null, "useJCEKS", false, false,
-        true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "useJCEKS",
-        INFO_INSTALLDS_DESCRIPTION_USE_JCEKS.get());
+    useJCEKSArg =
+            StringArgument.builder("useJCEKS")
+                    .description(INFO_INSTALLDS_DESCRIPTION_USE_JCEKS.get())
+                    .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(useJCEKSArg);
 
-    usePkcs12Arg = new StringArgument("usePkcs12keyStore".toLowerCase(),
-        null, "usePkcs12keyStore", false, false,
-        true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "usePkcs12keyStore",
-        INFO_INSTALLDS_DESCRIPTION_USE_PKCS12.get());
+    usePkcs12Arg =
+            StringArgument.builder("usePkcs12keyStore")
+                    .description(INFO_INSTALLDS_DESCRIPTION_USE_PKCS12.get())
+                    .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(usePkcs12Arg);
 
-    keyStorePasswordArg = new StringArgument(
-        OPTION_LONG_KEYSTORE_PWD.toLowerCase(),
-        OPTION_SHORT_KEYSTORE_PWD,
-        OPTION_LONG_KEYSTORE_PWD, false, false, true,
-        INFO_KEYSTORE_PWD_PLACEHOLDER.get(), null, OPTION_LONG_KEYSTORE_PWD,
-        INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD.get());
+    keyStorePasswordArg =
+            StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                    .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                    .description(INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD.get())
+                    .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                    .buildArgument();
     addDefaultArgument(keyStorePasswordArg);
 
-    keyStorePasswordFileArg = new FileBasedArgument(
-        OPTION_LONG_KEYSTORE_PWD_FILE.toLowerCase(),
-        OPTION_SHORT_KEYSTORE_PWD_FILE, OPTION_LONG_KEYSTORE_PWD_FILE, false,
-        false, INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(), null,
-        OPTION_LONG_KEYSTORE_PWD_FILE,
-        INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
+    keyStorePasswordFileArg =
+            FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                    .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                    .description(INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD_FILE.get())
+                    .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                    .buildArgument();
     addDefaultArgument(keyStorePasswordFileArg);
 
-    certNicknameArg = new StringArgument(
-        OPTION_LONG_CERT_NICKNAME.toLowerCase(),
-        OPTION_SHORT_CERT_NICKNAME, OPTION_LONG_CERT_NICKNAME,
-        false, true, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
-        OPTION_LONG_CERT_NICKNAME,
-        INFO_INSTALLDS_DESCRIPTION_CERT_NICKNAME.get());
+    certNicknameArg =
+            StringArgument.builder(OPTION_LONG_CERT_NICKNAME)
+                    .shortIdentifier(OPTION_SHORT_CERT_NICKNAME)
+                    .description(INFO_INSTALLDS_DESCRIPTION_CERT_NICKNAME.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                    .buildArgument();
     addDefaultArgument(certNicknameArg);
 
-    connectTimeoutArg = CommonArguments.getConnectTimeOut();
+    connectTimeoutArg = CommonArguments.getConnectTimeOutHidden();
     addArgument(connectTimeoutArg);
 
     acceptLicense = CommonArguments.getAcceptLicense();
@@ -386,15 +415,14 @@
     addArgument(showUsageArg);
     setUsageArgument(showUsageArg);
 
-    backendTypeArg = new StringArgument(
-        OPTION_LONG_BACKEND_TYPE.toLowerCase(),
-        OPTION_SHORT_BACKEND_TYPE, OPTION_LONG_BACKEND_TYPE,
-        false, false, true, INFO_INSTALLDS_BACKEND_TYPE_PLACEHOLDER.get(),
-        BackendTypeHelper.filterSchemaBackendName(
-            new BackendTypeHelper().getBackendTypes().get(0).getName()),
-        OPTION_LONG_BACKEND_TYPE,
-        INFO_INSTALLDS_DESCRIPTION_BACKEND_TYPE.get()
-    );
+    backendTypeArg =
+            StringArgument.builder(OPTION_LONG_BACKEND_TYPE)
+                    .shortIdentifier(OPTION_SHORT_BACKEND_TYPE)
+                    .description(INFO_INSTALLDS_DESCRIPTION_BACKEND_TYPE.get())
+                    .defaultValue(BackendTypeHelper.filterSchemaBackendName(
+                            new BackendTypeHelper().getBackendTypes().get(0).getName()))
+                    .valuePlaceholder(INFO_INSTALLDS_BACKEND_TYPE_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(backendTypeArg);
   }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesToolArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesToolArgumentParser.java
index a1cbc9f..8827ba2 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesToolArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/JavaPropertiesToolArgumentParser.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2014-2015 ForgeRock AS
+ *      Portions Copyright 2014-2016 ForgeRock AS
  */
 package org.opends.server.tools;
 
@@ -84,22 +84,24 @@
     quietArg = CommonArguments.getQuiet();
     addArgument(quietArg);
 
-    propertiesFileArg = new StringArgument("propertiesFile",
-        'p', "propertiesFile", false,
-        false, true, INFO_PATH_PLACEHOLDER.get(), getDefaultPropertiesValue(),
-        "propertiesFile",
-        INFO_JAVAPROPERTIES_DESCRIPTION_PROPERTIES_FILE.get(
-            getDefaultPropertiesValue()));
-    propertiesFileArg.setHidden(true);
+    propertiesFileArg =
+            StringArgument.builder("propertiesFile")
+                    .shortIdentifier('p')
+                    .description(INFO_JAVAPROPERTIES_DESCRIPTION_PROPERTIES_FILE.get(getDefaultPropertiesValue()))
+                    .hidden()
+                    .defaultValue(getDefaultPropertiesValue())
+                    .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(propertiesFileArg);
 
-    destinationFileArg = new StringArgument("destinationFile",
-        'd', "destinationFile", false,
-        false, true, INFO_PATH_PLACEHOLDER.get(), getDefaultDestinationValue(),
-        "destinationFile",
-        INFO_JAVAPROPERTIES_DESCRIPTION_DESTINATION_FILE.get(
-            getDefaultDestinationValue()));
-    destinationFileArg.setHidden(true);
+    destinationFileArg =
+            StringArgument.builder("destinationFile")
+                    .shortIdentifier('d')
+                    .description(INFO_JAVAPROPERTIES_DESCRIPTION_DESTINATION_FILE.get(getDefaultDestinationValue()))
+                    .hidden()
+                    .defaultValue(getDefaultDestinationValue())
+                    .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                    .buildArgument();
     addArgument(destinationFileArg);
 
     showUsageArg = CommonArguments.getShowUsage();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java
index cd07fbe..b2b32db 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPCompare.java
@@ -27,6 +27,7 @@
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_BINDPASSWORDFILE;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -407,230 +408,172 @@
 
     try
     {
-      scriptFriendlyArgument = new BooleanArgument(
-          "script-friendly",
-          's',
-          "script-friendly",
-          INFO_DESCRIPTION_SCRIPT_FRIENDLY.get());
-      scriptFriendlyArgument.setPropertyName(
-          scriptFriendlyArgument.getLongIdentifier());
-      argParser.addArgument(scriptFriendlyArgument);
-
-      propertiesFileArgument = new StringArgument("propertiesFilePath",
-          null, OPTION_LONG_PROP_FILE_PATH,
-          false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      scriptFriendlyArgument =
+              BooleanArgument.builder("script-friendly")
+                      .shortIdentifier('s')
+                      .description(INFO_DESCRIPTION_SCRIPT_FRIENDLY.get())
+                      .buildAndAddToParser(argParser);
+      propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      hostName = new StringArgument("host", OPTION_SHORT_HOST,
-                                    OPTION_LONG_HOST, false, false, true,
-                                    INFO_HOST_PLACEHOLDER.get(), "localhost",
-                                    null,
-                                    INFO_DESCRIPTION_HOST.get());
-      hostName.setPropertyName(OPTION_LONG_HOST);
-      argParser.addArgument(hostName);
-
-      port = new IntegerArgument("port", OPTION_SHORT_PORT,
-                                 OPTION_LONG_PORT, false, false, true,
-                                 INFO_PORT_PLACEHOLDER.get(), 389, null,
-                                 true, 1, true, 65535,
-                                 INFO_DESCRIPTION_PORT.get());
-      port.setPropertyName(OPTION_LONG_PORT);
-      argParser.addArgument(port);
-
-      useSSL = new BooleanArgument("useSSL", OPTION_SHORT_USE_SSL,
-                                   OPTION_LONG_USE_SSL,
-                                   INFO_DESCRIPTION_USE_SSL.get());
-      useSSL.setPropertyName(OPTION_LONG_USE_SSL);
-      argParser.addArgument(useSSL);
-
-      startTLS = new BooleanArgument("startTLS", OPTION_SHORT_START_TLS,
-                                     OPTION_LONG_START_TLS,
-                                     INFO_DESCRIPTION_START_TLS.get());
-      startTLS.setPropertyName(OPTION_LONG_START_TLS);
-      argParser.addArgument(startTLS);
-
-      bindDN = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_DESCRIPTION_BINDDN.get());
-      bindDN.setPropertyName(OPTION_LONG_BINDDN);
-      argParser.addArgument(bindDN);
-
-      bindPassword = new StringArgument("bindPassword", OPTION_SHORT_BINDPWD,
-                                        OPTION_LONG_BINDPWD,
-                                        false, false, true,
-                                        INFO_BINDPWD_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_BINDPASSWORD.get());
-      bindPassword.setPropertyName(OPTION_LONG_BINDPWD);
-      argParser.addArgument(bindPassword);
-
+      hostName =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_DESCRIPTION_HOST.get())
+                      .defaultValue("localhost")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      port =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(389)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      useSSL =
+              BooleanArgument.builder(OPTION_LONG_USE_SSL)
+                      .shortIdentifier(OPTION_SHORT_USE_SSL)
+                      .description(INFO_DESCRIPTION_USE_SSL.get())
+                      .buildAndAddToParser(argParser);
+      startTLS =
+              BooleanArgument.builder(OPTION_LONG_START_TLS)
+                      .shortIdentifier(OPTION_SHORT_START_TLS)
+                      .description(INFO_DESCRIPTION_START_TLS.get())
+                      .buildAndAddToParser(argParser);
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_DESCRIPTION_BINDDN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPassword =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_DESCRIPTION_BINDPASSWORD.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       bindPasswordFile =
-           new FileBasedArgument("bindPasswordFile",
-                                 OPTION_SHORT_BINDPWD_FILE,
-                                 OPTION_LONG_BINDPWD_FILE,
-                                 false, false,
-                                 INFO_BINDPWD_FILE_PLACEHOLDER.get(), null,
-                                 null, INFO_DESCRIPTION_BINDPASSWORDFILE.get());
-      bindPasswordFile.setPropertyName(OPTION_LONG_BINDPWD_FILE);
-      argParser.addArgument(bindPasswordFile);
-
-      filename = new StringArgument("filename", OPTION_SHORT_FILENAME,
-                                    OPTION_LONG_FILENAME, false, false,
-                                    true, INFO_FILE_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_COMPARE_DESCRIPTION_FILENAME.get());
-      filename.setPropertyName(OPTION_LONG_FILENAME);
-      argParser.addArgument(filename);
-
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_DESCRIPTION_BINDPASSWORDFILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      filename =
+              StringArgument.builder(OPTION_LONG_FILENAME)
+                      .shortIdentifier(OPTION_SHORT_FILENAME)
+                      .description(INFO_COMPARE_DESCRIPTION_FILENAME.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       saslExternal =
-              new BooleanArgument("useSASLExternal", 'r',
-                                  "useSASLExternal",
-                                  INFO_DESCRIPTION_USE_SASL_EXTERNAL.get());
-      saslExternal.setPropertyName("useSASLExternal");
-      argParser.addArgument(saslExternal);
-
-      saslOptions = new StringArgument("saslOption", OPTION_SHORT_SASLOPTION,
-                                       OPTION_LONG_SASLOPTION, false,
-                                       true, true,
-                                       INFO_SASL_OPTION_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_DESCRIPTION_SASL_PROPERTIES.get());
-      saslOptions.setPropertyName(OPTION_LONG_SASLOPTION);
-      argParser.addArgument(saslOptions);
+              BooleanArgument.builder("useSASLExternal")
+                      .shortIdentifier('r')
+                      .description(INFO_DESCRIPTION_USE_SASL_EXTERNAL.get())
+                      .buildAndAddToParser(argParser);
+      saslOptions =
+              StringArgument.builder(OPTION_LONG_SASLOPTION)
+                      .shortIdentifier(OPTION_SHORT_SASLOPTION)
+                      .description(INFO_DESCRIPTION_SASL_PROPERTIES.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_SASL_OPTION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addArgument(trustAll);
 
-      keyStorePath = new StringArgument("keyStorePath",
-                                        OPTION_SHORT_KEYSTOREPATH,
-                                        OPTION_LONG_KEYSTOREPATH,
-                                        false, false, true,
-                                        INFO_KEYSTOREPATH_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_KEYSTOREPATH.get());
-      keyStorePath.setPropertyName(OPTION_LONG_KEYSTOREPATH);
-      argParser.addArgument(keyStorePath);
-
-      keyStorePassword = new StringArgument("keyStorePassword",
-                                  OPTION_SHORT_KEYSTORE_PWD,
-                                  OPTION_LONG_KEYSTORE_PWD, false, false,
-                                  true, INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                                  null, null,
-                                  INFO_DESCRIPTION_KEYSTOREPASSWORD.get());
-      keyStorePassword.setPropertyName(OPTION_LONG_KEYSTORE_PWD);
-      argParser.addArgument(keyStorePassword);
-
+      keyStorePath =
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_DESCRIPTION_KEYSTOREPATH.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      keyStorePassword =
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       keyStorePasswordFile =
-           new FileBasedArgument("keyStorePasswordFile",
-                                 OPTION_SHORT_KEYSTORE_PWD_FILE,
-                                 OPTION_LONG_KEYSTORE_PWD_FILE,
-                                 false, false,
-                                 INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
-      keyStorePasswordFile.setPropertyName(OPTION_LONG_KEYSTORE_PWD_FILE);
-      argParser.addArgument(keyStorePasswordFile);
-
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       certNickname =
-              new StringArgument("certnickname", 'N', "certNickname",
-                                 false, false, true,
-                                 INFO_NICKNAME_PLACEHOLDER.get(), null,
-                                 null, INFO_DESCRIPTION_CERT_NICKNAME.get());
-      certNickname.setPropertyName("certNickname");
-      argParser.addArgument(certNickname);
-
+              StringArgument.builder("certNickname")
+                      .shortIdentifier('N')
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePath =
-              new StringArgument("trustStorePath",
-                                OPTION_SHORT_TRUSTSTOREPATH,
-                                OPTION_LONG_TRUSTSTOREPATH,
-                                false, false, true,
-                                INFO_TRUSTSTOREPATH_PLACEHOLDER.get(),
-                                null, null,
-                                INFO_DESCRIPTION_TRUSTSTOREPATH.get());
-      trustStorePath.setPropertyName(OPTION_LONG_TRUSTSTOREPATH);
-      argParser.addArgument(trustStorePath);
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPATH.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePassword =
-           new StringArgument("trustStorePassword", null,
-                              OPTION_LONG_TRUSTSTORE_PWD,
-                              false, false, true,
-                              INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(), null,
-                              null, INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get());
-      trustStorePassword.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD);
-      argParser.addArgument(trustStorePassword);
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePasswordFile =
-           new FileBasedArgument(
-                               "trustStorePasswordFile",
-                               OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                               OPTION_LONG_TRUSTSTORE_PWD_FILE, false, false,
-                               INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(), null,
-                               null,
-                               INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get());
-      trustStorePasswordFile.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD_FILE);
-      argParser.addArgument(trustStorePasswordFile);
-
-      assertionFilter = new StringArgument("assertionfilter", null,
-                                 OPTION_LONG_ASSERTION_FILE, false, false, true,
-                                 INFO_ASSERTION_FILTER_PLACEHOLDER.get(), null,
-                                 null,
-                                 INFO_DESCRIPTION_ASSERTION_FILTER.get());
-      assertionFilter.setPropertyName(OPTION_LONG_ASSERTION_FILE);
-      argParser.addArgument(assertionFilter);
-
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      assertionFilter =
+              StringArgument.builder(OPTION_LONG_ASSERTION_FILE)
+                      .description(INFO_DESCRIPTION_ASSERTION_FILTER.get())
+                      .valuePlaceholder(INFO_ASSERTION_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       controlStr =
-           new StringArgument("control", 'J', "control", false, true, true,
-               INFO_LDAP_CONTROL_PLACEHOLDER.get(),
-               null, null, INFO_DESCRIPTION_CONTROLS.get());
-      controlStr.setPropertyName("control");
-      argParser.addArgument(controlStr);
-
-      version = new IntegerArgument("version", OPTION_SHORT_PROTOCOL_VERSION,
-                                    OPTION_LONG_PROTOCOL_VERSION,
-                                    false, false, true,
-                                    INFO_PROTOCOL_VERSION_PLACEHOLDER.get(),
-                                    3, null, INFO_DESCRIPTION_VERSION.get());
-      version.setPropertyName(OPTION_LONG_PROTOCOL_VERSION);
-      argParser.addArgument(version);
-
-      int defaultTimeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
-      connectTimeout = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
-          null, OPTION_LONG_CONNECT_TIMEOUT,
-          false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
-          defaultTimeout, null,
-          true, 0, false, Integer.MAX_VALUE,
-          INFO_DESCRIPTION_CONNECTION_TIMEOUT.get());
-      connectTimeout.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
-      argParser.addArgument(connectTimeout);
-
-      encodingStr = new StringArgument("encoding", 'i', "encoding",
-                                      false, false,
-                                      true, INFO_ENCODING_PLACEHOLDER.get(),
-                                      null, null,
-                                      INFO_DESCRIPTION_ENCODING.get());
-      encodingStr.setPropertyName("encoding");
-      argParser.addArgument(encodingStr);
-
-      continueOnError = new BooleanArgument("continueOnError", 'c',
-                                    "continueOnError",
-                                    INFO_DESCRIPTION_CONTINUE_ON_ERROR.get());
-      continueOnError.setPropertyName("continueOnError");
-      argParser.addArgument(continueOnError);
-
-      noop = new BooleanArgument("no-op", OPTION_SHORT_DRYRUN,
-                                    OPTION_LONG_DRYRUN,
-                                    INFO_DESCRIPTION_NOOP.get());
-      argParser.addArgument(noop);
-      noop.setPropertyName(OPTION_LONG_DRYRUN);
+              StringArgument.builder("control")
+                      .shortIdentifier('J')
+                      .description(INFO_DESCRIPTION_CONTROLS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDAP_CONTROL_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      version =
+              IntegerArgument.builder(OPTION_LONG_PROTOCOL_VERSION)
+                      .shortIdentifier(OPTION_SHORT_PROTOCOL_VERSION)
+                      .description(INFO_DESCRIPTION_VERSION.get())
+                      .defaultValue(3)
+                      .valuePlaceholder(INFO_PROTOCOL_VERSION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      connectTimeout =
+              IntegerArgument.builder(OPTION_LONG_CONNECT_TIMEOUT)
+                      .description(INFO_DESCRIPTION_CONNECTION_TIMEOUT.get())
+                      .lowerBound(0)
+                      .defaultValue(CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT)
+                      .valuePlaceholder(INFO_TIMEOUT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      encodingStr =
+              StringArgument.builder("encoding")
+                      .shortIdentifier('i')
+                      .description(INFO_DESCRIPTION_ENCODING.get())
+                      .valuePlaceholder(INFO_ENCODING_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      continueOnError =
+              BooleanArgument.builder("continueOnError")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONTINUE_ON_ERROR.get())
+                      .buildAndAddToParser(argParser);
+      noop =
+              BooleanArgument.builder(OPTION_LONG_DRYRUN)
+                      .shortIdentifier(OPTION_SHORT_DRYRUN)
+                      .description(INFO_DESCRIPTION_NOOP.get())
+                      .buildAndAddToParser(argParser);
 
       verbose = CommonArguments.getVerbose();
       argParser.addArgument(verbose);
@@ -639,10 +582,10 @@
       argParser.addArgument(showUsage);
 
       useCompareResultCode =
-          new BooleanArgument("usecompareresultcode", 'm',
-              "useCompareResultCode",
-              INFO_LDAPCOMPARE_DESCRIPTION_USE_COMPARE_RESULT.get());
-      argParser.addArgument(useCompareResultCode);
+              BooleanArgument.builder("useCompareResultCode")
+                      .shortIdentifier('m')
+                      .description(INFO_LDAPCOMPARE_DESCRIPTION_USE_COMPARE_RESULT.get())
+                      .buildAndAddToParser(argParser);
 
       argParser.setUsageArgument(showUsage, out);
     } catch (ArgumentException ae)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java
index c5f9502..767a17c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPDelete.java
@@ -27,6 +27,7 @@
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_BINDPASSWORDFILE;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -328,218 +329,167 @@
     argParser.setVersionHandler(new DirectoryServerVersionHandler());
     try
     {
-      propertiesFileArgument = new StringArgument("propertiesFilePath",
-          null, OPTION_LONG_PROP_FILE_PATH,
-          false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      hostName = new StringArgument("host", OPTION_SHORT_HOST,
-                                    OPTION_LONG_HOST, false, false, true,
-                                    INFO_HOST_PLACEHOLDER.get(), "localhost",
-                                    null,
-                                    INFO_DESCRIPTION_HOST.get());
-      hostName.setPropertyName(OPTION_LONG_HOST);
-      argParser.addArgument(hostName);
-
-      port = new IntegerArgument("port", OPTION_SHORT_PORT,
-                                 OPTION_LONG_PORT, false, false, true,
-                                 INFO_PORT_PLACEHOLDER.get(), 389, null,
-                                 true, 1, true, 65535,
-                                 INFO_DESCRIPTION_PORT.get());
-      port.setPropertyName(OPTION_LONG_PORT);
-      argParser.addArgument(port);
-
-      useSSL = new BooleanArgument("useSSL", OPTION_SHORT_USE_SSL,
-                                   OPTION_LONG_USE_SSL,
-                                   INFO_DESCRIPTION_USE_SSL.get());
-      useSSL.setPropertyName(OPTION_LONG_USE_SSL);
-      argParser.addArgument(useSSL);
-
-      startTLS = new BooleanArgument("startTLS", OPTION_SHORT_START_TLS,
-                                     OPTION_LONG_START_TLS,
-                                     INFO_DESCRIPTION_START_TLS.get());
-      startTLS.setPropertyName(OPTION_LONG_START_TLS);
-      argParser.addArgument(startTLS);
-
-      bindDN = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_DESCRIPTION_BINDDN.get());
-      bindDN.setPropertyName(OPTION_LONG_BINDDN);
-      argParser.addArgument(bindDN);
-
-      bindPassword = new StringArgument("bindPassword", OPTION_SHORT_BINDPWD,
-                                        OPTION_LONG_BINDPWD,
-                                        false, false, true,
-                                        INFO_BINDPWD_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_BINDPASSWORD.get());
-      bindPassword.setPropertyName(OPTION_LONG_BINDPWD);
-      argParser.addArgument(bindPassword);
-
+      hostName =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_DESCRIPTION_HOST.get())
+                      .defaultValue("localhost")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      port =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(389)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      useSSL =
+              BooleanArgument.builder(OPTION_LONG_USE_SSL)
+                      .shortIdentifier(OPTION_SHORT_USE_SSL)
+                      .description(INFO_DESCRIPTION_USE_SSL.get())
+                      .buildAndAddToParser(argParser);
+      startTLS =
+              BooleanArgument.builder(OPTION_LONG_START_TLS)
+                      .shortIdentifier(OPTION_SHORT_START_TLS)
+                      .description(INFO_DESCRIPTION_START_TLS.get())
+                      .buildAndAddToParser(argParser);
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_DESCRIPTION_BINDDN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPassword =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_DESCRIPTION_BINDPASSWORD.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       bindPasswordFile =
-           new FileBasedArgument("bindPasswordFile", OPTION_SHORT_BINDPWD_FILE,
-                                 OPTION_LONG_BINDPWD_FILE,
-                                 false, false,
-                                 INFO_BINDPWD_FILE_PLACEHOLDER.get(), null,
-                                 null, INFO_DESCRIPTION_BINDPASSWORDFILE.get());
-      bindPasswordFile.setPropertyName(OPTION_LONG_BINDPWD_FILE);
-      argParser.addArgument(bindPasswordFile);
-
-      filename = new StringArgument("filename", OPTION_SHORT_FILENAME,
-                                    OPTION_LONG_FILENAME, false, false,
-                                    true, INFO_FILE_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_DELETE_DESCRIPTION_FILENAME.get());
-      filename.setPropertyName(OPTION_LONG_FILENAME);
-      argParser.addArgument(filename);
-
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_DESCRIPTION_BINDPASSWORDFILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      filename =
+              StringArgument.builder(OPTION_LONG_FILENAME)
+                      .shortIdentifier(OPTION_SHORT_FILENAME)
+                      .description(INFO_DELETE_DESCRIPTION_FILENAME.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       saslExternal =
-              new BooleanArgument("useSASLExternal", 'r',
-                                  "useSASLExternal",
-                                  INFO_DESCRIPTION_USE_SASL_EXTERNAL.get());
-      saslExternal.setPropertyName("useSASLExternal");
-      argParser.addArgument(saslExternal);
-
-      saslOptions = new StringArgument(
-              "saslOption", OPTION_SHORT_SASLOPTION,
-              OPTION_LONG_SASLOPTION,
-              false, true, true,
-              INFO_SASL_OPTION_PLACEHOLDER.get(), null,
-              null, INFO_DESCRIPTION_SASL_PROPERTIES.get());
-      saslOptions.setPropertyName(OPTION_LONG_SASLOPTION);
-      argParser.addArgument(saslOptions);
+              BooleanArgument.builder("useSASLExternal")
+                      .shortIdentifier('r')
+                      .description(INFO_DESCRIPTION_USE_SASL_EXTERNAL.get())
+                      .buildAndAddToParser(argParser);
+      saslOptions =
+              StringArgument.builder(OPTION_LONG_SASLOPTION)
+                      .shortIdentifier(OPTION_SHORT_SASLOPTION)
+                      .description(INFO_DESCRIPTION_SASL_PROPERTIES.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_SASL_OPTION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addArgument(trustAll);
 
-      keyStorePath = new StringArgument("keyStorePath",
-                                        OPTION_SHORT_KEYSTOREPATH,
-                                        OPTION_LONG_KEYSTOREPATH,
-                                        false, false, true,
-                                        INFO_KEYSTOREPATH_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_KEYSTOREPATH.get());
-      keyStorePath.setPropertyName(OPTION_LONG_KEYSTOREPATH);
-      argParser.addArgument(keyStorePath);
-
+      keyStorePath =
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_DESCRIPTION_KEYSTOREPATH.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       keyStorePassword =
-              new StringArgument("keyStorePassword",
-                                 OPTION_SHORT_KEYSTORE_PWD,
-                                 OPTION_LONG_KEYSTORE_PWD,
-                                 false, false,
-                                 true, INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_DESCRIPTION_KEYSTOREPASSWORD.get());
-      keyStorePassword.setPropertyName(OPTION_LONG_KEYSTORE_PWD);
-      argParser.addArgument(keyStorePassword);
-
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       keyStorePasswordFile =
-           new FileBasedArgument("keyStorePasswordFile",
-                                 OPTION_SHORT_KEYSTORE_PWD_FILE,
-                                 OPTION_LONG_KEYSTORE_PWD_FILE,
-                                 false, false,
-                                 INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
-      keyStorePasswordFile.setPropertyName(OPTION_LONG_KEYSTORE_PWD_FILE);
-      argParser.addArgument(keyStorePasswordFile);
-
-      certNickname = new StringArgument(
-              "certnickname", 'N', "certNickname",
-              false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
-              null, INFO_DESCRIPTION_CERT_NICKNAME.get());
-      certNickname.setPropertyName("certNickname");
-      argParser.addArgument(certNickname);
-
-      trustStorePath = new StringArgument(
-              "trustStorePath",
-              OPTION_SHORT_TRUSTSTOREPATH,
-              OPTION_LONG_TRUSTSTOREPATH,
-              false, false, true,
-              INFO_TRUSTSTOREPATH_PLACEHOLDER.get(),
-              null, null,
-              INFO_DESCRIPTION_TRUSTSTOREPATH.get());
-      trustStorePath.setPropertyName(OPTION_LONG_TRUSTSTOREPATH);
-      argParser.addArgument(trustStorePath);
-
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      certNickname =
+              StringArgument.builder("certNickname")
+                      .shortIdentifier('N')
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustStorePath =
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPATH.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePassword =
-           new StringArgument("trustStorePassword", null,
-                              OPTION_LONG_TRUSTSTORE_PWD,
-                              false, false, true,
-                              INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(), null,
-                              null, INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get());
-      trustStorePassword.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD);
-      argParser.addArgument(trustStorePassword);
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePasswordFile =
-           new FileBasedArgument(
-                   "trustStorePasswordFile",
-                   OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                   OPTION_LONG_TRUSTSTORE_PWD_FILE, false, false,
-                   INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(), null, null,
-                   INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get());
-      trustStorePasswordFile.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD_FILE);
-      argParser.addArgument(trustStorePasswordFile);
-
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       deleteSubtree =
-           new BooleanArgument("deleteSubtree", 'x', "deleteSubtree",
-                               INFO_DELETE_DESCRIPTION_DELETE_SUBTREE.get());
-      deleteSubtree.setPropertyName("deleteSubtree");
-      argParser.addArgument(deleteSubtree);
-
+              BooleanArgument.builder("deleteSubtree")
+                      .shortIdentifier('x')
+                      .description(INFO_DELETE_DESCRIPTION_DELETE_SUBTREE.get())
+                      .buildAndAddToParser(argParser);
       controlStr =
-           new StringArgument("control", 'J', "control", false, true, true,
-                    INFO_LDAP_CONTROL_PLACEHOLDER.get(),
-                    null, null, INFO_DESCRIPTION_CONTROLS.get());
-      controlStr.setPropertyName("control");
-      argParser.addArgument(controlStr);
-
-      version = new IntegerArgument("version", OPTION_SHORT_PROTOCOL_VERSION,
-                                    OPTION_LONG_PROTOCOL_VERSION, false, false,
-                                    true,
-                                    INFO_PROTOCOL_VERSION_PLACEHOLDER.get(), 3,
-                                    null, INFO_DESCRIPTION_VERSION.get());
-      version.setPropertyName(OPTION_LONG_PROTOCOL_VERSION);
-      argParser.addArgument(version);
-
-      int defaultTimeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
-      connectTimeout = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
-          null, OPTION_LONG_CONNECT_TIMEOUT,
-          false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
-          defaultTimeout, null,
-          true, 0, false, Integer.MAX_VALUE,
-          INFO_DESCRIPTION_CONNECTION_TIMEOUT.get());
-      connectTimeout.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
-      argParser.addArgument(connectTimeout);
-
-      encodingStr = new StringArgument("encoding", 'i',
-                                       OPTION_LONG_ENCODING, false,
-                                       false, true,
-                                       INFO_ENCODING_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_DESCRIPTION_ENCODING.get());
-      encodingStr.setPropertyName(OPTION_LONG_ENCODING);
-      argParser.addArgument(encodingStr);
-
+              StringArgument.builder("control")
+                      .shortIdentifier('J')
+                      .description(INFO_DESCRIPTION_CONTROLS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDAP_CONTROL_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      version =
+              IntegerArgument.builder(OPTION_LONG_PROTOCOL_VERSION)
+                      .shortIdentifier(OPTION_SHORT_PROTOCOL_VERSION)
+                      .description(INFO_DESCRIPTION_VERSION.get())
+                      .defaultValue(3)
+                      .valuePlaceholder(INFO_PROTOCOL_VERSION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+        connectTimeout =
+                IntegerArgument.builder(OPTION_LONG_CONNECT_TIMEOUT)
+                        .description(INFO_DESCRIPTION_CONNECTION_TIMEOUT.get())
+                        .lowerBound(0)
+                        .defaultValue(CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT)
+                        .valuePlaceholder(INFO_TIMEOUT_PLACEHOLDER.get())
+                        .buildAndAddToParser(argParser);
+      encodingStr =
+              StringArgument.builder(OPTION_LONG_ENCODING)
+                      .shortIdentifier('i')
+                      .description(INFO_DESCRIPTION_ENCODING.get())
+                      .valuePlaceholder(INFO_ENCODING_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       continueOnError =
-           new BooleanArgument("continueOnError", 'c', "continueOnError",
-                               INFO_DESCRIPTION_CONTINUE_ON_ERROR.get());
-      continueOnError.setPropertyName("continueOnError");
-      argParser.addArgument(continueOnError);
-
-      noop = new BooleanArgument("no-op", OPTION_SHORT_DRYRUN,
-          OPTION_LONG_DRYRUN, INFO_DESCRIPTION_NOOP.get());
-      noop.setPropertyName(OPTION_LONG_DRYRUN);
-      argParser.addArgument(noop);
+              BooleanArgument.builder("continueOnError")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONTINUE_ON_ERROR.get())
+                      .buildAndAddToParser(argParser);
+      noop =
+              BooleanArgument.builder(OPTION_LONG_DRYRUN)
+                      .shortIdentifier(OPTION_SHORT_DRYRUN)
+                      .description(INFO_DESCRIPTION_NOOP.get())
+                      .buildAndAddToParser(argParser);
 
       verbose = CommonArguments.getVerbose();
       argParser.addArgument(verbose);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java
index 949072c..4a80181 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPModify.java
@@ -28,6 +28,7 @@
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_BINDPASSWORDFILE;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -601,264 +602,193 @@
     argParser.setVersionHandler(new DirectoryServerVersionHandler());
     try
     {
-      propertiesFileArgument = new StringArgument("propertiesFilePath",
-          null, OPTION_LONG_PROP_FILE_PATH,
-          false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      hostName = new StringArgument("host", OPTION_SHORT_HOST,
-                                    OPTION_LONG_HOST, false, false, true,
-                                    INFO_HOST_PLACEHOLDER.get(), "localhost",
-                                    null,
-                                    INFO_DESCRIPTION_HOST.get());
-      hostName.setPropertyName(OPTION_LONG_HOST);
-      argParser.addArgument(hostName);
-
-      port = new IntegerArgument("port", OPTION_SHORT_PORT,
-                                 OPTION_LONG_PORT, false, false, true,
-                                 INFO_PORT_PLACEHOLDER.get(), 389, null,
-                                 true, 1, true, 65535,
-                                 INFO_DESCRIPTION_PORT.get());
-      port.setPropertyName(OPTION_LONG_PORT);
-      argParser.addArgument(port);
-
-      useSSL = new BooleanArgument("useSSL", OPTION_SHORT_USE_SSL,
-                                   OPTION_LONG_USE_SSL,
-                                   INFO_DESCRIPTION_USE_SSL.get());
-      useSSL.setPropertyName(OPTION_LONG_USE_SSL);
-      argParser.addArgument(useSSL);
-
-      startTLS = new BooleanArgument("startTLS", OPTION_SHORT_START_TLS,
-                                     OPTION_LONG_START_TLS,
-                                     INFO_DESCRIPTION_START_TLS.get());
-      startTLS.setPropertyName(OPTION_LONG_START_TLS);
-      argParser.addArgument(startTLS);
-
-      bindDN = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_DESCRIPTION_BINDDN.get());
-      bindDN.setPropertyName(OPTION_LONG_BINDDN);
-      argParser.addArgument(bindDN);
-
-      bindPassword = new StringArgument("bindPassword", OPTION_SHORT_BINDPWD,
-                                        OPTION_LONG_BINDPWD,
-                                        false, false, true,
-                                        INFO_BINDPWD_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_BINDPASSWORD.get());
-      bindPassword.setPropertyName(OPTION_LONG_BINDPWD);
-      argParser.addArgument(bindPassword);
-
+      hostName =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_DESCRIPTION_HOST.get())
+                      .defaultValue("localhost")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      port =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(389)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      useSSL =
+              BooleanArgument.builder(OPTION_LONG_USE_SSL)
+                      .shortIdentifier(OPTION_SHORT_USE_SSL)
+                      .description(INFO_DESCRIPTION_USE_SSL.get())
+                      .buildAndAddToParser(argParser);
+      startTLS =
+              BooleanArgument.builder(OPTION_LONG_START_TLS)
+                      .shortIdentifier(OPTION_SHORT_START_TLS)
+                      .description(INFO_DESCRIPTION_START_TLS.get())
+                      .buildAndAddToParser(argParser);
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_DESCRIPTION_BINDDN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPassword =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_DESCRIPTION_BINDPASSWORD.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       bindPasswordFile =
-           new FileBasedArgument("bindPasswordFile",
-                                 OPTION_SHORT_BINDPWD_FILE,
-                                 OPTION_LONG_BINDPWD_FILE,
-                                 false, false,
-                                 INFO_BINDPWD_FILE_PLACEHOLDER.get(), null,
-                                 null, INFO_DESCRIPTION_BINDPASSWORDFILE.get());
-      bindPasswordFile.setPropertyName(OPTION_LONG_BINDPWD_FILE);
-      argParser.addArgument(bindPasswordFile);
-
-      defaultAdd = new BooleanArgument(
-              "defaultAdd", 'a', "defaultAdd",
-              INFO_MODIFY_DESCRIPTION_DEFAULT_ADD.get());
-      argParser.addArgument(defaultAdd);
-
-      filename = new StringArgument("filename", OPTION_SHORT_FILENAME,
-                                    OPTION_LONG_FILENAME, false, false,
-                                    true, INFO_FILE_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_LDAPMODIFY_DESCRIPTION_FILENAME.get());
-      filename.setPropertyName(OPTION_LONG_FILENAME);
-      argParser.addArgument(filename);
-
-      saslExternal = new BooleanArgument(
-              "useSASLExternal", 'r',
-              "useSASLExternal",
-              INFO_DESCRIPTION_USE_SASL_EXTERNAL.get());
-      saslExternal.setPropertyName("useSASLExternal");
-      argParser.addArgument(saslExternal);
-
-      saslOptions = new StringArgument("saslOption", OPTION_SHORT_SASLOPTION,
-                                       OPTION_LONG_SASLOPTION, false,
-                                       true, true,
-                                       INFO_SASL_OPTION_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_DESCRIPTION_SASL_PROPERTIES.get());
-      saslOptions.setPropertyName(OPTION_LONG_SASLOPTION);
-      argParser.addArgument(saslOptions);
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_DESCRIPTION_BINDPASSWORDFILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      defaultAdd =
+              BooleanArgument.builder("defaultAdd")
+                      .shortIdentifier('a')
+                      .description(INFO_MODIFY_DESCRIPTION_DEFAULT_ADD.get())
+                      .buildAndAddToParser(argParser);
+      filename =
+              StringArgument.builder(OPTION_LONG_FILENAME)
+                      .shortIdentifier(OPTION_SHORT_FILENAME)
+                      .description(INFO_LDAPMODIFY_DESCRIPTION_FILENAME.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      saslExternal =
+              BooleanArgument.builder("useSASLExternal")
+                      .shortIdentifier('r')
+                      .description(INFO_DESCRIPTION_USE_SASL_EXTERNAL.get())
+                      .buildAndAddToParser(argParser);
+      saslOptions =
+              StringArgument.builder(OPTION_LONG_SASLOPTION)
+                      .shortIdentifier(OPTION_SHORT_SASLOPTION)
+                      .description(INFO_DESCRIPTION_SASL_PROPERTIES.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_SASL_OPTION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addArgument(trustAll);
 
-      keyStorePath = new StringArgument("keyStorePath",
-                                        OPTION_SHORT_KEYSTOREPATH,
-                                        OPTION_LONG_KEYSTOREPATH,
-                                        false, false, true,
-                                        INFO_KEYSTOREPATH_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_KEYSTOREPATH.get());
-      keyStorePath.setPropertyName(OPTION_LONG_KEYSTOREPATH);
-      argParser.addArgument(keyStorePath);
-
+      keyStorePath =
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_DESCRIPTION_KEYSTOREPATH.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       keyStorePassword =
-              new StringArgument("keyStorePassword",
-                                 OPTION_SHORT_KEYSTORE_PWD,
-                                 OPTION_LONG_KEYSTORE_PWD,
-                                 false, false,
-                                 true,
-                                 INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_DESCRIPTION_KEYSTOREPASSWORD.get());
-      keyStorePassword.setPropertyName(OPTION_LONG_KEYSTORE_PWD);
-      argParser.addArgument(keyStorePassword);
-
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       keyStorePasswordFile =
-           new FileBasedArgument("keystorepasswordfile",
-                                 OPTION_SHORT_KEYSTORE_PWD_FILE,
-                                 OPTION_LONG_KEYSTORE_PWD_FILE,
-                                 false, false,
-                                 INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
-      keyStorePasswordFile.setPropertyName(OPTION_LONG_KEYSTORE_PWD_FILE);
-      argParser.addArgument(keyStorePasswordFile);
-
-      certNickname = new StringArgument(
-              "certnickname", 'N', "certNickname",
-              false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
-              null, INFO_DESCRIPTION_CERT_NICKNAME.get());
-      certNickname.setPropertyName("certNickname");
-      argParser.addArgument(certNickname);
-
-      trustStorePath = new StringArgument(
-              "trustStorePath",
-              OPTION_SHORT_TRUSTSTOREPATH,
-              OPTION_LONG_TRUSTSTOREPATH,
-              false, false, true,
-              INFO_TRUSTSTOREPATH_PLACEHOLDER.get(),
-              null, null,
-              INFO_DESCRIPTION_TRUSTSTOREPATH.get());
-      trustStorePath.setPropertyName(OPTION_LONG_TRUSTSTOREPATH);
-      argParser.addArgument(trustStorePath);
-
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      certNickname =
+              StringArgument.builder("certNickname")
+                      .shortIdentifier('N')
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustStorePath =
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPATH.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePassword =
-           new StringArgument("trustStorePassword", null,
-                              OPTION_LONG_TRUSTSTORE_PWD ,
-                              false, false, true,
-                              INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(), null,
-                              null, INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get());
-      trustStorePassword.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD);
-      argParser.addArgument(trustStorePassword);
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePasswordFile =
-           new FileBasedArgument(
-                   "truststorepasswordfile",
-                   OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                   OPTION_LONG_TRUSTSTORE_PWD_FILE, false, false,
-                   INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(), null, null,
-                   INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get());
-      trustStorePasswordFile.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD_FILE);
-      argParser.addArgument(trustStorePasswordFile);
-
-      proxyAuthzID = new StringArgument("proxy_authzid",
-                                        OPTION_SHORT_PROXYAUTHID,
-                                        OPTION_LONG_PROXYAUTHID, false,
-                                        false, true,
-                                        INFO_PROXYAUTHID_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_PROXY_AUTHZID.get());
-      proxyAuthzID.setPropertyName(OPTION_LONG_PROXYAUTHID);
-      argParser.addArgument(proxyAuthzID);
-
-      reportAuthzID = new BooleanArgument(
-              "reportauthzid", 'E',
-              "reportAuthzID",
-              INFO_DESCRIPTION_REPORT_AUTHZID.get());
-      reportAuthzID.setPropertyName("reportAuthzID");
-      argParser.addArgument(reportAuthzID);
-
-      assertionFilter = new StringArgument(
-              "assertionfilter", null,
-              OPTION_LONG_ASSERTION_FILE,
-              false, false,
-              true,
-              INFO_ASSERTION_FILTER_PLACEHOLDER.get(),
-              null, null,
-              INFO_DESCRIPTION_ASSERTION_FILTER.get());
-      assertionFilter.setPropertyName(OPTION_LONG_ASSERTION_FILE);
-      argParser.addArgument(assertionFilter);
-
-      preReadAttributes = new StringArgument(
-              "prereadattrs", null,
-              "preReadAttributes", false, false,
-              true, INFO_ATTRIBUTE_LIST_PLACEHOLDER.get(), null, null,
-              INFO_DESCRIPTION_PREREAD_ATTRS.get());
-      preReadAttributes.setPropertyName("preReadAttributes");
-      argParser.addArgument(preReadAttributes);
-
-      postReadAttributes = new StringArgument(
-              "postreadattrs", null,
-              "postReadAttributes", false,
-              false, true, INFO_ATTRIBUTE_LIST_PLACEHOLDER.get(), null,
-              null,
-              INFO_DESCRIPTION_POSTREAD_ATTRS.get());
-      postReadAttributes.setPropertyName("postReadAttributes");
-      argParser.addArgument(postReadAttributes);
-
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      proxyAuthzID =
+              StringArgument.builder(OPTION_LONG_PROXYAUTHID)
+                      .shortIdentifier(OPTION_SHORT_PROXYAUTHID)
+                      .description(INFO_DESCRIPTION_PROXY_AUTHZID.get())
+                      .valuePlaceholder(INFO_PROXYAUTHID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      reportAuthzID =
+              BooleanArgument.builder("reportAuthzID")
+                      .shortIdentifier('E')
+                      .description(INFO_DESCRIPTION_REPORT_AUTHZID.get())
+                      .buildAndAddToParser(argParser);
+      assertionFilter =
+              StringArgument.builder(OPTION_LONG_ASSERTION_FILE)
+                      .description(INFO_DESCRIPTION_ASSERTION_FILTER.get())
+                      .valuePlaceholder(INFO_ASSERTION_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      preReadAttributes =
+              StringArgument.builder("preReadAttributes")
+                      .description(INFO_DESCRIPTION_PREREAD_ATTRS.get())
+                      .valuePlaceholder(INFO_ATTRIBUTE_LIST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      postReadAttributes =
+              StringArgument.builder("postReadAttributes")
+                      .description(INFO_DESCRIPTION_POSTREAD_ATTRS.get())
+                      .valuePlaceholder(INFO_ATTRIBUTE_LIST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       controlStr =
-           new StringArgument("control", 'J', "control", false, true, true,
-                    INFO_LDAP_CONTROL_PLACEHOLDER.get(),
-                    null, null, INFO_DESCRIPTION_CONTROLS.get());
-      controlStr.setPropertyName("control");
-      argParser.addArgument(controlStr);
-
-      version = new IntegerArgument("version", OPTION_SHORT_PROTOCOL_VERSION,
-                              OPTION_LONG_PROTOCOL_VERSION,
-                              false, false, true,
-                              INFO_PROTOCOL_VERSION_PLACEHOLDER.get(), 3, null,
-                              INFO_DESCRIPTION_VERSION.get());
-      version.setPropertyName(OPTION_LONG_PROTOCOL_VERSION);
-      argParser.addArgument(version);
-
-      int defaultTimeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
-      connectTimeout = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
-          null, OPTION_LONG_CONNECT_TIMEOUT,
-          false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
-          defaultTimeout, null,
-          true, 0, false, Integer.MAX_VALUE,
-          INFO_DESCRIPTION_CONNECTION_TIMEOUT.get());
-      connectTimeout.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
-      argParser.addArgument(connectTimeout);
-
-      encodingStr = new StringArgument("encoding", 'i', "encoding",
-                                      false, false,
-                                      true, INFO_ENCODING_PLACEHOLDER.get(),
-                                      null, null,
-                                      INFO_DESCRIPTION_ENCODING.get());
-      encodingStr.setPropertyName("encoding");
-      argParser.addArgument(encodingStr);
-
-      continueOnError = new BooleanArgument("continueOnError", 'c',
-                                    "continueOnError",
-                                    INFO_DESCRIPTION_CONTINUE_ON_ERROR.get());
-      continueOnError.setPropertyName("continueOnError");
-      argParser.addArgument(continueOnError);
-
-      noop = new BooleanArgument("no-op", OPTION_SHORT_DRYRUN,
-                                    OPTION_LONG_DRYRUN,
-                                    INFO_DESCRIPTION_NOOP.get());
-      noop.setPropertyName(OPTION_LONG_DRYRUN);
-      argParser.addArgument(noop);
+              StringArgument.builder("control")
+                      .shortIdentifier('J')
+                      .description(INFO_DESCRIPTION_CONTROLS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDAP_CONTROL_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      version =
+              IntegerArgument.builder(OPTION_LONG_PROTOCOL_VERSION)
+                      .shortIdentifier(OPTION_SHORT_PROTOCOL_VERSION)
+                      .description(INFO_DESCRIPTION_VERSION.get())
+                      .defaultValue(3)
+                      .valuePlaceholder(INFO_PROTOCOL_VERSION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+        connectTimeout =
+                IntegerArgument.builder(OPTION_LONG_CONNECT_TIMEOUT)
+                        .description(INFO_DESCRIPTION_CONNECTION_TIMEOUT.get())
+                        .lowerBound(0)
+                        .defaultValue(CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT)
+                        .valuePlaceholder(INFO_TIMEOUT_PLACEHOLDER.get())
+                        .buildAndAddToParser(argParser);
+      encodingStr =
+              StringArgument.builder("encoding")
+                      .shortIdentifier('i')
+                      .description(INFO_DESCRIPTION_ENCODING.get())
+                      .valuePlaceholder(INFO_ENCODING_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      continueOnError =
+              BooleanArgument.builder("continueOnError")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONTINUE_ON_ERROR.get())
+                      .buildAndAddToParser(argParser);
+      noop =
+              BooleanArgument.builder(OPTION_LONG_DRYRUN)
+                      .shortIdentifier(OPTION_SHORT_DRYRUN)
+                      .description(INFO_DESCRIPTION_NOOP.get())
+                      .buildAndAddToParser(argParser);
 
       verbose = CommonArguments.getVerbose();
       argParser.addArgument(verbose);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java
index f8993db..bb07701 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPPasswordModify.java
@@ -22,10 +22,19 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2013-2015 ForgeRock AS.
+ *      Portions Copyright 2013-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
+import static com.forgerock.opendj.cli.CliMessages.INFO_BINDPWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_CONNECTION_TIMEOUT;
+import static com.forgerock.opendj.cli.CliMessages.INFO_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_KEYSTORE_PWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_LDAPPWMOD_DESCRIPTION_CURRENTPWFILE;
+import static com.forgerock.opendj.cli.CliMessages.INFO_LDAPPWMOD_DESCRIPTION_NEWPWFILE;
+import static com.forgerock.opendj.cli.CliMessages.INFO_PORT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_TIMEOUT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER;
 import static org.opends.messages.ToolMessages.*;
 import static org.opends.server.extensions.ExtensionsConstants.*;
 import static org.opends.server.protocols.ldap.LDAPResultCode.*;
@@ -192,221 +201,155 @@
 
     try
     {
-      propertiesFileArgument = new StringArgument("propertiesFilePath",
-          null, OPTION_LONG_PROP_FILE_PATH,
-          false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      ldapHost = new StringArgument("ldaphost", OPTION_SHORT_HOST,
-                                    OPTION_LONG_HOST, false, false,
-                                    true, INFO_HOST_PLACEHOLDER.get(),
-                                    "127.0.0.1", null,
-                                    INFO_LDAPPWMOD_DESCRIPTION_HOST.get());
-      ldapHost.setPropertyName(OPTION_LONG_HOST);
-      argParser.addArgument(ldapHost);
-
-
-      ldapPort = new IntegerArgument(
-              "ldapport", OPTION_SHORT_PORT,
-              OPTION_LONG_PORT, false, false,
-              true, INFO_PORT_PLACEHOLDER.get(), 389,
-              null, true, 1, true,
-              65535, INFO_LDAPPWMOD_DESCRIPTION_PORT.get());
-      ldapPort.setPropertyName(OPTION_LONG_PORT);
-      argParser.addArgument(ldapPort);
-
-
-      useSSL = new BooleanArgument("usessl", OPTION_SHORT_USE_SSL,
-                                   OPTION_LONG_USE_SSL,
-                                   INFO_LDAPPWMOD_DESCRIPTION_USE_SSL.get());
-      useSSL.setPropertyName(OPTION_LONG_USE_SSL);
-      argParser.addArgument(useSSL);
-
-
-      useStartTLS = new BooleanArgument("usestarttls", OPTION_SHORT_START_TLS,
-                             OPTION_LONG_START_TLS,
-                             INFO_LDAPPWMOD_DESCRIPTION_USE_STARTTLS.get());
-      useStartTLS.setPropertyName(OPTION_LONG_START_TLS);
-      argParser.addArgument(useStartTLS);
-
-
-      bindDN = new StringArgument("binddn", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_LDAPPWMOD_DESCRIPTION_BIND_DN.get());
-      bindDN.setPropertyName(OPTION_LONG_BINDDN);
-      argParser.addArgument(bindDN);
-
-
-      bindPW = new StringArgument("bindpw", OPTION_SHORT_BINDPWD,
-                                  OPTION_LONG_BINDPWD, false, false,
-                                  true, INFO_BINDPWD_PLACEHOLDER.get(), null,
-                                  null,
-                                  INFO_LDAPPWMOD_DESCRIPTION_BIND_PW.get());
-      bindPW.setPropertyName(OPTION_LONG_BINDPWD);
-      argParser.addArgument(bindPW);
-
-
+      ldapHost =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_HOST.get())
+                      .defaultValue("127.0.0.1")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      ldapPort =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(389)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      useSSL =
+              BooleanArgument.builder(OPTION_LONG_USE_SSL)
+                      .shortIdentifier(OPTION_SHORT_USE_SSL)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_USE_SSL.get())
+                      .buildAndAddToParser(argParser);
+      useStartTLS =
+              BooleanArgument.builder(OPTION_LONG_START_TLS)
+                      .shortIdentifier(OPTION_SHORT_START_TLS)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_USE_STARTTLS.get())
+                      .buildAndAddToParser(argParser);
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_BIND_DN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPW =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_BIND_PW.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       bindPWFile =
-           new FileBasedArgument("bindpwfile", OPTION_SHORT_BINDPWD_FILE,
-                                 OPTION_LONG_BINDPWD_FILE, false,
-                                 false, INFO_BINDPWD_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_LDAPPWMOD_DESCRIPTION_BIND_PW_FILE.get());
-      bindPWFile.setPropertyName(OPTION_LONG_BINDPWD_FILE);
-      argParser.addArgument(bindPWFile);
-
-
-      authzID = new StringArgument("authzid", 'a', "authzID", false, false,
-                                   true, INFO_PROXYAUTHID_PLACEHOLDER.get(),
-                                   null, null,
-                                   INFO_LDAPPWMOD_DESCRIPTION_AUTHZID.get());
-      authzID.setPropertyName("authzID");
-      argParser.addArgument(authzID);
-
-
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_BIND_PW_FILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      authzID =
+              StringArgument.builder("authzID")
+                      .shortIdentifier('a')
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_AUTHZID.get())
+                      .valuePlaceholder(INFO_PROXYAUTHID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       provideDNForAuthzID =
-           new BooleanArgument("providednforauthzid", 'A',"provideDNForAuthzID",
-                    INFO_LDAPPWMOD_DESCRIPTION_PROVIDE_DN_FOR_AUTHZID.get());
-      provideDNForAuthzID.setPropertyName("provideDNForAuthzID");
-      argParser.addArgument(provideDNForAuthzID);
-
-
-      newPW = new StringArgument("newpw", 'n', "newPassword", false, false,
-                                 true, INFO_NEW_PASSWORD_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_LDAPPWMOD_DESCRIPTION_NEWPW.get());
-      newPW.setPropertyName("newPassword");
-      argParser.addArgument(newPW);
-
-
-      newPWFile = new FileBasedArgument(
-              "newpwfile", 'N', "newPasswordFile",
-              false, false, INFO_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDAPPWMOD_DESCRIPTION_NEWPWFILE.get());
-      newPWFile.setPropertyName("newPasswordFile");
-      argParser.addArgument(newPWFile);
-
-
+              BooleanArgument.builder("provideDNForAuthzID")
+                      .shortIdentifier('A')
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_PROVIDE_DN_FOR_AUTHZID.get())
+                      .buildAndAddToParser(argParser);
+      newPW =
+              StringArgument.builder("newPassword")
+                      .shortIdentifier('n')
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_NEWPW.get())
+                      .valuePlaceholder(INFO_NEW_PASSWORD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      newPWFile =
+              FileBasedArgument.builder("newPasswordFile")
+                      .shortIdentifier('N')
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_NEWPWFILE.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       currentPW =
-           new StringArgument("currentpw", 'c', "currentPassword", false, false,
-                              true, INFO_CURRENT_PASSWORD_PLACEHOLDER.get(),
-                              null,  null,
-                              INFO_LDAPPWMOD_DESCRIPTION_CURRENTPW.get());
-      currentPW.setPropertyName("currentPassword");
-      argParser.addArgument(currentPW);
-
-
+              StringArgument.builder("currentPassword")
+                      .shortIdentifier('c')
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_CURRENTPW.get())
+                      .valuePlaceholder(INFO_CURRENT_PASSWORD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       currentPWFile =
-           new FileBasedArgument(
-                   "currentpwfile", 'C', "currentPasswordFile",
-                   false, false, INFO_FILE_PLACEHOLDER.get(), null, null,
-                   INFO_LDAPPWMOD_DESCRIPTION_CURRENTPWFILE.get());
-      currentPWFile.setPropertyName("currentPasswordFile");
-      argParser.addArgument(currentPWFile);
-
+              FileBasedArgument.builder("currentPasswordFile")
+                      .shortIdentifier('C')
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_CURRENTPWFILE.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addArgument(trustAll);
 
-
       sslKeyStore =
-           new StringArgument("keystorepath", OPTION_SHORT_KEYSTOREPATH,
-                              OPTION_LONG_KEYSTOREPATH, false, false,
-                              true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_LDAPPWMOD_DESCRIPTION_KEYSTORE.get());
-      sslKeyStore.setPropertyName(OPTION_LONG_KEYSTOREPATH);
-      argParser.addArgument(sslKeyStore);
-
-
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_KEYSTORE.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       sslKeyStorePIN =
-           new StringArgument("keystorepassword",
-                              OPTION_SHORT_KEYSTORE_PWD,
-                              OPTION_LONG_KEYSTORE_PWD ,
-                              false, false, true,
-                              INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_LDAPPWMOD_DESCRIPTION_KEYSTORE_PIN.get());
-      sslKeyStorePIN.setPropertyName(OPTION_LONG_KEYSTORE_PWD);
-      argParser.addArgument(sslKeyStorePIN);
-
-
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_KEYSTORE_PIN.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       sslKeyStorePINFile =
-           new FileBasedArgument(
-                   "keystorepasswordfile",
-                   OPTION_SHORT_KEYSTORE_PWD_FILE,
-                   OPTION_LONG_KEYSTORE_PWD_FILE,
-                   false, false, INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(),
-                   null, null,
-                   INFO_LDAPPWMOD_DESCRIPTION_KEYSTORE_PINFILE.get());
-      sslKeyStorePINFile.setPropertyName(OPTION_LONG_KEYSTORE_PWD_FILE);
-      argParser.addArgument(sslKeyStorePINFile);
-
-      certNickname = new StringArgument("certnickname", null, "certNickname",
-          false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_CERT_NICKNAME.get());
-      certNickname.setPropertyName("certNickname");
-      argParser.addArgument(certNickname);
-
-
-
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_KEYSTORE_PINFILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      certNickname =
+              StringArgument.builder("certNickname")
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       sslTrustStore =
-           new StringArgument("truststorepath",
-                              OPTION_SHORT_TRUSTSTOREPATH,
-                              OPTION_LONG_TRUSTSTOREPATH, false,
-                              false, true,
-                              INFO_TRUSTSTOREPATH_PLACEHOLDER.get(), null, null,
-                              INFO_LDAPPWMOD_DESCRIPTION_TRUSTSTORE.get());
-      sslTrustStore.setPropertyName(OPTION_LONG_TRUSTSTOREPATH);
-      argParser.addArgument(sslTrustStore);
-
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_TRUSTSTORE.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       sslTrustStorePIN =
-           new StringArgument("truststorepassword", null,
-                              OPTION_LONG_TRUSTSTORE_PWD,
-                              false, false, true,
-                              INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(), null, null,
-                              INFO_LDAPPWMOD_DESCRIPTION_TRUSTSTORE_PIN.get());
-      sslTrustStorePIN.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD);
-      argParser.addArgument(sslTrustStorePIN);
-
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_TRUSTSTORE_PIN.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       sslTrustStorePINFile =
-           new FileBasedArgument("truststorepasswordfile",
-                    OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                    OPTION_LONG_TRUSTSTORE_PWD_FILE, false, false,
-                    INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(), null,
-                    null, INFO_LDAPPWMOD_DESCRIPTION_TRUSTSTORE_PINFILE.get());
-      sslTrustStorePINFile.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD_FILE);
-      argParser.addArgument(sslTrustStorePINFile);
-
-
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_LDAPPWMOD_DESCRIPTION_TRUSTSTORE_PINFILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       controlStr =
-           new StringArgument("control", 'J', "control", false, true, true,
-                    INFO_LDAP_CONTROL_PLACEHOLDER.get(),
-                    null, null, INFO_DESCRIPTION_CONTROLS.get());
-      controlStr.setPropertyName("control");
-      argParser.addArgument(controlStr);
-
-      int defaultTimeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
-      connectTimeout = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
-          null, OPTION_LONG_CONNECT_TIMEOUT,
-          false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
-          defaultTimeout, null,
-          true, 0, false, Integer.MAX_VALUE,
-          INFO_DESCRIPTION_CONNECTION_TIMEOUT.get());
-      connectTimeout.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
-      argParser.addArgument(connectTimeout);
-
+              StringArgument.builder("control")
+                      .shortIdentifier('J')
+                      .description(INFO_DESCRIPTION_CONTROLS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDAP_CONTROL_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      connectTimeout =
+              IntegerArgument.builder(OPTION_LONG_CONNECT_TIMEOUT)
+                      .description(INFO_DESCRIPTION_CONNECTION_TIMEOUT.get())
+                      .lowerBound(0)
+                      .defaultValue(CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT)
+                      .valuePlaceholder(INFO_TIMEOUT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java
index e87d50d..ef79fa6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDAPSearch.java
@@ -27,6 +27,13 @@
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_BINDPWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_BINDPASSWORDFILE;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE;
+import static com.forgerock.opendj.cli.CliMessages.INFO_DESCRIPTION_VERSION;
+import static com.forgerock.opendj.cli.CliMessages.INFO_KEYSTORE_PWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -691,370 +698,283 @@
 
     try
     {
-      propertiesFileArgument = new StringArgument("propertiesFilePath",
-          null, OPTION_LONG_PROP_FILE_PATH,
-          false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      hostName = new StringArgument("host", OPTION_SHORT_HOST,
-                                    OPTION_LONG_HOST, false, false, true,
-                                    INFO_HOST_PLACEHOLDER.get(), "localhost",
-                                    null,
-                                    INFO_DESCRIPTION_HOST.get());
-      hostName.setPropertyName(OPTION_LONG_HOST);
-      argParser.addArgument(hostName);
-
-      port = new IntegerArgument("port", OPTION_SHORT_PORT,
-                                 OPTION_LONG_PORT, false, false, true,
-                                 INFO_PORT_PLACEHOLDER.get(), 389, null,
-                                 true, 1, true, 65535,
-                                 INFO_DESCRIPTION_PORT.get());
-      port.setPropertyName(OPTION_LONG_PORT);
-      argParser.addArgument(port);
-
-      useSSL = new BooleanArgument("useSSL", OPTION_SHORT_USE_SSL,
-                                   OPTION_LONG_USE_SSL,
-                                   INFO_DESCRIPTION_USE_SSL.get());
-      useSSL.setPropertyName(OPTION_LONG_USE_SSL);
-      argParser.addArgument(useSSL);
-
-      startTLS = new BooleanArgument("startTLS", OPTION_SHORT_START_TLS,
-                                    OPTION_LONG_START_TLS,
-                                    INFO_DESCRIPTION_START_TLS.get());
-      startTLS.setPropertyName(OPTION_LONG_START_TLS);
-      argParser.addArgument(startTLS);
-
-      bindDN = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_DESCRIPTION_BINDDN.get());
-      bindDN.setPropertyName(OPTION_LONG_BINDDN);
-      argParser.addArgument(bindDN);
-
-      bindPassword = new StringArgument("bindPassword", OPTION_SHORT_BINDPWD,
-                                        OPTION_LONG_BINDPWD,
-                                        false, false, true,
-                                        INFO_BINDPWD_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_BINDPASSWORD.get());
-      bindPassword.setPropertyName(OPTION_LONG_BINDPWD);
-      argParser.addArgument(bindPassword);
-
+      hostName =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_DESCRIPTION_HOST.get())
+                      .defaultValue("localhost")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      port =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(389)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      useSSL =
+              BooleanArgument.builder(OPTION_LONG_USE_SSL)
+                      .shortIdentifier(OPTION_SHORT_USE_SSL)
+                      .description(INFO_DESCRIPTION_USE_SSL.get())
+                      .buildAndAddToParser(argParser);
+      startTLS =
+              BooleanArgument.builder(OPTION_LONG_START_TLS)
+                      .shortIdentifier(OPTION_SHORT_START_TLS)
+                      .description(INFO_DESCRIPTION_START_TLS.get())
+                      .buildAndAddToParser(argParser);
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_DESCRIPTION_BINDDN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPassword =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_DESCRIPTION_BINDPASSWORD.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       bindPasswordFile =
-           new FileBasedArgument("bindPasswordFile", OPTION_SHORT_BINDPWD_FILE,
-                                 OPTION_LONG_BINDPWD_FILE,
-                                 false, false,
-                                 INFO_BINDPWD_FILE_PLACEHOLDER.get(), null,
-                                 null, INFO_DESCRIPTION_BINDPASSWORDFILE.get());
-      bindPasswordFile.setPropertyName(OPTION_LONG_BINDPWD_FILE);
-      argParser.addArgument(bindPasswordFile);
-
-      baseDN = new StringArgument("baseDN", OPTION_SHORT_BASEDN,
-                                  OPTION_LONG_BASEDN, true, false, true,
-                                  INFO_BASEDN_PLACEHOLDER.get(), null, null,
-                                  INFO_SEARCH_DESCRIPTION_BASEDN.get());
-      baseDN.setPropertyName(OPTION_LONG_BASEDN);
-      argParser.addArgument(baseDN);
-
-      HashSet<String> allowedScopes = new HashSet<>();
-      allowedScopes.add("base");
-      allowedScopes.add("one");
-      allowedScopes.add("sub");
-      allowedScopes.add("subordinate");
-      searchScope = new MultiChoiceArgument(
-              "searchScope", 's', "searchScope", false,
-              true, INFO_SEARCH_SCOPE_PLACEHOLDER.get(), allowedScopes,
-              false,
-              INFO_SEARCH_DESCRIPTION_SEARCH_SCOPE.get());
-      searchScope.setPropertyName("searchScope");
-      searchScope.setDefaultValue("sub");
-      argParser.addArgument(searchScope);
-
-      filename = new StringArgument("filename", OPTION_SHORT_FILENAME,
-                                    OPTION_LONG_FILENAME, false, false,
-                                    true, INFO_FILE_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_SEARCH_DESCRIPTION_FILENAME.get());
-      searchScope.setPropertyName(OPTION_LONG_FILENAME);
-      argParser.addArgument(filename);
-
-      saslExternal = new BooleanArgument(
-              "useSASLExternal", 'r',
-              "useSASLExternal",
-              INFO_DESCRIPTION_USE_SASL_EXTERNAL.get());
-      saslExternal.setPropertyName("useSASLExternal");
-      argParser.addArgument(saslExternal);
-
-      saslOptions = new StringArgument("saslOption", OPTION_SHORT_SASLOPTION,
-                                       OPTION_LONG_SASLOPTION, false,
-                                       true, true,
-                                       INFO_SASL_OPTION_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_DESCRIPTION_SASL_PROPERTIES.get());
-      saslOptions.setPropertyName(OPTION_LONG_SASLOPTION);
-      argParser.addArgument(saslOptions);
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_DESCRIPTION_BINDPASSWORDFILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      baseDN =
+              StringArgument.builder(OPTION_LONG_BASEDN)
+                      .shortIdentifier(OPTION_SHORT_BASEDN)
+                      .description(INFO_SEARCH_DESCRIPTION_BASEDN.get())
+                      .required()
+                      .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      searchScope =
+              MultiChoiceArgument.<String>builder("searchScope")
+                      .shortIdentifier('s')
+                      .description(INFO_SEARCH_DESCRIPTION_SEARCH_SCOPE.get())
+                      .allowedValues("base", "one", "sub", "subordinate")
+                      .defaultValue("sub")
+                      .valuePlaceholder(INFO_SEARCH_SCOPE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      filename =
+              StringArgument.builder(OPTION_LONG_FILENAME)
+                      .shortIdentifier(OPTION_SHORT_FILENAME)
+                      .description(INFO_SEARCH_DESCRIPTION_FILENAME.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      saslExternal =
+              BooleanArgument.builder("useSASLExternal")
+                      .shortIdentifier('r')
+                      .description(INFO_DESCRIPTION_USE_SASL_EXTERNAL.get())
+                      .buildAndAddToParser(argParser);
+      saslOptions =
+              StringArgument.builder(OPTION_LONG_SASLOPTION)
+                      .shortIdentifier(OPTION_SHORT_SASLOPTION)
+                      .description(INFO_DESCRIPTION_SASL_PROPERTIES.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_SASL_OPTION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addArgument(trustAll);
 
-      keyStorePath = new StringArgument("keyStorePath",
-                                  OPTION_SHORT_KEYSTOREPATH,
-                                  OPTION_LONG_KEYSTOREPATH, false, false, true,
-                                  INFO_KEYSTOREPATH_PLACEHOLDER.get(), null,
-                                  null,
-                                  INFO_DESCRIPTION_KEYSTOREPATH.get());
-      keyStorePath.setPropertyName(OPTION_LONG_KEYSTOREPATH);
-      argParser.addArgument(keyStorePath);
-
-      keyStorePassword = new StringArgument("keyStorePassword",
-                                  OPTION_SHORT_KEYSTORE_PWD,
-                                  OPTION_LONG_KEYSTORE_PWD, false, false,
-                                  true, INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                                  null, null,
-                                  INFO_DESCRIPTION_KEYSTOREPASSWORD.get());
-      keyStorePassword.setPropertyName(OPTION_LONG_KEYSTORE_PWD);
-      argParser.addArgument(keyStorePassword);
-
+      keyStorePath =
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_DESCRIPTION_KEYSTOREPATH.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      keyStorePassword =
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       keyStorePasswordFile =
-           new FileBasedArgument("keystorepasswordfile",
-                                 OPTION_SHORT_KEYSTORE_PWD_FILE,
-                                 OPTION_LONG_KEYSTORE_PWD_FILE,
-                                 false, false,
-                                 INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get());
-      keyStorePasswordFile.setPropertyName(OPTION_LONG_KEYSTORE_PWD_FILE);
-      argParser.addArgument(keyStorePasswordFile);
-
-      certNickname = new StringArgument(
-              "certnickname", OPTION_SHORT_CERT_NICKNAME,
-              OPTION_LONG_CERT_NICKNAME,
-              false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
-              null, INFO_DESCRIPTION_CERT_NICKNAME.get());
-      certNickname.setPropertyName(OPTION_LONG_CERT_NICKNAME);
-      argParser.addArgument(certNickname);
-
-      trustStorePath = new StringArgument("trustStorePath",
-                                  OPTION_SHORT_TRUSTSTOREPATH,
-                                  OPTION_LONG_TRUSTSTOREPATH,
-                                  false, false, true,
-                                  INFO_TRUSTSTOREPATH_PLACEHOLDER.get(), null,
-                                  null,
-                                  INFO_DESCRIPTION_TRUSTSTOREPATH.get());
-      trustStorePath.setPropertyName(OPTION_LONG_TRUSTSTOREPATH);
-      argParser.addArgument(trustStorePath);
-
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_KEYSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      certNickname =
+              StringArgument.builder(OPTION_LONG_CERT_NICKNAME)
+                      .shortIdentifier(OPTION_SHORT_CERT_NICKNAME)
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustStorePath =
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPATH.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePassword =
-           new StringArgument("trustStorePassword", null,
-                              OPTION_LONG_TRUSTSTORE_PWD,
-                              false, false, true,
-                              INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(),
-                              null,
-                              null, INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get());
-      trustStorePassword.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD);
-      argParser.addArgument(trustStorePassword);
-
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       trustStorePasswordFile =
-           new FileBasedArgument(
-                   "truststorepasswordfile",
-                   OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                   OPTION_LONG_TRUSTSTORE_PWD_FILE, false, false,
-                   INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(), null, null,
-                   INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get());
-      trustStorePasswordFile.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD_FILE);
-      argParser.addArgument(trustStorePasswordFile);
-
-      proxyAuthzID = new StringArgument("proxy_authzid",
-                                        OPTION_SHORT_PROXYAUTHID,
-                                        OPTION_LONG_PROXYAUTHID, false,
-                                        false, true,
-                                        INFO_PROXYAUTHID_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_DESCRIPTION_PROXY_AUTHZID.get());
-      proxyAuthzID.setPropertyName(OPTION_LONG_PROXYAUTHID);
-      argParser.addArgument(proxyAuthzID);
-
-      reportAuthzID = new BooleanArgument(
-              "reportauthzid", 'E', OPTION_LONG_REPORT_AUTHZ_ID,
-              INFO_DESCRIPTION_REPORT_AUTHZID.get());
-      reportAuthzID.setPropertyName(OPTION_LONG_REPORT_AUTHZ_ID);
-      argParser.addArgument(reportAuthzID);
-
-      usePasswordPolicyControl = new BooleanArgument(
-              "usepwpolicycontrol", null,
-              OPTION_LONG_USE_PW_POLICY_CTL,
-              INFO_DESCRIPTION_USE_PWP_CONTROL.get());
-      usePasswordPolicyControl.setPropertyName(OPTION_LONG_USE_PW_POLICY_CTL);
-      argParser.addArgument(usePasswordPolicyControl);
-
-      pSearchInfo = new StringArgument("psearchinfo", 'C', "persistentSearch",
-                             false, false, true,
-                             INFO_PSEARCH_PLACEHOLDER.get(),
-                              null, null, INFO_DESCRIPTION_PSEARCH_INFO.get());
-      pSearchInfo.setPropertyName("persistentSearch");
-      pSearchInfo.setDocDescriptionSupplement(SUPPLEMENT_DESCRIPTION_PSEARCH_INFO.get());
-      argParser.addArgument(pSearchInfo);
-
-      simplePageSize = new IntegerArgument(
-              "simplepagesize", null,
-              "simplePageSize", false, false, true,
-              INFO_NUM_ENTRIES_PLACEHOLDER.get(), 1000, null, true, 1,
-              false, 0,
-              INFO_DESCRIPTION_SIMPLE_PAGE_SIZE.get());
-      simplePageSize.setPropertyName("simplePageSize");
-      argParser.addArgument(simplePageSize);
-
-      assertionFilter = new StringArgument(
-              "assertionfilter", null,
-              OPTION_LONG_ASSERTION_FILE,
-              false, false,
-              true, INFO_ASSERTION_FILTER_PLACEHOLDER.get(),
-              null, null,
-              INFO_DESCRIPTION_ASSERTION_FILTER.get());
-      assertionFilter.setPropertyName(OPTION_LONG_ASSERTION_FILE);
-      argParser.addArgument(assertionFilter);
-
-      matchedValuesFilter = new StringArgument(
-              "matchedvalues", null,
-              "matchedValuesFilter", false, true, true,
-              INFO_FILTER_PLACEHOLDER.get(), null, null,
-              INFO_DESCRIPTION_MATCHED_VALUES_FILTER.get());
-      matchedValuesFilter.setPropertyName("matchedValuesFilter");
-      argParser.addArgument(matchedValuesFilter);
-
-      sortOrder = new StringArgument(
-              "sortorder", 'S', "sortOrder", false,
-              false, true, INFO_SORT_ORDER_PLACEHOLDER.get(), null, null,
-              INFO_DESCRIPTION_SORT_ORDER.get());
-      sortOrder.setPropertyName("sortOrder");
-      argParser.addArgument(sortOrder);
-
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_DESCRIPTION_TRUSTSTOREPASSWORD_FILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      proxyAuthzID =
+              StringArgument.builder(OPTION_LONG_PROXYAUTHID)
+                      .shortIdentifier(OPTION_SHORT_PROXYAUTHID)
+                      .description(INFO_DESCRIPTION_PROXY_AUTHZID.get())
+                      .valuePlaceholder(INFO_PROXYAUTHID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      reportAuthzID =
+              BooleanArgument.builder(OPTION_LONG_REPORT_AUTHZ_ID)
+                      .shortIdentifier('E')
+                      .description(INFO_DESCRIPTION_REPORT_AUTHZID.get())
+                      .buildAndAddToParser(argParser);
+      usePasswordPolicyControl =
+              BooleanArgument.builder(OPTION_LONG_USE_PW_POLICY_CTL)
+                      .description(INFO_DESCRIPTION_USE_PWP_CONTROL.get())
+                      .buildAndAddToParser(argParser);
+      pSearchInfo =
+              StringArgument.builder("persistentSearch")
+                      .shortIdentifier('C')
+                      .description(INFO_DESCRIPTION_PSEARCH_INFO.get())
+                      .docDescriptionSupplement(SUPPLEMENT_DESCRIPTION_PSEARCH_INFO.get())
+                      .valuePlaceholder(INFO_PSEARCH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      simplePageSize =
+              IntegerArgument.builder("simplePageSize")
+                      .description(INFO_DESCRIPTION_SIMPLE_PAGE_SIZE.get())
+                      .lowerBound(1)
+                      .defaultValue(1000)
+                      .valuePlaceholder(INFO_NUM_ENTRIES_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      assertionFilter =
+              StringArgument.builder(OPTION_LONG_ASSERTION_FILE)
+                      .description(INFO_DESCRIPTION_ASSERTION_FILTER.get())
+                      .valuePlaceholder(INFO_ASSERTION_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      matchedValuesFilter =
+              StringArgument.builder("matchedValuesFilter")
+                      .description(INFO_DESCRIPTION_MATCHED_VALUES_FILTER.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_FILTER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      sortOrder =
+              StringArgument.builder("sortOrder")
+                      .shortIdentifier('S')
+                      .description(INFO_DESCRIPTION_SORT_ORDER.get())
+                      .valuePlaceholder(INFO_SORT_ORDER_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       vlvDescriptor =
-           new StringArgument(
-                   "vlvdescriptor", 'G', "virtualListView", false,
-                   false, true,
-                   INFO_VLV_PLACEHOLDER.get(),
-                   null, null, INFO_DESCRIPTION_VLV.get());
-      vlvDescriptor.setPropertyName("virtualListView");
-      argParser.addArgument(vlvDescriptor);
-
+              StringArgument.builder("virtualListView")
+                      .shortIdentifier('G')
+                      .description(INFO_DESCRIPTION_VLV.get())
+                      .valuePlaceholder(INFO_VLV_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       controlStr =
-           new StringArgument("control", 'J', "control", false, true, true,
-                    INFO_LDAP_CONTROL_PLACEHOLDER.get(),
-                    null, null, INFO_DESCRIPTION_CONTROLS.get());
-      controlStr.setPropertyName("control");
-      controlStr.setDocDescriptionSupplement(SUPPLEMENT_DESCRIPTION_CONTROLS.get());
-      argParser.addArgument(controlStr);
-
-      subEntriesArgument = new BooleanArgument("subEntries",
-              OPTION_SHORT_SUBENTRIES, OPTION_LONG_SUBENTRIES,
-              INFO_DESCRIPTION_SUBENTRIES.get());
-      subEntriesArgument.setPropertyName(OPTION_LONG_SUBENTRIES);
-      argParser.addArgument(subEntriesArgument);
-
+              StringArgument.builder("control")
+                      .shortIdentifier('J')
+                      .description(INFO_DESCRIPTION_CONTROLS.get())
+                      .docDescriptionSupplement(SUPPLEMENT_DESCRIPTION_CONTROLS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDAP_CONTROL_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      subEntriesArgument =
+              BooleanArgument.builder(OPTION_LONG_SUBENTRIES)
+                      .shortIdentifier(OPTION_SHORT_SUBENTRIES)
+                      .description(INFO_DESCRIPTION_SUBENTRIES.get())
+                      .buildAndAddToParser(argParser);
       effectiveRightsUser =
-              new StringArgument("effectiveRightsUser",
-                      OPTION_SHORT_EFFECTIVERIGHTSUSER,
-                      OPTION_LONG_EFFECTIVERIGHTSUSER, false, false, true,
-                      INFO_PROXYAUTHID_PLACEHOLDER.get(), null, null,
-                      INFO_DESCRIPTION_EFFECTIVERIGHTS_USER.get( ));
-      effectiveRightsUser.setPropertyName(OPTION_LONG_EFFECTIVERIGHTSUSER);
-      argParser.addArgument(effectiveRightsUser);
-
+              StringArgument.builder(OPTION_LONG_EFFECTIVERIGHTSUSER)
+                      .shortIdentifier(OPTION_SHORT_EFFECTIVERIGHTSUSER)
+                      .description(INFO_DESCRIPTION_EFFECTIVERIGHTS_USER.get())
+                      .valuePlaceholder(INFO_PROXYAUTHID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       effectiveRightsAttrs =
-              new StringArgument("effectiveRightsAttrs",
-                      OPTION_SHORT_EFFECTIVERIGHTSATTR,
-                      OPTION_LONG_EFFECTIVERIGHTSATTR, false, true, true,
-                      INFO_ATTRIBUTE_PLACEHOLDER.get(), null, null,
-                      INFO_DESCRIPTION_EFFECTIVERIGHTS_ATTR.get( ));
-      effectiveRightsAttrs.setPropertyName(OPTION_LONG_EFFECTIVERIGHTSATTR);
-      argParser.addArgument(effectiveRightsAttrs);
-
-      version = new IntegerArgument("version", OPTION_SHORT_PROTOCOL_VERSION,
-                                    OPTION_LONG_PROTOCOL_VERSION, false, false,
-                                    true,
-                                    INFO_PROTOCOL_VERSION_PLACEHOLDER.get(), 3,
-                                    null, INFO_DESCRIPTION_VERSION.get());
-      version.setPropertyName(OPTION_LONG_PROTOCOL_VERSION);
-      argParser.addArgument(version);
-
-      int defaultTimeout = CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT;
-      connectTimeout = new IntegerArgument(OPTION_LONG_CONNECT_TIMEOUT,
-          null, OPTION_LONG_CONNECT_TIMEOUT,
-          false, false, true, INFO_TIMEOUT_PLACEHOLDER.get(),
-          defaultTimeout, null,
-          true, 0, false, Integer.MAX_VALUE,
-          INFO_DESCRIPTION_CONNECTION_TIMEOUT.get());
-      connectTimeout.setPropertyName(OPTION_LONG_CONNECT_TIMEOUT);
-      argParser.addArgument(connectTimeout);
-
-      encodingStr = new StringArgument("encoding", 'i', "encoding", false,
-                                       false, true,
-                                       INFO_ENCODING_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_DESCRIPTION_ENCODING.get());
-      encodingStr.setPropertyName("encoding");
-      argParser.addArgument(encodingStr);
-
+              StringArgument.builder(OPTION_LONG_EFFECTIVERIGHTSATTR)
+                      .shortIdentifier(OPTION_SHORT_EFFECTIVERIGHTSATTR)
+                      .description(INFO_DESCRIPTION_EFFECTIVERIGHTS_ATTR.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_ATTRIBUTE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      version =
+              IntegerArgument.builder(OPTION_LONG_PROTOCOL_VERSION)
+                      .shortIdentifier(OPTION_SHORT_PROTOCOL_VERSION)
+                      .description(INFO_DESCRIPTION_VERSION.get())
+                      .defaultValue(3)
+                      .valuePlaceholder(INFO_PROTOCOL_VERSION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      connectTimeout =
+              IntegerArgument.builder(OPTION_LONG_CONNECT_TIMEOUT)
+                      .description(INFO_DESCRIPTION_CONNECTION_TIMEOUT.get())
+                      .lowerBound(0)
+                      .defaultValue(CliConstants.DEFAULT_LDAP_CONNECT_TIMEOUT)
+                      .valuePlaceholder(INFO_TIMEOUT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      encodingStr =
+              StringArgument.builder("encoding")
+                      .shortIdentifier('i')
+                      .description(INFO_DESCRIPTION_ENCODING.get())
+                      .valuePlaceholder(INFO_ENCODING_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       dereferencePolicy =
-           new StringArgument("derefpolicy", 'a', "dereferencePolicy", false,
-                              false, true,
-                              INFO_DEREFERENCE_POLICE_PLACEHOLDER.get(), "never",
-                              null,
-                              INFO_SEARCH_DESCRIPTION_DEREFERENCE_POLICY.get());
-      dereferencePolicy.setPropertyName("dereferencePolicy");
-      argParser.addArgument(dereferencePolicy);
-
-      typesOnly = new BooleanArgument("typesOnly", 'A', "typesOnly",
-                                      INFO_DESCRIPTION_TYPES_ONLY.get());
-      typesOnly.setPropertyName("typesOnly");
-      argParser.addArgument(typesOnly);
-
-      sizeLimit = new IntegerArgument("sizeLimit", 'z', "sizeLimit", false,
-                                      false, true,
-                                      INFO_SIZE_LIMIT_PLACEHOLDER.get(), 0,
-                                      null,
-                                      INFO_SEARCH_DESCRIPTION_SIZE_LIMIT.get());
-      sizeLimit.setPropertyName("sizeLimit");
-      argParser.addArgument(sizeLimit);
-
-      timeLimit = new IntegerArgument("timeLimit", 'l', "timeLimit", false,
-                                      false, true,
-                                      INFO_TIME_LIMIT_PLACEHOLDER.get(), 0,
-                                      null,
-                                      INFO_SEARCH_DESCRIPTION_TIME_LIMIT.get());
-      timeLimit.setPropertyName("timeLimit");
-      argParser.addArgument(timeLimit);
-
-      dontWrap = new BooleanArgument("dontwrap", 'T',
-                                     "dontWrap",
-                                     INFO_DESCRIPTION_DONT_WRAP.get());
-      dontWrap.setPropertyName("dontWrap");
-      argParser.addArgument(dontWrap);
-
-      countEntries = new BooleanArgument("countentries", null, "countEntries",
-                                         INFO_DESCRIPTION_COUNT_ENTRIES.get());
-      countEntries.setPropertyName("countEntries");
-      argParser.addArgument(countEntries);
-
+              StringArgument.builder("dereferencePolicy")
+                      .shortIdentifier('a')
+                      .description(INFO_SEARCH_DESCRIPTION_DEREFERENCE_POLICY.get())
+                      .defaultValue("never")
+                      .valuePlaceholder(INFO_DEREFERENCE_POLICE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      typesOnly =
+              BooleanArgument.builder("typesOnly")
+                      .shortIdentifier('A')
+                      .description(INFO_DESCRIPTION_TYPES_ONLY.get())
+                      .buildAndAddToParser(argParser);
+      sizeLimit =
+              IntegerArgument.builder("sizeLimit")
+                      .shortIdentifier('z')
+                      .description(INFO_SEARCH_DESCRIPTION_SIZE_LIMIT.get())
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_SIZE_LIMIT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      timeLimit =
+              IntegerArgument.builder("timeLimit")
+                      .shortIdentifier('l')
+                      .description(INFO_SEARCH_DESCRIPTION_TIME_LIMIT.get())
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_TIME_LIMIT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      dontWrap =
+              BooleanArgument.builder("dontWrap")
+                      .shortIdentifier('T')
+                      .description(INFO_DESCRIPTION_DONT_WRAP.get())
+                      .buildAndAddToParser(argParser);
+      countEntries =
+              BooleanArgument.builder("countEntries")
+                      .description(INFO_DESCRIPTION_COUNT_ENTRIES.get())
+                      .buildAndAddToParser(argParser);
       continueOnError =
-           new BooleanArgument("continueOnError", 'c', "continueOnError",
-                               INFO_DESCRIPTION_CONTINUE_ON_ERROR.get());
-      continueOnError.setPropertyName("continueOnError");
-      argParser.addArgument(continueOnError);
-
-      noop = new BooleanArgument("noop", OPTION_SHORT_DRYRUN,
-          OPTION_LONG_DRYRUN, INFO_DESCRIPTION_NOOP.get());
-      noop.setPropertyName(OPTION_LONG_DRYRUN);
-      argParser.addArgument(noop);
+              BooleanArgument.builder("continueOnError")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONTINUE_ON_ERROR.get())
+                      .buildAndAddToParser(argParser);
+      noop =
+              BooleanArgument.builder(OPTION_LONG_DRYRUN)
+                      .shortIdentifier(OPTION_SHORT_DRYRUN)
+                      .description(INFO_DESCRIPTION_NOOP.get())
+                      .buildAndAddToParser(argParser);
 
       verbose = CommonArguments.getVerbose();
       argParser.addArgument(verbose);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java
index ad91c3c..6440202 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFDiff.java
@@ -174,79 +174,76 @@
     argParser.setVersionHandler(new DirectoryServerVersionHandler());
     try
     {
-      sourceLDIF = new StringArgument(
-              "sourceldif", 's', "sourceLDIF", true,
-              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFDIFF_DESCRIPTION_SOURCE_LDIF.get());
-      argParser.addArgument(sourceLDIF);
-
-      targetLDIF = new StringArgument(
-              "targetldif", 't', "targetLDIF", true,
-              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFDIFF_DESCRIPTION_TARGET_LDIF.get());
-      argParser.addArgument(targetLDIF);
-
-      outputLDIF = new StringArgument(
-              "outputldif", 'o', "outputLDIF", false,
-              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFDIFF_DESCRIPTION_OUTPUT_LDIF.get());
-      argParser.addArgument(outputLDIF);
-
-      ignoreAttrsFile = new StringArgument(
-              "ignoreattrs", 'a', "ignoreAttrs", false,
-              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFDIFF_DESCRIPTION_IGNORE_ATTRS.get());
-      argParser.addArgument(ignoreAttrsFile);
-
-      ignoreEntriesFile = new StringArgument(
-              "ignoreentries", 'e', "ignoreEntries", false,
-              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFDIFF_DESCRIPTION_IGNORE_ENTRIES.get());
-      argParser.addArgument(ignoreEntriesFile);
-
+      sourceLDIF =
+              StringArgument.builder("sourceLDIF")
+                      .shortIdentifier('s')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_SOURCE_LDIF.get())
+                      .required()
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      targetLDIF =
+              StringArgument.builder("targetLDIF")
+                      .shortIdentifier('t')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_TARGET_LDIF.get())
+                      .required()
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      outputLDIF =
+              StringArgument.builder("outputLDIF")
+                      .shortIdentifier('o')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_OUTPUT_LDIF.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      ignoreAttrsFile =
+              StringArgument.builder("ignoreAttrs")
+                      .shortIdentifier('a')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_IGNORE_ATTRS.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      ignoreEntriesFile =
+              StringArgument.builder("ignoreEntries")
+                      .shortIdentifier('e')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_IGNORE_ENTRIES.get())
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       overwriteExisting =
-           new BooleanArgument(
-                   "overwriteexisting", 'O',
-                   "overwriteExisting",
-                   INFO_LDIFDIFF_DESCRIPTION_OVERWRITE_EXISTING.get());
-      argParser.addArgument(overwriteExisting);
-
+              BooleanArgument.builder("overwriteExisting")
+                      .shortIdentifier('O')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_OVERWRITE_EXISTING.get())
+                      .buildAndAddToParser(argParser);
       singleValueChanges =
-           new BooleanArgument(
-                   "singlevaluechanges", 'S', "singleValueChanges",
-                   INFO_LDIFDIFF_DESCRIPTION_SINGLE_VALUE_CHANGES.get());
-      argParser.addArgument(singleValueChanges);
-
+              BooleanArgument.builder("singleValueChanges")
+                      .shortIdentifier('S')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_SINGLE_VALUE_CHANGES.get())
+                      .buildAndAddToParser(argParser);
       doCheckSchema =
-        new BooleanArgument(
-                "checkschema", null, "checkSchema",
-                INFO_LDIFDIFF_DESCRIPTION_CHECK_SCHEMA.get());
-      argParser.addArgument(doCheckSchema);
-
-      configFile = new StringArgument("configfile", 'c', "configFile", false,
-                                      false, true,
-                                      INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-      configClass = new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                             OPTION_LONG_CONFIG_CLASS, false,
-                             false, true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                             ConfigFileHandler.class.getName(), null,
-                             INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
+              BooleanArgument.builder("checkSchema")
+                      .description(INFO_LDIFDIFF_DESCRIPTION_CHECK_SCHEMA.get())
+                      .buildAndAddToParser(argParser);
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage =  CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
 
       useCompareResultCode =
-          new BooleanArgument("usecompareresultcode", 'r',
-              "useCompareResultCode",
-              INFO_LDIFDIFF_DESCRIPTION_USE_COMPARE_RESULT.get());
-      argParser.addArgument(useCompareResultCode);
+              BooleanArgument.builder("useCompareResultCode")
+                      .shortIdentifier('r')
+                      .description(INFO_LDIFDIFF_DESCRIPTION_USE_COMPARE_RESULT.get())
+                      .buildAndAddToParser(argParser);
 
       argParser.setUsageArgument(showUsage);
     }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java
index 5b8ca29..6f44292 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFModify.java
@@ -435,47 +435,43 @@
 
     try
     {
-      configFile = new StringArgument("configfile", 'c', "configFile", true,
-                                      false, true,
-                                      INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
-      configClass = new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                             OPTION_LONG_CONFIG_CLASS, false,
-                             false, true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                             ConfigFileHandler.class.getName(), null,
-                             INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
-      sourceFile = new StringArgument("sourceldif", 's', "sourceLDIF", true,
-                                      false, true,
-                                      INFO_LDIFFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_LDIFMODIFY_DESCRIPTION_SOURCE.get());
-      argParser.addArgument(sourceFile);
-
-
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      sourceFile =
+              StringArgument.builder("sourceLDIF")
+                      .shortIdentifier('s')
+                      .description(INFO_LDIFMODIFY_DESCRIPTION_SOURCE.get())
+                      .required()
+                      .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       changesFile =
-              new StringArgument("changesldif", 'm', "changesLDIF", true,
-                                 false, true, INFO_LDIFFILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_LDIFMODIFY_DESCRIPTION_CHANGES.get());
-      argParser.addArgument(changesFile);
-
-
-      targetFile = new StringArgument("targetldif", 't', "targetLDIF", true,
-                                      false, true,
-                                      INFO_LDIFFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_LDIFMODIFY_DESCRIPTION_TARGET.get());
-      argParser.addArgument(targetFile);
-
+              StringArgument.builder("changesLDIF")
+                      .shortIdentifier('m')
+                      .description(INFO_LDIFMODIFY_DESCRIPTION_CHANGES.get())
+                      .required()
+                      .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      targetFile =
+              StringArgument.builder("targetLDIF")
+                      .shortIdentifier('t')
+                      .description(INFO_LDIFMODIFY_DESCRIPTION_TARGET.get())
+                      .required()
+                      .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java
index dd80d24..350856d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/LDIFSearch.java
@@ -27,6 +27,8 @@
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_SIZE_LIMIT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_TIME_LIMIT_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -151,77 +153,82 @@
 
     try
     {
-      ldifFile = new StringArgument(
-              "ldiffile", 'l', "ldifFile", false, true,
-              true, INFO_LDIFFILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFSEARCH_DESCRIPTION_LDIF_FILE.get());
-      argParser.addArgument(ldifFile);
-
-      baseDNString = new StringArgument(
-              "basedn", OPTION_SHORT_BASEDN,
-              OPTION_LONG_BASEDN, false, true,
-              true, INFO_BASEDN_PLACEHOLDER.get(), "", null,
-              INFO_LDIFSEARCH_DESCRIPTION_BASEDN.get());
-      argParser.addArgument(baseDNString);
-
-      scopeString = new MultiChoiceArgument<>(
-              "scope", 's', "searchScope", false, false,
-              true, INFO_SCOPE_PLACEHOLDER.get(), SCOPE_STRING_SUB,
-              null, scopeStrings, false,
-              INFO_LDIFSEARCH_DESCRIPTION_SCOPE.get());
-      argParser.addArgument(scopeString);
-
-      configFile = new StringArgument(
-              "configfile", 'c', "configFile", false,
-              false, true, INFO_CONFIGFILE_PLACEHOLDER.get(), null, null,
-              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-      configClass = new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                             OPTION_LONG_CONFIG_CLASS, false,
-                             false, true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                             ConfigFileHandler.class.getName(), null,
-                             INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-      filterFile = new StringArgument("filterfile", 'f', "filterFile", false,
-          false, true, INFO_FILTER_FILE_PLACEHOLDER.get(), null, null,
-          INFO_LDIFSEARCH_DESCRIPTION_FILTER_FILE.get());
-      argParser.addArgument(filterFile);
-
-      outputFile = new StringArgument(
-              "outputfile", 'o', "outputFile", false,
-              false, true, INFO_OUTPUT_FILE_PLACEHOLDER.get(), null, null,
-              INFO_LDIFSEARCH_DESCRIPTION_OUTPUT_FILE.get());
-      argParser.addArgument(outputFile);
-
+      ldifFile =
+              StringArgument.builder("ldifFile")
+                      .shortIdentifier('l')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_LDIF_FILE.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_LDIFFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      baseDNString =
+              StringArgument.builder(OPTION_LONG_BASEDN)
+                      .shortIdentifier(OPTION_SHORT_BASEDN)
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_BASEDN.get())
+                      .multiValued()
+                      .defaultValue("")
+                      .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      scopeString =
+              MultiChoiceArgument.<String>builder("searchScope")
+                      .shortIdentifier('s')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_SCOPE.get())
+                      .allowedValues(scopeStrings)
+                      .defaultValue(SCOPE_STRING_SUB)
+                      .valuePlaceholder(INFO_SCOPE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      filterFile =
+              StringArgument.builder("filterFile")
+                      .shortIdentifier('f')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_FILTER_FILE.get())
+                      .valuePlaceholder(INFO_FILTER_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      outputFile =
+              StringArgument.builder("outputFile")
+                      .shortIdentifier('o')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_OUTPUT_FILE.get())
+                      .valuePlaceholder(INFO_OUTPUT_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       overwriteExisting =
-           new BooleanArgument(
-                   "overwriteexisting", 'O',"overwriteExisting",
-                   INFO_LDIFSEARCH_DESCRIPTION_OVERWRITE_EXISTING.get());
-      argParser.addArgument(overwriteExisting);
-
-      dontWrap = new BooleanArgument(
-              "dontwrap", 'T', "dontWrap",
-              INFO_LDIFSEARCH_DESCRIPTION_DONT_WRAP.get());
-      argParser.addArgument(dontWrap);
-
-      sizeLimit = new IntegerArgument(
-              "sizelimit", 'z', "sizeLimit", false,
-              false, true, INFO_SIZE_LIMIT_PLACEHOLDER.get(), 0, null,
-              true, 0, false, 0,
-              INFO_LDIFSEARCH_DESCRIPTION_SIZE_LIMIT.get());
-      argParser.addArgument(sizeLimit);
-
-      timeLimit = new IntegerArgument(
-              "timelimit", 't', "timeLimit", false,
-              false, true, INFO_TIME_LIMIT_PLACEHOLDER.get(), 0, null,
-              true, 0, false, 0,
-              INFO_LDIFSEARCH_DESCRIPTION_TIME_LIMIT.get());
-      argParser.addArgument(timeLimit);
-
+              BooleanArgument.builder("overwriteExisting")
+                      .shortIdentifier('O')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_OVERWRITE_EXISTING.get())
+                      .buildAndAddToParser(argParser);
+      dontWrap =
+              BooleanArgument.builder("dontWrap")
+                      .shortIdentifier('T')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_DONT_WRAP.get())
+                      .buildAndAddToParser(argParser);
+      sizeLimit =
+              IntegerArgument.builder("sizeLimit")
+                      .shortIdentifier('z')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_SIZE_LIMIT.get())
+                      .lowerBound(0)
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_SIZE_LIMIT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      timeLimit =
+              IntegerArgument.builder("timeLimit")
+                      .shortIdentifier('t')
+                      .description(INFO_LDIFSEARCH_DESCRIPTION_TIME_LIMIT.get())
+                      .lowerBound(0)
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_TIME_LIMIT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java
index 98cd3d2..0310e4c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ListBackends.java
@@ -148,38 +148,36 @@
     try
     {
       configClass =
-           new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                              OPTION_LONG_CONFIG_CLASS, true, false,
-                              true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                              ConfigFileHandler.class.getName(), null,
-                              INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       configFile =
-           new StringArgument("configfile", 'f', "configFile", true, false,
-                              true, INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
-      backendID = new StringArgument(
-              "backendid", 'n', "backendID", false,
-              true, true, INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
-              INFO_LISTBACKENDS_DESCRIPTION_BACKEND_ID.get());
-      argParser.addArgument(backendID);
-
-
-      baseDN = new StringArgument(
-              "basedn", OPTION_SHORT_BASEDN,
-              OPTION_LONG_BASEDN, false, true, true,
-              INFO_BASEDN_PLACEHOLDER.get(), null, null,
-              INFO_LISTBACKENDS_DESCRIPTION_BASE_DN.get());
-      argParser.addArgument(baseDN);
-
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      backendID =
+              StringArgument.builder("backendID")
+                      .shortIdentifier('n')
+                      .description(INFO_LISTBACKENDS_DESCRIPTION_BACKEND_ID.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BACKENDNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      baseDN =
+              StringArgument.builder(OPTION_LONG_BASEDN)
+                      .shortIdentifier(OPTION_SHORT_BASEDN)
+                      .description(INFO_LISTBACKENDS_DESCRIPTION_BASE_DN.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java
index 71c346d..7e218ec 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageAccount.java
@@ -23,11 +23,15 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS.
+ *      Portions Copyright 2011-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_BINDPWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_KEYSTORE_PWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_PORT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -467,7 +471,7 @@
    * The name of the argument that will be used for holding the value(s) to use
    * for the target operation.
    */
-  private static final String ARG_OP_VALUE = "opvalue";
+  private static final String ARG_OP_VALUE = "operationValue";
 
 
 
@@ -840,117 +844,124 @@
 
     try
     {
-      host = new StringArgument("host", OPTION_SHORT_HOST,
-                                OPTION_LONG_HOST, false, false, true,
-                                INFO_HOST_PLACEHOLDER.get(), "127.0.0.1", null,
-                                INFO_PWPSTATE_DESCRIPTION_HOST.get());
+      host =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_PWPSTATE_DESCRIPTION_HOST.get())
+                      .defaultValue("127.0.0.1")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(host);
 
-      port = new IntegerArgument(
-              "port", OPTION_SHORT_PORT,
-              OPTION_LONG_PORT, false, false, true,
-              INFO_PORT_PLACEHOLDER.get(),
-              AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT,
-              null, true, 1,
-              true, 65535, INFO_PWPSTATE_DESCRIPTION_PORT.get());
+      port =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_PWPSTATE_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(port);
 
-      bindDN = new StringArgument("binddn", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_PWPSTATE_DESCRIPTION_BINDDN.get());
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_PWPSTATE_DESCRIPTION_BINDDN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(bindDN);
 
-      bindPW = new StringArgument("bindpw", OPTION_SHORT_BINDPWD,
-                                  OPTION_LONG_BINDPWD, false, false,
-                                  true,
-                                  INFO_BINDPWD_PLACEHOLDER.get(), null, null,
-                                  INFO_PWPSTATE_DESCRIPTION_BINDPW.get());
+      bindPW =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_PWPSTATE_DESCRIPTION_BINDPW.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(bindPW);
 
-      bindPWFile = new FileBasedArgument(
-              "bindpwfile",
-              OPTION_SHORT_BINDPWD_FILE,
-              OPTION_LONG_BINDPWD_FILE,
-              false, false,
-              INFO_BINDPWD_FILE_PLACEHOLDER.get(),
-              null, null,
-              INFO_PWPSTATE_DESCRIPTION_BINDPWFILE.get());
+      bindPWFile =
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_PWPSTATE_DESCRIPTION_BINDPWFILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(bindPWFile);
 
-      targetDN = new StringArgument("targetdn", 'b', "targetDN", true, false,
-                                    true, INFO_TARGETDN_PLACEHOLDER.get(), null,
-                                    null,
-                                    INFO_PWPSTATE_DESCRIPTION_TARGETDN.get());
+      targetDN =
+              StringArgument.builder("targetDN")
+                      .shortIdentifier('b')
+                      .description(INFO_PWPSTATE_DESCRIPTION_TARGETDN.get())
+                      .required()
+                      .valuePlaceholder(INFO_TARGETDN_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(targetDN);
 
-      saslOption = new StringArgument(
-              "sasloption", OPTION_SHORT_SASLOPTION,
-              OPTION_LONG_SASLOPTION, false,
-              true, true,
-              INFO_SASL_OPTION_PLACEHOLDER.get(), null, null,
-              INFO_PWPSTATE_DESCRIPTION_SASLOPTIONS.get());
+      saslOption =
+              StringArgument.builder(OPTION_LONG_SASLOPTION)
+                      .shortIdentifier(OPTION_SHORT_SASLOPTION)
+                      .description(INFO_PWPSTATE_DESCRIPTION_SASLOPTIONS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_SASL_OPTION_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(saslOption);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addGlobalArgument(trustAll);
 
-      keyStoreFile = new StringArgument("keystorefile",
-                                        OPTION_SHORT_KEYSTOREPATH,
-                                        OPTION_LONG_KEYSTOREPATH,
-                                        false, false, true,
-                                        INFO_KEYSTOREPATH_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_PWPSTATE_DESCRIPTION_KSFILE.get());
+      keyStoreFile =
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_PWPSTATE_DESCRIPTION_KSFILE.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(keyStoreFile);
 
-      keyStorePW = new StringArgument("keystorepw", OPTION_SHORT_KEYSTORE_PWD,
-                                      OPTION_LONG_KEYSTORE_PWD,
-                                      false, false, true,
-                                      INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                                      null, null,
-                                      INFO_PWPSTATE_DESCRIPTION_KSPW.get());
+      keyStorePW =
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_PWPSTATE_DESCRIPTION_KSPW.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(keyStorePW);
 
-      keyStorePWFile = new FileBasedArgument("keystorepwfile",
-                                OPTION_SHORT_KEYSTORE_PWD_FILE,
-                                OPTION_LONG_KEYSTORE_PWD_FILE, false, false,
-                                INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(), null,
-                                null,
-                                INFO_PWPSTATE_DESCRIPTION_KSPWFILE.get());
+      keyStorePWFile =
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_PWPSTATE_DESCRIPTION_KSPWFILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(keyStorePWFile);
 
-      certNickname = new StringArgument(
-              "certnickname", 'N', "certNickname",
-              false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
-              null, INFO_DESCRIPTION_CERT_NICKNAME.get());
+      certNickname =
+              StringArgument.builder("certNickname")
+                      .shortIdentifier('N')
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(certNickname);
 
-      trustStoreFile = new StringArgument(
-              "truststorefile",
-              OPTION_SHORT_TRUSTSTOREPATH,
-              OPTION_LONG_TRUSTSTOREPATH,
-              false, false, true,
-              INFO_TRUSTSTOREPATH_PLACEHOLDER.get(),
-              null, null,
-              INFO_PWPSTATE_DESCRIPTION_TSFILE.get());
+      trustStoreFile =
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_PWPSTATE_DESCRIPTION_TSFILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(trustStoreFile);
 
-      trustStorePW = new StringArgument(
-              "truststorepw", 'T',
-              OPTION_LONG_TRUSTSTORE_PWD,
-              false, false,
-              true, INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(), null,
-              null, INFO_PWPSTATE_DESCRIPTION_TSPW.get());
+      trustStorePW =
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .shortIdentifier('T')
+                      .description(INFO_PWPSTATE_DESCRIPTION_TSPW.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(trustStorePW);
 
-      trustStorePWFile = new FileBasedArgument("truststorepwfile",
-                                  OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                                  OPTION_LONG_TRUSTSTORE_PWD_FILE,
-                                  false, false,
-                                  INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(),
-                                  null, null,
-                                  INFO_PWPSTATE_DESCRIPTION_TSPWFILE.get());
+      trustStorePWFile =
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_PWPSTATE_DESCRIPTION_TSPWFILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildArgument();
       argParser.addGlobalArgument(trustStorePWFile);
 
       verbose = CommonArguments.getVerbose();
@@ -978,11 +989,13 @@
       msg = INFO_DESCRIPTION_PWPSTATE_SET_ACCOUNT_DISABLED_STATE.get();
       SubCommand sc = new SubCommand(argParser, SC_SET_ACCOUNT_DISABLED_STATE,
                                      msg);
-      sc.addArgument(new MultiChoiceArgument(ARG_OP_VALUE, 'O',
-                              "operationValue", true, false, true,
-                              INFO_TRUE_FALSE_PLACEHOLDER.get(), null, null,
-                              booleanValues, false,
-                              INFO_DESCRIPTION_OPERATION_BOOLEAN_VALUE.get()));
+      sc.addArgument(MultiChoiceArgument.<String>builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_BOOLEAN_VALUE.get())
+              .required()
+              .allowedValues(booleanValues)
+              .valuePlaceholder(INFO_TRUE_FALSE_PLACEHOLDER.get())
+              .buildArgument());
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_ACCOUNT_DISABLED_STATE.get();
       new SubCommand(argParser, SC_CLEAR_ACCOUNT_DISABLED_STATE, msg);
@@ -992,10 +1005,11 @@
 
       msg = INFO_DESCRIPTION_PWPSTATE_SET_ACCOUNT_EXPIRATION_TIME.get();
       sc = new SubCommand(argParser, SC_SET_ACCOUNT_EXPIRATION_TIME, msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, false, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_ACCOUNT_EXPIRATION_TIME.get();
@@ -1014,10 +1028,11 @@
 
       msg = INFO_DESCRIPTION_PWPSTATE_SET_PASSWORD_CHANGED_TIME.get();
       sc = new SubCommand(argParser, SC_SET_PASSWORD_CHANGED_TIME, msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, false, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_PASSWORD_CHANGED_TIME.get();
@@ -1031,10 +1046,11 @@
       msg = INFO_DESCRIPTION_PWPSTATE_SET_PASSWORD_EXPIRATION_WARNED_TIME
               .get();
       sc = new SubCommand(argParser, SC_SET_PASSWORD_EXP_WARNED_TIME, msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, false, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_PASSWORD_EXPIRATION_WARNED_TIME
@@ -1057,19 +1073,23 @@
       msg = INFO_DESCRIPTION_PWPSTATE_ADD_AUTH_FAILURE_TIME.get();
       sc = new SubCommand(argParser, SC_ADD_AUTHENTICATION_FAILURE_TIME,
               msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, true, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .multiValued()
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_SET_AUTH_FAILURE_TIMES.get();
       sc = new SubCommand(argParser, SC_SET_AUTHENTICATION_FAILURE_TIMES,
                           msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, true, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUES.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUES.get())
+              .multiValued()
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_AUTH_FAILURE_TIMES.get();
@@ -1093,10 +1113,11 @@
 
       msg = INFO_DESCRIPTION_PWPSTATE_SET_LAST_LOGIN_TIME.get();
       sc = new SubCommand(argParser, SC_SET_LAST_LOGIN_TIME, msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, false, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_LAST_LOGIN_TIME.get();
@@ -1111,11 +1132,13 @@
 
       msg = INFO_DESCRIPTION_PWPSTATE_SET_PASSWORD_RESET_STATE.get();
       sc = new SubCommand(argParser, SC_SET_PASSWORD_RESET_STATE, msg);
-      sc.addArgument(new MultiChoiceArgument(ARG_OP_VALUE, 'O',
-                              "operationValue", true, false, true,
-                              INFO_TRUE_FALSE_PLACEHOLDER.get(), null, null,
-                              booleanValues, false,
-                              INFO_DESCRIPTION_OPERATION_BOOLEAN_VALUE.get()));
+      sc.addArgument(MultiChoiceArgument.<String>builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_BOOLEAN_VALUE.get())
+              .required()
+              .allowedValues(booleanValues)
+              .valuePlaceholder(INFO_TRUE_FALSE_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_PASSWORD_RESET_STATE.get();
@@ -1131,18 +1154,22 @@
 
       msg = INFO_DESCRIPTION_PWPSTATE_ADD_GRACE_LOGIN_USE_TIME.get();
       sc = new SubCommand(argParser, SC_ADD_GRACE_LOGIN_USE_TIME, msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, true, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .multiValued()
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_SET_GRACE_LOGIN_USE_TIMES.get();
       sc = new SubCommand(argParser, SC_SET_GRACE_LOGIN_USE_TIMES, msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, true, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUES.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUES.get())
+              .multiValued()
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg = INFO_DESCRIPTION_PWPSTATE_CLEAR_GRACE_LOGIN_USE_TIMES.get();
@@ -1160,10 +1187,11 @@
       msg = INFO_DESCRIPTION_PWPSTATE_SET_PW_CHANGED_BY_REQUIRED_TIME.get();
       sc = new SubCommand(argParser, SC_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
                           msg);
-      sc.addArgument(new StringArgument(ARG_OP_VALUE, 'O', "operationValue",
-                              false, false, true, INFO_TIME_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_DESCRIPTION_OPERATION_TIME_VALUE.get()));
+      sc.addArgument(StringArgument.builder(ARG_OP_VALUE)
+              .shortIdentifier('O')
+              .description(INFO_DESCRIPTION_OPERATION_TIME_VALUE.get())
+              .valuePlaceholder(INFO_TIME_PLACEHOLDER.get())
+              .buildArgument());
       sc.setHidden(true);
 
       msg =
@@ -1396,7 +1424,7 @@
     }
     else if (subCommandName.equals(SC_SET_ACCOUNT_DISABLED_STATE))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         String valueStr = a.getValue();
@@ -1430,7 +1458,7 @@
     }
     else if (subCommandName.equals(SC_SET_ACCOUNT_EXPIRATION_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_SET_ACCOUNT_EXPIRATION_TIME, a.getValue());
@@ -1454,7 +1482,7 @@
     }
     else if (subCommandName.equals(SC_SET_PASSWORD_CHANGED_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_SET_PASSWORD_CHANGED_TIME, a.getValue());
@@ -1474,7 +1502,7 @@
     }
     else if(subCommandName.equals(SC_SET_PASSWORD_EXP_WARNED_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_SET_PASSWORD_EXPIRATION_WARNED_TIME,
@@ -1508,7 +1536,7 @@
     }
     else if(subCommandName.equals(SC_ADD_AUTHENTICATION_FAILURE_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_ADD_AUTHENTICATION_FAILURE_TIME,
@@ -1521,7 +1549,7 @@
     }
     else if(subCommandName.equals(SC_SET_AUTHENTICATION_FAILURE_TIMES))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         ArrayList<String> valueList = new ArrayList<>(a.getValues());
@@ -1557,7 +1585,7 @@
     }
     else if(subCommandName.equals(SC_SET_LAST_LOGIN_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_SET_LAST_LOGIN_TIME, a.getValue());
@@ -1581,7 +1609,7 @@
     }
     else if(subCommandName.equals(SC_SET_PASSWORD_RESET_STATE))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         String valueStr = a.getValue();
@@ -1620,7 +1648,7 @@
     }
     else if(subCommandName.equals(SC_ADD_GRACE_LOGIN_USE_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_ADD_GRACE_LOGIN_USE_TIME, a.getValue());
@@ -1632,7 +1660,7 @@
     }
     else if(subCommandName.equals(SC_SET_GRACE_LOGIN_USE_TIMES))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         ArrayList<String> valueList = new ArrayList<>(a.getValues());
@@ -1661,7 +1689,7 @@
     }
     else if(subCommandName.equals(SC_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME))
     {
-      Argument a = subCommand.getArgumentForName(ARG_OP_VALUE);
+      Argument a = subCommand.getArgumentForLongIdentifier(ARG_OP_VALUE);
       if (a != null && a.isPresent())
       {
         encode(writer, OP_SET_PASSWORD_CHANGED_BY_REQUIRED_TIME,
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java
index 235d904..b7fd810 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ManageTasks.java
@@ -22,12 +22,11 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS.
+ *      Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
 import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.DecodeException;
 import org.opends.server.backends.task.TaskState;
 import org.opends.server.core.DirectoryServer;
@@ -202,35 +201,36 @@
 
     // Initialize all the command-line argument types and register them with the parser
     try {
-       StringArgument propertiesFileArgument = new StringArgument(
-          "propertiesFilePath", null, OPTION_LONG_PROP_FILE_PATH, false, false,
-          true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      StringArgument propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      BooleanArgument noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      BooleanArgument noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      task = new StringArgument(
-              "info", 'i', "info",
-              false, true, INFO_TASK_ID_PLACEHOLDER.get(),
-              INFO_TASKINFO_TASK_ARG_DESCRIPTION.get());
-      argParser.addArgument(task);
-
-      cancel = new StringArgument(
-              "cancel", 'c', "cancel",
-              false, true, INFO_TASK_ID_PLACEHOLDER.get(),
-              INFO_TASKINFO_TASK_ARG_CANCEL.get());
-      argParser.addArgument(cancel);
-
-      summary = new BooleanArgument(
-              "summary", 's', "summary",
-              INFO_TASKINFO_SUMMARY_ARG_DESCRIPTION.get());
-      argParser.addArgument(summary);
+      task =
+              StringArgument.builder("info")
+                      .shortIdentifier('i')
+                      .description(INFO_TASKINFO_TASK_ARG_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_TASK_ID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      cancel =
+              StringArgument.builder("cancel")
+                      .shortIdentifier('c')
+                      .description(INFO_TASKINFO_TASK_ARG_CANCEL.get())
+                      .valuePlaceholder(INFO_TASK_ID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      summary =
+              BooleanArgument.builder("summary")
+                      .shortIdentifier('s')
+                      .description(INFO_TASKINFO_SUMMARY_ARG_DESCRIPTION.get())
+                      .buildAndAddToParser(argParser);
 
       noPrompt = CommonArguments.getNoPrompt();
       argParser.addArgument(noPrompt);
@@ -245,12 +245,7 @@
       return 1;
     }
 
-    try
-    {
-      argParser.getArguments().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ignored) {}
-
+    argParser.getArguments().initArgumentsWithConfiguration(argParser);
     // Parse the command-line arguments provided to this program.
     try {
       argParser.parseArguments(args);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
index b2d05e6..e08ce3d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/RebuildIndex.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS.
+ *      Portions Copyright 2011-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
@@ -242,53 +242,59 @@
     argParser.setShortToolDescription(REF_SHORT_DESC_REBUILD_INDEX.get());
 
     configClass =
-        new StringArgument("configclass", 'C', "configClass", true, false,
-            true, INFO_CONFIGCLASS_PLACEHOLDER.get(), ConfigFileHandler.class
-                .getName(), null, INFO_DESCRIPTION_CONFIG_CLASS.get());
-    configClass.setHidden(true);
-    argParser.addArgument(configClass);
-
+            StringArgument.builder("configClass")
+                    .shortIdentifier('C')
+                    .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                    .hidden()
+                    .required()
+                    .defaultValue(ConfigFileHandler.class.getName())
+                    .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                    .buildAndAddToParser(argParser);
     configFile =
-        new StringArgument("configfile", 'f', "configFile", true, false, true,
-            INFO_CONFIGFILE_PLACEHOLDER.get(), null, null,
-            INFO_DESCRIPTION_CONFIG_FILE.get());
-    configFile.setHidden(true);
-    argParser.addArgument(configFile);
+            StringArgument.builder("configFile")
+                    .shortIdentifier('f')
+                    .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                    .hidden()
+                    .required()
+                    .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                    .buildAndAddToParser(argParser);
 
-
-    baseDNString =
-        new StringArgument("basedn", 'b', "baseDN", true, isMultipleBackends,
-            true, INFO_BASEDN_PLACEHOLDER.get(), null, null,
-            INFO_REBUILDINDEX_DESCRIPTION_BASE_DN.get());
-    argParser.addArgument(baseDNString);
-
+    final StringArgument.Builder builder =
+            StringArgument.builder("baseDN")
+                    .shortIdentifier('b')
+                    .description(INFO_REBUILDINDEX_DESCRIPTION_BASE_DN.get())
+                    .required()
+                    .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get());
+    if (isMultipleBackends) {
+      builder.multiValued();
+    }
+    baseDNString = builder.buildAndAddToParser(argParser);
 
     indexList =
-        new StringArgument("index", 'i', "index", false, true, true,
-            INFO_INDEX_PLACEHOLDER.get(), null, null,
-            INFO_REBUILDINDEX_DESCRIPTION_INDEX_NAME.get());
-    argParser.addArgument(indexList);
-
+            StringArgument.builder("index")
+                    .shortIdentifier('i')
+                    .description(INFO_REBUILDINDEX_DESCRIPTION_INDEX_NAME.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_INDEX_PLACEHOLDER.get())
+                    .buildAndAddToParser(argParser);
     rebuildAll =
-        new BooleanArgument("rebuildAll", null, "rebuildAll",
-            INFO_REBUILDINDEX_DESCRIPTION_REBUILD_ALL.get());
-    argParser.addArgument(rebuildAll);
-
+            BooleanArgument.builder("rebuildAll")
+                    .description(INFO_REBUILDINDEX_DESCRIPTION_REBUILD_ALL.get())
+                    .buildAndAddToParser(argParser);
     rebuildDegraded =
-        new BooleanArgument("rebuildDegraded", null, "rebuildDegraded",
-            INFO_REBUILDINDEX_DESCRIPTION_REBUILD_DEGRADED.get());
-    argParser.addArgument(rebuildDegraded);
-
+            BooleanArgument.builder("rebuildDegraded")
+                    .description(INFO_REBUILDINDEX_DESCRIPTION_REBUILD_DEGRADED.get())
+                    .buildAndAddToParser(argParser);
     clearDegradedState =
-        new BooleanArgument("clearDegradedState", null, "clearDegradedState",
-            INFO_REBUILDINDEX_DESCRIPTION_CLEAR_DEGRADED_STATE.get());
-    argParser.addArgument(clearDegradedState);
-
+            BooleanArgument.builder("clearDegradedState")
+                    .description(INFO_REBUILDINDEX_DESCRIPTION_CLEAR_DEGRADED_STATE.get())
+                    .buildAndAddToParser(argParser);
     tmpDirectory =
-        new StringArgument("tmpdirectory", null, "tmpdirectory", false, false,
-            true, INFO_REBUILDINDEX_TEMP_DIR_PLACEHOLDER.get(), "import-tmp",
-            null, INFO_REBUILDINDEX_DESCRIPTION_TEMP_DIRECTORY.get());
-    argParser.addArgument(tmpDirectory);
+            StringArgument.builder("tmpdirectory")
+                    .description(INFO_REBUILDINDEX_DESCRIPTION_TEMP_DIRECTORY.get())
+                    .defaultValue("import-tmp")
+                    .valuePlaceholder(INFO_REBUILDINDEX_TEMP_DIR_PLACEHOLDER.get())
+                    .buildAndAddToParser(argParser);
 
     final BooleanArgument displayUsage = CommonArguments.getShowUsage();
     argParser.addArgument(displayUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java
index c069519..59fbc64 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/RestoreDB.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS.
+ *      Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
@@ -168,50 +168,45 @@
       argParser.setShortToolDescription(REF_SHORT_DESC_RESTORE.get());
 
       configClass =
-           new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                              OPTION_LONG_CONFIG_CLASS, true, false,
-                              true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                              ConfigFileHandler.class.getName(), null,
-                              INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       configFile =
-           new StringArgument("configfile", 'f', "configFile", true, false,
-                              true, INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       backupIDString =
-           new StringArgument("backupid", 'I', "backupID", false, false, true,
-                              INFO_BACKUPID_PLACEHOLDER.get(), null, null,
-                              INFO_RESTOREDB_DESCRIPTION_BACKUP_ID.get());
-      argParser.addArgument(backupIDString);
-
-
+              StringArgument.builder("backupID")
+                      .shortIdentifier('I')
+                      .description(INFO_RESTOREDB_DESCRIPTION_BACKUP_ID.get())
+                      .valuePlaceholder(INFO_BACKUPID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       backupDirectory =
-           new StringArgument("backupdirectory", 'd', "backupDirectory", true,
-                              false, true, INFO_BACKUPDIR_PLACEHOLDER.get(),
-                              null, null,
-                              INFO_RESTOREDB_DESCRIPTION_BACKUP_DIR.get());
-      argParser.addArgument(backupDirectory);
-
-
-      listBackups = new BooleanArgument(
-              "listbackups", 'l', "listBackups",
-              INFO_RESTOREDB_DESCRIPTION_LIST_BACKUPS.get());
-      argParser.addArgument(listBackups);
-
-
-      verifyOnly = new BooleanArgument(
-              "verifyonly", OPTION_SHORT_DRYRUN,
-              OPTION_LONG_DRYRUN,
-              INFO_RESTOREDB_DESCRIPTION_VERIFY_ONLY.get());
-      argParser.addArgument(verifyOnly);
-
+              StringArgument.builder("backupDirectory")
+                      .shortIdentifier('d')
+                      .description(INFO_RESTOREDB_DESCRIPTION_BACKUP_DIR.get())
+                      .required()
+                      .valuePlaceholder(INFO_BACKUPDIR_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      listBackups =
+              BooleanArgument.builder("listBackups")
+                      .shortIdentifier('l')
+                      .description(INFO_RESTOREDB_DESCRIPTION_LIST_BACKUPS.get())
+                      .buildAndAddToParser(argParser);
+      verifyOnly =
+              BooleanArgument.builder(OPTION_LONG_DRYRUN)
+                      .shortIdentifier(OPTION_SHORT_DRYRUN)
+                      .description(INFO_RESTOREDB_DESCRIPTION_VERIFY_ONLY.get())
+                      .buildAndAddToParser(argParser);
 
       displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
@@ -224,14 +219,7 @@
     }
 
     // Init the default values so that they can appear also on the usage.
-    try
-    {
-      argParser.getArguments().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ce)
-    {
-      // Ignore.
-    }
+    argParser.getArguments().initArgumentsWithConfiguration(argParser);
 
     // Parse the command-line arguments provided to this program.
     try
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java
index b763471..54d095f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/StopDS.java
@@ -22,11 +22,15 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS.
+ *      Portions Copyright 2011-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_BINDPWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_KEYSTORE_PWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_PORT_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -183,7 +187,6 @@
     argParser.setVersionHandler(new DirectoryServerVersionHandler());
     BooleanArgument   checkStoppability;
     BooleanArgument   quietMode;
-    BooleanArgument   windowsNetStop;
     BooleanArgument   restart;
     BooleanArgument   showUsage;
     BooleanArgument   trustAll;
@@ -208,179 +211,136 @@
 
     try
     {
-      propertiesFileArgument = new StringArgument("propertiesFilePath",
-          null, OPTION_LONG_PROP_FILE_PATH,
-          false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null,
-          INFO_DESCRIPTION_PROP_FILE_PATH.get());
-      argParser.addArgument(propertiesFileArgument);
+      propertiesFileArgument =
+              StringArgument.builder(OPTION_LONG_PROP_FILE_PATH)
+                      .description(INFO_DESCRIPTION_PROP_FILE_PATH.get())
+                      .valuePlaceholder(INFO_PROP_FILE_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       argParser.setFilePropertiesArgument(propertiesFileArgument);
 
-      noPropertiesFileArgument = new BooleanArgument(
-          "noPropertiesFileArgument", null, OPTION_LONG_NO_PROP_FILE,
-          INFO_DESCRIPTION_NO_PROP_FILE.get());
-      argParser.addArgument(noPropertiesFileArgument);
+      noPropertiesFileArgument =
+              BooleanArgument.builder(OPTION_LONG_NO_PROP_FILE)
+                      .description(INFO_DESCRIPTION_NO_PROP_FILE.get())
+                      .buildAndAddToParser(argParser);
       argParser.setNoPropertiesFileArgument(noPropertiesFileArgument);
 
-      host = new StringArgument("host", OPTION_SHORT_HOST,
-                                OPTION_LONG_HOST, false, false, true,
-                                INFO_HOST_PLACEHOLDER.get(), "127.0.0.1", null,
-                                INFO_STOPDS_DESCRIPTION_HOST.get());
-      host.setPropertyName(OPTION_LONG_HOST);
-      argParser.addArgument(host);
-
-      port = new IntegerArgument(
-              "port", OPTION_SHORT_PORT,
-              OPTION_LONG_PORT, false, false, true,
-              INFO_PORT_PLACEHOLDER.get(),
-              AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT,
-              null, true, 1,
-              true, 65535, INFO_STOPDS_DESCRIPTION_PORT.get());
-      port.setPropertyName(OPTION_LONG_PORT);
-      argParser.addArgument(port);
-
-      bindDN = new StringArgument("binddn", OPTION_SHORT_BINDDN,
-                                  OPTION_LONG_BINDDN, false, false, true,
-                                  INFO_BINDDN_PLACEHOLDER.get(), null, null,
-                                  INFO_STOPDS_DESCRIPTION_BINDDN.get());
-      bindDN.setPropertyName(OPTION_LONG_BINDDN);
-      argParser.addArgument(bindDN);
-
-      bindPW = new StringArgument("bindpw", OPTION_SHORT_BINDPWD,
-                                  OPTION_LONG_BINDPWD, false, false,
-                                  true,
-                                  INFO_BINDPWD_PLACEHOLDER.get(), null, null,
-                                  INFO_STOPDS_DESCRIPTION_BINDPW.get());
-      bindPW.setPropertyName(OPTION_LONG_BINDPWD);
-      argParser.addArgument(bindPW);
-
-      bindPWFile = new FileBasedArgument(
-              "bindpwfile",
-              OPTION_SHORT_BINDPWD_FILE,
-              OPTION_LONG_BINDPWD_FILE,
-              false, false,
-              INFO_BINDPWD_FILE_PLACEHOLDER.get(),
-              null, null,
-              INFO_STOPDS_DESCRIPTION_BINDPWFILE.get());
-      bindPWFile.setPropertyName(OPTION_LONG_BINDPWD_FILE);
-      argParser.addArgument(bindPWFile);
-
-      saslOption = new StringArgument(
-              "sasloption", OPTION_SHORT_SASLOPTION,
-              OPTION_LONG_SASLOPTION, false,
-              true, true,
-              INFO_SASL_OPTION_PLACEHOLDER.get(), null, null,
-              INFO_STOPDS_DESCRIPTION_SASLOPTIONS.get());
-      saslOption.setPropertyName(OPTION_LONG_SASLOPTION);
-      argParser.addArgument(saslOption);
-
-      proxyAuthzID = new StringArgument(
-              "proxyauthzid",
-              OPTION_SHORT_PROXYAUTHID,
-              OPTION_LONG_PROXYAUTHID, false,
-              false, true,
-              INFO_PROXYAUTHID_PLACEHOLDER.get(), null,
-              null,
-              INFO_STOPDS_DESCRIPTION_PROXYAUTHZID.get());
-      proxyAuthzID.setPropertyName(OPTION_LONG_PROXYAUTHID);
-      argParser.addArgument(proxyAuthzID);
-
-      stopReason = new StringArgument(
-              "stopreason", 'r', "stopReason", false,
-              false, true, INFO_STOP_REASON_PLACEHOLDER.get(), null, null,
-              INFO_STOPDS_DESCRIPTION_STOP_REASON.get());
-      stopReason.setPropertyName("stopReason");
-      argParser.addArgument(stopReason);
-
-      checkStoppability = new BooleanArgument("checkstoppability", null,
-              "checkStoppability",
-              INFO_STOPDS_CHECK_STOPPABILITY.get());
-      checkStoppability.setHidden(true);
-      argParser.addArgument(checkStoppability);
-
-      windowsNetStop = new BooleanArgument("windowsnetstop", null,
-          "windowsNetStop", INFO_STOPDS_DESCRIPTION_WINDOWS_NET_STOP.get());
-      windowsNetStop.setHidden(true);
-      argParser.addArgument(windowsNetStop);
+      host =
+              StringArgument.builder(OPTION_LONG_HOST)
+                      .shortIdentifier(OPTION_SHORT_HOST)
+                      .description(INFO_STOPDS_DESCRIPTION_HOST.get())
+                      .defaultValue("127.0.0.1")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      port =
+              IntegerArgument.builder(OPTION_LONG_PORT)
+                      .shortIdentifier(OPTION_SHORT_PORT)
+                      .description(INFO_STOPDS_DESCRIPTION_PORT.get())
+                      .range(1, 65535)
+                      .defaultValue(AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT)
+                      .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindDN =
+              StringArgument.builder(OPTION_LONG_BINDDN)
+                      .shortIdentifier(OPTION_SHORT_BINDDN)
+                      .description(INFO_STOPDS_DESCRIPTION_BINDDN.get())
+                      .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPW =
+              StringArgument.builder(OPTION_LONG_BINDPWD)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD)
+                      .description(INFO_STOPDS_DESCRIPTION_BINDPW.get())
+                      .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bindPWFile =
+              FileBasedArgument.builder(OPTION_LONG_BINDPWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                      .description(INFO_STOPDS_DESCRIPTION_BINDPWFILE.get())
+                      .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      saslOption =
+              StringArgument.builder(OPTION_LONG_SASLOPTION)
+                      .shortIdentifier(OPTION_SHORT_SASLOPTION)
+                      .description(INFO_STOPDS_DESCRIPTION_SASLOPTIONS.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_SASL_OPTION_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      proxyAuthzID =
+              StringArgument.builder(OPTION_LONG_PROXYAUTHID)
+                      .shortIdentifier(OPTION_SHORT_PROXYAUTHID)
+                      .description(INFO_STOPDS_DESCRIPTION_PROXYAUTHZID.get())
+                      .valuePlaceholder(INFO_PROXYAUTHID_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      stopReason =
+              StringArgument.builder("stopReason")
+                      .shortIdentifier('r')
+                      .description(INFO_STOPDS_DESCRIPTION_STOP_REASON.get())
+                      .valuePlaceholder(INFO_STOP_REASON_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      checkStoppability =
+              BooleanArgument.builder(OPTION_LONG_CHECK_STOPPABILITY)
+                      .description(INFO_STOPDS_CHECK_STOPPABILITY.get())
+                      .hidden()
+                      .buildAndAddToParser(argParser);
+      BooleanArgument.builder(OPTION_LONG_WINDOWS_NET_STOP)
+              .description(INFO_STOPDS_DESCRIPTION_WINDOWS_NET_STOP.get())
+              .hidden()
+              .buildAndAddToParser(argParser);
 
       restart = CommonArguments.getRestart();
       argParser.addArgument(restart);
 
-      stopTimeStr = new StringArgument("stoptime", 't', "stopTime", false,
-                                       false, true,
-                                       INFO_STOP_TIME_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_STOPDS_DESCRIPTION_STOP_TIME.get());
-      stopTimeStr.setPropertyName("stopTime");
-      argParser.addArgument(stopTimeStr);
+      stopTimeStr =
+              StringArgument.builder("stopTime")
+                      .shortIdentifier('t')
+                      .description(INFO_STOPDS_DESCRIPTION_STOP_TIME.get())
+                      .valuePlaceholder(INFO_STOP_TIME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       trustAll = CommonArguments.getTrustAll();
       argParser.addArgument(trustAll);
 
-      keyStoreFile = new StringArgument("keystorefile",
-                                        OPTION_SHORT_KEYSTOREPATH,
-                                        OPTION_LONG_KEYSTOREPATH,
-                                        false, false, true,
-                                        INFO_KEYSTOREPATH_PLACEHOLDER.get(),
-                                        null, null,
-                                        INFO_STOPDS_DESCRIPTION_KSFILE.get());
-      keyStoreFile.setPropertyName(OPTION_LONG_KEYSTOREPATH);
-      argParser.addArgument(keyStoreFile);
-
-      keyStorePW = new StringArgument("keystorepw", OPTION_SHORT_KEYSTORE_PWD,
-                                      OPTION_LONG_KEYSTORE_PWD,
-                                      false, false, true,
-                                      INFO_KEYSTORE_PWD_PLACEHOLDER.get(),
-                                      null, null,
-                                      INFO_STOPDS_DESCRIPTION_KSPW.get());
-      keyStorePW.setPropertyName(OPTION_LONG_KEYSTORE_PWD);
-      argParser.addArgument(keyStorePW);
-
-      keyStorePWFile = new FileBasedArgument(
-              "keystorepwfile",
-              OPTION_SHORT_KEYSTORE_PWD_FILE,
-              OPTION_LONG_KEYSTORE_PWD_FILE,
-              false, false,
-              INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(),
-              null, null,
-              INFO_STOPDS_DESCRIPTION_KSPWFILE.get());
-      keyStorePWFile.setPropertyName(OPTION_LONG_KEYSTORE_PWD_FILE);
-      argParser.addArgument(keyStorePWFile);
-
-      certNickname = new StringArgument(
-              "certnickname", 'N', "certNickname",
-              false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null,
-              null, INFO_DESCRIPTION_CERT_NICKNAME.get());
-      certNickname.setPropertyName("certNickname");
-      argParser.addArgument(certNickname);
-
-      trustStoreFile = new StringArgument("truststorefile",
-                                          OPTION_SHORT_TRUSTSTOREPATH,
-                                          OPTION_LONG_TRUSTSTOREPATH,
-                                          false, false, true,
-                                          INFO_TRUSTSTOREPATH_PLACEHOLDER.get(),
-                                          null, null,
-                                          INFO_STOPDS_DESCRIPTION_TSFILE.get());
-      trustStoreFile.setPropertyName(OPTION_LONG_TRUSTSTOREPATH);
-      argParser.addArgument(trustStoreFile);
-
-      trustStorePW = new StringArgument(
-              "truststorepw", 'T',
-              OPTION_LONG_TRUSTSTORE_PWD,
-              false, false,
-              true, INFO_TRUSTSTORE_PWD_PLACEHOLDER.get(), null,
-              null, INFO_STOPDS_DESCRIPTION_TSPW.get());
-      trustStorePW.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD);
-      argParser.addArgument(trustStorePW);
-
-      trustStorePWFile = new FileBasedArgument("truststorepwfile",
-                                  OPTION_SHORT_TRUSTSTORE_PWD_FILE,
-                                  OPTION_LONG_TRUSTSTORE_PWD_FILE,
-                                  false, false,
-                                  INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get(),
-                                  null, null,
-                                  INFO_STOPDS_DESCRIPTION_TSPWFILE.get());
-      trustStorePWFile.setPropertyName(OPTION_LONG_TRUSTSTORE_PWD_FILE);
-      argParser.addArgument(trustStorePWFile);
+      keyStoreFile =
+              StringArgument.builder(OPTION_LONG_KEYSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_KEYSTOREPATH)
+                      .description(INFO_STOPDS_DESCRIPTION_KSFILE.get())
+                      .valuePlaceholder(INFO_KEYSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      keyStorePW =
+              StringArgument.builder(OPTION_LONG_KEYSTORE_PWD)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD)
+                      .description(INFO_STOPDS_DESCRIPTION_KSPW.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      keyStorePWFile =
+              FileBasedArgument.builder(OPTION_LONG_KEYSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_KEYSTORE_PWD_FILE)
+                      .description(INFO_STOPDS_DESCRIPTION_KSPWFILE.get())
+                      .valuePlaceholder(INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      certNickname =
+              StringArgument.builder("certNickname")
+                      .shortIdentifier('N')
+                      .description(INFO_DESCRIPTION_CERT_NICKNAME.get())
+                      .valuePlaceholder(INFO_NICKNAME_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustStoreFile =
+              StringArgument.builder(OPTION_LONG_TRUSTSTOREPATH)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTOREPATH)
+                      .description(INFO_STOPDS_DESCRIPTION_TSFILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTOREPATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustStorePW =
+              StringArgument.builder(OPTION_LONG_TRUSTSTORE_PWD)
+                      .shortIdentifier('T')
+                      .description(INFO_STOPDS_DESCRIPTION_TSPW.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      trustStorePWFile =
+              FileBasedArgument.builder(OPTION_LONG_TRUSTSTORE_PWD_FILE)
+                      .shortIdentifier(OPTION_SHORT_TRUSTSTORE_PWD_FILE)
+                      .description(INFO_STOPDS_DESCRIPTION_TSPWFILE.get())
+                      .valuePlaceholder(INFO_TRUSTSTORE_PWD_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       quietMode = CommonArguments.getQuiet();
       argParser.addArgument(quietMode);
@@ -711,24 +671,19 @@
       quietMode = true;
     }
 
-    BooleanArgument restart =
-      (BooleanArgument)argParser.getArgumentForLongID(OPTION_LONG_RESTART);
-    boolean restartPresent = restart.isPresent();
-    BooleanArgument windowsNetStop =
-      (BooleanArgument)argParser.getArgumentForLongID("windowsnetstop");
-    boolean windowsNetStopPresent = windowsNetStop.isPresent();
+    final boolean restartPresent = argParser.getArgumentForLongID(OPTION_LONG_RESTART).isPresent();
+    final boolean windowsNetStopPresent = argParser.getArgumentForLongID(OPTION_LONG_WINDOWS_NET_STOP).isPresent();
 
     // Check if this is a stop through protocol.
-    LinkedList<Argument> list = argParser.getArgumentList();
     boolean stopThroughProtocol = false;
-    for (Argument arg: list)
+    for (final Argument arg: argParser.getArgumentList())
     {
-      if (!OPTION_LONG_RESTART.toLowerCase().equals(arg.getName()) &&
-          !OPTION_LONG_QUIET.equals(arg.getName()) &&
-          !OPTION_LONG_HELP.toLowerCase().equals(arg.getName()) &&
-          !"checkstoppability".equals(arg.getName()) &&
-          !"windowsnetstop".equals(arg.getName()) &&
-          ! OPTION_LONG_NO_PROP_FILE.equals(arg.getLongIdentifier()))
+      if (!OPTION_LONG_RESTART.equals(arg.getLongIdentifier()) &&
+          !OPTION_LONG_QUIET.equals(arg.getLongIdentifier()) &&
+          !OPTION_LONG_HELP.equals(arg.getLongIdentifier()) &&
+          !OPTION_LONG_CHECK_STOPPABILITY.equals(arg.getLongIdentifier()) &&
+          !OPTION_LONG_WINDOWS_NET_STOP.equals(arg.getLongIdentifier()) &&
+          !OPTION_LONG_NO_PROP_FILE.equals(arg.getLongIdentifier()))
       {
         stopThroughProtocol |= arg.isPresent();
       }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java
index 7b62df8..840853f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/VerifyIndex.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS.
+ *      Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.opends.server.tools;
 
@@ -128,48 +128,45 @@
     try
     {
       configClass =
-           new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                              OPTION_LONG_CONFIG_CLASS, true, false,
-                              true, INFO_CONFIGCLASS_PLACEHOLDER.get(),
-                              ConfigFileHandler.class.getName(), null,
-                              INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .required()
+                      .defaultValue(ConfigFileHandler.class.getName())
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       configFile =
-           new StringArgument("configfile", 'f', "configFile", true, false,
-                              true, INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                              null,
-                              INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
+              StringArgument.builder("configFile")
+                      .shortIdentifier('f')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       baseDNString =
-           new StringArgument("basedn", OPTION_SHORT_BASEDN,
-                              OPTION_LONG_BASEDN, true, false, true,
-                              INFO_BASEDN_PLACEHOLDER.get(), null, null,
-                              INFO_VERIFYINDEX_DESCRIPTION_BASE_DN.get());
-      argParser.addArgument(baseDNString);
-
-
+              StringArgument.builder(OPTION_LONG_BASEDN)
+                      .shortIdentifier(OPTION_SHORT_BASEDN)
+                      .description(INFO_VERIFYINDEX_DESCRIPTION_BASE_DN.get())
+                      .required()
+                      .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       indexList =
-           new StringArgument("index", 'i', "index",
-                              false, true, true,
-                              INFO_INDEX_PLACEHOLDER.get(), null, null,
-                              INFO_VERIFYINDEX_DESCRIPTION_INDEX_NAME.get());
-      argParser.addArgument(indexList);
-
+              StringArgument.builder("index")
+                      .shortIdentifier('i')
+                      .description(INFO_VERIFYINDEX_DESCRIPTION_INDEX_NAME.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_INDEX_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       cleanMode =
-           new BooleanArgument("clean", 'c', "clean",
-                               INFO_VERIFYINDEX_DESCRIPTION_VERIFY_CLEAN.get());
-      argParser.addArgument(cleanMode);
-
+              BooleanArgument.builder("clean")
+                      .shortIdentifier('c')
+                      .description(INFO_VERIFYINDEX_DESCRIPTION_VERIFY_CLEAN.get())
+                      .buildAndAddToParser(argParser);
       countErrors =
-           new BooleanArgument("counterrors", null, "countErrors",
-                               INFO_VERIFYINDEX_DESCRIPTION_COUNT_ERRORS.get());
-      argParser.addArgument(countErrors);
+              BooleanArgument.builder("countErrors")
+                      .description(INFO_VERIFYINDEX_DESCRIPTION_COUNT_ERRORS.get())
+                      .buildAndAddToParser(argParser);
 
       displayUsage = CommonArguments.getShowUsage();
       argParser.addArgument(displayUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java
index 50d0d59..8e64b31 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/WaitForFileDelete.java
@@ -180,42 +180,40 @@
     try
     {
       targetFilePath =
-           new StringArgument("targetfile", 'f', "targetFile", true, false,
-                              true, INFO_PATH_PLACEHOLDER.get(), null, null,
-                              INFO_WAIT4DEL_DESCRIPTION_TARGET_FILE.get());
-      argParser.addArgument(targetFilePath);
+              StringArgument.builder("targetFile")
+                      .shortIdentifier('f')
+                      .description(INFO_WAIT4DEL_DESCRIPTION_TARGET_FILE.get())
+                      .required()
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      logFilePath =
+              StringArgument.builder("logFile")
+                      .shortIdentifier('l')
+                      .description(INFO_WAIT4DEL_DESCRIPTION_LOG_FILE.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      outputFilePath =
+              StringArgument.builder("outputFile")
+                      .shortIdentifier('o')
+                      .description(INFO_WAIT4DEL_DESCRIPTION_OUTPUT_FILE.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      timeout =
+              IntegerArgument.builder("timeout")
+                      .shortIdentifier('t')
+                      .description(INFO_WAIT4DEL_DESCRIPTION_TIMEOUT.get())
+                      .required()
+                      .lowerBound(0)
+                      .defaultValue(DirectoryServer.DEFAULT_TIMEOUT)
+                      .valuePlaceholder(INFO_SECONDS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
 
-      logFilePath = new StringArgument(
-              "logfile", 'l', "logFile", false, false,
-              true, INFO_PATH_PLACEHOLDER.get(), null, null,
-              INFO_WAIT4DEL_DESCRIPTION_LOG_FILE.get());
-      argParser.addArgument(logFilePath);
-
-
-      outputFilePath = new StringArgument(
-              "outputfile", 'o', "outputFile",
-              false, false,
-              true, INFO_PATH_PLACEHOLDER.get(), null, null,
-              INFO_WAIT4DEL_DESCRIPTION_OUTPUT_FILE.get());
-      argParser.addArgument(outputFilePath);
-
-
-      timeout = new IntegerArgument("timeout", 't', "timeout", true, false,
-                                    true, INFO_SECONDS_PLACEHOLDER.get(),
-                                    DirectoryServer.DEFAULT_TIMEOUT,
-                                    null, true, 0, false,
-                                    0, INFO_WAIT4DEL_DESCRIPTION_TIMEOUT.get());
-      argParser.addArgument(timeout);
-
-
-      // Not used in this class, but required by the start-ds script
-      // (see issue #3814)
-      useLastKnownGoodConfig =
-           new BooleanArgument("lastknowngoodconfig", 'L',
-                               "useLastKnownGoodConfig",
-                               INFO_DSCORE_DESCRIPTION_LASTKNOWNGOODCFG.get());
-      argParser.addArgument(useLastKnownGoodConfig);
+      // Not used in this class, but required by the start-ds script (see issue #3814)
+      BooleanArgument.builder("useLastKnownGoodConfig")
+              .shortIdentifier('L')
+              .description(INFO_DSCORE_DESCRIPTION_LASTKNOWNGOODCFG.get())
+              .buildAndAddToParser(argParser);
 
       // Not used in this class, but required by the start-ds script (see issue #3814)
       quietMode = CommonArguments.getQuiet();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java
index 76f4f9f..a9ed4ac 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliArgumentParser.java
@@ -27,6 +27,8 @@
 package org.opends.server.tools.dsreplication;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_BINDPWD_FILE_PLACEHOLDER;
+import static com.forgerock.opendj.cli.CliMessages.INFO_PORT_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.AdminToolMessages.*;
@@ -199,6 +201,9 @@
   /** the 'change-number' argument for task reset-changenumber. */
   IntegerArgument resetChangeNumber;
 
+  /** The "adminUid" non hidden argument */
+  StringArgument adminUidArg;
+
   /** The text of the enable replication subcommand. */
   static final String ENABLE_REPLICATION_SUBCMD_NAME = "enable";
   /** The text of the disable replication subcommand. */
@@ -417,35 +422,33 @@
 
     int index = 0;
 
-    baseDNsArg = new StringArgument("baseDNs", OPTION_SHORT_BASEDN,
-        OPTION_LONG_BASEDN, false, true, true, INFO_BASEDN_PLACEHOLDER.get(),
-        null,
-        null, INFO_DESCRIPTION_REPLICATION_BASEDNS.get());
-    baseDNsArg.setPropertyName(OPTION_LONG_BASEDN);
+    baseDNsArg =
+            StringArgument.builder(OPTION_LONG_BASEDN)
+                    .shortIdentifier(OPTION_SHORT_BASEDN)
+                    .description(INFO_DESCRIPTION_REPLICATION_BASEDNS.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                    .buildArgument();
     defaultArgs.add(index++, baseDNsArg);
 
-    secureArgsList.adminUidArg = new StringArgument("adminUID", 'I',
-        OPTION_LONG_ADMIN_UID, false, false, true,
-        INFO_ADMINUID_PLACEHOLDER.get(),
-        Constants.GLOBAL_ADMIN_UID, null,
-        INFO_DESCRIPTION_REPLICATION_ADMIN_UID.get(
-            ENABLE_REPLICATION_SUBCMD_NAME));
-    getAdminUidArg().setPropertyName(OPTION_LONG_ADMIN_UID);
-    getAdminUidArg().setHidden(false);
-    defaultArgs.add(index++, getAdminUidArg());
+    adminUidArg = CommonArguments.getAdminUid(
+            INFO_DESCRIPTION_REPLICATION_ADMIN_UID.get(ENABLE_REPLICATION_SUBCMD_NAME));
+    defaultArgs.add(index++, adminUidArg);
 
-    secureArgsList.bindPasswordArg = new StringArgument(
-        OPTION_LONG_ADMIN_PWD.toLowerCase(),
-        OPTION_SHORT_BINDPWD, OPTION_LONG_ADMIN_PWD, false, false, true,
-        INFO_BINDPWD_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORD.get());
+    secureArgsList.bindPasswordArg =
+            StringArgument.builder(OPTION_LONG_ADMIN_PWD)
+                    .shortIdentifier(OPTION_SHORT_BINDPWD)
+                    .description(INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORD.get())
+                    .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                    .buildArgument();
     defaultArgs.add(index++, secureArgsList.bindPasswordArg);
 
-    secureArgsList.bindPasswordFileArg = new FileBasedArgument(
-        OPTION_LONG_ADMIN_PWD_FILE.toLowerCase(),
-        OPTION_SHORT_BINDPWD_FILE, OPTION_LONG_ADMIN_PWD_FILE, false, false,
-        INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get());
+    secureArgsList.bindPasswordFileArg =
+            FileBasedArgument.builder(OPTION_LONG_ADMIN_PWD_FILE)
+                    .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                    .description(INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get())
+                    .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                    .buildArgument();
     defaultArgs.add(index++, secureArgsList.bindPasswordFileArg);
 
     defaultArgs.remove(verboseArg);
@@ -476,12 +479,6 @@
     configFileArg = CommonArguments.getConfigFile();
     defaultArgs.add(index++, configFileArg);
 
-    for (int i=0; i<index; i++)
-    {
-      Argument arg = defaultArgs.get(i);
-      arg.setPropertyName(arg.getLongIdentifier());
-    }
-
     this.propertiesFileArgument = CommonArguments.getPropertiesFile();
     defaultArgs.add(this.propertiesFileArgument);
     setFilePropertiesArgument(this.propertiesFileArgument);
@@ -534,136 +531,145 @@
     createServerArgs1();
     createServerArgs2();
 
-    skipPortCheckArg = new BooleanArgument(
-        "skipportcheck", 'S', "skipPortCheck",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_SKIPPORT.get());
-
-    noSchemaReplicationArg = new BooleanArgument(
-        "noschemareplication", null, "noSchemaReplication",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_NO_SCHEMA_REPLICATION.get());
-
-    useSecondServerAsSchemaSourceArg = new BooleanArgument(
-        "usesecondserverasschemasource", null, "useSecondServerAsSchemaSource",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_USE_SECOND_AS_SCHEMA_SOURCE.get(
-            "--"+noSchemaReplicationArg.getLongIdentifier()));
+    skipPortCheckArg =
+            BooleanArgument.builder("skipPortCheck")
+                    .shortIdentifier('S')
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_SKIPPORT.get())
+                    .buildArgument();
+    noSchemaReplicationArg =
+            BooleanArgument.builder("noSchemaReplication")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_NO_SCHEMA_REPLICATION.get())
+                    .buildArgument();
+    useSecondServerAsSchemaSourceArg =
+            BooleanArgument.builder("useSecondServerAsSchemaSource")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_USE_SECOND_AS_SCHEMA_SOURCE.get(
+                            "--" + noSchemaReplicationArg.getLongIdentifier()))
+                    .buildArgument();
 
     enableReplicationSubCmd = new SubCommand(this,
         ENABLE_REPLICATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_ENABLE_REPLICATION.get());
-
-    Argument[] argsToAdd = {
-          server1.hostNameArg, server1.portArg, server1.bindDnArg, server1.bindPasswordArg,
-          server1.bindPasswordFileArg, server1.replicationPortArg, server1.secureReplicationArg,
-          server1.noReplicationServerArg, server1.onlyReplicationServerArg,
-          server2.hostNameArg, server2.portArg, server2.bindDnArg, server2.bindPasswordArg,
-          server2.bindPasswordFileArg, server2.replicationPortArg, server2.secureReplicationArg,
-          server2.noReplicationServerArg, server2.onlyReplicationServerArg,
-          skipPortCheckArg, noSchemaReplicationArg, useSecondServerAsSchemaSourceArg
-    };
-    for (Argument arg : argsToAdd)
-    {
-      arg.setPropertyName(arg.getLongIdentifier());
-      enableReplicationSubCmd.addArgument(arg);
-    }
+    addArgumentsToSubCommand(enableReplicationSubCmd,
+            server1.hostNameArg, server1.portArg, server1.bindDnArg, server1.bindPasswordArg,
+            server1.bindPasswordFileArg, server1.replicationPortArg, server1.secureReplicationArg,
+            server1.noReplicationServerArg, server1.onlyReplicationServerArg,
+            server2.hostNameArg, server2.portArg, server2.bindDnArg, server2.bindPasswordArg,
+            server2.bindPasswordFileArg, server2.replicationPortArg, server2.secureReplicationArg,
+            server2.noReplicationServerArg, server2.onlyReplicationServerArg,
+            skipPortCheckArg, noSchemaReplicationArg, useSecondServerAsSchemaSourceArg);
   }
 
   private void createServerArgs1() throws ArgumentException
   {
     ServerArgs server = server1;
-    server.hostNameArg = new StringArgument("host1", OPTION_SHORT_HOST,
-        "host1", false, false, true, INFO_HOST_PLACEHOLDER.get(),
-        getDefaultHostValue(),
-        null, INFO_DESCRIPTION_ENABLE_REPLICATION_HOST1.get());
-
-    server.portArg = new IntegerArgument("port1", OPTION_SHORT_PORT, "port1",
-        false, false, true, INFO_PORT_PLACEHOLDER.get(),
-        defaultAdminPort, null,
-        true, 1,
-        true, 65336,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT1.get());
-
-    server.bindDnArg = new StringArgument("bindDN1", OPTION_SHORT_BINDDN,
-        "bindDN1", false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
-        "cn=Directory Manager", null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN1.get());
-
-    server.bindPasswordArg = new StringArgument("bindPassword1",
-        null, "bindPassword1", false, false, true,
-        INFO_BINDPWD_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORD1.get());
-
-    server.bindPasswordFileArg = new FileBasedArgument("bindPasswordFile1",
-        null, "bindPasswordFile1", false, false,
-        INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE1.get());
-
-    server.replicationPortArg = new IntegerArgument("replicationPort1", 'r',
-        "replicationPort1", false, false, true, INFO_PORT_PLACEHOLDER.get(),
-        8989, null,
-        true, 1,
-        true, 65336,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_PORT1.get());
-
-    server.secureReplicationArg = new BooleanArgument("secureReplication1", null,
-        "secureReplication1",
-        INFO_DESCRIPTION_ENABLE_SECURE_REPLICATION1.get());
-
-    server.noReplicationServerArg = new BooleanArgument(
-        "noreplicationserver1", null, "noReplicationServer1",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_NO_REPLICATION_SERVER1.get());
-
-    server.onlyReplicationServerArg = new BooleanArgument(
-        "onlyreplicationserver1", null, "onlyReplicationServer1",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_ONLY_REPLICATION_SERVER1.get());
+    server.hostNameArg =
+            StringArgument.builder("host1")
+                    .shortIdentifier(OPTION_SHORT_HOST)
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_HOST1.get())
+                    .defaultValue(secureArgsList.getDefaultHostName())
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
+    server.portArg =
+            IntegerArgument.builder("port1")
+                    .shortIdentifier(OPTION_SHORT_PORT)
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT1.get())
+                    .range(1, 65336)
+                    .defaultValue(defaultAdminPort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
+    server.bindDnArg =
+            StringArgument.builder("bindDN1")
+                    .shortIdentifier(OPTION_SHORT_BINDDN)
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN1.get())
+                    .defaultValue("cn=Directory Manager")
+                    .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                    .buildArgument();
+    server.bindPasswordArg =
+            StringArgument.builder("bindPassword1")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORD1.get())
+                    .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                    .buildArgument();
+    server.bindPasswordFileArg =
+            FileBasedArgument.builder("bindPasswordFile1")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE1.get())
+                    .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                    .buildArgument();
+    server.replicationPortArg =
+            IntegerArgument.builder("replicationPort1")
+                    .shortIdentifier('r')
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_PORT1.get())
+                    .range(1, 65336)
+                    .defaultValue(8989)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
+    server.secureReplicationArg =
+            BooleanArgument.builder("secureReplication1")
+                    .description(INFO_DESCRIPTION_ENABLE_SECURE_REPLICATION1.get())
+                    .buildArgument();
+    server.noReplicationServerArg =
+            BooleanArgument.builder("noReplicationServer1")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_NO_REPLICATION_SERVER1.get())
+                    .buildArgument();
+    server.onlyReplicationServerArg =
+            BooleanArgument.builder("onlyReplicationServer1")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_ONLY_REPLICATION_SERVER1.get())
+                    .buildArgument();
   }
 
   private void createServerArgs2() throws ArgumentException
   {
     ServerArgs server = server2;
-    server.hostNameArg = new StringArgument("host2", 'O',
-        "host2", false, false, true, INFO_HOST_PLACEHOLDER.get(),
-        getDefaultHostValue(),
-        null, INFO_DESCRIPTION_ENABLE_REPLICATION_HOST2.get());
-
-    server.portArg = new IntegerArgument("port2", null, "port2",
-        false, false, true, INFO_PORT_PLACEHOLDER.get(), defaultAdminPort, null,
-        true, 1,
-        true, 65336,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT2.get());
-
-    server.bindDnArg = new StringArgument("bindDN2", null,
-        "bindDN2", false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
-        "cn=Directory Manager", null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN2.get());
-
-    server.bindPasswordArg = new StringArgument("bindPassword2",
-        null, "bindPassword2", false, false, true,
-        INFO_BINDPWD_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORD2.get());
-
-    server.bindPasswordFileArg = new FileBasedArgument("bindPasswordFile2",
-        'F', "bindPasswordFile2", false, false,
-        INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE2.get());
-
-    server.replicationPortArg = new IntegerArgument("replicationPort2", 'R',
-        "replicationPort2", false, false, true, INFO_PORT_PLACEHOLDER.get(),
-        8989, null,
-        true, 1,
-        true, 65336,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_PORT2.get());
-
-    server.secureReplicationArg = new BooleanArgument("secureReplication2", null,
-        "secureReplication2",
-        INFO_DESCRIPTION_ENABLE_SECURE_REPLICATION2.get());
-
-    server.noReplicationServerArg = new BooleanArgument(
-        "noreplicationserver2", null, "noReplicationServer2",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_NO_REPLICATION_SERVER2.get());
-
-    server.onlyReplicationServerArg = new BooleanArgument(
-        "onlyreplicationserver2", null, "onlyReplicationServer2",
-        INFO_DESCRIPTION_ENABLE_REPLICATION_ONLY_REPLICATION_SERVER2.get());
+    server.hostNameArg =
+            StringArgument.builder("host2")
+                    .shortIdentifier('O')
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_HOST2.get())
+                    .defaultValue(secureArgsList.getDefaultHostName())
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
+    server.portArg =
+            IntegerArgument.builder("port2")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_SERVER_PORT2.get())
+                    .range(1, 65336)
+                    .defaultValue(defaultAdminPort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
+    server.bindDnArg =
+            StringArgument.builder("bindDN2")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN2.get())
+                    .defaultValue("cn=Directory Manager")
+                    .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                    .buildArgument();
+    server.bindPasswordArg =
+            StringArgument.builder("bindPassword2")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORD2.get())
+                    .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                    .buildArgument();
+    server.bindPasswordFileArg =
+            FileBasedArgument.builder("bindPasswordFile2")
+                    .shortIdentifier('F')
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE2.get())
+                    .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                    .buildArgument();
+    server.replicationPortArg =
+            IntegerArgument.builder("replicationPort2")
+                    .shortIdentifier('R')
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_PORT2.get())
+                    .range(1, 65336)
+                    .defaultValue(8989)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
+    server.secureReplicationArg =
+            BooleanArgument.builder("secureReplication2")
+                    .description(INFO_DESCRIPTION_ENABLE_SECURE_REPLICATION2.get())
+                    .buildArgument();
+    server.noReplicationServerArg =
+            BooleanArgument.builder("noReplicationServer2")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_NO_REPLICATION_SERVER2.get())
+                    .buildArgument();
+    server.onlyReplicationServerArg =
+            BooleanArgument.builder("onlyReplicationServer2")
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_ONLY_REPLICATION_SERVER2.get())
+                    .buildArgument();
   }
 
   /**
@@ -678,18 +684,22 @@
     disableReplicationSubCmd = new SubCommand(this,
         DISABLE_REPLICATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_DISABLE_REPLICATION.get());
-    secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
-    secureArgsList.bindDnArg = new StringArgument("bindDN", OPTION_SHORT_BINDDN,
-        OPTION_LONG_BINDDN, false, false, true, INFO_BINDDN_PLACEHOLDER.get(),
-        "cn=Directory Manager", OPTION_LONG_BINDDN,
-        INFO_DESCRIPTION_DISABLE_REPLICATION_BINDDN.get());
-    disableReplicationServerArg = new BooleanArgument(
-        "disablereplicationserver", null, "disableReplicationServer",
-        INFO_DESCRIPTION_DISABLE_REPLICATION_SERVER.get());
-    disableAllArg = new BooleanArgument(
-        "disableall", 'a', "disableAll",
-        INFO_DESCRIPTION_DISABLE_ALL.get());
-
+    secureArgsList.bindDnArg =
+            StringArgument.builder(OPTION_LONG_BINDDN)
+                    .shortIdentifier(OPTION_SHORT_BINDDN)
+                    .description(INFO_DESCRIPTION_DISABLE_REPLICATION_BINDDN.get())
+                    .defaultValue("cn=Directory Manager")
+                    .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                    .buildArgument();
+    disableReplicationServerArg =
+            BooleanArgument.builder("disableReplicationServer")
+                    .shortIdentifier('a')
+                    .description(INFO_DESCRIPTION_DISABLE_REPLICATION_SERVER.get())
+                    .buildArgument();
+    disableAllArg =
+            BooleanArgument.builder("disableAll")
+                    .description(INFO_DESCRIPTION_DISABLE_ALL.get())
+                    .buildArgument();
 
     Argument[] argsToAdd = { secureArgsList.hostNameArg,
         secureArgsList.portArg, secureArgsList.bindDnArg,
@@ -708,39 +718,42 @@
   {
     initializeReplicationSubCmd = new SubCommand(this, INITIALIZE_REPLICATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_INITIALIZE_REPLICATION.get(INITIALIZE_ALL_REPLICATION_SUBCMD_NAME));
-
-    Argument[] argsToAdd = {
-        hostNameSourceArg, portSourceArg, hostNameDestinationArg, portDestinationArg
-    };
-    setSubCommandArguments(initializeReplicationSubCmd, argsToAdd);
+    addArgumentsToSubCommand(initializeReplicationSubCmd,
+        hostNameSourceArg, portSourceArg, hostNameDestinationArg, portDestinationArg);
   }
 
   private void createRelatedServersOptions() throws ArgumentException
   {
-    hostNameSourceArg = new StringArgument("hostSource", OPTION_SHORT_HOST,
-        "hostSource", false, false, true, INFO_HOST_PLACEHOLDER.get(),
-        getDefaultHostValue(), null,
-        INFO_DESCRIPTION_INITIALIZE_REPLICATION_HOST_SOURCE.get());
-
-    portSourceArg = new IntegerArgument("portSource", OPTION_SHORT_PORT,
-        "portSource", false, false, true, INFO_PORT_PLACEHOLDER.get(),
-        defaultAdminPort, null,
-        true, 1,
-        true, 65336,
-        INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_SOURCE.get());
-
-    hostNameDestinationArg = new StringArgument("hostDestination", 'O',
-        "hostDestination", false, false, true, INFO_HOST_PLACEHOLDER.get(),
-        getDefaultHostValue(), null,
-        INFO_DESCRIPTION_INITIALIZE_REPLICATION_HOST_DESTINATION.get());
-
-    portDestinationArg = new IntegerArgument("portDestination", null,
-        "portDestination", false, false, true, INFO_PORT_PLACEHOLDER.get(),
-        defaultAdminPort,
-        null,
-        true, 1,
-        true, 65336,
-        INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_DESTINATION.get());
+    final String defaultHostName = secureArgsList.getDefaultHostName();
+    hostNameSourceArg =
+            StringArgument.builder("hostSource")
+                    .shortIdentifier(OPTION_SHORT_HOST)
+                    .description(INFO_DESCRIPTION_INITIALIZE_REPLICATION_HOST_SOURCE.get())
+                    .defaultValue(defaultHostName)
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
+    portSourceArg =
+            IntegerArgument.builder("portSource")
+                    .shortIdentifier(OPTION_SHORT_PORT)
+                    .description(INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_SOURCE.get())
+                    .range(1, 65336)
+                    .defaultValue(defaultAdminPort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
+    hostNameDestinationArg =
+            StringArgument.builder("hostDestination")
+                    .shortIdentifier('O')
+                    .description(INFO_DESCRIPTION_INITIALIZE_REPLICATION_HOST_DESTINATION.get())
+                    .defaultValue(defaultHostName)
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
+    portDestinationArg =
+            IntegerArgument.builder("portDestination")
+                    .description(INFO_DESCRIPTION_INITIALIZE_REPLICATION_SERVER_PORT_DESTINATION.get())
+                    .range(1, 65336)
+                    .defaultValue(defaultAdminPort)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
   }
 
   /**
@@ -756,7 +769,6 @@
         INITIALIZE_ALL_REPLICATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_INITIALIZE_ALL_REPLICATION.get(
             INITIALIZE_REPLICATION_SUBCMD_NAME));
-    secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
     Argument[] argsToAdd = { secureArgsList.hostNameArg,
         secureArgsList.portArg };
     for (Argument arg : argsToAdd)
@@ -779,13 +791,12 @@
         PRE_EXTERNAL_INITIALIZATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_PRE_EXTERNAL_INITIALIZATION.get(
             POST_EXTERNAL_INITIALIZATION_SUBCMD_NAME));
-    secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
-    BooleanArgument externalInitializationLocalOnlyArg = new BooleanArgument(
-        "local-only",
-        'l',
-        "local-only",
-        LocalizableMessage.EMPTY);
-    externalInitializationLocalOnlyArg.setHidden(true);
+    BooleanArgument externalInitializationLocalOnlyArg =
+            BooleanArgument.builder("local-only")
+                    .shortIdentifier('l')
+                    .description(LocalizableMessage.EMPTY)
+                    .hidden()
+                    .buildArgument();
 
     Argument[] argsToAdd = { secureArgsList.hostNameArg,
         secureArgsList.portArg,
@@ -811,7 +822,6 @@
         POST_EXTERNAL_INITIALIZATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_POST_EXTERNAL_INITIALIZATION.get(
             PRE_EXTERNAL_INITIALIZATION_SUBCMD_NAME));
-    secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
     Argument[] argsToAdd = { secureArgsList.hostNameArg,
         secureArgsList.portArg };
     for (Argument arg : argsToAdd)
@@ -824,27 +834,17 @@
   {
     resetChangelogNumber = new SubCommand(this, RESET_CHANGE_NUMBER_SUBCMD_NAME,
         INFO_DESCRIPTION_RESET_CHANGE_NUMBER.get());
-
     resetChangeNumber = newChangeNumberArgument();
-    Argument[] argsToAdd = {
-        hostNameSourceArg, portSourceArg, hostNameDestinationArg, portDestinationArg, resetChangeNumber
-    };
-    setSubCommandArguments(resetChangelogNumber, argsToAdd);
-  }
-
-  private void setSubCommandArguments(SubCommand subCommand, Argument[] argsToAdd) throws ArgumentException
-  {
-    for (Argument arg : argsToAdd)
-    {
-      arg.setPropertyName(arg.getLongIdentifier());
-      subCommand.addArgument(arg);
-    }
+    addArgumentsToSubCommand(resetChangelogNumber,
+            hostNameSourceArg, portSourceArg, hostNameDestinationArg, portDestinationArg, resetChangeNumber);
   }
 
   IntegerArgument newChangeNumberArgument() throws ArgumentException
   {
-    return new IntegerArgument("change-number", null, "change-number",
-        false, true, INFO_CHANGE_NUMBER_PLACEHOLDER.get(), INFO_DESCRIPTION_START_CHANGE_NUMBER.get());
+    return IntegerArgument.builder("change-number")
+            .description(INFO_DESCRIPTION_START_CHANGE_NUMBER.get())
+            .valuePlaceholder(INFO_CHANGE_NUMBER_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   /**
@@ -858,19 +858,13 @@
     statusReplicationSubCmd = new SubCommand(this,
         STATUS_REPLICATION_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_STATUS_REPLICATION.get());
-    scriptFriendlyArg = new BooleanArgument(
-        "script-friendly",
-        's',
-        "script-friendly",
-        INFO_DESCRIPTION_SCRIPT_FRIENDLY.get());
-    scriptFriendlyArg.setPropertyName(scriptFriendlyArg.getLongIdentifier());
-    secureArgsList.hostNameArg.setDefaultValue(getDefaultHostValue());
-    Argument[] argsToAdd = { secureArgsList.hostNameArg,
-        secureArgsList.portArg, scriptFriendlyArg };
-    for (Argument arg : argsToAdd)
-    {
-      statusReplicationSubCmd.addArgument(arg);
-    }
+    scriptFriendlyArg =
+            BooleanArgument.builder("script-friendly")
+                    .shortIdentifier('s')
+                    .description(INFO_DESCRIPTION_SCRIPT_FRIENDLY.get())
+                    .buildArgument();
+    addArgumentsToSubCommand(
+            statusReplicationSubCmd, secureArgsList.hostNameArg, secureArgsList.portArg, scriptFriendlyArg);
   }
 
   /**
@@ -879,41 +873,32 @@
    * initializeGlobalArguments has already been called and that hostNameArg and
    * portArg have been created.
    */
-  private void createPurgeHistoricalSubCommand()
-  throws ArgumentException
+  private void createPurgeHistoricalSubCommand() throws ArgumentException
   {
-    maximumDurationArg = new IntegerArgument(
-        "maximumDuration",
-        null, // shortId
-        "maximumDuration",
-        true, // isRequired
-        false, // isMultivalued
-        true,  // needsValue
-        INFO_MAXIMUM_DURATION_PLACEHOLDER.get(),
-        PurgeConflictsHistoricalTask.DEFAULT_MAX_DURATION,
-        null,
-        true, 0,
-        false, Integer.MAX_VALUE,
-        INFO_DESCRIPTION_PURGE_HISTORICAL_MAXIMUM_DURATION.get());
+    maximumDurationArg =
+            IntegerArgument.builder("maximumDuration")
+                    .description(INFO_DESCRIPTION_PURGE_HISTORICAL_MAXIMUM_DURATION.get())
+                    .required()
+                    .lowerBound(0)
+                    .defaultValue(PurgeConflictsHistoricalTask.DEFAULT_MAX_DURATION)
+                    .valuePlaceholder(INFO_MAXIMUM_DURATION_PLACEHOLDER.get())
+                    .buildArgument();
 
     purgeHistoricalSubCmd = new SubCommand(
         this,
         PURGE_HISTORICAL_SUBCMD_NAME,
         INFO_DESCRIPTION_SUBCMD_PURGE_HISTORICAL.get());
 
-    Argument[] argsToAdd = {
-        secureArgsList.hostNameArg,
-        secureArgsList.portArg,
-        maximumDurationArg};
+    addArgumentsToSubCommand(purgeHistoricalSubCmd,
+            secureArgsList.hostNameArg, secureArgsList.portArg, maximumDurationArg);
+    addArgumentsToSubCommand(purgeHistoricalSubCmd, taskArgs.getArguments());
+  }
 
-    for (Argument arg : argsToAdd)
+  private void addArgumentsToSubCommand(final SubCommand subCommand, final Argument... args) throws ArgumentException
+  {
+    for (final Argument arg : args)
     {
-      arg.setPropertyName(arg.getLongIdentifier());
-      purgeHistoricalSubCmd.addArgument(arg);
-    }
-    for (Argument arg : taskArgs.getArguments())
-    {
-      purgeHistoricalSubCmd.addArgument(arg);
+      subCommand.addArgument(arg);
     }
   }
 
@@ -989,7 +974,7 @@
    */
   StringArgument getAdminUidArg()
   {
-    return secureArgsList.adminUidArg;
+    return adminUidArg;
   }
 
   /**
@@ -1658,30 +1643,6 @@
   }
 
   /**
-   * Returns the default value to be used for the host.
-   * @return the default value to be used for the host.
-   */
-  private String getDefaultHostValue()
-  {
-    if (defaultLocalHostValue == null)
-    {
-      try
-      {
-        defaultLocalHostValue =
-          java.net.InetAddress.getLocalHost().getHostName();
-      }
-      catch (Throwable t)
-      {
-      }
-      if (defaultLocalHostValue == null)
-      {
-        defaultLocalHostValue = "localhost";
-      }
-    }
-    return defaultLocalHostValue;
-  }
-
-  /**
    * Returns the SecureConnectionCliArgs object containing the arguments
    * of this parser.
    * @return the SecureConnectionCliArgs object containing the arguments
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
index b1020dd..7dc799a 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/dsreplication/ReplicationCliMain.java
@@ -68,13 +68,13 @@
 import javax.net.ssl.SSLHandshakeException;
 import javax.net.ssl.TrustManager;
 
+import com.forgerock.opendj.cli.CommonArguments;
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg0;
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg1;
 import org.forgerock.i18n.LocalizableMessageDescriptor.Arg2;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.forgerock.opendj.config.server.ConfigException;
 import org.opends.admin.ads.*;
 import org.opends.admin.ads.ADSContext.ADSPropertySyntax;
 import org.opends.admin.ads.ADSContext.AdministratorProperty;
@@ -396,14 +396,7 @@
       return CANNOT_INITIALIZE_ARGS;
     }
 
-    try
-    {
-      argParser.getSecureArgsList().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ce)
-    {
-      // Ignore.
-    }
+    argParser.getSecureArgsList().initArgumentsWithConfiguration(argParser);
 
     // Parse the command-line arguments provided to this program.
     try
@@ -472,10 +465,11 @@
     {
       try
       {
-        userProvidedAdminPwdFile = new FileBasedArgument(
-            "adminPasswordFile", OPTION_SHORT_BINDPWD_FILE, "adminPasswordFile", false, false,
-            INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-            INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get());
+        userProvidedAdminPwdFile = FileBasedArgument.builder("adminPasswordFile")
+                .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                .description(INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get())
+                .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                .buildArgument();
         userProvidedAdminPwdFile.getNameToValueMap().putAll(
             argParser.getSecureArgsList().bindPasswordFileArg.getNameToValueMap());
       }
@@ -8509,17 +8503,13 @@
       }
     }
 
-    IntegerArgument maximumDurationArg = new IntegerArgument(
-        argParser.maximumDurationArg.getName(),
-        argParser.maximumDurationArg.getShortIdentifier(),
-        argParser.maximumDurationArg.getLongIdentifier(),
-        argParser.maximumDurationArg.isRequired(),
-        argParser.maximumDurationArg.isMultiValued(),
-        argParser.maximumDurationArg.needsValue(),
-        argParser.maximumDurationArg.getValuePlaceholder(),
-        PurgeConflictsHistoricalTask.DEFAULT_MAX_DURATION,
-        argParser.maximumDurationArg.getPropertyName(),
-        argParser.maximumDurationArg.getDescription());
+    IntegerArgument maximumDurationArg = IntegerArgument.builder(argParser.maximumDurationArg.getLongIdentifier())
+            .shortIdentifier(argParser.maximumDurationArg.getShortIdentifier())
+            .description(argParser.maximumDurationArg.getDescription())
+            .required()
+            .defaultValue(PurgeConflictsHistoricalTask.DEFAULT_MAX_DURATION)
+            .valuePlaceholder(argParser.maximumDurationArg.getValuePlaceholder())
+            .buildArgument();
     maximumDurationArg.addValue(String.valueOf(uData.getMaximumDuration()));
     commandBuilder.addArgument(maximumDurationArg);
   }
@@ -8536,11 +8526,13 @@
   throws ArgumentException
   {
     List<String> baseDNs = uData.getBaseDNs();
-    StringArgument baseDNsArg = new StringArgument("baseDNs",
-        OPTION_SHORT_BASEDN,
-        OPTION_LONG_BASEDN, false, true, true, INFO_BASEDN_PLACEHOLDER.get(),
-        null,
-        null, INFO_DESCRIPTION_REPLICATION_BASEDNS.get());
+    StringArgument baseDNsArg =
+            StringArgument.builder(OPTION_LONG_BASEDN)
+                    .shortIdentifier(OPTION_SHORT_BASEDN)
+                    .description(INFO_DESCRIPTION_REPLICATION_BASEDNS.get())
+                    .multiValued()
+                    .valuePlaceholder(INFO_BASEDN_PLACEHOLDER.get())
+                    .buildArgument();
     for (String baseDN : baseDNs)
     {
       baseDNsArg.addValue(baseDN);
@@ -8593,9 +8585,11 @@
 
     if (argParser.isVerbose())
     {
-      commandBuilder.addArgument(new BooleanArgument("verbose",
-          OPTION_SHORT_VERBOSE,
-          OPTION_LONG_VERBOSE, INFO_DESCRIPTION_VERBOSE.get()));
+      commandBuilder.addArgument(
+              BooleanArgument.builder(OPTION_LONG_VERBOSE)
+                      .shortIdentifier(OPTION_SHORT_VERBOSE)
+                      .description(INFO_DESCRIPTION_VERBOSE.get())
+                      .buildArgument());
     }
 
     if (argParser.isScriptFriendly())
@@ -8845,11 +8839,8 @@
     {
       if (uData.getAdminUid() != null)
       {
-        StringArgument adminUID = new StringArgument(OPTION_LONG_ADMIN_UID, 'I',
-            OPTION_LONG_ADMIN_UID, false, false, true,
-            INFO_ADMINUID_PLACEHOLDER.get(),
-            Constants.GLOBAL_ADMIN_UID, null,
-            INFO_DESCRIPTION_REPLICATION_ADMIN_UID.get(ENABLE_REPLICATION_SUBCMD_NAME));
+        final StringArgument adminUID = CommonArguments.getAdminUid(
+                INFO_DESCRIPTION_REPLICATION_ADMIN_UID.get(ENABLE_REPLICATION_SUBCMD_NAME));
         adminUID.addValue(uData.getAdminUid());
         commandBuilder.addArgument(adminUID);
       }
@@ -8919,45 +8910,56 @@
 
     if (!uData.replicateSchema())
     {
-      commandBuilder.addArgument(new BooleanArgument(
-          "noschemareplication", null, "noSchemaReplication",
-          INFO_DESCRIPTION_ENABLE_REPLICATION_NO_SCHEMA_REPLICATION.get()));
+      commandBuilder.addArgument(
+              BooleanArgument.builder("noSchemaReplication")
+                      .description(INFO_DESCRIPTION_ENABLE_REPLICATION_NO_SCHEMA_REPLICATION.get())
+                      .buildArgument());
     }
     if (argParser.skipReplicationPortCheck())
     {
-      commandBuilder.addArgument(new BooleanArgument(
-          "skipportcheck", 'S', "skipPortCheck",
-          INFO_DESCRIPTION_ENABLE_REPLICATION_SKIPPORT.get()));
+      commandBuilder.addArgument(
+              BooleanArgument.builder("skipPortCheck")
+                      .shortIdentifier('S')
+                      .description(INFO_DESCRIPTION_ENABLE_REPLICATION_SKIPPORT.get())
+                      .buildArgument());
     }
     if (argParser.useSecondServerAsSchemaSource())
     {
-      commandBuilder.addArgument(new BooleanArgument(
-          "usesecondserverasschemasource", null,
-          "useSecondServerAsSchemaSource",
-          INFO_DESCRIPTION_ENABLE_REPLICATION_USE_SECOND_AS_SCHEMA_SOURCE.get(
-              "--" + argParser.noSchemaReplicationArg.getLongIdentifier())));
+      commandBuilder.addArgument(
+              BooleanArgument.builder("useSecondServerAsSchemaSource")
+                      .description(INFO_DESCRIPTION_ENABLE_REPLICATION_USE_SECOND_AS_SCHEMA_SOURCE.get(
+                              "--" + argParser.noSchemaReplicationArg.getLongIdentifier()))
+                      .buildArgument());
     }
   }
 
   private IntegerArgument getReplicationPortArg(
       String name, EnableReplicationServerData server, int defaultValue, Arg0 description) throws ArgumentException
   {
-    IntegerArgument replicationPort = new IntegerArgument(
-        name, 'r', name, false, false, true,
-        INFO_PORT_PLACEHOLDER.get(), defaultValue, null, description.get());
-    int value = server.getReplicationPort();
-    replicationPort.addValue(String.valueOf(value));
+    IntegerArgument replicationPort =
+            IntegerArgument.builder(name)
+                    .shortIdentifier('r')
+                    .description(description.get())
+                    .defaultValue(defaultValue)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
+    replicationPort.addValue(String.valueOf(server.getReplicationPort()));
     return replicationPort;
   }
 
   private BooleanArgument newBooleanArgument(String name, Arg0 msg) throws ArgumentException
   {
-    return new BooleanArgument(name, null, name, msg.get());
+    return BooleanArgument.builder(name)
+            .description(msg.get())
+            .buildArgument();
   }
 
   private BooleanArgument newBooleanArgument(BooleanArgument arg, Arg0 msg) throws ArgumentException
   {
-    return new BooleanArgument(arg.getName(), arg.getShortIdentifier(), arg.getLongIdentifier(), msg.get());
+    return BooleanArgument.builder(arg.getLongIdentifier())
+            .shortIdentifier(arg.getShortIdentifier())
+            .description(msg.get())
+            .buildArgument();
   }
 
   private StringArgument getBindPassword1Arg(Argument arg) throws ArgumentException
@@ -8972,34 +8974,40 @@
 
   private StringArgument getBindPasswordArg(String name, Argument arg, Arg0 bindPwdMsg) throws ArgumentException
   {
-    StringArgument bindPasswordArg = new StringArgument(
-        name, null, name, false, false, true,
-        INFO_BINDPWD_PLACEHOLDER.get(), null, null, bindPwdMsg.get());
+    StringArgument bindPasswordArg =
+            StringArgument.builder(name)
+                    .description(bindPwdMsg.get())
+                    .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+                    .buildArgument();
     bindPasswordArg.addValue(arg.getValue());
     return bindPasswordArg;
   }
 
   private FileBasedArgument getBindPasswordFile1Arg() throws ArgumentException
   {
-    return new FileBasedArgument(
-        "bindPasswordFile1", null, "bindPasswordFile1", false, false,
-        INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE1.get());
+    return FileBasedArgument.builder("bindPasswordFile1")
+            .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE1.get())
+            .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   private FileBasedArgument getBindPasswordFile2Arg() throws ArgumentException
   {
-    return new FileBasedArgument(
-        "bindPasswordFile2", null, "bindPasswordFile2", false, false,
-        INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE2.get());
+    return FileBasedArgument.builder("bindPasswordFile2")
+            .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDPASSWORDFILE2.get())
+            .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   private StringArgument getBindDN1Arg(EnableReplicationUserData uData) throws ArgumentException
   {
-    StringArgument bindDN = new StringArgument("bindDN1", OPTION_SHORT_BINDDN, "bindDN1", false, false, true,
-        INFO_BINDDN_PLACEHOLDER.get(), "cn=Directory Manager", null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN1.get());
+    StringArgument bindDN =
+            StringArgument.builder("bindDN1")
+                    .shortIdentifier(OPTION_SHORT_BINDDN)
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN1.get())
+                    .defaultValue("cn=Directory Manager")
+                    .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                    .buildArgument();
     bindDN.addValue(uData.getServer1().getBindDn());
     return bindDN;
   }
@@ -9007,9 +9015,13 @@
   private StringArgument getBindDN2Arg(EnableReplicationUserData uData, Character shortIdentifier)
       throws ArgumentException
   {
-    StringArgument bindDN = new StringArgument("bindDN2", shortIdentifier, "bindDN2", false, false, true,
-        INFO_BINDDN_PLACEHOLDER.get(), "cn=Directory Manager", null,
-        INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN2.get());
+    StringArgument bindDN =
+            StringArgument.builder("bindDN2")
+                    .shortIdentifier(shortIdentifier)
+                    .description(INFO_DESCRIPTION_ENABLE_REPLICATION_BINDDN2.get())
+                    .defaultValue("cn=Directory Manager")
+                    .valuePlaceholder(INFO_BINDDN_PLACEHOLDER.get())
+                    .buildArgument();
     bindDN.addValue(uData.getServer2().getBindDn());
     return bindDN;
   }
@@ -9078,18 +9090,21 @@
 
   private StringArgument getAdminPasswordArg() throws ArgumentException
   {
-    return new StringArgument("adminPassword",
-        OPTION_SHORT_BINDPWD, "adminPassword", false, false, true,
-        INFO_BINDPWD_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORD.get());
+    return StringArgument.builder("adminPassword")
+            .shortIdentifier(OPTION_SHORT_BINDPWD)
+            .description(INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORD.get())
+            .valuePlaceholder(INFO_BINDPWD_PLACEHOLDER.get())
+            .buildArgument();
   }
 
   private FileBasedArgument getAdminPasswordFileArg(Argument arg) throws ArgumentException
   {
-    FileBasedArgument fbArg = new FileBasedArgument(
-        "adminPasswordFile", OPTION_SHORT_BINDPWD_FILE, "adminPasswordFile", false, false,
-        INFO_BINDPWD_FILE_PLACEHOLDER.get(), null, null,
-        INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get());
+    FileBasedArgument fbArg =
+            FileBasedArgument.builder("adminPasswordFile")
+                    .shortIdentifier(OPTION_SHORT_BINDPWD_FILE)
+                    .description(INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get())
+                    .valuePlaceholder(INFO_BINDPWD_FILE_PLACEHOLDER.get())
+                    .buildArgument();
     fbArg.getNameToValueMap().putAll(((FileBasedArgument) arg).getNameToValueMap());
     return fbArg;
   }
@@ -9097,8 +9112,13 @@
   private IntegerArgument getPortArg(String longIdentifier, Character shortIdentifier, int value, Arg0 arg)
       throws ArgumentException
   {
-    IntegerArgument iArg = new IntegerArgument(longIdentifier, shortIdentifier, longIdentifier, false, false, true,
-        INFO_PORT_PLACEHOLDER.get(), 4444, null, arg.get());
+    IntegerArgument iArg =
+            IntegerArgument.builder(longIdentifier)
+                    .shortIdentifier(shortIdentifier)
+                    .description(arg.get())
+                    .defaultValue(4444)
+                    .valuePlaceholder(INFO_PORT_PLACEHOLDER.get())
+                    .buildArgument();
     iArg.addValue(String.valueOf(value));
     return iArg;
   }
@@ -9106,8 +9126,12 @@
   private StringArgument getHostArg(String longIdentifier, char shortIdentifier, String value,
       Arg0 description) throws ArgumentException
   {
-    StringArgument sArg = new StringArgument(longIdentifier, shortIdentifier, longIdentifier, false, false, true,
-        INFO_HOST_PLACEHOLDER.get(), null, null, description.get());
+    StringArgument sArg =
+            StringArgument.builder(longIdentifier)
+                    .shortIdentifier(shortIdentifier)
+                    .description(description.get())
+                    .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                    .buildArgument();
     sArg.addValue(value);
     return sArg;
   }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java
index ed1399c..d4b3c59 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/makeldif/MakeLDIF.java
@@ -27,6 +27,8 @@
 package org.opends.server.tools.makeldif;
 
 import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.CliMessages.INFO_MAKELDIF_DESCRIPTION_SEED;
+import static com.forgerock.opendj.cli.CliMessages.INFO_SEED_PLACEHOLDER;
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.messages.ToolMessages.*;
@@ -167,54 +169,50 @@
 
     try
     {
-      configFile = new StringArgument("configfile", 'c', "configFile", true,
-                                      false, true,
-                                      INFO_CONFIGFILE_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_DESCRIPTION_CONFIG_FILE.get());
-      configFile.setHidden(true);
-      argParser.addArgument(configFile);
-
-
-      configClass = new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS,
-                                       OPTION_LONG_CONFIG_CLASS, false,
-                                       false, true,
-                                       INFO_CONFIGCLASS_PLACEHOLDER.get(), null,
-                                       null,
-                                       INFO_DESCRIPTION_CONFIG_CLASS.get());
-      configClass.setHidden(true);
-      argParser.addArgument(configClass);
-
-
+      configFile =
+              StringArgument.builder("configFile")
+                      .shortIdentifier('c')
+                      .description(INFO_DESCRIPTION_CONFIG_FILE.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_CONFIGFILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      configClass =
+              StringArgument.builder(OPTION_LONG_CONFIG_CLASS)
+                      .shortIdentifier(OPTION_SHORT_CONFIG_CLASS)
+                      .description(INFO_DESCRIPTION_CONFIG_CLASS.get())
+                      .hidden()
+                      .valuePlaceholder(INFO_CONFIGCLASS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       resourcePath =
-           new StringArgument("resourcepath", 'r', "resourcePath", true, false,
-                              true, INFO_PATH_PLACEHOLDER.get(), null, null,
-                              INFO_MAKELDIF_DESCRIPTION_RESOURCE_PATH.get());
-      resourcePath.setHidden(true);
-      argParser.addArgument(resourcePath);
-
-
+              StringArgument.builder("resourcePath")
+                      .shortIdentifier('r')
+                      .description(INFO_MAKELDIF_DESCRIPTION_RESOURCE_PATH.get())
+                      .hidden()
+                      .required()
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
       templatePath =
-              new StringArgument("templatefile", 't', "templateFile",
-                                 true, false, true, INFO_FILE_PLACEHOLDER.get(),
-                                 null, null,
-                                 INFO_MAKELDIF_DESCRIPTION_TEMPLATE.get());
-      argParser.addArgument(templatePath);
-
-
-      ldifFile = new StringArgument("ldiffile", 'o', "ldifFile", true, false,
-                                    true, INFO_FILE_PLACEHOLDER.get(), null,
-                                    null, INFO_MAKELDIF_DESCRIPTION_LDIF.get());
-      argParser.addArgument(ldifFile);
-
-
-      randomSeed = new IntegerArgument("randomseed", OPTION_SHORT_RANDOM_SEED,
-                                       OPTION_LONG_RANDOM_SEED, false,
-                                       false, true, INFO_SEED_PLACEHOLDER.get(),
-                                       0, null,
-                                       INFO_MAKELDIF_DESCRIPTION_SEED.get());
-      argParser.addArgument(randomSeed);
-
+              StringArgument.builder("templateFile")
+                      .shortIdentifier('t')
+                      .description(INFO_MAKELDIF_DESCRIPTION_TEMPLATE.get())
+                      .required()
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      ldifFile =
+              StringArgument.builder("ldifFile")
+                      .shortIdentifier('o')
+                      .description(INFO_MAKELDIF_DESCRIPTION_LDIF.get())
+                      .required()
+                      .valuePlaceholder(INFO_FILE_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      randomSeed =
+              IntegerArgument.builder(OPTION_LONG_RANDOM_SEED)
+                      .shortIdentifier(OPTION_SHORT_RANDOM_SEED)
+                      .description(INFO_MAKELDIF_DESCRIPTION_SEED.get())
+                      .defaultValue(0)
+                      .valuePlaceholder(INFO_SEED_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java
index 3fc1033..0880d42 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCli.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  */
 package org.opends.server.tools.status;
 
@@ -62,7 +62,6 @@
 import org.forgerock.opendj.config.LDAPProfile;
 import org.forgerock.opendj.config.client.ManagementContext;
 import org.forgerock.opendj.config.client.ldap.LDAPManagementContext;
-import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.AuthorizationException;
 import org.forgerock.opendj.ldap.Connection;
 import org.forgerock.opendj.ldap.LDAPConnectionFactory;
@@ -227,14 +226,7 @@
       return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
     }
 
-    try
-    {
-      argParser.getSecureArgsList().initArgumentsWithConfiguration();
-    }
-    catch (ConfigException ce)
-    {
-      // Ignore.
-    }
+    argParser.getSecureArgsList().initArgumentsWithConfiguration(argParser);
 
     // Validate user provided data
     try {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCliArgumentParser.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCliArgumentParser.java
index aed8a1a..2eed284 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCliArgumentParser.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/status/StatusCliArgumentParser.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS.
+ *      Portions Copyright 2012-2016 ForgeRock AS.
  */
 package org.opends.server.tools.status;
 
@@ -109,10 +109,13 @@
 
     initializeGlobalArguments(defaultArgs);
 
-    refreshArg = new IntegerArgument("refresh", 'r',
-        "refresh", false, true, INFO_PERIOD_PLACEHOLDER.get(),
-        true, 1, false, Integer.MAX_VALUE,
-        INFO_DESCRIPTION_REFRESH_PERIOD.get());
+    refreshArg =
+            IntegerArgument.builder("refresh")
+                    .shortIdentifier('r')
+                    .description(INFO_DESCRIPTION_REFRESH_PERIOD.get())
+                    .lowerBound(1)
+                    .valuePlaceholder(INFO_PERIOD_PLACEHOLDER.get())
+                    .buildArgument();
     addGlobalArgument(refreshArg, ioArgGroup);
   }
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskScheduleUserData.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskScheduleUserData.java
index a21c1a2..fec71ea 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskScheduleUserData.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskScheduleUserData.java
@@ -276,14 +276,19 @@
     StringArgument arg;
     try
     {
-      arg = new StringArgument(argToClone.getName(),
-          argToClone.getShortIdentifier(), argToClone.getLongIdentifier(),
-          argToClone.isRequired(), argToClone.isMultiValued(),
-          argToClone.needsValue(),
-          argToClone.getValuePlaceholder(),
-          argToClone.getDefaultValue(),
-          argToClone.getPropertyName(),
-          argToClone.getDescription());
+      StringArgument.Builder argBuilder =
+              StringArgument.builder(argToClone.getLongIdentifier())
+                      .shortIdentifier(argToClone.getShortIdentifier())
+                      .description(argToClone.getDescription())
+                      .defaultValue(argToClone.getDefaultValue())
+                      .valuePlaceholder(argToClone.getValuePlaceholder());
+      if (argToClone.isRequired()) {
+        argBuilder.required();
+      }
+      if (argToClone.isMultiValued()) {
+        argBuilder.multiValued();
+      }
+      arg = argBuilder.buildArgument();
     }
     catch (ArgumentException e)
     {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
index 4b5a111..58c3b4d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskTool.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2007-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2012-2015 ForgeRock AS
+ *      Portions Copyright 2012-2016 ForgeRock AS
  */
 package org.opends.server.tools.tasks;
 
@@ -158,10 +158,11 @@
         argParser.addArgument(arg, taskGroup);
       }
 
-      testIfOfflineArg = new BooleanArgument("testIfOffline", null,
-          "testIfOffline", INFO_DESCRIPTION_TEST_IF_OFFLINE.get());
-      testIfOfflineArg.setHidden(true);
-      argParser.addArgument(testIfOfflineArg);
+      testIfOfflineArg =
+              BooleanArgument.builder("testIfOffline")
+                      .description(INFO_DESCRIPTION_TEST_IF_OFFLINE.get())
+                      .hidden()
+                      .buildAndAddToParser(argParser);
     } catch (ArgumentException e) {
       // should never happen
     }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java
index 2eca4f0..15a21c1 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeCli.java
@@ -21,7 +21,7 @@
  * CDDL HEADER END
  *
  *
- *      Portions Copyright 2013-2015 ForgeRock AS.
+ *      Portions Copyright 2013-2016 ForgeRock AS.
  */
 package org.opends.server.tools.upgrade;
 
@@ -229,16 +229,14 @@
       noPrompt = CommonArguments.getNoPrompt();
       verbose = CommonArguments.getVerbose();
       quietMode = CommonArguments.getQuiet();
-
       ignoreErrors =
-          new BooleanArgument(OPTION_LONG_IGNORE_ERRORS, null,
-              OPTION_LONG_IGNORE_ERRORS, INFO_UPGRADE_OPTION_IGNORE_ERRORS
-                  .get());
-
-      force = new BooleanArgument(OPTION_LONG_FORCE_UPGRADE, null,
-          OPTION_LONG_FORCE_UPGRADE,
-          INFO_UPGRADE_OPTION_FORCE.get(OPTION_LONG_NO_PROMPT));
-
+              BooleanArgument.builder(OPTION_LONG_IGNORE_ERRORS)
+                      .description(INFO_UPGRADE_OPTION_IGNORE_ERRORS.get())
+                      .buildArgument();
+      force =
+              BooleanArgument.builder(OPTION_LONG_FORCE_UPGRADE)
+                      .description(INFO_UPGRADE_OPTION_FORCE.get(OPTION_LONG_NO_PROMPT))
+                      .buildArgument();
       acceptLicense = CommonArguments.getAcceptLicense();
       showUsageArgument = CommonArguments.getShowUsage();
 
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java b/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java
index ef4aff5..042f9aa 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/Base64.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2014-2015 ForgeRock AS.
+ *      Portions Copyright 2014-2016 ForgeRock AS.
  */
 package org.opends.server.util;
 
@@ -487,54 +487,47 @@
       encodeSubCommand = new SubCommand(argParser, "encode",
                                         INFO_BASE64_ENCODE_DESCRIPTION.get());
 
-
-      encodedData = new StringArgument("encodeddata", 'd', "encodedData", false,
-                             false, true, INFO_DATA_PLACEHOLDER.get(), null,
-                             null,
-                             INFO_BASE64_ENCODED_DATA_DESCRIPTION.get());
-      decodeSubCommand.addArgument(encodedData);
-
-
-      encodedFile = new StringArgument("encodedfile", 'f', "encodedDataFile",
-                             false, false, true, INFO_PATH_PLACEHOLDER.get(),
-                             null, null,
-                             INFO_BASE64_ENCODED_FILE_DESCRIPTION.get());
-      decodeSubCommand.addArgument(encodedFile);
-
-
-      toRawFile = new StringArgument("torawfile", 'o', "toRawFile", false,
-                                     false, true, INFO_PATH_PLACEHOLDER.get(),
-                                     null, null,
-                                     INFO_BASE64_TO_RAW_FILE_DESCRIPTION.get());
-      decodeSubCommand.addArgument(toRawFile);
-
-
-      rawData = new StringArgument("rawdata", 'd', "rawData", false, false,
-                                   true, INFO_DATA_PLACEHOLDER.get(), null,
-                                   null,
-                                   INFO_BASE64_RAW_DATA_DESCRIPTION.get());
-      encodeSubCommand.addArgument(rawData);
-
-
-      rawFile = new StringArgument("rawfile", 'f', "rawDataFile", false, false,
-                                   true, INFO_PATH_PLACEHOLDER.get(), null,
-                                   null,
-                                   INFO_BASE64_RAW_FILE_DESCRIPTION.get());
-      encodeSubCommand.addArgument(rawFile);
-
-
-      toEncodedFile = new StringArgument("toencodedfile", 'o', "toEncodedFile",
-                               false, false, true, INFO_PATH_PLACEHOLDER.get(),
-                               null, null,
-                               INFO_BASE64_TO_ENCODED_FILE_DESCRIPTION.get());
-      encodeSubCommand.addArgument(toEncodedFile);
-
+      encodedData =
+              StringArgument.builder("encodedData")
+                      .shortIdentifier('d')
+                      .description(INFO_BASE64_ENCODED_DATA_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_DATA_PLACEHOLDER.get())
+                      .buildAndAddToSubCommand(decodeSubCommand);
+      encodedFile =
+              StringArgument.builder("encodedDataFile")
+                      .shortIdentifier('f')
+                      .description(INFO_BASE64_ENCODED_FILE_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToSubCommand(decodeSubCommand);
+      toRawFile =
+              StringArgument.builder("toRawFile")
+                      .shortIdentifier('o')
+                      .description(INFO_BASE64_TO_RAW_FILE_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToSubCommand(decodeSubCommand);
+      rawData =
+              StringArgument.builder("rawData")
+                      .shortIdentifier('d')
+                      .description(INFO_BASE64_RAW_DATA_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_DATA_PLACEHOLDER.get())
+                      .buildAndAddToSubCommand(encodeSubCommand);
+      rawFile =
+              StringArgument.builder("rawDataFile")
+                      .shortIdentifier('f')
+                      .description(INFO_BASE64_RAW_FILE_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToSubCommand(encodeSubCommand);
+      toEncodedFile =
+              StringArgument.builder("toEncodedFile")
+                      .shortIdentifier('o')
+                      .description(INFO_BASE64_TO_ENCODED_FILE_DESCRIPTION.get())
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToSubCommand(encodeSubCommand);
 
       ArrayList<SubCommand> subCommandList = new ArrayList<>(2);
       subCommandList.add(decodeSubCommand);
       subCommandList.add(encodeSubCommand);
 
-
       showUsage = CommonArguments.getShowUsage();
       argParser.addGlobalArgument(showUsage);
       argParser.setUsageGroupArgument(showUsage, subCommandList);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java b/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java
index 4812e7e..fa32181 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/EMailMessage.java
@@ -23,7 +23,7 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions Copyright 2014-2015 ForgeRock AS
+ *      Portions Copyright 2014-2016 ForgeRock AS
  *      Portions copyright 2015 Edan Idzerda
  */
 package org.opends.server.util;
@@ -534,42 +534,52 @@
 
     try
     {
-      host = new StringArgument("host", 'h', "host", true, true, true,
-                                INFO_HOST_PLACEHOLDER.get(), "127.0.0.1", null,
-                                INFO_EMAIL_HOST_DESCRIPTION.get());
-      argParser.addArgument(host);
-
-
-      from = new StringArgument("from", 'f', "from", true, false, true,
-                                INFO_ADDRESS_PLACEHOLDER.get(), null, null,
-                                INFO_EMAIL_FROM_DESCRIPTION.get());
-      argParser.addArgument(from);
-
-
-      to = new StringArgument("to", 't', "to", true, true, true,
-                              INFO_ADDRESS_PLACEHOLDER.get(),
-                              null, null, INFO_EMAIL_TO_DESCRIPTION.get());
-      argParser.addArgument(to);
-
-
-      subject = new StringArgument("subject", 's', "subject", true, false, true,
-                                   INFO_SUBJECT_PLACEHOLDER.get(), null, null,
-                                   INFO_EMAIL_SUBJECT_DESCRIPTION.get());
-      argParser.addArgument(subject);
-
-
-      bodyFile = new StringArgument("bodyfile", 'b', "body", true, true, true,
-                                    INFO_PATH_PLACEHOLDER.get(), null, null,
-                                    INFO_EMAIL_BODY_DESCRIPTION.get());
-      argParser.addArgument(bodyFile);
-
-
-      attachFile = new StringArgument("attachfile", 'a', "attach", false, true,
-                                      true, INFO_PATH_PLACEHOLDER.get(), null,
-                                      null,
-                                      INFO_EMAIL_ATTACH_DESCRIPTION.get());
-      argParser.addArgument(attachFile);
-
+      host =
+              StringArgument.builder("host")
+                      .shortIdentifier('h')
+                      .description(INFO_EMAIL_HOST_DESCRIPTION.get())
+                      .multiValued()
+                      .required()
+                      .defaultValue("127.0.0.1")
+                      .valuePlaceholder(INFO_HOST_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      from =
+              StringArgument.builder("from")
+                      .shortIdentifier('f')
+                      .description(INFO_EMAIL_FROM_DESCRIPTION.get())
+                      .required()
+                      .valuePlaceholder(INFO_ADDRESS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      to =
+              StringArgument.builder("to")
+                      .shortIdentifier('t')
+                      .description(INFO_EMAIL_TO_DESCRIPTION.get())
+                      .multiValued()
+                      .required()
+                      .valuePlaceholder(INFO_ADDRESS_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      subject =
+              StringArgument.builder("subject")
+                      .shortIdentifier('s')
+                      .description(INFO_EMAIL_SUBJECT_DESCRIPTION.get())
+                      .required()
+                      .valuePlaceholder(INFO_SUBJECT_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      bodyFile =
+              StringArgument.builder("body")
+                      .shortIdentifier('b')
+                      .description(INFO_EMAIL_BODY_DESCRIPTION.get())
+                      .multiValued()
+                      .required()
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
+      attachFile =
+              StringArgument.builder("attach")
+                      .shortIdentifier('a')
+                      .description(INFO_EMAIL_ATTACH_DESCRIPTION.get())
+                      .multiValued()
+                      .valuePlaceholder(INFO_PATH_PLACEHOLDER.get())
+                      .buildAndAddToParser(argParser);
 
       showUsage = CommonArguments.getShowUsage();
       argParser.addArgument(showUsage);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/StaticUtils.java b/opendj-server-legacy/src/main/java/org/opends/server/util/StaticUtils.java
index 0c0cdeb..2fb7c0d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/StaticUtils.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/StaticUtils.java
@@ -2491,8 +2491,7 @@
         for (Argument otherArg : args) {
           if (arg != otherArg && arg.isPresent() && otherArg.isPresent()) {
             throw new ArgumentException(
-                    ToolMessages.ERR_INCOMPATIBLE_ARGUMENTS.get(
-                            arg.getName(), otherArg.getName()));
+                    ToolMessages.ERR_INCOMPATIBLE_ARGUMENTS.get(arg.getLongIdentifier(), otherArg.getLongIdentifier()));
           }
         }
       }
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/cli/LDAPConnectionConsoleInteraction.java b/opendj-server-legacy/src/main/java/org/opends/server/util/cli/LDAPConnectionConsoleInteraction.java
index ff9f3fe..ad059be 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/cli/LDAPConnectionConsoleInteraction.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/cli/LDAPConnectionConsoleInteraction.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2015 ForgeRock AS
+ *      Portions Copyright 2011-2016 ForgeRock AS
  */
 package org.opends.server.util.cli;
 
@@ -630,9 +630,9 @@
 
     // Get the LDAP bind credentials.
     state.bindDN = secureArgsList.bindDnArg.getValue();
-    state.adminUID= secureArgsList.adminUidArg.getValue();
+    state.adminUID= secureArgsList.adminUidHiddenArg.getValue();
     final boolean useAdmin = secureArgsList.useAdminUID();
-    if (useAdmin && secureArgsList.adminUidArg.isPresent())
+    if (useAdmin && secureArgsList.adminUidHiddenArg.isPresent())
     {
       state.providedAdminUID = state.adminUID;
     }
@@ -737,9 +737,9 @@
         }
         if (addAdmin)
         {
-          copySecureArgsList.adminUidArg.clearValues();
-          copySecureArgsList.adminUidArg.addValue(getAdministratorUID());
-          commandBuilder.addArgument(copySecureArgsList.adminUidArg);
+          copySecureArgsList.adminUidHiddenArg.clearValues();
+          copySecureArgsList.adminUidHiddenArg.addValue(getAdministratorUID());
+          commandBuilder.addArgument(copySecureArgsList.adminUidHiddenArg);
         }
         else if (addBindDN)
         {
@@ -750,9 +750,9 @@
       }
       else if (useAdmin)
       {
-        copySecureArgsList.adminUidArg.clearValues();
-        copySecureArgsList.adminUidArg.addValue(getAdministratorUID());
-        commandBuilder.addArgument(copySecureArgsList.adminUidArg);
+        copySecureArgsList.adminUidHiddenArg.clearValues();
+        copySecureArgsList.adminUidHiddenArg.addValue(getAdministratorUID());
+        commandBuilder.addArgument(copySecureArgsList.adminUidHiddenArg);
       }
       else
       {
@@ -1978,8 +1978,8 @@
     secureArgsList.useStartTLSArg.setPresent(state.useStartTLS);
     if (adminUid != null)
     {
-      secureArgsList.adminUidArg.addValue(adminUid);
-      secureArgsList.adminUidArg.setPresent(true);
+      secureArgsList.adminUidHiddenArg.addValue(adminUid);
+      secureArgsList.adminUidHiddenArg.setPresent(true);
     }
     if (bindDn != null)
     {
@@ -2025,8 +2025,8 @@
     secureArgsList.bindPasswordFileArg.getNameToValueMap().clear();
     secureArgsList.bindPasswordFileArg.setPresent(false);
     state.bindPassword = null;
-    secureArgsList.adminUidArg.clearValues();
-    secureArgsList.adminUidArg.setPresent(false);
+    secureArgsList.adminUidHiddenArg.clearValues();
+    secureArgsList.adminUidHiddenArg.setPresent(false);
   }
 
   private void initializeTrustManager() throws ArgumentException
diff --git a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java
index f5f398f..cfeca7f 100644
--- a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java
+++ b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java
@@ -20,7 +20,7 @@
  *
  * CDDL HEADER END
  *
- *      Copyright 2014-2015 ForgeRock AS.
+ *      Copyright 2014-2016 ForgeRock AS.
  */
 package org.forgerock.opendj.server.setup.cli;
 
@@ -249,7 +249,7 @@
         keyStorePassword = addGlobal(CommonArguments.getKeyStorePassword());
         keyStorePasswordFile = addGlobal(CommonArguments.getKeyStorePasswordFile());
         certNickname = addGlobal(CommonArguments.getCertNickName());
-        connectTimeout = CommonArguments.getConnectTimeOut();
+        connectTimeout = CommonArguments.getConnectTimeOutHidden();
 
         // Utility Input Output Options.
         noPrompt = addGlobal(CommonArguments.getNoPrompt());

--
Gitblit v1.10.0