From a9037949c175770a591d75624d4b282264dfcf5b Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 04 Jul 2007 16:48:57 +0000
Subject: [PATCH] This commit's design changes have been reviewed and approved by Brian Ehret.

---
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java                    |  165 ++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java                |    6 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java                          |  319 +++++--
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java                                 |   12 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/ui/WelcomePanel.java           |  259 +++++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java           |   26 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ButtonsPanel.java                              |   14 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java                      |   54 +
 opendj-sdk/opends/src/ads/org/opends/admin/ads/ADSContext.java                                           |  146 ---
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java       |   10 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgradeUserData.java |   57 +
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java            |   16 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeWizardStep.java                   |   90 ++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Step.java                                         |   13 
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java                |    2 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/WizardStep.java                                   |    7 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java                                |    5 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties                    |   32 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Application.java                                  |    8 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java                            |   94 +-
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallLauncher.java                    |    3 
 opendj-sdk/opends/build.xml                                                                              |    1 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java                      |    2 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java                     |    4 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredDomain.java                   |   91 ++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredReplication.java              |  127 +++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java         |   35 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgrader.java        |  495 +++++++++++++
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/StepsPanel.java                                |   15 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java                            |   45 
 opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FinishedPanel.java                             |   54 +
 31 files changed, 1,821 insertions(+), 386 deletions(-)

diff --git a/opendj-sdk/opends/build.xml b/opendj-sdk/opends/build.xml
index d2ca0cf..43a0b9c 100644
--- a/opendj-sdk/opends/build.xml
+++ b/opendj-sdk/opends/build.xml
@@ -705,6 +705,7 @@
          location="${package.dir}/OpenDS-${VERSION_NUMBER_STRING}" />
 
     <mkdir dir="${pdir}"                 />
+    <mkdir dir="${pdir}/adminDb"         />
     <mkdir dir="${pdir}/bak"             />
     <mkdir dir="${pdir}/bat"             />
     <mkdir dir="${pdir}/bin"             />
diff --git a/opendj-sdk/opends/src/ads/org/opends/admin/ads/ADSContext.java b/opendj-sdk/opends/src/ads/org/opends/admin/ads/ADSContext.java
index bc1e02f..c100998 100644
--- a/opendj-sdk/opends/src/ads/org/opends/admin/ads/ADSContext.java
+++ b/opendj-sdk/opends/src/ads/org/opends/admin/ads/ADSContext.java
@@ -44,7 +44,6 @@
 import javax.naming.NoPermissionException;
 import javax.naming.NotContextException;
 import javax.naming.directory.DirContext;
-import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchResult;
 import javax.naming.directory.Attribute;
 import javax.naming.directory.Attributes;
@@ -52,7 +51,6 @@
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.SearchControls;
 import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
 import javax.naming.ldap.LdapName;
 import javax.naming.ldap.Rdn;
 
@@ -762,7 +760,7 @@
    * The call to this method assumes that OpenDS.jar has already been loaded.
    * So this should not be called by the Java Web Start before being sure that
    * this jar is loaded.
-   * @param backendName the backend name which will handle admin inforamtion.
+   * @param backendName the backend name which will handle admin information.
    * @throws ADSContextException if something goes wrong.
    */
   public void createAdminData(String backendName) throws ADSContextException
@@ -775,7 +773,6 @@
     createAdministratorContainerEntry();
     createContainerEntry(getServerContainerDN());
     createContainerEntry(getServerGroupContainerDN());
-    //setupACIOnServer(getDirContext(), true);
   }
 
   /**
@@ -785,7 +782,6 @@
   public void removeAdminData() throws ADSContextException
   {
     removeAdministrationSuffix();
-    //setupACIOnServer(getDirContext(), false);
   }
 
 
@@ -931,92 +927,6 @@
   }
 
   /**
-   * Used to modify the configuration on the server that must be managed; this
-   * setups the ACIs on the server so that the Administrator can access the
-   * server configuration.
-   * TODO: complete this.
-   * @param dirCtx the DirContext to the server that must be updated.
-   * @param enable whether to enable or disable the access to the server.
-   * @return <CODE>true</CODE> if something modified and <CODE>false</CODE>
-   * otherwise.
-   * @throws ADSContextException if the ACIs could not be set up.
-   */
-  private boolean setupACIOnServer(LdapContext dirCtx, boolean enable)
-  throws ADSContextException
-  {
-    boolean result;
-    Attributes currentAttrs;
-    Attribute currentAttr, newAttr;
-    ModificationItem modItem;
-
-    try
-    {
-      // Get the ACI value on the global ACI
-      String accessControlDn = "cn=Access Control Handler,cn=config";
-      currentAttrs = dirCtx.getAttributes(accessControlDn,
-          new String[] { "ds-cfg-global-aci" });
-      currentAttr = currentAttrs.get("ds-cfg-global-aci");
-
-      // Check what ACIs values must be added or removed
-      newAttr = new BasicAttribute("ds-cfg-global-aci");
-      modItem = null;
-      if (enable)
-      {
-        if ((currentAttr == null) || !currentAttr.contains(getAdminACI1()))
-        {
-          newAttr.add(getAdminACI1());
-        }
-        if ((currentAttr == null) || !currentAttr.contains(getAdminACI2()))
-        {
-          newAttr.add(getAdminACI2());
-        }
-        if (newAttr.size() >= 1)
-        {
-          modItem = new ModificationItem(LdapContext.ADD_ATTRIBUTE, newAttr);
-        }
-      }
-      else
-      {
-        if ((currentAttr != null) && currentAttr.contains(getAdminACI1()))
-        {
-          newAttr.add(getAdminACI1());
-        }
-        if ((currentAttr != null) && currentAttr.contains(getAdminACI2()))
-        {
-          newAttr.add(getAdminACI2());
-        }
-        if (newAttr.size() >= 1)
-        {
-          modItem = new ModificationItem(LdapContext.REMOVE_ATTRIBUTE, newAttr);
-        }
-      }
-
-      // Update the ACI values on the access control entry
-      if (modItem != null)
-      {
-        dirCtx.modifyAttributes(accessControlDn,
-            new ModificationItem[] { modItem});
-        result = true;
-      }
-      else
-      {
-        result = false;
-      }
-    }
-    catch (NoPermissionException x)
-    {
-      throw new ADSContextException(
-          ADSContextException.ErrorType.ACCESS_PERMISSION);
-    }
-    catch(NamingException x)
-    {
-      throw new ADSContextException(
-          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
-    }
-    return result;
-  }
-
-  /**
    * This method returns the DN of the entry that corresponds to the given host
    * name and installation path.
    * @param hostname the host name.
@@ -1733,26 +1643,13 @@
   }
 
   /**
-   * Returns the DN of the ACI container entry.
-   * @return the DN of the ACI container entry.
-   */
-  private static String getTopContainerACI()
-  {
-    return
-    "(targetattr = \"*\")" +
-    "(version 3.0;" +
-    "acl \"Enable full access for Directory Services Managers group\";" +
-    "allow (all)" +
-    "(groupdn = \"ldap:///" + getAdministratorContainerDN() + "\");" +
-    ")";
-  }
-
-  /**
    * Creates the Administration Suffix.
-   * @param backendName TODO
+   * @param backendName the backend name to be used for the Administration
+   * Suffix.  If this value is null the default backendName for the
+   * Administration Suffix will be used.
    * @throws ADSContextException if something goes wrong.
    */
-  private void createAdministrationSuffix(String backendName)
+  public void createAdministrationSuffix(String backendName)
   throws ADSContextException
   {
     ADSContextHelper helper = new ADSContextHelper();
@@ -1762,7 +1659,7 @@
       ben = getBackendName() ;
     }
     helper.createAdministrationSuffix(getDirContext(), ben,
-        "db", "importAdminTemp");
+        getDbName(), getImportTemp());
   }
 
   /**
@@ -1780,36 +1677,13 @@
     return "adminRoot";
   }
 
-  /**
-   * Returns the first ACI required to provide access to administrators.
-   * @return the first ACI required to provide access to administrators.
-   */
-  private static String getAdminACI1()
+  private static String getDbName()
   {
-    return
-    "(target=\"ldap:///cn=config\")"+
-    "(targetattr = \"*\") " +
-    "(version 3.0; " +
-    "acl \"Enable full access for Global Administrators.\"; " +
-    "allow (all)(userdn = \"ldap:///" +
-    getAdministratorDN("*") +
-    "\");)";
+    return "adminDb";
   }
 
-
-  /**
-   * Returns the second ACI required to provide access to administrators.
-   * @return the second ACI required to provide access to administrators.
-   */
-  private static String getAdminACI2()
+  private static String getImportTemp()
   {
-    return
-    "(target=\"ldap:///cn=Access Control Handler,cn=config\")"+
-    "(targetattr = \"ds-cfg-global-aci\") (targetscope = \"base\") " +
-    "(version 3.0; " +
-    "acl \"Enable global ACI modification by Global Administrators.\"; "+
-    "allow (all)(userdn = \"ldap:///" +
-    getAdministratorDN("*") +
-    "\");)";
+    return "importAdminTemp";
   }
 }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Application.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Application.java
index ed9eaaa..bb9a906 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Application.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Application.java
@@ -443,15 +443,15 @@
    * exception.
    * This method applies a margin if the applyMargin parameter is
    * <CODE>true</CODE>.
-   * @param ex the exception.
+   * @param t the exception.
    * @param applyMargin specifies whether we apply a margin or not to the
    * resulting formatted text.
    * @return the formatted representation of an error message for the given
    * exception.
    */
-  protected String getFormattedError(Exception ex, boolean applyMargin)
+  protected String getFormattedError(Throwable t, boolean applyMargin)
   {
-    return formatter.getFormattedError(ex, applyMargin);
+    return formatter.getFormattedError(t, applyMargin);
   }
 
   /**
@@ -488,7 +488,7 @@
    * Returns the installation path.
    * @return the installation path.
    */
-  protected abstract String getInstallationPath();
+  public abstract String getInstallationPath();
 
   /**
    * Gets the current step.
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Step.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Step.java
index be3d2ec..5e80f7d 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Step.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/Step.java
@@ -80,7 +80,12 @@
   /**
    * Progress panel.
    */
-  PROGRESS("progress-step");
+  PROGRESS("progress-step"),
+
+  /**
+   * Finished panel.
+   */
+  FINISHED("finished-step");
 
   private String msgKey;
 
@@ -109,5 +114,11 @@
     return this == PROGRESS;
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isFinishedStep() {
+    return this == FINISHED;
+  }
 
 }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/WizardStep.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/WizardStep.java
index 28a8e57..ff912f5 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/WizardStep.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/WizardStep.java
@@ -47,4 +47,11 @@
    */
   boolean isProgressStep();
 
+  /**
+   * Indicates whether this is the finished step for the application or not.
+   * @return <CODE>true</CODE> if this is the finished step for the application
+   * and <CODE>false</CODE> otherwise.
+   */
+  boolean isFinishedStep();
+
 }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgradeUserData.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgradeUserData.java
new file mode 100644
index 0000000..70d7423
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgradeUserData.java
@@ -0,0 +1,57 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.installandupgrader;
+
+import org.opends.quicksetup.upgrader.UpgradeUserData;
+
+/**
+ * User data specific to the upgrade and install merged application.
+ */
+public class InstallAndUpgradeUserData extends UpgradeUserData
+{
+  private boolean isUpgrade;
+
+  /**
+   * Returns <CODE>true</CODE> if we are doing an upgrade and <CODE>false</CODE>
+   * if not.
+   * @return <CODE>true</CODE> if we are doing an upgrade and <CODE>false</CODE>
+   * if not.
+   */
+  public boolean isUpgrade() {
+    return isUpgrade;
+  }
+
+  /**
+   * Sets whether we want to make an upgrade.
+   * @param isUpgrade the boolean telling whether we want to do an upgrade or
+   * not.
+   */
+  public void setUpgrade(boolean isUpgrade) {
+    this.isUpgrade = isUpgrade;
+  }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgrader.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgrader.java
new file mode 100644
index 0000000..278c852
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/InstallAndUpgrader.java
@@ -0,0 +1,495 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.installandupgrader;
+
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import org.opends.quicksetup.ButtonName;
+import org.opends.quicksetup.CurrentInstallStatus;
+import org.opends.quicksetup.ProgressStep;
+import org.opends.quicksetup.QuickSetupLog;
+import org.opends.quicksetup.Step;
+import org.opends.quicksetup.UserData;
+import org.opends.quicksetup.UserDataException;
+import org.opends.quicksetup.WizardStep;
+import org.opends.quicksetup.event.ProgressUpdateListener;
+import org.opends.quicksetup.i18n.ResourceProvider;
+import org.opends.quicksetup.installandupgrader.ui.WelcomePanel;
+import org.opends.quicksetup.installer.Installer;
+import org.opends.quicksetup.installer.offline.OfflineInstaller;
+import org.opends.quicksetup.installer.webstart.WebStartInstaller;
+import org.opends.quicksetup.ui.FieldName;
+import org.opends.quicksetup.ui.GuiApplication;
+import org.opends.quicksetup.ui.QuickSetup;
+import org.opends.quicksetup.ui.QuickSetupDialog;
+import org.opends.quicksetup.ui.QuickSetupStepPanel;
+import org.opends.quicksetup.upgrader.UpgradeLauncher;
+import org.opends.quicksetup.upgrader.UpgradeWizardStep;
+import org.opends.quicksetup.upgrader.Upgrader;
+import org.opends.quicksetup.util.ProgressMessageFormatter;
+import org.opends.quicksetup.util.Utils;
+
+/**
+ * Application that allows to upgrade or install OpenDS.
+ */
+public class InstallAndUpgrader extends GuiApplication
+{
+  static private final Logger LOG =
+    Logger.getLogger(InstallAndUpgrader.class.getName());
+  private Installer installer;
+  private Upgrader upgrader;
+  private InstallAndUpgradeUserData userData;
+
+  /**
+   * Creates a default instance.
+   */
+  public InstallAndUpgrader() {
+
+    // Initialize the logs if necessary
+    try {
+      if (!QuickSetupLog.isInitialized())
+        QuickSetupLog.initLogFileHandler(
+                File.createTempFile(
+                        UpgradeLauncher.LOG_FILE_PREFIX,
+                        UpgradeLauncher.LOG_FILE_SUFFIX));
+    } catch (IOException e) {
+      System.err.println(
+              ResourceProvider.getInstance().getMsg("error-initializing-log"));
+      e.printStackTrace();
+    }
+    if (Utils.isWebStart())
+    {
+      installer = new WebStartInstaller();
+    }
+    else
+    {
+      installer = new OfflineInstaller();
+    }
+    upgrader = new Upgrader();
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public void setProgressMessageFormatter(ProgressMessageFormatter formatter) {
+    super.setProgressMessageFormatter(formatter);
+    installer.setProgressMessageFormatter(formatter);
+    upgrader.setProgressMessageFormatter(formatter);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void setCurrentInstallStatus(CurrentInstallStatus installStatus) {
+    super.setCurrentInstallStatus(installStatus);
+    installer.setCurrentInstallStatus(installStatus);
+    upgrader.setCurrentInstallStatus(installStatus);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public UserData getUserData()
+  {
+    if (userData == null) {
+      userData = (InstallAndUpgradeUserData)createUserData();
+    }
+    return userData;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public UserData createUserData() {
+    return new InstallAndUpgradeUserData();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String getFrameTitle() {
+    return getMsg("frame-install-title");
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public WizardStep getFirstWizardStep() {
+    return Step.WELCOME;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public WizardStep getFinishedStep() {
+    return getDelegateApplication().getFinishedStep();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void run()
+  {
+    getDelegateApplication().run();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void addProgressUpdateListener(ProgressUpdateListener l)
+  {
+    installer.addProgressUpdateListener(l);
+    upgrader.addProgressUpdateListener(l);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void removeProgressUpdateListener(ProgressUpdateListener l)
+  {
+    installer.removeProgressUpdateListener(l);
+    upgrader.removeProgressUpdateListener(l);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isCancellable()
+  {
+    return getDelegateApplication().isCancellable();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void setWizardDialogState(QuickSetupDialog dlg,
+                                      UserData userData,
+                                      WizardStep step) {
+    if ((getDelegateApplication() == upgrader) &&
+        (step == Step.WELCOME))
+    {
+      step = UpgradeWizardStep.WELCOME;
+    }
+    getDelegateApplication().setWizardDialogState(dlg, userData, step);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public WizardStep getNextWizardStep(WizardStep step) {
+    if ((getDelegateApplication() == upgrader) &&
+        (step == Step.WELCOME))
+    {
+      step = UpgradeWizardStep.WELCOME;
+    }
+    return getDelegateApplication().getNextWizardStep(step);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public QuickSetupStepPanel createWizardStepPanel(WizardStep step) {
+    QuickSetupStepPanel p = null;
+    if (step == Step.WELCOME) {
+      p = new WelcomePanel(this);
+    }
+    if (p == null)
+    {
+      p = upgrader.createWizardStepPanel(step);
+    }
+    if (p == null)
+    {
+      p = installer.createWizardStepPanel(step);
+    }
+    return p;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public WizardStep getPreviousWizardStep(WizardStep step) {
+    WizardStep s = getDelegateApplication().getPreviousWizardStep(step);
+    if (s == UpgradeWizardStep.WELCOME)
+    {
+      s = Step.WELCOME;
+    }
+    return s;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public LinkedHashSet<WizardStep> getOrderedSteps()
+  {
+    LinkedHashSet<WizardStep> set = new LinkedHashSet<WizardStep>();
+    set.addAll(installer.getOrderedSteps());
+    set.addAll(upgrader.getOrderedSteps());
+    set.remove(UpgradeWizardStep.WELCOME);
+    return set;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public ProgressStep getCurrentProgressStep() {
+    return getDelegateApplication().getCurrentProgressStep();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public Integer getRatio(ProgressStep step) {
+    return getDelegateApplication().getRatio(step);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String getSummary(ProgressStep step) {
+    return getDelegateApplication().getSummary(step);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void windowClosing(QuickSetupDialog dlg, WindowEvent evt) {
+    getDelegateApplication().windowClosing(dlg, evt);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public ButtonName getInitialFocusButtonName() {
+    return getDelegateApplication().getInitialFocusButtonName();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public Set<? extends WizardStep> getWizardSteps() {
+    Set<WizardStep> set = new HashSet<WizardStep>();
+    set.addAll(installer.getWizardSteps());
+    set.addAll(upgrader.getWizardSteps());
+    set.remove(UpgradeWizardStep.WELCOME);
+    return set;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isVisible(WizardStep step)
+  {
+    boolean isVisible;
+    if (step == Step.WELCOME)
+    {
+      isVisible = true;
+    }
+    else
+    {
+      isVisible = getDelegateApplication().isVisible(step) &&
+      getDelegateApplication().getWizardSteps().contains(step);
+    }
+    return isVisible;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isSubStep(WizardStep step)
+  {
+    boolean isSubStep;
+    if (step == Step.WELCOME)
+    {
+      isSubStep = false;
+    }
+    else
+    {
+      isSubStep = getDelegateApplication().isSubStep(step);
+    }
+    return isSubStep;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean canGoBack(WizardStep step) {
+    boolean canGoBack;
+    if (step == Step.WELCOME)
+    {
+      canGoBack = false;
+    }
+    else
+    {
+      canGoBack = getDelegateApplication().canGoBack(step);
+    }
+    return canGoBack;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean canGoForward(WizardStep step) {
+    boolean canGoForward;
+    if (step == Step.WELCOME)
+    {
+      canGoForward = true;
+    }
+    else
+    {
+      canGoForward = getDelegateApplication().canGoForward(step);
+    }
+    return canGoForward;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean canFinish(WizardStep step) {
+    return getDelegateApplication().canFinish(step);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean canQuit(WizardStep step) {
+    return getDelegateApplication().canQuit(step);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void previousClicked(WizardStep cStep, QuickSetup qs)
+  {
+    getDelegateApplication().previousClicked(cStep, qs);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void nextClicked(WizardStep cStep, QuickSetup qs)
+  {
+    getDelegateApplication().nextClicked(cStep, qs);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean finishClicked(WizardStep cStep, QuickSetup qs)
+  {
+    return getDelegateApplication().finishClicked(cStep, qs);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void closeClicked(WizardStep cStep, QuickSetup qs)
+  {
+    getDelegateApplication().closeClicked(cStep, qs);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void quitClicked(WizardStep cStep, QuickSetup qs)
+  {
+    getDelegateApplication().quitClicked(cStep, qs);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void updateUserData(WizardStep cStep, QuickSetup qs)
+  throws UserDataException
+  {
+    if (cStep == Step.WELCOME)
+    {
+      Boolean isUpgrade = (Boolean)qs.getFieldValue(FieldName.IS_UPGRADE);
+      ((InstallAndUpgradeUserData)getUserData()).setUpgrade(isUpgrade);
+      if (isUpgrade)
+      {
+        upgrader.updateUserData(UpgradeWizardStep.WELCOME, qs);
+        getUserData().setServerLocation(
+            upgrader.getUserData().getServerLocation());
+      }
+      else
+      {
+        installer.updateUserData(cStep, qs);
+      }
+    }
+    else
+    {
+      getDelegateApplication().updateUserData(cStep, qs);
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void cancel()
+  {
+    getDelegateApplication().cancel();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isFinished()
+  {
+    return getDelegateApplication().isFinished();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String getInstallationPath()
+  {
+    return getDelegateApplication().getInstallationPath();
+  }
+
+  private GuiApplication getDelegateApplication()
+  {
+    GuiApplication application;
+    if (((InstallAndUpgradeUserData)getUserData()).isUpgrade())
+    {
+      application = upgrader;
+    }
+    else
+    {
+      application = installer;
+    }
+    return application;
+  }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/ui/WelcomePanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/ui/WelcomePanel.java
new file mode 100644
index 0000000..6f8099f
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installandupgrader/ui/WelcomePanel.java
@@ -0,0 +1,259 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.installandupgrader.ui;
+
+import org.opends.quicksetup.ui.*;
+import org.opends.quicksetup.UserData;
+import org.opends.quicksetup.event.BrowseActionListener;
+import org.opends.quicksetup.installandupgrader.InstallAndUpgradeUserData;
+import org.opends.quicksetup.installandupgrader.InstallAndUpgrader;
+import org.opends.server.util.DynamicConstants;
+
+import javax.swing.*;
+import javax.swing.text.JTextComponent;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * This panel is used to show a welcome message asking the user whether to
+ * install a new instance or upgrade an existing instance.
+ */
+public class WelcomePanel extends QuickSetupStepPanel {
+
+  private static final long serialVersionUID = 8696606861642491768L;
+
+  private JLabel lblServerLocation;
+
+  private JTextComponent tcServerLocation;
+
+  private JRadioButton rbInstall;
+
+  private JRadioButton rbUpgrade;
+
+  private JButton butBrowse;
+
+  /**
+   * Default constructor.
+   * @param application Upgrader application
+   */
+  public WelcomePanel(InstallAndUpgrader application) {
+    super(application);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void beginDisplay(UserData data) {
+    super.beginDisplay(data);
+    tcServerLocation.setText(data.getServerLocation());
+    boolean isUpgrade = ((InstallAndUpgradeUserData)data).isUpgrade();
+    rbInstall.setSelected(!isUpgrade);
+    rbUpgrade.setSelected(isUpgrade);
+    checkEnablingState();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public Object getFieldValue(FieldName fieldName) {
+    Object v = null;
+    if (FieldName.SERVER_TO_UPGRADE_LOCATION.equals(fieldName)) {
+      v = tcServerLocation.getText();
+    }
+    else if (FieldName.IS_UPGRADE.equals(fieldName))
+    {
+      v = rbUpgrade.isSelected() ? Boolean.TRUE : Boolean.FALSE;
+    }
+    return v;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void displayFieldInvalid(FieldName fieldName, boolean invalid) {
+    UIFactory.TextStyle style;
+    if (invalid) {
+      style = UIFactory.TextStyle.PRIMARY_FIELD_INVALID;
+    } else {
+      style = UIFactory.TextStyle.PRIMARY_FIELD_VALID;
+    }
+    if (FieldName.SERVER_TO_UPGRADE_LOCATION.equals(fieldName)) {
+      UIFactory.setTextStyle(lblServerLocation, style);
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected String getTitle() {
+    return getMsg("installandupgrade-welcome-panel-title");
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected String getInstructions() {
+    /*
+     * We can use org.opends.server.util.DynamicConstants without problems as it
+     * has been added to quicksetup.jar during build time.
+     */
+    return getMsg("installandupgrade-welcome-panel-instructions",
+            new String[] {
+                    DynamicConstants.COMPACT_VERSION_STRING,
+                    DynamicConstants.BUILD_ID});
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected Component createInputPanel()
+  {
+    JPanel p = UIFactory.makeJPanel();
+    p.setLayout(new GridBagLayout());
+
+    rbInstall = UIFactory.makeJRadioButton(
+        getMsg("installandupgrader-rbinstall-label"),
+        getMsg("installandupgrader-rbinstall-tooltip"),
+        UIFactory.TextStyle.PRIMARY_FIELD_VALID);
+    rbUpgrade = UIFactory.makeJRadioButton(
+        getMsg("installandupgrader-rbupgrade-label"),
+        getMsg("installandupgrader-rbupgrade-tooltip"),
+        UIFactory.TextStyle.PRIMARY_FIELD_VALID);
+    ButtonGroup group = new ButtonGroup();
+    group.add(rbInstall);
+    group.add(rbUpgrade);
+
+    ActionListener l = new ActionListener()
+    {
+      public void actionPerformed(ActionEvent ev)
+      {
+        checkEnablingState();
+      }
+    };
+    rbInstall.addActionListener(l);
+    rbUpgrade.addActionListener(l);
+
+    GridBagConstraints gbc = new GridBagConstraints();
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.insets = UIFactory.getEmptyInsets();
+    gbc.anchor = GridBagConstraints.NORTHWEST;
+    gbc.weightx = 1.0;
+    gbc.weighty = 0.0;
+    gbc.gridwidth = GridBagConstraints.REMAINDER;
+
+    p.add(rbInstall, gbc);
+    gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
+    p.add(rbUpgrade, gbc);
+    gbc.insets.left = UIFactory.LEFT_INSET_RADIO_SUBORDINATE;
+    p.add(createUpgraderPanel(), gbc);
+
+    gbc.insets.top = 0;
+    gbc.weighty = 1.0;
+    gbc.fill = GridBagConstraints.VERTICAL;
+    p.add(Box.createVerticalGlue(), gbc);
+    return p;
+  }
+
+  /**
+   * Updates the state of the widgets in the panel depending on the radio button
+   * that has been chosen.
+   *
+   */
+  private void checkEnablingState()
+  {
+    boolean enable = rbUpgrade.isSelected();
+    lblServerLocation.setEnabled(enable);
+    tcServerLocation.setEnabled(enable);
+    butBrowse.setEnabled(enable);
+  }
+
+  /**
+   * Creates the panel containing the fields specific to the upgrader.
+   * @return the panel containing the fields specific to the upgrader.
+   */
+  private Component createUpgraderPanel() {
+    Component c;
+
+    LabelFieldDescriptor serverLocationDescriptor =
+            new LabelFieldDescriptor(getMsg("upgrade-location-label"),
+                    getMsg("upgrade-location-tooltip"),
+                    LabelFieldDescriptor.FieldType.TEXTFIELD,
+                    LabelFieldDescriptor.LabelType.PRIMARY,
+                    UIFactory.PATH_FIELD_SIZE);
+
+    JPanel pnlBuildInfo = UIFactory.makeJPanel();
+    pnlBuildInfo.setLayout(new GridBagLayout());
+    GridBagConstraints gbc = new GridBagConstraints();
+
+    UserData userData = getApplication().getUserData();
+
+    lblServerLocation = UIFactory.makeJLabel(serverLocationDescriptor);
+
+    tcServerLocation =
+      UIFactory.makeJTextComponent(serverLocationDescriptor,
+          userData.getServerLocation());
+
+    butBrowse =
+      UIFactory.makeJButton(getMsg("browse-button-label"),
+          getMsg("browse-button-tooltip"));
+
+    BrowseActionListener l =
+      new BrowseActionListener(tcServerLocation,
+          BrowseActionListener.BrowseType.LOCATION_DIRECTORY,
+          getMainWindow());
+    butBrowse.addActionListener(l);
+
+    JPanel pnlBrowser = Utilities.createBrowseButtonPanel(
+        lblServerLocation,
+        tcServerLocation,
+        butBrowse);
+    pnlBrowser.setOpaque(false);
+
+    gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
+    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
+    gbc.gridwidth = GridBagConstraints.REMAINDER;
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.BOTH;
+    pnlBuildInfo.add(pnlBrowser, gbc);
+
+    gbc.gridy = 1;
+    gbc.weighty = 1.0;
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.BOTH;
+    gbc.anchor = GridBagConstraints.LINE_START;
+    JPanel fill = UIFactory.makeJPanel();
+    // fill.setBorder(BorderFactory.createLineBorder(Color.BLUE));
+    pnlBuildInfo.add(fill, gbc);
+
+    c = pnlBuildInfo;
+
+    return c;
+  }
+}
+
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredDomain.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredDomain.java
new file mode 100644
index 0000000..5140c92
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredDomain.java
@@ -0,0 +1,91 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.installer;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Class used to know what has been modified in the configuration of a
+ * replication domain.
+ * This class provides a read only view of what has been configured.
+ *
+ */
+class ConfiguredDomain
+{
+  private String domainName;
+  private boolean isCreated;
+  Set<String> addedReplicationServers;
+
+  /**
+   * Constructor of the ConfiguredDomain object.
+   * @param domainName the name of the domain.
+   * @param isCreated whether the domain has been created or not.
+   * @param addedReplicationServers the set of replication servers added to
+   * the replication server configuration.
+   */
+  ConfiguredDomain(String domainName, boolean isCreated,
+      Set<String> addedReplicationServers)
+  {
+    this.domainName = domainName;
+    this.isCreated = isCreated;
+    this.addedReplicationServers = new HashSet<String>();
+    this.addedReplicationServers.addAll(addedReplicationServers);
+  }
+
+  /**
+   * Returns a set of replication servers added to the replication domain
+   * configuration.
+   * @return a set of replication servers added to the replication domain
+   * configuration.
+   */
+  Set<String> getAddedReplicationServers()
+  {
+    return addedReplicationServers;
+  }
+
+  /**
+   * Returns the domain name.
+   * @return the domain name.
+   */
+  String getDomainName()
+  {
+    return domainName;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if the Replication domain was created and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if the Replication domain was created and
+   * <CODE>false</CODE> otherwise.
+   */
+  boolean isCreated()
+  {
+    return isCreated;
+  }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredReplication.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredReplication.java
new file mode 100644
index 0000000..0215b6d
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/ConfiguredReplication.java
@@ -0,0 +1,127 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.installer;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Class used to know what has been configured in terms of replication on
+ * a server.  This class provides a read only view of what has been configured.
+ *
+ */
+class ConfiguredReplication
+{
+  private boolean synchProviderCreated;
+  private boolean synchProviderEnabled;
+  private boolean replicationServerCreated;
+  private Set<String> newReplicationServers;
+  private Set<ConfiguredDomain> domainsConf;
+
+  /**
+   * Constructor of the ConfiguredReplication object.
+   * @param synchProviderCreated whether the synchronization provider was
+   * created or not.
+   * @param synchProviderEnabled whether the synchronization provider was
+   * enabled or not.
+   * @param replicationServerCreated whether the replication server was
+   * created or not.
+   * @param newReplicationServers the set of replication servers added to
+   * the replication server configuration.
+   * @param domainsConf the set of ConfiguredDomain objects representing the
+   * replication domains that were modified.
+   */
+  ConfiguredReplication(boolean synchProviderCreated,
+      boolean synchProviderEnabled, boolean replicationServerCreated,
+      Set<String> newReplicationServers, Set<ConfiguredDomain> domainsConf)
+  {
+    this.synchProviderCreated = synchProviderCreated;
+    this.synchProviderEnabled = synchProviderEnabled;
+    this.replicationServerCreated = replicationServerCreated;
+    this.newReplicationServers = new HashSet<String>();
+    this.newReplicationServers.addAll(newReplicationServers);
+    this.domainsConf = new HashSet<ConfiguredDomain>();
+    this.domainsConf.addAll(domainsConf);
+  }
+
+  /**
+   * Returns a set of ConfiguredDomain objects representing the replication
+   * domains that were modified.
+   * @return a set of ConfiguredDomain objects representing the replication
+   * domains that were modified.
+   */
+  public Set<ConfiguredDomain> getDomainsConf()
+  {
+    return domainsConf;
+  }
+
+
+  /**
+   * Returns a set of replication servers added to the replication server
+   * configuration.
+   * @return a set of replication servers added to the replication server
+   * configuration.
+   */
+  Set<String> getNewReplicationServers()
+  {
+    return newReplicationServers;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if the Replication Server was created and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if the Replication Server was created and
+   * <CODE>false</CODE> otherwise.
+   */
+  boolean isReplicationServerCreated()
+  {
+    return replicationServerCreated;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if the Synchronization Provider was created and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if the Synchronization Provider was created and
+   * <CODE>false</CODE> otherwise.
+   */
+  boolean isSynchProviderCreated()
+  {
+    return synchProviderCreated;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if the Synchronization Provider was enabled and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if the Synchronization Provider was enabled and
+   * <CODE>false</CODE> otherwise.
+   */
+  boolean isSynchProviderEnabled()
+  {
+    return synchProviderEnabled;
+  }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallLauncher.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallLauncher.java
index fd263bb..822520a 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallLauncher.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallLauncher.java
@@ -138,9 +138,6 @@
     System.out.println(getMsg("setup-launcher-launching-gui"));
     System.setProperty("org.opends.quicksetup.Application.class",
             "org.opends.quicksetup.installer.offline.OfflineInstaller");
-    // TO DELETE
-    System.setProperty("org.opends.quicksetup.Application.class",
-    "org.opends.quicksetup.installandupgrader.InstallAndUpgrader");
   }
 
   /**
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
index 03b0f9a..106efa4 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -106,6 +106,10 @@
   /** When true indicates that the user has canceled this operation. */
   protected boolean canceled = false;
 
+  /** Map containing information about what has been configured remotely. */
+  Map<ServerDescriptor, ConfiguredReplication> hmConfiguredRemoteReplication =
+    new HashMap<ServerDescriptor, ConfiguredReplication>();
+
   // Constants used to do checks
   private static final int MIN_DIRECTORY_MANAGER_PWD = 1;
 
@@ -135,9 +139,7 @@
   {
     SUBSTEPS.add(Step.CREATE_GLOBAL_ADMINISTRATOR);
     SUBSTEPS.add(Step.SUFFIXES_OPTIONS);
-    // TODO: remove this comment once we want to display the replication options
-    // in setup.
-    //SUBSTEPS.add(Step.NEW_SUFFIX_OPTIONS);
+    SUBSTEPS.add(Step.NEW_SUFFIX_OPTIONS);
     SUBSTEPS.add(Step.REMOTE_REPLICATION_PORTS);
   }
 
@@ -146,6 +148,10 @@
 
   private char[] selfSignedCertPw = null;
 
+  private boolean registeredNewServerOnRemote;
+  private boolean createdAdministrator;
+  private boolean createdRemoteAds;
+
   /**
    * An static String that contains the class name of ConfigFileHandler.
    */
@@ -161,17 +167,14 @@
   public Installer() {
     lstSteps.add(WELCOME);
     lstSteps.add(SERVER_SETTINGS);
-    // TODO: remove this comment once we want to display the replication options
-    // in setup.
-    /*
     lstSteps.add(REPLICATION_OPTIONS);
     lstSteps.add(CREATE_GLOBAL_ADMINISTRATOR);
     lstSteps.add(SUFFIXES_OPTIONS);
     lstSteps.add(REMOTE_REPLICATION_PORTS);
-    */
     lstSteps.add(NEW_SUFFIX_OPTIONS);
     lstSteps.add(REVIEW);
     lstSteps.add(PROGRESS);
+    lstSteps.add(FINISHED);
     try {
       if (!QuickSetupLog.isInitialized())
         QuickSetupLog.initLogFileHandler(
@@ -211,7 +214,8 @@
    */
   public boolean canGoBack(WizardStep step) {
     return step != WELCOME &&
-            step != PROGRESS;
+            step != PROGRESS &&
+            step != FINISHED;
   }
 
   /**
@@ -219,7 +223,8 @@
    */
   public boolean canGoForward(WizardStep step) {
     return step != REVIEW &&
-            step != PROGRESS;
+            step != PROGRESS &&
+            step != FINISHED;
   }
 
   /**
@@ -233,7 +238,8 @@
    * {@inheritDoc}
    */
   public boolean canQuit(WizardStep step) {
-    return step != PROGRESS;
+    return step != PROGRESS &&
+    step != FINISHED;
   }
 
   /**
@@ -294,9 +300,6 @@
     {
       isVisible = true;
     }
-    // TODO: remove this line once we want to display the replication options
-    // in setup.
-    isVisible = true;
     return isVisible;
   }
 
@@ -325,6 +328,9 @@
           "Cannot click on next from progress step");
     } else if (cStep == REVIEW) {
       throw new IllegalStateException("Cannot click on next from review step");
+    } else if (cStep == FINISHED) {
+      throw new IllegalStateException(
+          "Cannot click on next from finished step");
     }
   }
 
@@ -338,6 +344,10 @@
               getMsg("confirm-close-install-title"))) {
         qs.quit();
       }
+    }
+    else if (cStep == FINISHED)
+    {
+      qs.quit();
     } else {
       throw new IllegalStateException(
               "Close only can be clicked on PROGRESS step");
@@ -358,7 +368,7 @@
    * {@inheritDoc}
    */
   public void cancel() {
-    setStatus(InstallProgressStep.WAITING_TO_CANCEL);
+    setCurrentProgressStep(InstallProgressStep.WAITING_TO_CANCEL);
     notifyListeners(null);
     this.canceled = true;
   }
@@ -367,7 +377,11 @@
    * {@inheritDoc}
    */
   public void quitClicked(WizardStep cStep, QuickSetup qs) {
-    if (cStep == PROGRESS) {
+    if (cStep == FINISHED)
+    {
+      qs.quit();
+    }
+    else if (cStep == PROGRESS) {
       throw new IllegalStateException(
               "Cannot click on quit from progress step");
     } else if (installStatus.isInstalled()) {
@@ -443,6 +457,8 @@
         p = new InstallReviewPanel(this);
     } else if (step == PROGRESS) {
         p = new ProgressPanel(this);
+    } else if (step == FINISHED) {
+        p = new FinishedPanel(this);
     }
     return p;
   }
@@ -504,6 +520,9 @@
     } else if (cStep == PROGRESS) {
       throw new IllegalStateException(
           "Cannot click on previous from progress step");
+    } else if (cStep == FINISHED) {
+      throw new IllegalStateException(
+          "Cannot click on previous from finished step");
     }
   }
 
@@ -515,13 +534,13 @@
   }
 
   /** Indicates the current progress step. */
-  private InstallProgressStep status =
+  private InstallProgressStep currentProgressStep =
           InstallProgressStep.NOT_STARTED;
 
   /**
    * {@inheritDoc}
    */
-  protected void setWizardDialogState(QuickSetupDialog dlg,
+  public void setWizardDialogState(QuickSetupDialog dlg,
                                       UserData userData,
                                       WizardStep step) {
     if (!installStatus.isInstalled() || forceToDisplaySetup) {
@@ -532,8 +551,9 @@
       } else if (step == WELCOME) {
         dlg.setDefaultButton(ButtonName.NEXT);
         dlg.setFocusOnButton(ButtonName.NEXT);
-      } else if (step == REVIEW) {
-        dlg.setDefaultButton(ButtonName.NEXT);
+      } else if ((step == PROGRESS) || (step == FINISHED)) {
+        dlg.setDefaultButton(ButtonName.CLOSE);
+        dlg.setFocusOnButton(ButtonName.CLOSE);
       } else {
         dlg.setDefaultButton(ButtonName.NEXT);
       }
@@ -545,7 +565,7 @@
    */
   public ProgressStep getCurrentProgressStep()
   {
-    return status;
+    return currentProgressStep;
   }
 
   /**
@@ -627,17 +647,14 @@
     LinkedHashSet<WizardStep> orderedSteps = new LinkedHashSet<WizardStep>();
     orderedSteps.add(WELCOME);
     orderedSteps.add(SERVER_SETTINGS);
-    // TODO: remove this comment once we want to display the replication options
-    // in setup.
-    /*
     orderedSteps.add(REPLICATION_OPTIONS);
     orderedSteps.add(CREATE_GLOBAL_ADMINISTRATOR);
     orderedSteps.add(SUFFIXES_OPTIONS);
     orderedSteps.add(REMOTE_REPLICATION_PORTS);
-    */
     orderedSteps.add(NEW_SUFFIX_OPTIONS);
     orderedSteps.add(REVIEW);
     orderedSteps.add(PROGRESS);
+    orderedSteps.add(FINISHED);
     return orderedSteps;
   }
 
@@ -659,6 +676,13 @@
   }
 
   /**
+   * {@inheritDoc}
+   */
+  public WizardStep getFinishedStep() {
+    return Step.FINISHED;
+  }
+
+  /**
    * Uninstalls installed services.  This is to be used when the user
    * has elected to cancel an installation.
    */
@@ -672,10 +696,7 @@
       }
     }
 
-    if (completedProgress.contains(
-            InstallProgressStep.CONFIGURING_REPLICATION)) {
-      // TODO:  undo replication
-    }
+    unconfigureRemote();
   }
 
   /**
@@ -1085,6 +1106,112 @@
   }
 
   /**
+   * This method undoes the modifications made in other servers in terms of
+   * replication.  This method assumes that we are aborting the Installer and
+   * that is why it does not call checkAbort.
+   */
+  private void unconfigureRemote()
+  {
+    InitialLdapContext ctx = null;
+    if (registeredNewServerOnRemote || createdAdministrator ||
+    createdRemoteAds)
+    {
+      // Try to connect
+      DataReplicationOptions repl = getUserData().getReplicationOptions();
+      AuthenticationData auth = repl.getAuthenticationData();
+      String ldapUrl = getLdapUrl(auth);
+      String dn = auth.getDn();
+      String pwd = auth.getPwd();
+      notifyListeners(getFormattedWithPoints(
+          getMsg("progress-unconfiguring-ads-on-remote",
+              getHostDisplay(auth))));
+      try
+      {
+        if (auth.useSecureConnection())
+        {
+          ApplicationTrustManager trustManager = getTrustManager();
+          trustManager.setHost(auth.getHostName());
+          ctx = Utils.createLdapsContext(ldapUrl, dn, pwd,
+              Utils.getDefaultLDAPTimeout(), null, trustManager);
+        }
+        else
+        {
+          ctx = Utils.createLdapContext(ldapUrl, dn, pwd,
+              Utils.getDefaultLDAPTimeout(), null);
+        }
+
+        ADSContext adsContext = new ADSContext(ctx);
+        if (createdRemoteAds)
+        {
+          adsContext.removeAdminData();
+        }
+        else
+        {
+          if (registeredNewServerOnRemote)
+          {
+            adsContext.unregisterServer(getNewServerAdsProperties());
+          }
+          if (createdAdministrator)
+          {
+            adsContext.deleteAdministrator(getAdministratorProperties());
+          }
+        }
+        notifyListeners(getFormattedDone());
+        notifyListeners(getLineBreak());
+      }
+      catch (Throwable t)
+      {
+        String html = getFormattedError(t, true);
+        notifyListeners(html);
+      }
+      finally
+      {
+        if (ctx != null)
+        {
+          try
+          {
+            ctx.close();
+          }
+          catch (Throwable t)
+          {
+          }
+        }
+      }
+    }
+    InstallerHelper helper = new InstallerHelper();
+    for (ServerDescriptor server : hmConfiguredRemoteReplication.keySet())
+    {
+      notifyListeners(getFormattedWithPoints(
+          getMsg("progress-unconfiguring-replication-remote",
+              server.getHostPort(true))));
+      try
+      {
+        ctx = getRemoteConnection(server, getTrustManager());
+        helper.unconfigureReplication(ctx,
+            hmConfiguredRemoteReplication.get(server),
+            server.getHostPort(true));
+      }
+      catch (ApplicationException ae)
+      {
+        String html = getFormattedError(ae, true);
+        notifyListeners(html);
+      }
+      if (ctx != null)
+      {
+        try
+        {
+          ctx.close();
+        }
+        catch (Throwable t)
+        {
+        }
+      }
+      notifyListeners(getFormattedDone());
+      notifyListeners(getLineBreak());
+    }
+  }
+
+  /**
    * This method creates the replication configuration for the suffixes on the
    * the local server (and eventually in the remote servers) to synchronize
    * things.
@@ -1208,6 +1335,8 @@
       }
     }
     notifyListeners(getFormattedDone());
+    notifyListeners(getLineBreak());
+    checkAbort();
 
     if (rep.getType() == DataReplicationOptions.Type.IN_EXISTING_TOPOLOGY)
     {
@@ -1229,7 +1358,6 @@
       }
       for (ServerDescriptor server : hm.keySet())
       {
-        notifyListeners(getLineBreak());
         notifyListeners(getFormattedWithPoints(
             getMsg("progress-configuring-replication-remote",
                 server.getHostPort(true))));
@@ -1252,9 +1380,11 @@
         }
 
         ctx = getRemoteConnection(server, getTrustManager());
-        helper.configureReplication(ctx, dns, replicationServers,
-            replicationPort, server.getHostPort(true),
-            knownReplicationServerIds, knownServerIds);
+        ConfiguredReplication repl =
+          helper.configureReplication(ctx, dns, replicationServers,
+              replicationPort, server.getHostPort(true),
+              knownReplicationServerIds, knownServerIds);
+        hmConfiguredRemoteReplication.put(server, repl);
 
         try
         {
@@ -1264,6 +1394,8 @@
         {
         }
         notifyListeners(getFormattedDone());
+        notifyListeners(getLineBreak());
+        checkAbort();
       }
     }
   }
@@ -1344,7 +1476,7 @@
    */
   protected void checkAbort() throws ApplicationException {
     if (canceled) {
-      setStatus(InstallProgressStep.CANCELING);
+      setCurrentProgressStep(InstallProgressStep.CANCELING);
       notifyListeners(null);
       throw new ApplicationException(
             ApplicationException.Type.CANCEL,
@@ -1422,15 +1554,16 @@
   }
 
   /**
-   * Sets the current status of the installation process.
-   * @param status the current status of the installation process.
+   * Sets the current progress step of the installation process.
+   * @param currentProgressStep the current progress step of the installation
+   * process.
    */
-  protected void setStatus(InstallProgressStep status)
+  protected void setCurrentProgressStep(InstallProgressStep currentProgressStep)
   {
-    if (status != null) {
-      this.completedProgress.add(status);
+    if (currentProgressStep != null) {
+      this.completedProgress.add(currentProgressStep);
     }
-    this.status = status;
+    this.currentProgressStep = currentProgressStep;
   }
 
   /**
@@ -1445,17 +1578,18 @@
       switch (getUserData().getNewSuffixOptions().getType())
       {
       case CREATE_BASE_ENTRY:
-        status = InstallProgressStep.CREATING_BASE_ENTRY;
+        currentProgressStep = InstallProgressStep.CREATING_BASE_ENTRY;
         notifyListeners(getTaskSeparator());
         createBaseEntry();
         break;
       case IMPORT_FROM_LDIF_FILE:
-        status = InstallProgressStep.IMPORTING_LDIF;
+        currentProgressStep = InstallProgressStep.IMPORTING_LDIF;
         notifyListeners(getTaskSeparator());
         importLDIF();
         break;
       case IMPORT_AUTOMATICALLY_GENERATED_DATA:
-        status = InstallProgressStep.IMPORTING_AUTOMATICALLY_GENERATED;
+        currentProgressStep =
+          InstallProgressStep.IMPORTING_AUTOMATICALLY_GENERATED;
         notifyListeners(getTaskSeparator());
         importAutomaticallyGenerated();
         break;
@@ -1545,6 +1679,11 @@
             }
           }
         }
+        try
+        {
+          Thread.sleep(3000);
+        }
+        catch (Throwable t) {}
         int nTries = 4;
         boolean initDone = false;
         while (!initDone)
@@ -1593,6 +1732,7 @@
         notifyListeners(getLineBreak());
       }
       i++;
+      checkAbort();
     }
   }
 
@@ -1648,8 +1788,10 @@
               notifyListeners(getFormattedWithPoints(
                   getMsg("progress-creating-administrator", arg)));
               adsContext.createAdministrator(getAdministratorProperties());
+              createdAdministrator = true;
               notifyListeners(getFormattedDone());
               notifyListeners(getLineBreak());
+              checkAbort();
             }
             catch (ADSContextException ade)
             {
@@ -1676,9 +1818,10 @@
           adsContext.registerServer(
               getRemoteServerProperties(auth.getHostName(),
                   adsContext.getDirContext()));
-
+          createdRemoteAds = true;
           notifyListeners(getFormattedDone());
           notifyListeners(getLineBreak());
+          checkAbort();
         }
         /* Configure local server to have an ADS */
         notifyListeners(getFormattedWithPoints(
@@ -1694,9 +1837,10 @@
           throw new ApplicationException(
               ApplicationException.Type.CONFIGURATION_ERROR, failedMsg, t);
         }
-        createLocalAds(localCtx);
+        createLocalAds(localCtx, false);
         notifyListeners(getFormattedDone());
         notifyListeners(getLineBreak());
+        checkAbort();
 
         lastLoadedCache = new TopologyCache(adsContext, getTrustManager());
         lastLoadedCache.reloadTopology();
@@ -1771,12 +1915,15 @@
         try
         {
           adsContext.registerServer(getNewServerAdsProperties());
+          registeredNewServerOnRemote = true;
         }
         catch (ADSContextException adse)
         {
           if (adse.getError() ==
             ADSContextException.ErrorType.ALREADY_REGISTERED)
           {
+            LOG.log(Level.WARNING, "Server already registered. Unregistering "+
+                "and registering server");
             /* This might occur after registering and unregistering a server */
             adsContext.unregisterServer(getNewServerAdsProperties());
             adsContext.registerServer(getNewServerAdsProperties());
@@ -1803,52 +1950,15 @@
                 getMsg("progress-initializing-ads")));
 
             int replicationId = replica.getReplicationId();
-            if (replicationId == -1)
-            {
-              /**
-               * This occurs if the remote server had not replication
-               * configured.
-               */
-              InitialLdapContext rCtx = null;
-              try
-              {
-                rCtx = getRemoteConnection(server, getTrustManager());
-                ServerDescriptor s = ServerDescriptor.createStandalone(rCtx);
-                for (ReplicaDescriptor r : s.getReplicas())
-                {
-                  if (Utils.areDnsEqual(r.getSuffix().getDN(), dn))
-                  {
-                    replicationId = r.getReplicationId();
-                  }
-                }
-              }
-              catch (NamingException ne)
-              {
-                String[] arg = {server.getHostPort(true)};
-                throw new ApplicationException(
-                    ApplicationException.Type.CONFIGURATION_ERROR,
-                    getMsg("cannot-connect-to-remote-generic", arg), ne);
-              }
-              finally
-              {
-                try
-                {
-                  rCtx.close();
-                }
-                catch (Throwable t)
-                {
-                }
-              }
-            }
-            int nTries = 4;
+            int nTries = 1;
             boolean initDone = false;
             while (!initDone)
             {
               try
               {
-                initializeSuffix(localCtx, replica.getReplicationId(),
+                initializeSuffix(localCtx, replicationId,
                     ADSContext.getAdministrationSuffixDN(),
-                    true, server.getHostPort(true));
+                    false, server.getHostPort(true));
                 initDone = true;
               }
               catch (PeerNotFoundException pnfe)
@@ -1872,6 +1982,7 @@
             }
             notifyListeners(getFormattedDone());
             notifyListeners(getLineBreak());
+            checkAbort();
             break;
           }
         }
@@ -1947,7 +2058,7 @@
           throw new ApplicationException(
               ApplicationException.Type.CONFIGURATION_ERROR, failedMsg, t);
         }
-        createLocalAds(localCtx);
+        createLocalAds(localCtx, true);
         int replicationPort =
           getUserData().getReplicationOptions().getReplicationPort();
         Set<String> dns = new HashSet<String>();
@@ -2688,6 +2799,7 @@
     trustManager.resetLastRefusedItems();
     try
     {
+      effectiveDn[0] = dn;
       try
       {
         if (isSecure)
@@ -2707,6 +2819,7 @@
         {
           // Try using a global administrator
           dn = ADSContext.getAdministratorDN(dn);
+          effectiveDn[0] = dn;
           if (isSecure)
           {
             ctx = Utils.createLdapsContext(ldapUrl, dn, pwd,
@@ -2753,8 +2866,11 @@
                 isCertificateException(e.getCause()))
             {
               UserDataCertificateException.Type excType;
-              ApplicationTrustManager.Cause cause =
-                trustManager.getLastRefusedCause();
+              ApplicationTrustManager.Cause cause = null;
+              if (e.getTrustManager() != null)
+              {
+                cause = e.getTrustManager().getLastRefusedCause();
+              }
               LOG.log(Level.INFO, "Certificate exception cause: "+cause);
               if (cause == ApplicationTrustManager.Cause.NOT_TRUSTED)
               {
@@ -2790,7 +2906,7 @@
                     getMsg("certificate-exception", h, String.valueOf(p)),
                     e.getCause(), h, p,
                     e.getTrustManager().getLastRefusedChain(),
-                    trustManager.getLastRefusedAuthType(), excType);
+                    e.getTrustManager().getLastRefusedAuthType(), excType);
               }
             }
           }
@@ -2900,7 +3016,6 @@
         }
       }
     }
-    effectiveDn[0] = dn;
   }
 
   /**
@@ -3607,24 +3722,32 @@
 
   private InitialLdapContext createLocalContext() throws NamingException
   {
-    String ldapUrl = "ldap://"+getUserData().getHostName()+":"+
+    String ldapUrl = "ldap://"+
+    Utils.getHostNameForLdapUrl(getUserData().getHostName())+":"+
     getUserData().getServerPort();
     String dn = getUserData().getDirectoryManagerDn();
     String pwd = getUserData().getDirectoryManagerPwd();
     return Utils.createLdapContext(ldapUrl, dn, pwd,
         Utils.getDefaultLDAPTimeout(), null);
   }
-  private void createLocalAds(InitialLdapContext ctx)
+  private void createLocalAds(InitialLdapContext ctx, boolean addData)
   throws ApplicationException, ADSContextException
   {
     try
     {
       ADSContext adsContext = new ADSContext(ctx);
-      adsContext.createAdminData(null);
-      adsContext.registerServer(getNewServerAdsProperties());
-      if (getUserData().mustCreateAdministrator())
+      if (addData)
       {
-        adsContext.createAdministrator(getAdministratorProperties());
+        adsContext.createAdminData(null);
+        adsContext.registerServer(getNewServerAdsProperties());
+        if (getUserData().mustCreateAdministrator())
+        {
+          adsContext.createAdministrator(getAdministratorProperties());
+        }
+      }
+      else
+      {
+        adsContext.createAdministrationSuffix(null);
       }
     }
     catch (ADSContextException ace)
@@ -3686,9 +3809,6 @@
     }
     catch (NamingException ne)
     {
-      System.out.println("dn: "+auth.getDn());
-      System.out.println("dn: "+auth.getDn());
-
       String errorMessage = getMsg("cannot-connect-to-remote-generic",
           server.getHostPort(true), ne.toString(true));
       throw new ApplicationException(
@@ -3840,7 +3960,8 @@
               minRefreshPeriod = 10000;
             }
             if (!msg.equals(lastDisplayedMsg) &&
-                ((currentTime - minRefreshPeriod) > lastTimeMsgDisplayed))
+            ((currentTime - minRefreshPeriod) > lastTimeMsgDisplayed))
+            if (!msg.equals(lastDisplayedMsg))
             {
               notifyListeners(getFormattedProgress(msg));
               lastDisplayedMsg = msg;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
index bb57cc2..9338a42 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
@@ -37,6 +37,7 @@
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.logging.Logger;
 
 import javax.naming.ldap.InitialLdapContext;
@@ -238,13 +239,18 @@
    * @param usedServerIds the list of server ids (domain ids) that
    * are already used.
    * @throws ApplicationException if something goes wrong.
+   * @return a ConfiguredReplication object describing what has been configured.
    */
-  public void configureReplication(InitialLdapContext remoteCtx,
-      Set<String> dns, Map<String,Set<String>> replicationServers,
+  public ConfiguredReplication configureReplication(
+      InitialLdapContext remoteCtx, Set<String> dns,
+      Map<String,Set<String>> replicationServers,
       int replicationPort, String serverDisplay,
       Set<Integer> usedReplicationServerIds, Set<Integer> usedServerIds)
   throws ApplicationException
   {
+    boolean synchProviderCreated;
+    boolean synchProviderEnabled;
+    boolean replicationServerCreated;
     try
     {
       ManagementContext mCtx = LDAPManagementContext.createFromContext(
@@ -273,8 +279,23 @@
             new ArrayList<DefaultBehaviorException>());
         sync.setJavaImplementationClass(
             "org.opends.server.replication.plugin.MultimasterReplication");
+        sync.setEnabled(Boolean.TRUE);
+        synchProviderCreated = true;
+        synchProviderEnabled = false;
       }
-      sync.setEnabled(Boolean.TRUE);
+      else
+      {
+        synchProviderCreated = false;
+        if (!sync.isEnabled())
+        {
+          sync.setEnabled(Boolean.TRUE);
+          synchProviderEnabled = true;
+        }
+        else
+        {
+          synchProviderEnabled = false;
+        }
+      }
       sync.commit();
 
       /*
@@ -291,12 +312,14 @@
             new ArrayList<DefaultBehaviorException>());
         replicationServer.setReplicationServerId(id);
         replicationServer.setReplicationPort(replicationPort);
+        replicationServerCreated = true;
       }
       else
       {
         replicationServer = sync.getReplicationServer();
         usedReplicationServerIds.add(
             replicationServer.getReplicationServerId());
+        replicationServerCreated = false;
       }
 
       Set<String> servers = replicationServer.getReplicationServer();
@@ -304,15 +327,20 @@
       {
         servers = new HashSet<String>();
       }
+      Set<String> oldServers = new HashSet<String>();
+      oldServers.addAll(servers);
       for (Set<String> rs : replicationServers.values())
       {
         servers.addAll(rs);
       }
 
       replicationServer.setReplicationServer(servers);
-
       replicationServer.commit();
 
+      Set<String> newReplicationServers = new HashSet<String>();
+      newReplicationServers.addAll(servers);
+      newReplicationServers.removeAll(oldServers);
+
       /*
        * Create the domains
        */
@@ -321,6 +349,7 @@
       {
         domainNames = new String[]{};
       }
+      Set<ConfiguredDomain> domainsConf = new HashSet<ConfiguredDomain>();
       MultimasterDomainCfgClient[] domains =
         new MultimasterDomainCfgClient[domainNames.length];
       for (int i=0; i<domains.length; i++)
@@ -330,29 +359,152 @@
       for (String dn : dns)
       {
         MultimasterDomainCfgClient domain = null;
+        boolean isCreated;
+        String domainName = null;
         for (int i=0; i<domains.length && (domain == null); i++)
         {
           if (Utils.areDnsEqual(dn,
               domains[i].getReplicationDN().toString()))
           {
             domain = domains[i];
+            domainName = domainNames[i];
           }
         }
         if (domain == null)
         {
           int domainId = getReplicationId(usedServerIds);
           usedServerIds.add(domainId);
-          String domainName = getDomainName(domainNames, domainId);
+          domainName = getDomainName(domainNames, domainId);
           domain = sync.createMultimasterDomain(
               MultimasterDomainCfgDefn.getInstance(), domainName,
               new ArrayList<DefaultBehaviorException>());
           domain.setServerId(domainId);
           domain.setReplicationDN(DN.decode(dn));
+          isCreated = true;
         }
-        domain.setReplicationServer(replicationServers.get(dn));
+        else
+        {
+          isCreated = false;
+        }
+        oldServers = domain.getReplicationServer();
+        if (oldServers == null)
+        {
+          oldServers = new TreeSet<String>();
+        }
+        servers = replicationServers.get(dn);
+        domain.setReplicationServer(servers);
         usedServerIds.add(domain.getServerId());
 
         domain.commit();
+        servers.removeAll(oldServers);
+        ConfiguredDomain domainConf = new ConfiguredDomain(domainName,
+            isCreated, servers);
+        domainsConf.add(domainConf);
+      }
+      return new ConfiguredReplication(synchProviderCreated,
+          synchProviderEnabled, replicationServerCreated, newReplicationServers,
+          domainsConf);
+    }
+    catch (Throwable t)
+    {
+      String errorMessage = getMsg("error-configuring-remote-generic",
+          serverDisplay, t.toString());
+      throw new ApplicationException(
+          ApplicationException.Type.CONFIGURATION_ERROR, errorMessage, t);
+    }
+  }
+
+  /**
+   * Configures the replication on a given server.
+   * @param remoteCtx the conection to the server where we want to configure
+   * the replication.
+   * @param replConf the object describing what was configured.
+   * @param serverDisplay the server display.
+   * @throws ApplicationException if something goes wrong.
+   */
+  public void unconfigureReplication(
+      InitialLdapContext remoteCtx, ConfiguredReplication replConf,
+      String serverDisplay)
+  throws ApplicationException
+  {
+    try
+    {
+      ManagementContext mCtx = LDAPManagementContext.createFromContext(
+          JNDIDirContextAdaptor.adapt(remoteCtx));
+      RootCfgClient root = mCtx.getRootConfiguration();
+
+      /*
+       * Unconfigure Synchronization plugin.
+       */
+      if (replConf.isSynchProviderCreated())
+      {
+        MultimasterSynchronizationProviderCfgClient sync = null;
+        try
+        {
+          root.removeSynchronizationProvider("Multimaster Synchronization");
+        }
+        catch (ManagedObjectNotFoundException monfe)
+        {
+          // It does not exist.
+        }
+      }
+      else
+      {
+        try
+        {
+          MultimasterSynchronizationProviderCfgClient sync =
+            (MultimasterSynchronizationProviderCfgClient)
+            root.getSynchronizationProvider("Multimaster Synchronization");
+          if (replConf.isSynchProviderEnabled())
+          {
+            sync.setEnabled(Boolean.FALSE);
+          }
+          if (replConf.isReplicationServerCreated())
+          {
+            sync.removeReplicationServer();
+          }
+          else if (sync.hasReplicationServer())
+          {
+            ReplicationServerCfgClient replicationServer =
+              sync.getReplicationServer();
+            Set<String> replServers = replicationServer.getReplicationServer();
+            if (replServers != null)
+            {
+              replServers.removeAll(replConf.getNewReplicationServers());
+              replicationServer.commit();
+            }
+          }
+          for (ConfiguredDomain domain : replConf.getDomainsConf())
+          {
+            if (domain.isCreated())
+            {
+              sync.removeMultimasterDomain(domain.getDomainName());
+            }
+            else
+            {
+              try
+              {
+                MultimasterDomainCfgClient d =
+                  sync.getMultimasterDomain(domain.getDomainName());
+                Set<String> replServers = d.getReplicationServer();
+                if (replServers != null)
+                {
+                  replServers.removeAll(domain.getAddedReplicationServers());
+                  d.commit();
+                }
+              }
+              catch (ManagedObjectNotFoundException monfe)
+              {
+                // It does not exist.
+              }
+            }
+          }
+          sync.commit();
+        }
+        catch (ManagedObjectNotFoundException monfe)
+        {
+          // It does not exist.
+        }
       }
     }
     catch (Throwable t)
@@ -574,4 +726,3 @@
     return replicationServers;
   }
 }
-
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java
index 48d84d2..61973d7 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/offline/OfflineInstaller.java
@@ -91,7 +91,7 @@
 
       checkAbort();
 
-      setStatus(InstallProgressStep.CONFIGURING_SERVER);
+      setCurrentProgressStep(InstallProgressStep.CONFIGURING_SERVER);
       configureServer();
 
       checkAbort();
@@ -105,7 +105,7 @@
       if (Utils.isWindows() && getUserData().getEnableWindowsService())
       {
           notifyListeners(getTaskSeparator());
-          setStatus(InstallProgressStep.ENABLING_WINDOWS_SERVICE);
+          setCurrentProgressStep(InstallProgressStep.ENABLING_WINDOWS_SERVICE);
           enableWindowsService();
           checkAbort();
       }
@@ -113,14 +113,14 @@
       if (mustStart())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.STARTING_SERVER);
+        setCurrentProgressStep(InstallProgressStep.STARTING_SERVER);
         new ServerController(this).startServer();
         checkAbort();
       }
 
       if (mustConfigureReplication())
       {
-        setStatus(InstallProgressStep.CONFIGURING_REPLICATION);
+        setCurrentProgressStep(InstallProgressStep.CONFIGURING_REPLICATION);
         notifyListeners(getTaskSeparator());
 
         configureReplication();
@@ -130,7 +130,8 @@
       if (mustInitializeSuffixes())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.INITIALIZE_REPLICATED_SUFFIXES);
+        setCurrentProgressStep(
+            InstallProgressStep.INITIALIZE_REPLICATED_SUFFIXES);
         initializeSuffixes();
         checkAbort();
       }
@@ -138,7 +139,7 @@
       if (mustCreateAds())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.CONFIGURING_ADS);
+        setCurrentProgressStep(InstallProgressStep.CONFIGURING_ADS);
         updateADS();
         checkAbort();
       }
@@ -146,24 +147,24 @@
       if (mustStop())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.STOPPING_SERVER);
+        setCurrentProgressStep(InstallProgressStep.STOPPING_SERVER);
         new ServerController(this).stopServer();
       }
 
       checkAbort();
-      setStatus(InstallProgressStep.FINISHED_SUCCESSFULLY);
+      setCurrentProgressStep(InstallProgressStep.FINISHED_SUCCESSFULLY);
       notifyListeners(null);
 
     } catch (ApplicationException ex)
     {
       if (ApplicationException.Type.CANCEL.equals(ex.getType())) {
         uninstall();
-        setStatus(InstallProgressStep.FINISHED_CANCELED);
+        setCurrentProgressStep(InstallProgressStep.FINISHED_CANCELED);
         notifyListeners(null);
       } else {
         notifyListeners(getLineBreak());
         notifyListenersOfLog();
-        setStatus(InstallProgressStep.FINISHED_WITH_ERROR);
+        setCurrentProgressStep(InstallProgressStep.FINISHED_WITH_ERROR);
         String html = getFormattedError(ex, true);
         notifyListeners(html);
         LOG.log(Level.SEVERE, "Error installing.", ex);
@@ -173,7 +174,7 @@
     {
       notifyListeners(getLineBreak());
       notifyListenersOfLog();
-      setStatus(InstallProgressStep.FINISHED_WITH_ERROR);
+      setCurrentProgressStep(InstallProgressStep.FINISHED_WITH_ERROR);
       ApplicationException ex = new ApplicationException(
           ApplicationException.Type.BUG, getThrowableMsg("bug-msg", t), t);
       String msg = getFormattedError(ex, true);
@@ -205,6 +206,7 @@
    */
   protected void uninstall() {
 
+    notifyListeners(getTaskSeparator());
     Installation installation = getInstallation();
     FileManager fm = new FileManager(this);
 
@@ -393,7 +395,7 @@
   /**
    * {@inheritDoc}
    */
-  protected String getInstallationPath()
+  public String getInstallationPath()
   {
     return Utils.getInstallPathFromClasspath();
   }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java
index 022dd14..af599fe 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/webstart/WebStartInstaller.java
@@ -89,7 +89,7 @@
   public WebStartInstaller()
   {
     initLoader();
-    setStatus(InstallProgressStep.NOT_STARTED);
+    setCurrentProgressStep(InstallProgressStep.NOT_STARTED);
   }
 
   /**
@@ -108,14 +108,14 @@
       System.setErr(err);
       System.setOut(out);
 
-      setStatus(InstallProgressStep.DOWNLOADING);
+      setCurrentProgressStep(InstallProgressStep.DOWNLOADING);
 
       checkAbort();
 
       InputStream in =
           getZipInputStream(getRatio(InstallProgressStep.EXTRACTING));
 
-      setStatus(InstallProgressStep.EXTRACTING);
+      setCurrentProgressStep(InstallProgressStep.EXTRACTING);
       notifyListeners(getTaskSeparator());
 
       checkAbort();
@@ -135,7 +135,7 @@
 
       checkAbort();
 
-      setStatus(InstallProgressStep.CONFIGURING_SERVER);
+      setCurrentProgressStep(InstallProgressStep.CONFIGURING_SERVER);
       notifyListeners(getTaskSeparator());
 
       // Write java home before calling Installation class.  The installation
@@ -145,7 +145,7 @@
 
       checkAbort();
 
-      setStatus(InstallProgressStep.CONFIGURING_SERVER);
+      setCurrentProgressStep(InstallProgressStep.CONFIGURING_SERVER);
       configureServer();
 
       checkAbort();
@@ -157,7 +157,7 @@
       if (Utils.isWindows() && getUserData().getEnableWindowsService())
       {
           notifyListeners(getTaskSeparator());
-          setStatus(InstallProgressStep.ENABLING_WINDOWS_SERVICE);
+          setCurrentProgressStep(InstallProgressStep.ENABLING_WINDOWS_SERVICE);
           enableWindowsService();
 
           checkAbort();
@@ -166,7 +166,7 @@
       if (mustStart())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.STARTING_SERVER);
+        setCurrentProgressStep(InstallProgressStep.STARTING_SERVER);
         new ServerController(this).startServer();
 
         checkAbort();
@@ -174,7 +174,7 @@
 
       if (mustConfigureReplication())
       {
-        setStatus(InstallProgressStep.CONFIGURING_REPLICATION);
+        setCurrentProgressStep(InstallProgressStep.CONFIGURING_REPLICATION);
         notifyListeners(getTaskSeparator());
 
         configureReplication();
@@ -185,7 +185,8 @@
       if (mustInitializeSuffixes())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.INITIALIZE_REPLICATED_SUFFIXES);
+        setCurrentProgressStep(
+            InstallProgressStep.INITIALIZE_REPLICATED_SUFFIXES);
         initializeSuffixes();
 
         checkAbort();
@@ -194,7 +195,7 @@
       if (mustCreateAds())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.CONFIGURING_ADS);
+        setCurrentProgressStep(InstallProgressStep.CONFIGURING_ADS);
         updateADS();
 
         checkAbort();
@@ -203,24 +204,24 @@
       if (mustStop())
       {
         notifyListeners(getTaskSeparator());
-        setStatus(InstallProgressStep.STOPPING_SERVER);
+        setCurrentProgressStep(InstallProgressStep.STOPPING_SERVER);
         new ServerController(this).stopServer();
       }
 
       checkAbort();
-      setStatus(InstallProgressStep.FINISHED_SUCCESSFULLY);
+      setCurrentProgressStep(InstallProgressStep.FINISHED_SUCCESSFULLY);
       notifyListeners(null);
 
     } catch (ApplicationException ex)
     {
       if (ApplicationException.Type.CANCEL.equals(ex.getType())) {
         uninstall();
-        setStatus(InstallProgressStep.FINISHED_CANCELED);
+        setCurrentProgressStep(InstallProgressStep.FINISHED_CANCELED);
         notifyListeners(null);
       } else {
         notifyListeners(getLineBreak());
         notifyListenersOfLog();
-        setStatus(InstallProgressStep.FINISHED_WITH_ERROR);
+        setCurrentProgressStep(InstallProgressStep.FINISHED_WITH_ERROR);
         String html = getFormattedError(ex, true);
         notifyListeners(html);
         LOG.log(Level.SEVERE, "Error installing.", ex);
@@ -230,7 +231,7 @@
     {
       notifyListeners(getLineBreak());
       notifyListenersOfLog();
-      setStatus(InstallProgressStep.FINISHED_WITH_ERROR);
+      setCurrentProgressStep(InstallProgressStep.FINISHED_WITH_ERROR);
       ApplicationException ex = new ApplicationException(
           ApplicationException.Type.BUG, getThrowableMsg("bug-msg", t), t);
       String msg = getFormattedError(ex, true);
@@ -498,6 +499,8 @@
    * Uninstall what has already been installed.
    */
   private void uninstall() {
+    notifyListeners(getTaskSeparator());
+
     Installation installation = getInstallation();
     FileManager fm = new FileManager(this);
 
@@ -523,7 +526,7 @@
   /**
    * {@inheritDoc}
    */
-  protected String getInstallationPath()
+  public String getInstallationPath()
   {
     return getUserData().getServerLocation();
   }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
index 360f12e..06a7588 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/resources/Resources.properties
@@ -343,6 +343,7 @@
 data-options-step=Directory Data
 review-step=Review
 progress-step=Progress
+finished-step=Finished
 confirm-uninstall-step=Uninstall Options
 step-upgrade-choose-version=Choose Version
 
@@ -556,7 +557,8 @@
 certificate-not-trusted-text=The Certificate presented by the server {0}:{1} \
 could not be trusted.<br><br>Possible reasons for this error:\
 <br>&nbsp;&nbsp;&nbsp;&nbsp;-The Certificate Authority that issued the \
-certificate is not recognized.<br>&nbsp;&nbsp;&nbsp;&nbsp;-The server''s \
+certificate is not recognized (this is the case of the self-signed \
+certificates).<br>&nbsp;&nbsp;&nbsp;&nbsp;-The server''s \
 certificate is incomplete due to a misconfiguration.\
 <br>&nbsp;&nbsp;&nbsp;&nbsp;-The server''s certificate has expired.<br>Before \
 accepting this certificate, you should examine the server''s certificate \
@@ -769,6 +771,11 @@
 progressbar-tooltip=Progress Bar
 
 #
+# Finished Panel specific labels
+#
+finished-panel-title=Finished
+
+#
 # Confirm Uninstall Panel specific labels
 #
 confirm-uninstall-panel-title=Uninstall Options
@@ -948,6 +955,7 @@
 progress-cancel=Waiting to cancel operation.
 
 progress-configuring-replication-remote=Configuring Replication on {0}
+progress-unconfiguring-replication-remote=Unconfiguring Replication on {0}
 progress-import-automatically-generated=Importing Automatically-Generated Data \
 ({0} Entries):
 progress-starting=Starting Directory Server:
@@ -972,6 +980,7 @@
 administrator-already-registered=Administrator already registered.
 progress-creating-ads=Creating Registration Configuration
 progress-creating-ads-on-remote=Creating Registration Configuration on {0}
+progress-unconfiguring-ads-on-remote=Reverting Registration Configuration on {0}
 progress-initializing-ads=Initializing Registration information
 progress-initializing-suffix=Initializing suffix {0} with the contents from \
 {1}:
@@ -1240,6 +1249,27 @@
 upgrade-log-status-failure=Failure
 upgrade-log-status-cancel=Canceled
 
+#
+# Install and Upgrade merged welcome panel.
+#
+installandupgrade-welcome-panel-title=Welcome
+installandupgrade-welcome-panel-instructions=The OpenDS QuickSetup tool can \
+either install and configure a new server instance or upgrade an existing \
+server instance. In either case, QuickSetup will use the latest weekly build, \
+which in this case is: {0} (Build ID: {1}) <br><br> \
+You can also use QuickSetup to set up a weekly build you have downloaded \
+manually. To run QuickSetup in this case, use the setup command at the top \
+level of the OpenDS directory.<br><br> \
+OpenDS requires a Java SE 5.0 or higher runtime.<br><br> \
+Additional information on QuickSetup is available on the <a \
+href="https://www.opends.org/wiki/page/OverviewOfTheQuickSetupTool"> \
+OpenDS documentation wiki</a>.
+installandupgrader-rbinstall-label=Install New Server Instance
+installandupgrader-rbinstall-tooltip=Select to install a new server instance.
+installandupgrader-rbupgrade-label=Upgrade Existing Server Instance
+installandupgrader-rbupgrade-tooltip=Select to upgrade an existing server \
+instance.
+
 general-loading=Loading...
 general-see-for-details=See {0} for a detailed log of this operation.
 not-available-label=<not available>
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ButtonsPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ButtonsPanel.java
index dd57fc9..dd0b8bc 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ButtonsPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/ButtonsPanel.java
@@ -29,11 +29,8 @@
 
 import org.opends.quicksetup.ButtonName;
 import org.opends.quicksetup.WizardStep;
-import org.opends.quicksetup.upgrader.Upgrader;
 import org.opends.quicksetup.event.ButtonActionListener;
 import org.opends.quicksetup.event.ButtonEvent;
-import org.opends.quicksetup.installer.Installer;
-import org.opends.quicksetup.uninstaller.Uninstaller;
 
 import javax.swing.*;
 import java.awt.*;
@@ -115,11 +112,11 @@
 
     // The quit button appears on all the panels leading up
     // to the progress panel
-    quitButton.setVisible(!step.isProgressStep());
+    quitButton.setVisible(!step.isProgressStep() && !step.isFinishedStep());
 
     // The close button is only used on the progress panel and
     // is only enabled once progress has finished or cancelled.
-    closeButton.setVisible(step.isProgressStep());
+    closeButton.setVisible(step.isProgressStep() || step.isFinishedStep());
     closeButton.setEnabled(application.getCurrentProgressStep().isLast());
   }
 
@@ -227,9 +224,7 @@
     nextFinishPanel.setOpaque(false);
     nextFinishPanel.add(nextButton, gbcAux);
 
-    // TODO: remove this hack
-    if (getApplication() instanceof Installer ||
-            getApplication() instanceof Upgrader) {
+    if (getApplication().finishOnLeft()) {
       nextFinishPanel.add(finishButton, gbcAux);
     }
     width =
@@ -249,8 +244,7 @@
     gbc.fill = GridBagConstraints.NONE;
     gbc.insets.left = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS;
 
-    // TODO: remove this hack
-    if (getApplication() instanceof Uninstaller) {
+    if (!getApplication().finishOnLeft()) {
       gbc.insets.right = UIFactory.HORIZONTAL_INSET_BETWEEN_BUTTONS;
       add(finishButton, gbc);
       gbc.insets.right = 0;
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java
index 0f05277..9f3d014 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FieldName.java
@@ -40,10 +40,22 @@
 public enum FieldName
 {
   /**
+   * The value associated with this is a Boolean.
+   * It is used by the merged installer and upgrader to know whether an upgrade
+   * or an install must be performed.
+   */
+  IS_UPGRADE,
+  /**
    * The value associated with this is a String.
    * The upgrader uses this field to indicate the
    * location of the server to upgrade.
    */
+  SERVER_TO_UPGRADE_LOCATION,
+  /**
+   * The value associated with this is a String.
+   * The web start installer uses this field to indicate the
+   * location to install the server.
+   */
   SERVER_LOCATION,
   /**
    * The value associated with this is a String.
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FinishedPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FinishedPanel.java
new file mode 100644
index 0000000..e736b63
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/FinishedPanel.java
@@ -0,0 +1,54 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.ui;
+
+/**
+ * This panel is used to show the application is finished.
+ *
+ */
+public class FinishedPanel extends ProgressPanel
+{
+  private static final long serialVersionUID = 8129325068133356170L;
+
+  /**
+   * FinishedPanel constructor.
+   * @param application Application this panel represents
+   */
+  public FinishedPanel(GuiApplication application)
+  {
+    super(application);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected String getTitle()
+  {
+    return getMsg("finished-panel-title");
+  }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
index 5d70931..d63c477 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/GuiApplication.java
@@ -110,7 +110,7 @@
    * @param userData UserData representing the data specified by the user
    * @param step Step indicating the new current step
    */
-  protected abstract void setWizardDialogState(QuickSetupDialog dlg,
+  public abstract void setWizardDialogState(QuickSetupDialog dlg,
                                                UserData userData,
                                                WizardStep step);
 
@@ -202,6 +202,12 @@
   abstract public WizardStep getPreviousWizardStep(WizardStep step);
 
   /**
+   * Gets the finished step in the wizard.
+   * @return Step the finished step
+   */
+  abstract public WizardStep getFinishedStep();
+
+  /**
    * Gets the currently displayed wizard step.
    * @return WizardStep being displayed.
    */
@@ -210,8 +216,16 @@
   }
 
   /**
-   * Indicates whether or not the provided <code>step</code> is a sub step or
-   * not.
+   * Returns the QuickSetupDialog in control.
+   * @return the QuickSetupDialog in control.
+   */
+  protected QuickSetupDialog getQuickSetupDialog()
+  {
+    return qs;
+  }
+
+  /**
+   * Indicates whether the provided <code>step</code> is a sub step or not.
    * @param step WizardStep for which the return value indicates whether
    * or not is a sub step.
    * @return boolean where true indicates the provided <code>step</code> is a
@@ -223,8 +237,7 @@
   }
 
   /**
-   * Indicates whether or not the provided <code>step</code> is visible or
-   * not.
+   * Indicates whether the provided <code>step</code> is visible or not.
    * @param step WizardStep for which the return value indicates whether
    * or not is visible.
    * @return boolean where true indicates the provided <code>step</code> is
@@ -232,7 +245,7 @@
    */
   public boolean isVisible(WizardStep step)
   {
-    return false;
+    return true;
   }
 
   /**
@@ -280,18 +293,16 @@
   }
 
   /**
-   * Inidicates whether or not the user is allowed to finish the wizard from
+   * Indicates whether or not the user is allowed to finish the wizard from
    * <code>step</code>.
    * @param step WizardStep for which the the return value indicates whether
    * or not the user can finish the wizard
    * @return boolean where true indicates the user can finish the wizard
    */
-  public boolean canFinish(WizardStep step) {
-    return getNextWizardStep(step) != null;
-  }
+  public abstract boolean canFinish(WizardStep step);
 
   /**
-   * Inidicates whether or not the user is allowed to quit the wizard from
+   * Indicates whether or not the user is allowed to quit the wizard from
    * <code>step</code>.
    * @param step WizardStep for which the the return value indicates whether
    * or not the user can quit the wizard
@@ -389,6 +400,17 @@
   }
 
   /**
+   * Indicates whether the finish button must be placed on the left (close to
+   * "Next" button) or on the right (close to "Quit" button).
+   * @return <CODE>true</CODE> if the finish button must be placed on the left
+   * and <CODE>false</CODE> otherwise.
+   */
+  public boolean finishOnLeft()
+  {
+    return true;
+  }
+
+  /**
    * Updates the list of certificates accepted by the user in the trust manager
    * based on the information stored in the UserDataCertificateException we got
    * when trying to connect in secure mode.
@@ -403,6 +425,7 @@
 
     if ((chain != null) && (authType != null) && (host != null))
     {
+      LOG.log(Level.INFO, "Accepting certificate presented by host "+host);
       getTrustManager().acceptCertificate(chain, authType, host);
     }
     else
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java
index 0d85b7c..35da1ee 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/QuickSetup.java
@@ -230,6 +230,11 @@
 
             SwingUtilities.invokeLater(new Runnable() {
               public void run() {
+                if (application.isFinished() &&
+                    !getCurrentStep().isFinishedStep())
+                {
+                  setCurrentStep(application.getFinishedStep());
+                }
                 getDialog().displayProgress(desc);
               }
             });
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/StepsPanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/StepsPanel.java
index 6d46b37..67c0309 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/StepsPanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/ui/StepsPanel.java
@@ -96,11 +96,7 @@
               UIFactory.TextStyle.NOT_CURRENT_STEP);
         }
       }
-
-      if (getApplication().isSubStep(s))
-      {
-        setStepVisible(s, getApplication().isVisible(s));
-      }
+      setStepVisible(s, getApplication().isVisible(s));
     }
   }
 
@@ -143,14 +139,7 @@
       JLabel iconLabel =
           UIFactory.makeJLabel(UIFactory.IconType.CURRENT_STEP, null,
               UIFactory.TextStyle.NO_STYLE);
-      if (getApplication().isSubStep(s))
-      {
-        gbcAux.insets.left = UIFactory.LEFT_INSET_SUBSTEP;
-      }
-      else
-      {
-        gbcAux.insets.left = 0;
-      }
+      gbcAux.insets.left = 0;
 
       auxPanel.add(iconLabel, gbcAux);
       int width = (int) iconLabel.getPreferredSize().getWidth();
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
index 176654e..64ceb83 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
@@ -28,6 +28,8 @@
 package org.opends.quicksetup.uninstaller;
 
 import org.opends.quicksetup.*;
+
+import static org.opends.quicksetup.Step.FINISHED;
 import static org.opends.quicksetup.Step.PROGRESS;
 import static org.opends.quicksetup.Step.REVIEW;
 import org.opends.quicksetup.ui.*;
@@ -93,6 +95,10 @@
     if (step != null && step.equals(Step.CONFIRM_UNINSTALL)) {
       nextStep = Step.PROGRESS;
     }
+    else if (Step.PROGRESS.equals(step))
+    {
+      nextStep = Step.FINISHED;
+    }
     return nextStep;
   }
 
@@ -104,12 +110,31 @@
     if (step != null && step.equals(Step.PROGRESS)) {
       prevStep = Step.CONFIRM_UNINSTALL;
     }
+    else if (Step.FINISHED.equals(step))
+    {
+      prevStep = Step.PROGRESS;
+    }
     return prevStep;
   }
 
   /**
    * {@inheritDoc}
    */
+  public WizardStep getFinishedStep() {
+    return Step.FINISHED;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean finishOnLeft()
+  {
+    return false;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
   public boolean canGoBack(WizardStep step) {
     return false;
   }
@@ -144,6 +169,9 @@
           "Cannot click on next from progress step");
     } else if (cStep == REVIEW) {
       throw new IllegalStateException("Cannot click on next from review step");
+    } else if (cStep == FINISHED) {
+      throw new IllegalStateException(
+          "Cannot click on next from finished step");
     }
   }
 
@@ -158,6 +186,10 @@
         {
           qs.quit();
         }
+    }
+    else if (cStep == FINISHED)
+    {
+      qs.quit();
     } else {
       throw new IllegalStateException(
           "Close only can be clicked on PROGRESS step");
@@ -222,6 +254,10 @@
       throw new IllegalStateException(
               "Cannot click on quit from progress step");
     }
+    else if (step == Step.FINISHED) {
+      throw new IllegalStateException(
+      "Cannot click on quit from finished step");
+    }
     qs.quit();
   }
 
@@ -250,10 +286,14 @@
    * {@inheritDoc}
    */
   public void previousClicked(WizardStep cStep, QuickSetup qs) {
-    if (cStep == Step.PROGRESS) {
+    if (cStep == PROGRESS) {
       throw new IllegalStateException(
               "Cannot click on previous from progress step");
     }
+    else if (cStep == FINISHED) {
+      throw new IllegalStateException(
+      "Cannot click on previous from finished step");
+    }
   }
 
   /**
@@ -333,13 +373,13 @@
   /**
    * {@inheritDoc}
    */
-  protected void setWizardDialogState(QuickSetupDialog dlg,
+  public void setWizardDialogState(QuickSetupDialog dlg,
                                       UserData userData,
                                       WizardStep step) {
     if (step == Step.CONFIRM_UNINSTALL) {
       dlg.setDefaultButton(ButtonName.FINISH);
       dlg.setFocusOnButton(ButtonName.FINISH);
-    } else if (step == Step.PROGRESS) {
+    } else if ((step == PROGRESS) || (step == FINISHED)) {
       dlg.setDefaultButton(ButtonName.CLOSE);
       dlg.setFocusOnButton(ButtonName.CLOSE);
       dlg.setButtonEnabled(ButtonName.CLOSE, false);
@@ -357,7 +397,7 @@
   /**
    * {@inheritDoc}
    */
-  protected String getInstallationPath() {
+  public String getInstallationPath() {
     return Utils.getInstallPathFromClasspath();
   }
 
@@ -634,7 +674,8 @@
    * {@inheritDoc}
    */
   public void windowClosing(QuickSetupDialog dlg, WindowEvent evt) {
-    if (dlg.getDisplayedStep() == Step.PROGRESS) {
+    if ((dlg.getDisplayedStep() == PROGRESS) ||
+        (dlg.getDisplayedStep() == FINISHED)) {
       // Simulate a close button event
       dlg.notifyButtonEvent(ButtonName.CLOSE);
     } else {
@@ -657,6 +698,7 @@
     Set<WizardStep> setSteps = new HashSet<WizardStep>();
     setSteps.add(Step.CONFIRM_UNINSTALL);
     setSteps.add(Step.PROGRESS);
+    setSteps.add(Step.FINISHED);
     return Collections.unmodifiableSet(setSteps);
   }
 
@@ -669,6 +711,8 @@
       p = new ConfirmUninstallPanel(this, installStatus);
     } else if (step == Step.PROGRESS) {
       p = new ProgressPanel(this);
+    } else if (step == Step.FINISHED) {
+      p = new FinishedPanel(this);
     }
     return p;
   }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
index afcb006..ffc7b40 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/BuildExtractor.java
@@ -158,7 +158,7 @@
   /**
    * {@inheritDoc}
    */
-  protected String getInstallationPath() {
+  public String getInstallationPath() {
     return Utils.getInstallPathFromClasspath();
   }
 
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeWizardStep.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeWizardStep.java
new file mode 100644
index 0000000..b29db64
--- /dev/null
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeWizardStep.java
@@ -0,0 +1,90 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.upgrader;
+
+import org.opends.quicksetup.WizardStep;
+
+/**
+ * Steps in the Upgrade wizard.
+ */
+public enum UpgradeWizardStep implements WizardStep {
+
+  /**
+   * The welcome step.
+   */
+  WELCOME("welcome-step"),
+  /**
+   * The welcome step.
+   */
+  REVIEW("review-step"),
+  /**
+   * The progress step.
+   */
+  PROGRESS("progress-step"),
+  /**
+   * The finished step.
+   */
+  FINISHED("finished-step");
+
+  private String msgKey;
+
+  private UpgradeWizardStep(String msgKey) {
+    this.msgKey = msgKey;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String getMessageKey() {
+    return msgKey;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isProgressStep() {
+    return this == PROGRESS;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isFinishedStep() {
+    return this == FINISHED;
+  }
+
+  /**
+   * Returns an String representation of this object.
+   * @return an String representation of this object.  This method is
+   * overwritten in order to be able to use this objects as keys in Maps and
+   * make them different to the Steps defined in the Step class.
+   */
+  public String toString() {
+    return "UpgradWizardStep"+super.toString();
+  }
+}
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
index 9a62ea8..a15654c 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -29,6 +29,7 @@
 
 import org.opends.quicksetup.CliApplication;
 import static org.opends.quicksetup.Installation.*;
+
 import org.opends.quicksetup.WizardStep;
 import org.opends.quicksetup.ProgressStep;
 import org.opends.quicksetup.ApplicationException;
@@ -37,7 +38,6 @@
 import org.opends.quicksetup.UserData;
 import org.opends.quicksetup.ButtonName;
 import org.opends.quicksetup.UserDataException;
-import org.opends.quicksetup.Step;
 import org.opends.quicksetup.BuildInformation;
 import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.UserInteraction;
@@ -53,6 +53,7 @@
 
 import org.opends.quicksetup.util.ExternalTools;
 import org.opends.quicksetup.util.OperationOutput;
+import org.opends.quicksetup.ui.FinishedPanel;
 import org.opends.quicksetup.ui.GuiApplication;
 import org.opends.quicksetup.ui.QuickSetupDialog;
 import org.opends.quicksetup.ui.ProgressPanel;
@@ -80,46 +81,11 @@
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 /**
- * QuickSetup application of ugrading the bits of an installation of
+ * QuickSetup application of upgrading the bits of an installation of
  * OpenDS.
  */
 public class Upgrader extends GuiApplication implements CliApplication {
-
-  /**
-   * Steps in the Upgrade wizard.
-   */
-  enum UpgradeWizardStep implements WizardStep {
-
-    WELCOME("welcome-step"),
-
-    REVIEW("review-step"),
-
-    PROGRESS("progress-step");
-
-    private String msgKey;
-
-    private UpgradeWizardStep(String msgKey) {
-      this.msgKey = msgKey;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getMessageKey() {
-      return msgKey;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isProgressStep() {
-      return this == PROGRESS;
-    }
-
-  }
-
   /**
    * Steps during the upgrade process.
    */
@@ -357,10 +323,21 @@
   /**
    * {@inheritDoc}
    */
-  protected void setWizardDialogState(QuickSetupDialog dlg,
+  public void setWizardDialogState(QuickSetupDialog dlg,
                                       UserData userData,
                                       WizardStep step) {
-    // TODO
+    //  Set the default button for the frame
+    if (step == UpgradeWizardStep.REVIEW) {
+      dlg.setFocusOnButton(ButtonName.FINISH);
+      dlg.setDefaultButton(ButtonName.FINISH);
+    } else if (step == UpgradeWizardStep.WELCOME) {
+      dlg.setDefaultButton(ButtonName.NEXT);
+      dlg.setFocusOnButton(ButtonName.NEXT);
+    } else if ((step == UpgradeWizardStep.PROGRESS) ||
+        (step == UpgradeWizardStep.FINISHED)) {
+      dlg.setDefaultButton(ButtonName.CLOSE);
+      dlg.setFocusOnButton(ButtonName.CLOSE);
+    }
   }
 
   /**
@@ -412,7 +389,7 @@
   /**
    * {@inheritDoc}
    */
-  protected String getInstallationPath() {
+  public String getInstallationPath() {
     // The upgrader runs from the bits extracted by BuildExtractor
     // in the staging directory.  So 'stagePath' below will point
     // to the staging directory [installroot]/tmp/upgrade.  However
@@ -473,7 +450,14 @@
    * {@inheritDoc}
    */
   public void windowClosing(QuickSetupDialog dlg, WindowEvent evt) {
-    // TODO
+    if ((dlg.getDisplayedStep() == UpgradeWizardStep.PROGRESS) ||
+        (dlg.getDisplayedStep() == UpgradeWizardStep.FINISHED)) {
+      // Simulate a close button event
+      dlg.notifyButtonEvent(ButtonName.CLOSE);
+    } else {
+      // Simulate a quit button event
+      dlg.notifyButtonEvent(ButtonName.QUIT);
+    }
   }
 
   /**
@@ -502,6 +486,8 @@
       pnl = new UpgraderReviewPanel(this);
     } else if (UpgradeWizardStep.PROGRESS.equals(step)) {
       pnl = new ProgressPanel(this);
+    } else if (UpgradeWizardStep.FINISHED.equals(step)) {
+      pnl = new FinishedPanel(this);
     }
     return pnl;
   }
@@ -515,6 +501,8 @@
       next = UpgradeWizardStep.REVIEW;
     } else if (UpgradeWizardStep.REVIEW.equals(step)) {
       next = UpgradeWizardStep.PROGRESS;
+    } else if (UpgradeWizardStep.PROGRESS.equals(step)) {
+      next = UpgradeWizardStep.FINISHED;
     }
     return next;
   }
@@ -524,7 +512,9 @@
    */
   public WizardStep getPreviousWizardStep(WizardStep step) {
     WizardStep prev = null;
-    if (UpgradeWizardStep.PROGRESS.equals(step)) {
+    if (UpgradeWizardStep.FINISHED.equals(step)) {
+      prev = UpgradeWizardStep.PROGRESS;
+    } else if (UpgradeWizardStep.PROGRESS.equals(step)) {
       prev = UpgradeWizardStep.REVIEW;
     } else if (UpgradeWizardStep.REVIEW.equals(step)) {
       prev = UpgradeWizardStep.WELCOME;
@@ -535,6 +525,13 @@
   /**
    * {@inheritDoc}
    */
+  public WizardStep getFinishedStep() {
+    return UpgradeWizardStep.FINISHED;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
   public boolean canQuit(WizardStep step) {
     return UpgradeWizardStep.WELCOME == step ||
             UpgradeWizardStep.REVIEW == step;
@@ -626,11 +623,11 @@
       // the fields are readonly.
       if (Utils.isWebStart()) {
         String serverLocationString =
-                qs.getFieldStringValue(FieldName.SERVER_LOCATION);
+                qs.getFieldStringValue(FieldName.SERVER_TO_UPGRADE_LOCATION);
         if ((serverLocationString == null) ||
                 ("".equals(serverLocationString.trim()))) {
           errorMsgs.add(getMsg("empty-server-location"));
-          qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true);
+          qs.displayFieldInvalid(FieldName.SERVER_TO_UPGRADE_LOCATION, true);
         } else {
           try {
             File serverLocation = new File(serverLocationString);
@@ -652,13 +649,13 @@
             }
 
             uud.setServerLocation(serverLocationString);
-            qs.displayFieldInvalid(FieldName.SERVER_LOCATION, false);
+            qs.displayFieldInvalid(FieldName.SERVER_TO_UPGRADE_LOCATION, false);
           } catch (IllegalArgumentException iae) {
             LOG.log(Level.INFO,
                     "illegal OpenDS installation directory selected", iae);
             errorMsgs.add(getMsg("error-invalid-server-location",
                     serverLocationString));
-            qs.displayFieldInvalid(FieldName.SERVER_LOCATION, true);
+            qs.displayFieldInvalid(FieldName.SERVER_TO_UPGRADE_LOCATION, true);
           }
         }
       } else {
@@ -672,7 +669,7 @@
     }
 
     if (errorMsgs.size() > 0) {
-      throw new UserDataException(Step.SERVER_SETTINGS,
+      throw new UserDataException(UpgradeWizardStep.WELCOME,
               Utils.getStringFromCollection(errorMsgs, "\n"));
     }
 
@@ -708,7 +705,8 @@
    * {@inheritDoc}
    */
   public boolean canGoBack(WizardStep step) {
-    return super.canGoBack(step) && !step.equals(UpgradeWizardStep.PROGRESS);
+    return super.canGoBack(step) && !step.equals(UpgradeWizardStep.PROGRESS)
+    && !step.equals(UpgradeWizardStep.FINISHED);
   }
 
   /**
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java
index 05f15b5..1922af2 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/upgrader/ui/WelcomePanel.java
@@ -75,7 +75,7 @@
    */
   public Object getFieldValue(FieldName fieldName) {
     Object v = null;
-    if (FieldName.SERVER_LOCATION.equals(fieldName)) {
+    if (FieldName.SERVER_TO_UPGRADE_LOCATION.equals(fieldName)) {
       v = tcServerLocation.getText();
     }
     return v;
@@ -91,7 +91,7 @@
     } else {
       style = UIFactory.TextStyle.PRIMARY_FIELD_VALID;
     }
-    if (FieldName.SERVER_LOCATION.equals(fieldName)) {
+    if (FieldName.SERVER_TO_UPGRADE_LOCATION.equals(fieldName)) {
       UIFactory.setTextStyle(lblServerLocation, style);
     }
   }
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java
index 71d0778..4cf6862 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/HtmlProgressMessageFormatter.java
@@ -259,16 +259,16 @@
   }
 
   /**
-   * Returns the HTML representation of an error message for a given exception.
+   * Returns the HTML representation of an error message for a given throwable.
    * This method applies a margin if the applyMargin parameter is
    * <CODE>true</CODE>.
-   * @param ex the exception.
+   * @param t the throwable.
    * @param applyMargin specifies whether we apply a margin or not to the
    * resulting HTML.
    * @return the HTML representation of an error message for the given
    * exception.
    */
-  public String getFormattedError(Exception ex, boolean applyMargin)
+  public String getFormattedError(Throwable t, boolean applyMargin)
   {
     String openDiv = "<div style=\"margin-left:5px; margin-top:10px\">";
     String hideText =
@@ -280,8 +280,8 @@
     String closeDiv = "</div>";
 
     StringBuilder stackBuf = new StringBuilder();
-    stackBuf.append(getHtmlStack(ex));
-    Throwable root = ex.getCause();
+    stackBuf.append(getHtmlStack(t));
+    Throwable root = t.getCause();
     while (root != null)
     {
       stackBuf.append(getHtml(getMsg("exception-root-cause")))
@@ -294,14 +294,14 @@
 
     StringBuilder buf = new StringBuilder();
 
-    String msg = ex.getMessage();
+    String msg = t.getMessage();
     if (msg != null)
     {
-      buf.append(UIFactory.applyFontToHtml(getHtml(ex.getMessage()),
+      buf.append(UIFactory.applyFontToHtml(getHtml(t.getMessage()),
               UIFactory.PROGRESS_ERROR_FONT)).append(Constants.HTML_LINE_BREAK);
     } else
     {
-      buf.append(ex.toString()).append(Constants.HTML_LINE_BREAK);
+      buf.append(t.toString()).append(Constants.HTML_LINE_BREAK);
     }
     buf.append(getErrorWithStackHtml(openDiv, hideText, showText, stackText,
         closeDiv, false));
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java
index ca8098a..22ff05b 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/PlainTextProgressMessageFormatter.java
@@ -203,21 +203,21 @@
 
   /**
    * Returns the plain text representation of an error message for a given
-   * exception.
+   * throwable.
    * This method applies a margin if the applyMargin parameter is
    * <CODE>true</CODE>.
-   * @param ex the exception.
+   * @param t the exception.
    * @param applyMargin specifies whether we apply a margin or not to the
    * resulting plain text.
    * @return the plain text representation of an error message for the given
    * exception.
    */
-  public String getFormattedError(Exception ex, boolean applyMargin)
+  public String getFormattedError(Throwable t, boolean applyMargin)
   {
-    String msg = ex.getMessage();
+    String msg = t.getMessage();
     if (msg == null)
     {
-      msg = ex.toString();
+      msg = t.toString();
     }
     String result;
     if (applyMargin)
diff --git a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java
index bea2daf..1df5bf9 100644
--- a/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java
+++ b/opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/ProgressMessageFormatter.java
@@ -138,16 +138,16 @@
 
   /**
    * Returns the formatted representation of an error message for a given
-   * exception.
+   * throwable.
    * This method applies a margin if the applyMargin parameter is
    * <CODE>true</CODE>.
-   * @param ex the exception.
+   * @param t the throwable.
    * @param applyMargin specifies whether we apply a margin or not to the
    * resulting formatted text.
    * @return the formatted representation of an error message for the given
    * exception.
    */
-  public String getFormattedError(Exception ex, boolean applyMargin);
+  public String getFormattedError(Throwable t, boolean applyMargin);
 
   /**
    * Returns the line break formatted.
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
index 7e50734..7a71359 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -178,7 +178,7 @@
     //db_rebuild is the third jeb backend used by the jeb rebuild test cases
     //db_unindexed is the forth backend used by the unindexed search privilege
     //test cases
-    String[] subDirectories = { "bak", "bin", "changelogDb", "classes",
+    String[] subDirectories = { "adminDb", "bak", "bin", "changelogDb", "classes",
                                 "config", "db", "db_verify", "ldif", "lib",
                                 "locks", "logs", "db_rebuild", "db_unindexed",
                                 "db_index_test", "db_import_test"};

--
Gitblit v1.10.0