From 06ec8c88556b02782c7b91a233de91eaf4a1439d Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Tue, 09 Jun 2009 12:28:05 +0000
Subject: [PATCH] Fix for issue 3550 (Consider making the control panel able to manage remote servers)

---
 opends/src/guitools/org/opends/guitools/controlpanel/ui/MainMenuBar.java                      |   97 +
 opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java          |  393 +++++-
 opends/src/guitools/org/opends/guitools/controlpanel/ui/VLVIndexPanel.java                    |   16 
 opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java                   |   15 
 opends/src/guitools/org/opends/guitools/controlpanel/task/RebuildIndexTask.java               |   27 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBackendPanel.java               |    8 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/RestorePanel.java                     |   92 +
 opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java                   |   13 
 opends/src/server/org/opends/server/tools/RebuildIndex.java                                   |   90 +
 opends/src/guitools/org/opends/guitools/controlpanel/ui/NewVLVIndexPanel.java                 |   18 
 opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java     |    2 
 opends/src/server/org/opends/server/tasks/RebuildTask.java                                    |  110 -
 opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java |   10 
 opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java                |    4 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupPanel.java                      |   97 +
 opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java             |   12 
 opends/src/guitools/org/opends/guitools/controlpanel/task/Task.java                           |   83 +
 opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupListPanel.java                  |   46 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java     |   17 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/WindowsServicePanel.java              |   43 
 opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java          |    4 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/ControlCenterMainPane.java            |   54 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java           |   12 
 opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java                   |   47 
 opends/src/messages/messages/admin_tool.properties                                            |   80 +
 opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java               |  881 ++++++++++++++
 opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java           |   13 
 opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java          |   79 +
 opends/src/guitools/org/opends/guitools/controlpanel/ControlPanel.java                        |   78 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/AbstractBrowseEntriesPanel.java       |   10 
 opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteIndexTask.java                |    2 
 opends/src/guitools/org/opends/guitools/controlpanel/task/ModifyEntryTask.java                |    4 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardObjectClassPanel.java         |   14 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/VerifyIndexPanel.java                 |   17 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java              |    6 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java                      |  141 ++
 opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java                  |    2 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java              |   43 
 opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java                 |    4 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java                   |   11 
 opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java           |  105 +
 opends/src/guitools/org/opends/guitools/controlpanel/task/NewEntryTask.java                   |    4 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java                   |  149 ++
 opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBaseDNPanel.java                |    8 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java           |    3 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/ExportLDIFPanel.java                  |   37 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java                |    6 
 opends/src/guitools/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java             |  185 +++
 opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java               |  121 +
 opends/src/server/org/opends/server/tools/status/StatusCli.java                               |    4 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/IndexPanel.java                       |   14 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/RebuildIndexPanel.java                |   17 
 opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java                 |   31 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/NewIndexPanel.java                    |    5 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java         |    2 
 opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java                      |  109 +
 opends/src/guitools/org/opends/guitools/controlpanel/ui/ImportLDIFPanel.java                  |   68 
 57 files changed, 3,052 insertions(+), 511 deletions(-)

diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ControlPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ControlPanel.java
index bf16506..5651cf3 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ControlPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ControlPanel.java
@@ -36,11 +36,12 @@
 import javax.swing.WindowConstants;
 
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
-import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.ui.ControlCenterMainPane;
+import org.opends.guitools.controlpanel.ui.GenericDialog;
 import org.opends.guitools.controlpanel.ui.MainMenuBar;
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.messages.AdminToolMessages;
+import org.opends.quicksetup.Installation;
 import org.opends.messages.Message;
 import org.opends.quicksetup.util.Utils;
 
@@ -55,6 +56,7 @@
   private JFrame dlg;
   private ControlPanelInfo info;
   private ControlCenterMainPane controlCenterPane;
+  private MainMenuBar menuBar;
 
   /**
    * Main method that is used for testing purposes.  The control-panel
@@ -83,15 +85,16 @@
 
   /**
    * Method that creates the ControlCenterInfo object that will be in all the
-   * control panel.  Here it basically reads the configuration of the
-   * configuration file.
+   * control panel.  Nothing is done here: the user must say whether the server
+   * is local or remote.
    * @param args the arguments that are passed in the command line.
    */
   public void initialize(String[] args)
   {
     info = ControlPanelInfo.getInstance();
-    info.regenerateDescriptor();
-    info.startPooling();
+    // Call Installation because the LocalOrRemotePanel uses it to check
+    // whether the server is running or not and to get the install path.
+    Installation.getLocal();
   }
 
   /**
@@ -99,34 +102,47 @@
    */
   public void createAndDisplayGUI()
   {
-//  Create and set up the content pane.
-    controlCenterPane = new ControlCenterMainPane(info);
-    //  Create and set up the window.
-    dlg = new JFrame();
-    dlg.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
-    final MainMenuBar menuBar = new MainMenuBar(info);
-    dlg.addWindowListener(new WindowAdapter() {
-      public void windowClosing(WindowEvent e) {
-        menuBar.quitClicked();
+    GenericDialog localOrRemote =
+      ControlCenterMainPane.getLocalOrRemoteDialog(info);
+    Utilities.centerOnScreen(localOrRemote);
+    localOrRemote.setVisible(true);
+
+    if (info.getServerDescriptor() == null)
+    {
+      menuBar = new MainMenuBar(info);
+      // Assume that the user decided to quit the application
+      menuBar.quitClicked();
+    }
+    // To be sure that the dlg receives the new configuration event before
+    // calling pack.
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      public void run()
+      {
+        // Create and set up the content pane.
+        controlCenterPane = new ControlCenterMainPane(info);
+        //  Create and set up the window.
+        dlg = new JFrame();
+        dlg.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+        final MainMenuBar menuBar = new MainMenuBar(info);
+        dlg.addWindowListener(new WindowAdapter() {
+          public void windowClosing(WindowEvent e) {
+            menuBar.quitClicked();
+          }
+        });
+        dlg.setJMenuBar(menuBar);
+        String title = Utils.getCustomizedObject(
+            "INFO_CONTROL_PANEL_TITLE",
+            AdminToolMessages.INFO_CONTROL_PANEL_TITLE.get(),
+            Message.class).toString();
+        dlg.setTitle(title);
+        dlg.setContentPane(controlCenterPane);
+        dlg.pack();
+        Utilities.centerOnScreen(dlg);
+
+        dlg.setVisible(true);
       }
     });
-    dlg.setJMenuBar(menuBar);
-    String title = Utils.getCustomizedObject(
-        "INFO_CONTROL_PANEL_TITLE",
-        AdminToolMessages.INFO_CONTROL_PANEL_TITLE.get(),
-        Message.class).toString();
-    dlg.setTitle(title);
-    dlg.setContentPane(controlCenterPane);
-
-    dlg.pack();
-    Utilities.centerOnScreen(dlg);
-    dlg.setVisible(true);
-    if (info.getServerDescriptor().getStatus() ==
-      ServerDescriptor.ServerStatus.STARTED)
-    {
-      controlCenterPane.getLoginDialog().setVisible(true);
-      controlCenterPane.getLoginDialog().toFront();
-    }
   }
 
   private static void initLookAndFeel() throws Throwable
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java b/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java
index f0c536b..cec350c 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java
@@ -36,6 +36,8 @@
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.naming.NameNotFoundException;
 import javax.naming.NamingException;
@@ -133,6 +135,9 @@
 
   private String filter;
 
+  private static final Logger LOG =
+    Logger.getLogger(BrowserController.class.getName());
+
   /**
    * Constructor of the BrowserController.
    * @param tree the tree that must be updated.
@@ -1540,8 +1545,9 @@
         try {
           refreshTaskDidProgress(task, oldState, newState);
         }
-        catch(Exception x) {
-          x.printStackTrace();
+        catch(Throwable t)
+        {
+          LOG.log(Level.SEVERE, "Error calling refreshTaskDidProgress: "+t, t);
         }
       }
     };
@@ -1735,7 +1741,8 @@
     if (node.getError() != null) {
       if (node.getError().getException() != null)
       {
-        node.getError().getException().printStackTrace();
+        LOG.log(Level.SEVERE, "node has error: "+node.getError().getException(),
+            node.getError().getException());
       }
       modifiers |= IconPool.MODIFIER_ERROR;
     }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java b/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
index d76e9b5..8e037ee 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
@@ -27,6 +27,7 @@
 
 package org.opends.guitools.controlpanel.datamodel;
 
+import java.io.File;
 import java.net.InetAddress;
 import java.util.Collection;
 import java.util.Collections;
@@ -58,7 +59,7 @@
 import org.opends.guitools.controlpanel.util.ConfigReader;
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.quicksetup.util.UIKeyStore;
-import org.opends.server.core.DirectoryServer;
+import org.opends.quicksetup.util.Utils;
 import org.opends.server.tools.ConfigureWindowsService;
 
 /**
@@ -88,11 +89,16 @@
   private String startTLSURL;
   private String ldapsURL;
   private String adminConnectorURL;
+  private String localAdminConnectorURL;
   private String lastWorkingBindDN;
   private String lastWorkingBindPwd;
+  private String lastRemoteHostName;
+  private String lastRemoteAdministrationURL;
 
   private static boolean mustDeregisterConfig;
 
+  private boolean isLocal = true;
+
   private Set<AbstractIndexDescriptor> modifiedIndexes =
     new HashSet<AbstractIndexDescriptor>();
 
@@ -296,6 +302,8 @@
     {
       lastWorkingBindDN = ConnectionUtils.getBindDN(ctx);
       lastWorkingBindPwd = ConnectionUtils.getBindPassword(ctx);
+      lastRemoteHostName = ConnectionUtils.getHostName(ctx);
+      lastRemoteAdministrationURL = ConnectionUtils.getLdapUrl(ctx);
     }
   }
 
@@ -420,7 +428,9 @@
    */
   protected ConfigFromDirContext createNewConfigFromDirContextReader()
   {
-    return new ConfigFromDirContext();
+    ConfigFromDirContext configFromDirContext = new ConfigFromDirContext();
+    configFromDirContext.setIsLocal(isLocal());
+    return configFromDirContext;
   }
 
   /**
@@ -439,39 +449,55 @@
     desc.setSchema(reader.getSchema());
     desc.setSchemaEnabled(reader.isSchemaEnabled());
   }
+  private int i=0;
   /**
    * Regenerates the last found ServerDescriptor object.
    *
    */
   public synchronized void regenerateDescriptor()
   {
+    boolean isLocal = isLocal();
+
     ServerDescriptor desc = createNewServerDescriptorInstance();
+    desc.setIsLocal(isLocal);
     InitialLdapContext ctx = getDirContext();
-    desc.setInstallPath(Utilities.getServerRootDirectory());
-    desc.setInstancePath(Utilities.getInstanceRootDirectory(
-        Utilities.getServerRootDirectory().getAbsolutePath()));
-    boolean windowsServiceEnabled = false;
-    if (Utilities.isWindows())
+    if (isLocal)
     {
-      int result = ConfigureWindowsService.serviceState(null, null);
-      windowsServiceEnabled =
-        result == ConfigureWindowsService.SERVICE_STATE_ENABLED;
-    }
-    desc.setWindowsServiceEnabled(windowsServiceEnabled);
-    desc.setOpenDSVersion(
+      desc.setOpenDSVersion(
         org.opends.server.util.DynamicConstants.FULL_VERSION_STRING);
+      desc.setInstallPath(Utilities.getServerRootDirectory());
+      desc.setInstancePath(Utilities.getInstanceRootDirectory(
+          Utilities.getServerRootDirectory().getAbsolutePath()));
+      boolean windowsServiceEnabled = false;
+      if (Utilities.isWindows())
+      {
+        int result = ConfigureWindowsService.serviceState(null, null);
+        windowsServiceEnabled =
+          result == ConfigureWindowsService.SERVICE_STATE_ENABLED;
+      }
+      desc.setWindowsServiceEnabled(windowsServiceEnabled);
+    }
+    else
+    {
+      if (lastRemoteHostName != null)
+      {
+        desc.setHostname(lastRemoteHostName);
+      }
+    }
     ConfigReader reader;
 
     ServerDescriptor.ServerStatus status = null;
     for (Task task : getTasks())
     {
       if ((task.getType() == Task.Type.START_SERVER) &&
-          task.getState() == Task.State.RUNNING)
+          (task.getState() == Task.State.RUNNING) &&
+          isRunningOnServer(desc, task))
       {
         status = ServerDescriptor.ServerStatus.STARTING;
       }
       else if ((task.getType() == Task.Type.STOP_SERVER) &&
-          task.getState() == Task.State.RUNNING)
+          (task.getState() == Task.State.RUNNING) &&
+          isRunningOnServer(desc, task))
       {
         status = ServerDescriptor.ServerStatus.STOPPING;
       }
@@ -514,11 +540,19 @@
           userDataCtx = null;
         }
       }
-      reader = createNewConfigFromFileReader();
-      ((ConfigFromFile)reader).readConfiguration();
+      if (isLocal)
+      {
+        reader = createNewConfigFromFileReader();
+        ((ConfigFromFile)reader).readConfiguration();
+      }
+      else
+      {
+        reader = null;
+      }
       desc.setAuthenticated(false);
     }
-    else if (Utilities.isServerRunning(
+    else if (!isLocal ||
+        Utilities.isServerRunning(
         Utilities.getInstanceRootDirectory(
             desc.getInstallPath().getAbsolutePath())))
     {
@@ -529,8 +563,19 @@
         // Try with previous credentials.
         try
         {
-          ctx = Utilities.getAdminDirContext(this, lastWorkingBindDN,
+          if (isLocal)
+          {
+            ctx = Utilities.getAdminDirContext(this, lastWorkingBindDN,
               lastWorkingBindPwd);
+          }
+          else if (lastRemoteAdministrationURL != null)
+          {
+            ctx = Utils.createLdapsContext(lastRemoteAdministrationURL,
+                lastWorkingBindDN,
+                lastWorkingBindPwd,
+                Utils.getDefaultLDAPTimeout(), null,
+                getTrustManager());
+          }
         }
         catch (ConfigReadException cre)
         {
@@ -546,83 +591,117 @@
         }
       }
 
-      if (ctx == null)
+      if (isLocal && (ctx == null))
       {
         reader = createNewConfigFromFileReader();
         ((ConfigFromFile)reader).readConfiguration();
       }
       else
       {
-        reader = createNewConfigFromDirContextReader();
-        ((ConfigFromDirContext)reader).readConfiguration(ctx);
-        if (reader.getExceptions().size() > 0)
+        if (!isLocal && (ctx == null))
         {
-          // Check the connection
-          boolean connectionWorks = false;
-          int nMaxErrors = 5;
-          for (int i=0; i< nMaxErrors && !connectionWorks; i++)
+          desc.setStatus(ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE);
+          reader = null;
+        }
+        else
+        {
+          reader = createNewConfigFromDirContextReader();
+          ((ConfigFromDirContext)reader).readConfiguration(ctx);
+          if (reader.getExceptions().size() > 0)
           {
-            try
-            {
-              Utilities.pingDirContext(ctx);
-              connectionWorks = true;
-            }
-            catch (NamingException ne)
+            // Check the connection
+            boolean connectionWorks = false;
+            int nMaxErrors = 5;
+            for (int i=0; i< nMaxErrors && !connectionWorks; i++)
             {
               try
               {
-                Thread.sleep(400);
+                Utilities.pingDirContext(ctx);
+                connectionWorks = true;
+              }
+              catch (NamingException ne)
+              {
+                try
+                {
+                  Thread.sleep(400);
+                }
+                catch (Throwable t)
+                {
+                }
+              }
+            }
+            if (!connectionWorks)
+            {
+              if (isLocal)
+              {
+                // Try with offline info
+                reader = createNewConfigFromFileReader();
+                ((ConfigFromFile)reader).readConfiguration();
+              }
+              else
+              {
+                desc.setStatus(
+                    ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE);
+                reader = null;
+              }
+              try
+              {
+                ctx.close();
               }
               catch (Throwable t)
               {
               }
-            }
-          }
-          if (!connectionWorks)
-          {
-            // Try with offline info
-            reader = createNewConfigFromFileReader();
-            ((ConfigFromFile)reader).readConfiguration();
-            try
-            {
-              ctx.close();
-            }
-            catch (Throwable t)
-            {
-            }
-            this.ctx = null;
-            if (connectionPool.isConnectionRegistered(userDataCtx))
-            {
+              this.ctx = null;
+              if (connectionPool.isConnectionRegistered(userDataCtx))
+              {
+                try
+                {
+                  connectionPool.unregisterConnection(userDataCtx);
+                }
+                catch (Throwable t)
+                {
+                }
+              }
               try
               {
-                connectionPool.unregisterConnection(userDataCtx);
+                userDataCtx.close();
               }
               catch (Throwable t)
               {
               }
+              userDataCtx = null;
             }
-            try
-            {
-              userDataCtx.close();
-            }
-            catch (Throwable t)
-            {
-            }
-            userDataCtx = null;
           }
         }
       }
-      desc.setAuthenticated(reader instanceof ConfigFromDirContext);
-      desc.setJavaVersion(reader.getJavaVersion());
-      desc.setOpenConnections(reader.getOpenConnections());
-      if (reader instanceof ConfigFromDirContext)
+      if (reader != null)
       {
-        ConfigFromDirContext rCtx = (ConfigFromDirContext)reader;
-        desc.setRootMonitor(rCtx.getRootMonitor());
-        desc.setEntryCachesMonitor(rCtx.getEntryCaches());
-        desc.setJvmMemoryUsageMonitor(rCtx.getJvmMemoryUsage());
-        desc.setSystemInformationMonitor(rCtx.getSystemInformation());
-        desc.setWorkQueueMonitor(rCtx.getWorkQueue());
+        desc.setAuthenticated(reader instanceof ConfigFromDirContext);
+        desc.setJavaVersion(reader.getJavaVersion());
+        desc.setOpenConnections(reader.getOpenConnections());
+        if (reader instanceof ConfigFromDirContext)
+        {
+          ConfigFromDirContext rCtx = (ConfigFromDirContext)reader;
+          desc.setRootMonitor(rCtx.getRootMonitor());
+          desc.setEntryCachesMonitor(rCtx.getEntryCaches());
+          desc.setJvmMemoryUsageMonitor(rCtx.getJvmMemoryUsage());
+          desc.setSystemInformationMonitor(rCtx.getSystemInformation());
+          desc.setWorkQueueMonitor(rCtx.getWorkQueue());
+          desc.setOpenDSVersion((String)Utilities.getFirstMonitoringValue(
+              rCtx.getVersionMonitor(), "fullVersion"));
+          String installPath = (String)Utilities.getFirstMonitoringValue(
+              rCtx.getSystemInformation(), "installPath");
+          if (installPath != null)
+          {
+            desc.setInstallPath(new File(installPath));
+          }
+          String instancePath = (String)Utilities.getFirstMonitoringValue(
+              rCtx.getSystemInformation(), "instancePath");
+          if (instancePath != null)
+          {
+            desc.setInstancePath(new File(instancePath));
+          }
+        }
       }
     }
     else
@@ -632,24 +711,21 @@
       reader = createNewConfigFromFileReader();
       ((ConfigFromFile)reader).readConfiguration();
     }
-    updateServerDescriptor(reader, desc);
+    if (reader != null)
+    {
+      updateServerDescriptor(reader, desc);
+    }
 
     if ((serverDesc == null) || !serverDesc.equals(desc))
     {
       serverDesc = desc;
-      // Update the schema: so that when we call the server code the latest
-      // schema read is used.
-      if (serverDesc.getSchema() != null)
-      {
-        if (!ServerDescriptor.areSchemasEqual(serverDesc.getSchema(),
-            DirectoryServer.getSchema()))
-        {
-          DirectoryServer.setSchema(desc.getSchema());
-        }
-      }
       ldapURL = getURL(serverDesc, ConnectionHandlerDescriptor.Protocol.LDAP);
       ldapsURL = getURL(serverDesc, ConnectionHandlerDescriptor.Protocol.LDAPS);
       adminConnectorURL = getAdminConnectorURL(serverDesc);
+      if (serverDesc.isLocal())
+      {
+        localAdminConnectorURL = adminConnectorURL;
+      }
       startTLSURL = getURL(serverDesc,
           ConnectionHandlerDescriptor.Protocol.LDAP_STARTTLS);
       ConfigurationChangeEvent ev = new ConfigurationChangeEvent(this, desc);
@@ -766,6 +842,7 @@
             regenerateDescriptor();
             Thread.sleep(poolingPeriod);
           }
+
         }
         catch (Throwable t)
         {
@@ -861,7 +938,29 @@
    */
   public String getAdminConnectorURL()
   {
-    return adminConnectorURL;
+    if (isLocal)
+    {
+      // If the user set isLocal to true, we want to return the
+      // localAdminConnectorURL (in particular if regenerateDescriptor has not
+      // been called).
+      return localAdminConnectorURL;
+    }
+    else
+    {
+      return adminConnectorURL;
+    }
+  }
+
+  /**
+   * Gets the Administration Connector URL based in what is read in the local
+   * configuration. It returns <CODE>null</CODE> if no Administration
+   * Connector URL was found.
+   * @return the Administration Connector URL to be used to connect
+   * to the local server.
+   */
+  public String getLocalAdminConnectorURL()
+  {
+    return localAdminConnectorURL;
   }
 
   /**
@@ -958,20 +1057,27 @@
     String url = null;
 
     ConnectionHandlerDescriptor desc = server.getAdminConnector();
-    int port = desc.getPort();
-    SortedSet<InetAddress> addresses = desc.getAddresses();
-    if (addresses.size() == 0) {
-      if (port > 0) {
-        url = "ldaps://localhost:" + port;
-      }
-    } else {
-      if (port > 0) {
-        InetAddress address = addresses.first();
-        url = "ldaps://" +
+    if (desc != null)
+    {
+      int port = desc.getPort();
+      SortedSet<InetAddress> addresses = desc.getAddresses();
+      if (addresses.size() == 0) {
+        if (port > 0) {
+          url = "ldaps://localhost:" + port;
+        }
+      } else {
+        if (port > 0) {
+          InetAddress address = addresses.first();
+          url = "ldaps://" +
           ConnectionUtils.getHostNameForLdapUrl(address.getHostAddress()) + ":"
           + port;
+        }
       }
     }
+    else
+    {
+      url = null;
+    }
     return url;
   }
 
@@ -1081,6 +1187,26 @@
   }
 
   /**
+   * Sets whether the server is local or not.
+   * @param isLocal whether the server is local or not.
+   */
+  public void setIsLocal(boolean isLocal)
+  {
+    this.isLocal = isLocal;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if we are trying to manage the local host and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if we are trying to manage the local host and
+   * <CODE>false</CODE> otherwise.
+   */
+  public boolean isLocal()
+  {
+    return isLocal;
+  }
+
+  /**
    * Returns the connection pool to be used by the LDAP entry browsers.
    * @return the connection pool to be used by the LDAP entry browsers.
    */
@@ -1115,4 +1241,87 @@
   {
     this.poolingPeriod = poolingPeriod;
   }
+
+  /**
+   * Returns whether the provided task is running on the provided server or not.
+   * The code takes into account that the server object might not be fully
+   * initialized (but at least it contains the host name and the instance
+   * path if it is local).
+   * @param server the server.
+   * @param task the task to be analyzed.
+   * @return <CODE>true</CODE> if the provided task is running on the provided
+   * server and <CODE>false</CODE> otherwise.
+   */
+  private boolean isRunningOnServer(ServerDescriptor server, Task task)
+  {
+    boolean isRunningOnServer;
+    if (!server.isLocal() || !task.getServer().isLocal())
+    {
+      if (!server.isLocal())
+      {
+        // At this point we only have connection information about the new
+        // server.  Use the dir context which corresponds to the server to
+        // compare things.
+        String host1 = server.getHostname();
+        String host2 = task.getServer().getHostname();
+        if (host1 == null)
+        {
+          isRunningOnServer = host2 == null;
+        }
+        else
+        {
+          isRunningOnServer = host1.equalsIgnoreCase(host2);
+        }
+        if (isRunningOnServer)
+        {
+          // Compare administration port;
+          int adminPort1 = -1;
+          int adminPort2 = -1;
+          if (server.getAdminConnector() != null)
+          {
+            adminPort1 = server.getAdminConnector().getPort();
+          }
+
+          if (getDirContext() != null)
+          {
+            adminPort2 = ConnectionUtils.getPort(getDirContext());
+          }
+          isRunningOnServer = adminPort1 == adminPort2;
+        }
+      }
+      else
+      {
+        // Compare host names and paths
+        File f1 = server.getInstancePath();
+        File f2 = task.getServer().getInstancePath();
+
+        String host1 = server.getHostname();
+        String host2 = task.getServer().getHostname();
+        if (host1 == null)
+        {
+          isRunningOnServer = host2 == null;
+        }
+        else
+        {
+          isRunningOnServer = host1.equalsIgnoreCase(host2);
+        }
+        if (isRunningOnServer)
+        {
+          if (f1 == null)
+          {
+            isRunningOnServer = f2 == null;
+          }
+          else
+          {
+            isRunningOnServer = f1.equals(f2);
+          }
+        }
+      }
+    }
+    else
+    {
+      isRunningOnServer = true;
+    }
+    return isRunningOnServer;
+  }
 }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java b/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
index 16f4612..7f2dfbd 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
@@ -83,18 +83,22 @@
 
   private boolean isAuthenticated;
 
-  private static String hostName = "locahost";
+  private static String localHostName = "locahost";
   static
   {
     try
     {
-      hostName = java.net.InetAddress.getLocalHost().getHostName();
+      localHostName = java.net.InetAddress.getLocalHost().getHostName();
     }
     catch (Throwable t)
     {
     }
   };
 
+  private String hostName = localHostName;
+
+  private boolean isLocal = true;
+
   /**
    * Enumeration indicating the status of the server.
    *
@@ -118,6 +122,10 @@
      */
     STOPPING,
     /**
+     * Not connected to remote.
+     */
+    NOT_CONNECTED_TO_REMOTE,
+    /**
      * Status Unknown.
      */
     UNKNOWN
@@ -295,6 +303,11 @@
 
         if (equals)
         {
+          equals = desc.isLocal() == isLocal();
+        }
+
+        if (equals)
+        {
           equals = desc.isAuthenticated() == isAuthenticated();
         }
 
@@ -305,12 +318,26 @@
 
         if (equals)
         {
-          equals = desc.getInstallPath().equals(getInstallPath());
+          if (desc.getInstallPath() == null)
+          {
+            equals = getInstallPath() == null;
+          }
+          else
+          {
+            equals = desc.getInstallPath().equals(getInstallPath());
+          }
         }
 
         if (equals)
         {
-          equals = desc.getInstancePath().equals(getInstancePath());
+          if (desc.getInstancePath() == null)
+          {
+            equals = getInstancePath() == null;
+          }
+          else
+          {
+            equals = desc.getInstancePath().equals(getInstancePath());
+          }
         }
 
         if (equals)
@@ -327,7 +354,14 @@
 
         if (equals)
         {
-          equals = desc.getOpenDSVersion().equals(getOpenDSVersion());
+          if (desc.getOpenDSVersion() == null)
+          {
+            equals = getOpenDSVersion() == null;
+          }
+          else
+          {
+            equals = desc.getOpenDSVersion().equals(getOpenDSVersion());
+          }
         }
 
         if (equals)
@@ -484,6 +518,37 @@
   }
 
   /**
+   * Sets the host name of the server.
+   * @param hostName the host name of the server.
+   */
+  public void setHostname(String hostName)
+  {
+    this.hostName = hostName;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if we are trying to manage the local host and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if we are trying to manage the local host and
+   * <CODE>false</CODE> otherwise.
+   */
+  public boolean isLocal()
+  {
+    return isLocal;
+  }
+
+  /**
+   * Sets whether this server represents the local instance or a remote server.
+   * @param isLocal whether this server represents the local instance or a
+   * remote server (in another machine or in another installation on the same
+   * machine).
+   */
+  public void setIsLocal(boolean isLocal)
+  {
+    this.isLocal = isLocal;
+  }
+
+  /**
    * Returns the exceptions that occurred while reading the configuration.
    * @return the exceptions that occurred while reading the configuration.
    */
@@ -772,7 +837,9 @@
   public void setAdminConnector(ConnectionHandlerDescriptor adminConnector)
   {
     this.adminConnector = adminConnector;
-  }/**
+  }
+
+  /**
    * Sets the monitoring entry for the entry caches.
    * @param entryCaches the monitoring entry for the entry caches.
    */
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
index 0da60ad..1c7f3ca 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -150,7 +150,7 @@
     boolean canLaunch = true;
     if (!isServerRunning())
     {
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java
index 157d245..66e7a62 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java
@@ -218,7 +218,7 @@
       Collection<Message> incompatibilityReasons)
   {
     boolean canLaunch = true;
-    if (state == State.RUNNING)
+    if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
     {
       // All the operations are incompatible if they apply to this
       // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java
index c6751b4..c6cb688 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -182,7 +182,7 @@
     boolean canLaunch = true;
     if (!isServerRunning())
     {
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteIndexTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteIndexTask.java
index bbc7918..cd1408d 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteIndexTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteIndexTask.java
@@ -125,7 +125,7 @@
       Collection<Message> incompatibilityReasons)
   {
     boolean canLaunch = true;
-    if (state == State.RUNNING)
+    if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
     {
       // All the operations are incompatible if they apply to this
       // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/ModifyEntryTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/ModifyEntryTask.java
index fdb47c5..ad24b54 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/ModifyEntryTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/ModifyEntryTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -203,7 +203,7 @@
     boolean canLaunch = true;
     if (!isServerRunning())
     {
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/NewEntryTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/NewEntryTask.java
index 10ad4ab..bd388f6 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/NewEntryTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/NewEntryTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -155,7 +155,7 @@
     boolean canLaunch = true;
     if (!isServerRunning())
     {
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/RebuildIndexTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/RebuildIndexTask.java
index b85b9b0..a2ccac5 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/RebuildIndexTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/RebuildIndexTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -50,6 +50,7 @@
 import org.opends.server.admin.client.ldap.LDAPManagementContext;
 import org.opends.server.admin.std.client.LocalDBBackendCfgClient;
 import org.opends.server.admin.std.client.RootCfgClient;
+import org.opends.server.tools.RebuildIndex;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.util.cli.CommandBuilder;
 
@@ -109,7 +110,7 @@
       Collection<Message> incompatibilityReasons)
   {
     boolean canLaunch = true;
-    if (state == State.RUNNING)
+    if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
     {
       // All the operations are incompatible if they apply to this
       // backend.
@@ -137,8 +138,9 @@
     {
       boolean mustDisable = false;
       boolean mustEnable = false;
+      boolean isLocal = getInfo().getServerDescriptor().isLocal();
       String backendName = backendSet.iterator().next();
-      if (isServerRunning())
+      if (isServerRunning() && isLocal)
       {
         for (BackendDescriptor backend :
           getInfo().getServerDescriptor().getBackends())
@@ -188,8 +190,16 @@
           }
         });
 
-        returnCode = executeCommandLine(getCommandLinePath("rebuild-index"),
-            args);
+        if (isLocal)
+        {
+          returnCode = executeCommandLine(getCommandLinePath("rebuild-index"),
+              args);
+        }
+        else
+        {
+          returnCode = RebuildIndex.mainRebuildIndex(args, false,
+              outPrintStream, errorPrintStream);
+        }
 
         if (returnCode != 0)
         {
@@ -258,6 +268,13 @@
       }
     }
 
+    boolean isLocal = getInfo().getServerDescriptor().isLocal();
+    if (!isLocal)
+    {
+      args.addAll(getConnectionCommandLineArguments());
+      args.addAll(getConfigCommandLineArguments());
+    }
+
     return args;
   }
 
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java
index bb060f9..c435139 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -190,7 +190,7 @@
     boolean canLaunch = true;
     if (!isServerRunning())
     {
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java
index f8cd1a6..69d182a 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/StartStopTask.java
@@ -79,7 +79,7 @@
       Collection<Message> incompatibilityReasons)
   {
     boolean canLaunch = true;
-    if (state == State.RUNNING)
+    if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
     {
       incompatibilityReasons.add(getIncompatibilityMessage(this,
           taskToBeLaunched));
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/Task.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/Task.java
index edbbba4..c494188 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/Task.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/Task.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.task;
@@ -53,6 +53,7 @@
 import org.opends.guitools.controlpanel.util.ProcessReader;
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.messages.Message;
+import org.opends.quicksetup.Installation;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.DN;
 import org.opends.server.types.Schema;
@@ -68,6 +69,7 @@
 public abstract class Task
 {
   private static String localHostName = null;
+  private String binDir;
   static
   {
     // Do this since by default the hostname used by the connection is
@@ -275,6 +277,8 @@
   protected Process process;
   private ControlPanelInfo info;
 
+  private ServerDescriptor server;
+
   private ProgressDialog progressDialog;
 
   private static int MAX_BINARY_LENGTH_TO_DISPLAY = 1024;
@@ -313,6 +317,7 @@
         logs.append(msg+"\n");
       }
     });
+    server = info.getServerDescriptor();
   }
 
   /**
@@ -600,16 +605,80 @@
    */
   protected String getBinaryDir()
   {
-    if (Utilities.isWindows())
+    if (binDir == null)
     {
-      return getInfo().getServerDescriptor().getInstallPath() +
-      File.separator + "bat" + File.separator;
+      File f = Installation.getLocal().getBinariesDirectory();
+      try
+      {
+        binDir = f.getCanonicalPath();
+      }
+      catch (Throwable t)
+      {
+        binDir = f.getAbsolutePath();
+      }
+      if (binDir.lastIndexOf(File.separatorChar) != (binDir.length() - 1))
+      {
+        binDir += File.separatorChar;
+      }
+    }
+
+    return binDir;
+  }
+
+  /**
+   * Check whether the provided task and this task run on the same server.
+   * @param task the task the task to be analyzed.
+   * @return <CODE>true</CODE> if both tasks run on the same server and
+   * <CODE>false</CODE> otherwise.
+   */
+  protected boolean runningOnSameServer(Task task)
+  {
+    boolean runningOnSameServer = false;
+    if (getServer().isLocal() && task.getServer().isLocal())
+    {
+      runningOnSameServer = true;
     }
     else
     {
-      return getInfo().getServerDescriptor().getInstallPath() +
-      File.separator + "bin" + File.separator;
+      // Compare the host name and the instance path.  This is safer than
+      // comparing ports: we might be running locally on a stopped instance with
+      // the same configuration as a "remote" (though located on the same
+      // machine) server.
+      File f1 = getServer().getInstancePath();
+      File f2 = task.getServer().getInstancePath();
+
+      String host1 = getServer().getHostname();
+      String host2 = task.getServer().getHostname();
+      if (host1 == null)
+      {
+        runningOnSameServer = host2 == null;
+      }
+      else
+      {
+        runningOnSameServer = host1.equalsIgnoreCase(host2);
+      }
+      if (runningOnSameServer)
+      {
+        if (f1 == null)
+        {
+          runningOnSameServer = f2 == null;
+        }
+        else
+        {
+          runningOnSameServer = f1.equals(f2);
+        }
+      }
     }
+    return runningOnSameServer;
+  }
+
+  /**
+   * Returns the server descriptor on which the task was launched.
+   * @return the server descriptor on which the task was launched.
+   */
+  public ServerDescriptor getServer()
+  {
+    return server;
   }
 
   /**
@@ -729,7 +798,7 @@
     if (isServerRunning() && (ctx != null))
     {
       String hostName = localHostName;
-      if (hostName == null)
+      if ((hostName == null) || !getInfo().getServerDescriptor().isLocal())
       {
         hostName = ConnectionUtils.getHostName(ctx);
       }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/AbstractBrowseEntriesPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/AbstractBrowseEntriesPanel.java
index 53888ff..2c06dd8 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/AbstractBrowseEntriesPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/AbstractBrowseEntriesPanel.java
@@ -1366,6 +1366,16 @@
         }
       }
     }
+    else if (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
+    {
+      MessageBuilder mb = new MessageBuilder();
+      mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
+          desc.getHostname()));
+      mb.append("<br><br>"+getAuthenticateHTML());
+      errorDetails = mb.toMessage();
+      errorTitle = INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_SUMMARY.get();
+      displayErrorPane = true;
+    }
     else
     {
       errorTitle = INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get();
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupListPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupListPanel.java
index 0f4807d..8b9c8f3 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupListPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupListPanel.java
@@ -132,6 +132,8 @@
    */
   protected JTable backupList;
 
+  private JLabel lRemoteFileHelp;
+
   /**
    * Whether the backup parent directory has been initialized with a value or
    * not.
@@ -214,6 +216,15 @@
     gbc.weightx = 0.0;
     add(browse, gbc);
 
+    lRemoteFileHelp = Utilities.createInlineHelpLabel(
+        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    gbc.gridx = 1;
+    gbc.gridwidth = 2;
+    gbc.insets.top = 3;
+    gbc.insets.left = 10;
+    gbc.gridy ++;
+    add(lRemoteFileHelp, gbc);
+
     gbc.gridx = 0;
     gbc.gridy ++;
     gbc.insets.top = 10;
@@ -222,6 +233,7 @@
         INFO_CTRL_PANEL_AVAILABLE_BACKUPS_LABEL.get());
     gbc.anchor = GridBagConstraints.NORTHWEST;
     gbc.fill = GridBagConstraints.NONE;
+    gbc.gridwidth = 1;
     add(lAvailableBackups, gbc);
 
     gbc.gridx = 1;
@@ -339,7 +351,7 @@
     verifyBackup.setEnabled(false);
     tableScroll.setVisible(false);
     lRefreshingList.setText(REFRESHING_LIST.toString());
-    lRefreshingList.setVisible(true);
+    lRefreshingList.setVisible(isLocal());
     final int lastSelectedRow = backupList.getSelectedRow();
 
     final String parentPath = parentDirectory.getText();
@@ -428,6 +440,7 @@
           {
             model.fireTableDataChanged();
             lRefreshingList.setText(NO_BACKUPS_FOUND.toString());
+            lRefreshingList.setVisible(isLocal());
           }
           errorPane.setVisible(false);
           // This is done to perform checks against whether we require to
@@ -522,20 +535,41 @@
     if (!backupDirectoryInitialized &&
         (parentDirectory.getText().length() == 0))
     {
-      final String path =
-        org.opends.quicksetup.util.Utils.getPath(
-            new File(desc.getInstancePath(),
-                org.opends.quicksetup.Installation.BACKUPS_PATH_RELATIVE));
+      String path;
+
+      File f = new File(desc.getInstancePath(),
+          org.opends.quicksetup.Installation.BACKUPS_PATH_RELATIVE);
+      try
+      {
+        path = f.getCanonicalPath();
+      }
+      catch (Throwable t)
+      {
+        path = f.getAbsolutePath();
+      }
+      final String fPath = path;
       SwingUtilities.invokeLater(new Runnable()
       {
         public void run()
         {
-          parentDirectory.setText(path);
+          parentDirectory.setText(fPath);
           refreshList();
           backupDirectoryInitialized = true;
         }
       });
     }
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      public void run()
+      {
+        lRemoteFileHelp.setVisible(!isLocal());
+        browse.setVisible(isLocal());
+        lAvailableBackups.setVisible(isLocal());
+        tableScroll.setVisible(isLocal());
+        refreshList.setVisible(isLocal());
+        verifyBackup.setVisible(isLocal());
+      }
+    });
   }
 
   /**
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupPanel.java
index b59839e..d0be1e1 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BackupPanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -81,6 +81,7 @@
   private JComboBox backends;
   private JCheckBox allBackends;
   private JTextField backupID;
+  private JTextField parentBackupID;
   private JRadioButton fullBackup;
   private JRadioButton incrementalBackup;
   private JCheckBox compressData;
@@ -91,6 +92,7 @@
   private JLabel lBackend;
   private JLabel lNoBackendsFound;
   private JLabel lBackupID;
+  private JLabel lParentID;
   private JLabel lBackupType;
   private JLabel lBackupOptions;
 
@@ -220,6 +222,7 @@
     gbc.gridx = 0;
     gbc.gridy ++;
     super.createLayout(gbc);
+
     verifyBackup.setVisible(false);
     lAvailableBackups.setText(
         INFO_CTRL_PANEL_AVAILABLE_PARENT_BACKUPS_LABEL.get().toString());
@@ -229,6 +232,21 @@
     gbc.insets.top = 10;
     gbc.gridwidth = 1;
     gbc.anchor = GridBagConstraints.WEST;
+    lParentID = Utilities.createPrimaryLabel(
+        INFO_CTRL_PANEL_PARENT_BACKUP_ID_LABEL.get());
+    add(lParentID, gbc);
+    parentBackupID = Utilities.createMediumTextField();
+    gbc.weightx = 0.0;
+    gbc.gridx ++;
+    gbc.insets.left = 10;
+    gbc.fill = GridBagConstraints.NONE;
+    gbc.gridwidth = 2;
+    add(parentBackupID, gbc);
+
+    gbc.gridy ++;
+    gbc.gridx = 0;
+    gbc.gridwidth = 1;
+    gbc.insets.left = 0;
     lBackupOptions = Utilities.createPrimaryLabel(
         INFO_CTRL_PANEL_BACKUP_OPTIONS_LABEL.get());
     add(lBackupOptions, gbc);
@@ -275,6 +293,11 @@
         refreshList.setEnabled(enable);
         tableScroll.setEnabled(enable);
         backupList.setEnabled(enable);
+        lAvailableBackups.setEnabled(enable);
+        lRefreshingList.setEnabled(enable);
+        lParentID.setEnabled(enable);
+        parentBackupID.setEnabled(enable);
+        verifyBackup.setEnabled(enable && getSelectedBackup() != null);
       }
     };
     incrementalBackup.addChangeListener(changeListener);
@@ -290,7 +313,7 @@
    */
   public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    ServerDescriptor desc = ev.getNewDescriptor();
+    final ServerDescriptor desc = ev.getNewDescriptor();
     updateSimpleBackendComboBoxModel(backends, lNoBackendsFound, desc);
     SwingUtilities.invokeLater(new Runnable()
     {
@@ -300,11 +323,23 @@
       public void run()
       {
         allBackends.setVisible(backends.getModel().getSize() > 0);
+        lParentID.setVisible(!desc.isLocal());
+        parentBackupID.setVisible(!desc.isLocal());
+        if (desc.isLocal())
+        {
+          lPath.setText(INFO_CTRL_PANEL_BACKUP_PATH_LABEL.get().toString());
+        }
+        else
+        {
+          lPath.setText(
+              INFO_CTRL_PANEL_PARENT_BACKUP_PATH_LABEL.get().toString());
+        }
       }
     });
     super.configurationChanged(ev);
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BACKUP.get());
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+        isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BACKUP.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
   }
 
   /**
@@ -315,6 +350,7 @@
     setPrimaryValid(lBackend);
     setPrimaryValid(lPath);
     setPrimaryValid(lAvailableBackups);
+    setPrimaryValid(lParentID);
     backupIDInitialized = false;
 
     final LinkedHashSet<Message> errors = new LinkedHashSet<Message>();
@@ -343,7 +379,7 @@
       errors.add(ERR_CTRL_PANEL_NO_BACKUP_PATH_PROVIDED.get());
       setPrimaryInvalid(lPath);
     }
-    else
+    else if (isLocal())
     {
       File f = new File(parentPath);
       if (f.isFile())
@@ -364,7 +400,7 @@
       setPrimaryInvalid(lBackupID);
     }
 
-    if (errors.isEmpty())
+    if (errors.isEmpty() && isLocal())
     {
       File f = new File(parentPath, dir);
       if (f.isFile())
@@ -377,12 +413,24 @@
 
     if (incrementalBackup.isSelected())
     {
-      boolean selected = backupList.isVisible() &&
-      (getSelectedBackup() != null);
-      if (!selected)
+      if (isLocal())
       {
-        errors.add(ERR_CTRL_PANEL_NO_PARENT_BACKUP_SELECTED.get());
-        setPrimaryInvalid(lAvailableBackups);
+        boolean selected = backupList.isVisible() &&
+        (getSelectedBackup() != null);
+        if (!selected)
+        {
+          errors.add(ERR_CTRL_PANEL_NO_PARENT_BACKUP_SELECTED.get());
+          setPrimaryInvalid(lAvailableBackups);
+        }
+      }
+      else
+      {
+        String parentID = parentBackupID.getText();
+        if ((parentID == null) || (parentID.trim().equals("")))
+        {
+          errors.add(ERR_CTRL_PANEL_NO_PARENT_BACKUP_ID_PROVIDED.get());
+          setPrimaryInvalid(lParentID);
+        }
       }
     }
 
@@ -604,8 +652,15 @@
       }
       if (incrementalBackup.isSelected())
       {
-        BackupDescriptor backup = getSelectedBackup();
-        dir = backup.getPath().getAbsolutePath();
+        if (isLocal())
+        {
+          BackupDescriptor backup = getSelectedBackup();
+          dir = backup.getPath().getAbsolutePath();
+        }
+        else
+        {
+          dir = parentDirectory.getText();
+        }
       }
       else
       {
@@ -637,7 +692,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend.
@@ -734,9 +789,17 @@
       if (incrementalBackup.isSelected())
       {
         args.add("--incremental");
-        BackupDescriptor backup = getSelectedBackup();
-        args.add("--incrementalBaseID");
-        args.add(backup.getID());
+        if (isLocal())
+        {
+          BackupDescriptor backup = getSelectedBackup();
+          args.add("--incrementalBaseID");
+          args.add(backup.getID());
+        }
+        else
+        {
+          args.add("--incrementalBaseID");
+          args.add(parentBackupID.getText());
+        }
       }
 
 
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java
index 9560bc5..581c8f7 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/BrowseGeneralMonitoringPanel.java
@@ -369,6 +369,16 @@
         displayErrorPane = true;
       }
     }
+    else if (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
+    {
+      MessageBuilder mb = new MessageBuilder();
+      mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
+          server.getHostname()));
+      mb.append("<br><br>"+getAuthenticateHTML());
+      errorDetails = mb.toMessage();
+      errorTitle = INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_SUMMARY.get();
+      displayErrorPane = true;
+    }
     else
     {
       errorTitle = INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get();
@@ -614,8 +624,11 @@
 
   private String getServerName(ServerDescriptor server)
   {
-    String serverName = server.getHostname()+":"+
-    server.getAdminConnector().getPort();
+    String serverName = server.getHostname();
+    if (server.getAdminConnector() != null)
+    {
+      serverName +=":"+server.getAdminConnector().getPort();
+    }
     return serverName;
   }
 
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java
index e6bb42b..e8c7709 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ConnectionHandlerMonitoringPanel.java
@@ -351,6 +351,16 @@
         displayErrorPane = true;
       }
     }
+    else if (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
+    {
+      MessageBuilder mb = new MessageBuilder();
+      mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
+          server.getHostname()));
+      mb.append("<br><br>"+getAuthenticateHTML());
+      errorDetails = mb.toMessage();
+      errorTitle = INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_SUMMARY.get();
+      displayErrorPane = true;
+    }
     else
     {
       errorTitle = INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get();
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ControlCenterMainPane.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ControlCenterMainPane.java
index e70d462..0f6435b 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ControlCenterMainPane.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ControlCenterMainPane.java
@@ -178,7 +178,7 @@
    * Returns the login dialog used to ask authentication to the user.
    * @return the login dialog used to ask authentication to the user.
    */
-  public GenericDialog getLoginDialog()
+  private GenericDialog getLoginDialog()
   {
     return statusPane.getLoginDialog();
   }
@@ -207,10 +207,60 @@
             INFO_CTRL_PANEL_NOT_AUTHENTICATED.get().toString());
       }
     }
-    else
+    else if (server.isLocal())
     {
       lAuthenticatedAs.setText(
          INFO_CTRL_PANEL_NOT_AUTHENTICATED_SERVER_NOT_RUNNING.get().toString());
     }
+    else
+    {
+      lAuthenticatedAs.setText(
+          INFO_CTRL_PANEL_NOT_AUTHENTICATED_SERVER_REMOTE.get(
+              server.getHostname()).toString());
+    }
+  }
+
+  private static GenericDialog localOrRemoteDlg;
+  private static GenericDialog loginDlg;
+
+  /**
+   * Returns the dialog that is in charge of asking the user the server
+   * to be administer.  This method will return always the same dialog.  The
+   * dialog will do all the logic of updating the ControlPanelInfo object.
+   * @param info the control panel information object.
+   * @return the dialog that is in charge of asking the user the server
+   * to be administer.
+   */
+  public static GenericDialog getLocalOrRemoteDialog(ControlPanelInfo info)
+  {
+    if (localOrRemoteDlg == null)
+    {
+      LocalOrRemotePanel localOrRemotePanel = new LocalOrRemotePanel();
+      localOrRemotePanel.setInfo(info);
+      localOrRemoteDlg = new GenericDialog(null, localOrRemotePanel);
+      localOrRemoteDlg.setModal(true);
+      localOrRemoteDlg.pack();
+    }
+    return localOrRemoteDlg;
+  }
+
+  /**
+   * Returns the dialog that is in charge of asking the user the authentication
+   * for the local server.  This method will return always the same dialog.
+   * @param info the control panel information object.  The
+   * dialog will do all the logic of updating the ControlPanelInfo object.
+   * @return the dialog that is in charge of asking the user the authentication
+   * for the local server.
+   */
+  public static GenericDialog getLocalServerLoginDialog(ControlPanelInfo info)
+  {
+    if (loginDlg == null)
+    {
+      LoginPanel loginPanel = new LoginPanel();
+      loginDlg = new GenericDialog(null, loginPanel);
+      loginPanel.setInfo(info);
+      loginDlg.setModal(true);
+    }
+    return loginDlg;
   }
 }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
index 7b1e713..2f3abf3 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
@@ -41,6 +41,7 @@
 import javax.swing.JScrollPane;
 import javax.swing.SwingUtilities;
 
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.event.ScrollPaneBorderListener;
 import org.opends.guitools.controlpanel.task.DeleteSchemaElementsTask;
@@ -136,10 +137,13 @@
   /**
    * {@inheritDoc}
    */
-  public void configurationChanged(final ConfigurationChangeEvent ev)
+  public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    updateErrorPaneIfAuthRequired(ev.getNewDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_ATTRIBUTE_DELETE.get());
+    final ServerDescriptor desc = ev.getNewDescriptor();
+    updateErrorPaneIfAuthRequired(desc,
+        isLocal() ?
+        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_ATTRIBUTE_DELETE.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     SwingUtilities.invokeLater(new Runnable()
     {
       /**
@@ -147,7 +151,7 @@
        */
       public void run()
       {
-        delete.setEnabled(!authenticationRequired(ev.getNewDescriptor()));
+        delete.setEnabled(!authenticationRequired(desc));
       }
     });
   }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
index 18f7298..89028af 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
@@ -41,6 +41,7 @@
 import javax.swing.JScrollPane;
 import javax.swing.SwingUtilities;
 
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.event.ScrollPaneBorderListener;
 import org.opends.guitools.controlpanel.task.DeleteSchemaElementsTask;
@@ -116,10 +117,13 @@
   /**
    * {@inheritDoc}
    */
-  public void configurationChanged(final ConfigurationChangeEvent ev)
+  public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    updateErrorPaneIfAuthRequired(ev.getNewDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_OBJECTCLASS_DELETE.get());
+    final ServerDescriptor desc = ev.getNewDescriptor();
+    updateErrorPaneIfAuthRequired(desc,
+       isLocal() ?
+          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_OBJECTCLASS_DELETE.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     SwingUtilities.invokeLater(new Runnable()
     {
       /**
@@ -127,7 +131,7 @@
        */
       public void run()
       {
-        delete.setEnabled(!authenticationRequired(ev.getNewDescriptor()));
+        delete.setEnabled(!authenticationRequired(desc));
       }
     });
   }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBackendPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBackendPanel.java
index ac9fffa..ebc1f6c 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBackendPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBackendPanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -96,8 +96,10 @@
       }
     }
     updateList(newElements);
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BACKEND_DELETE.get());
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+        isLocal() ?
+            INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BACKEND_DELETE.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
   }
 
   /**
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBaseDNPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBaseDNPanel.java
index 5e82097..63463a9 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBaseDNPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/DeleteBaseDNPanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -362,8 +362,10 @@
       }
     }
     updateList(newElements);
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BASE_DN_DELETE.get());
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+        isLocal() ?
+            INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BASE_DN_DELETE.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
   }
 
   /**
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ExportLDIFPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ExportLDIFPanel.java
index 263b5bd..1115fb2 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ExportLDIFPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ExportLDIFPanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -47,12 +47,14 @@
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.event.BrowseActionListener;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.task.Task;
@@ -76,11 +78,13 @@
   private JCheckBox generateSignedHash;
   private JCheckBox wrapText;
   private JTextField wrapColumn;
+  private JButton bBrowse;
 
   private JLabel lBackend;
   private JLabel lNoBackendsFound;
   private JLabel lFile;
   private JLabel lExportOptions;
+  private JLabel lRemoteFileHelp;
   private JCheckBox excludeOperationalAttrs;
 
   private DocumentListener documentListener;
@@ -195,7 +199,7 @@
     gbc.weightx = 1.0;
     gbc.fill = GridBagConstraints.HORIZONTAL;
     add(file, gbc);
-    JButton bBrowse = Utilities.createButton(
+    bBrowse = Utilities.createButton(
         INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get());
     bBrowse.addActionListener(
         new BrowseActionListener(file,
@@ -205,6 +209,16 @@
     gbc.weightx = 0.0;
     bBrowse.setOpaque(false);
     add(bBrowse, gbc);
+
+    lRemoteFileHelp = Utilities.createInlineHelpLabel(
+        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    gbc.gridx = 1;
+    gbc.insets.top = 3;
+    gbc.insets.left = 10;
+    gbc.gridy ++;
+    gbc.gridwidth = 3;
+    add(lRemoteFileHelp, gbc);
+
     gbc.gridx = 1;
     gbc.gridy ++;
     gbc.insets.left = 30;
@@ -312,11 +326,22 @@
    */
   public void configurationChanged(ConfigurationChangeEvent ev)
   {
+    ServerDescriptor desc = ev.getNewDescriptor();
     updateSimpleBackendComboBoxModel(backends, lNoBackendsFound,
         ev.getNewDescriptor());
 
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_EXPORT.get());
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+       isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_EXPORT.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
+
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      public void run()
+      {
+        lRemoteFileHelp.setVisible(!isLocal());
+        bBrowse.setVisible(isLocal());
+      }
+    });
   }
 
   /**
@@ -350,7 +375,7 @@
       errors.add(INFO_NO_LDIF_PATH.get());
       setPrimaryInvalid(lFile);
     }
-    else
+    else if (isLocal())
     {
       File f = new File(ldifPath);
       if (f.isDirectory())
@@ -468,7 +493,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend.
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ImportLDIFPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ImportLDIFPanel.java
index 5fa2d5b..bb17888 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ImportLDIFPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ImportLDIFPanel.java
@@ -48,6 +48,7 @@
 import javax.swing.JLabel;
 import javax.swing.JRadioButton;
 import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.event.DocumentEvent;
@@ -55,6 +56,7 @@
 
 import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.event.BrowseActionListener;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.task.Task;
@@ -84,6 +86,9 @@
   private JTextField skipsFile;
   private JCheckBox overwriteRejectsFile;
   private JCheckBox overwriteSkipsFile;
+  private JButton bBrowse;
+  private JButton rejectsBrowse;
+  private JButton skipsBrowse;
 
   private JLabel lBackend;
   private JLabel lNoBackendsFound;
@@ -92,6 +97,9 @@
   private JLabel lSchemaValidation;
   private JLabel lRejectsFile;
   private JLabel lSkipsFile;
+  private JLabel lRemoteFileHelp;
+  private JLabel lRemoteRejectsHelp;
+  private JLabel lRemoteSkipsHelp;
 
   private DocumentListener documentListener;
 
@@ -204,7 +212,7 @@
     gbc.weightx = 1.0;
     gbc.fill = GridBagConstraints.HORIZONTAL;
     add(file, gbc);
-    JButton bBrowse = Utilities.createButton(
+    bBrowse = Utilities.createButton(
         INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get());
     bBrowse.addActionListener(
         new BrowseActionListener(file,
@@ -214,6 +222,16 @@
     gbc.weightx = 0.0;
     bBrowse.setOpaque(false);
     add(bBrowse, gbc);
+
+    lRemoteFileHelp = Utilities.createInlineHelpLabel(
+        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    gbc.gridx = 1;
+    gbc.gridwidth = 2;
+    gbc.insets.top = 3;
+    gbc.insets.left = 10;
+    gbc.gridy ++;
+    add(lRemoteFileHelp, gbc);
+
     gbc.gridx = 1;
     gbc.gridy ++;
     gbc.insets.left = 30;
@@ -310,7 +328,7 @@
     gbc.weightx = 1.0;
     gbc.fill = GridBagConstraints.HORIZONTAL;
     add(rejectsFile, gbc);
-    final JButton rejectsBrowse =
+    rejectsBrowse =
       Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get());
     rejectsBrowse.addActionListener(
         new BrowseActionListener(rejectsFile,
@@ -321,6 +339,16 @@
     gbc.insets.left = 10;
     rejectsBrowse.setOpaque(false);
     add(rejectsBrowse, gbc);
+
+    lRemoteRejectsHelp = Utilities.createInlineHelpLabel(
+        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    gbc.gridx = 1;
+    gbc.gridwidth = 2;
+    gbc.insets.top = 3;
+    gbc.insets.left = 10;
+    gbc.gridy ++;
+    add(lRemoteRejectsHelp, gbc);
+
     gbc.gridx = 1;
     gbc.gridy ++;
     gbc.insets.left = 30;
@@ -370,7 +398,7 @@
     gbc.weightx = 1.0;
     gbc.fill = GridBagConstraints.HORIZONTAL;
     add(skipsFile, gbc);
-    final JButton skipsBrowse =
+    skipsBrowse =
       Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get());
     skipsBrowse.addActionListener(
         new BrowseActionListener(skipsFile,
@@ -382,6 +410,15 @@
     skipsBrowse.setOpaque(false);
     add(skipsBrowse, gbc);
 
+    lRemoteSkipsHelp = Utilities.createInlineHelpLabel(
+        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    gbc.gridx = 1;
+    gbc.gridwidth = 2;
+    gbc.insets.top = 3;
+    gbc.insets.left = 10;
+    gbc.gridy ++;
+    add(lRemoteSkipsHelp, gbc);
+
     gbc.gridx = 1;
     gbc.gridy ++;
     gbc.insets.left = 30;
@@ -446,10 +483,23 @@
    */
   public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    updateSimpleBackendComboBoxModel(backends, lNoBackendsFound,
-        ev.getNewDescriptor());
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_IMPORT.get());
+    ServerDescriptor desc = ev.getNewDescriptor();
+    updateSimpleBackendComboBoxModel(backends, lNoBackendsFound, desc);
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+      isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_IMPORT.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      public void run()
+      {
+        lRemoteFileHelp.setVisible(!isLocal());
+        bBrowse.setVisible(isLocal());
+        rejectsBrowse.setVisible(isLocal());
+        skipsBrowse.setVisible(isLocal());
+        lRemoteRejectsHelp.setVisible(!isLocal());
+        lRemoteSkipsHelp.setVisible(!isLocal());
+      }
+    });
   }
 
   /**
@@ -483,7 +533,7 @@
     {
       errors.add(INFO_NO_LDIF_PATH.get());
       setPrimaryInvalid(lFile);
-    } else if (!Utils.fileExists(ldifPath))
+    } else if (isLocal() && !Utils.fileExists(ldifPath))
     {
       errors.add(INFO_LDIF_FILE_DOES_NOT_EXIST.get());
       setPrimaryInvalid(lFile);
@@ -622,7 +672,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend.
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/IndexPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/IndexPanel.java
index b3d86b7..11bef95 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/IndexPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/IndexPanel.java
@@ -60,6 +60,7 @@
 import org.opends.guitools.controlpanel.datamodel.AbstractIndexDescriptor;
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
 import org.opends.guitools.controlpanel.datamodel.IndexDescriptor;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
 import org.opends.guitools.controlpanel.event.ScrollPaneBorderListener;
 import org.opends.guitools.controlpanel.task.DeleteIndexTask;
@@ -249,10 +250,13 @@
   /**
    * {@inheritDoc}
    */
-  public void configurationChanged(final ConfigurationChangeEvent ev)
+  public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    updateErrorPaneIfAuthRequired(ev.getNewDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_INDEX_EDITING.get());
+    final ServerDescriptor desc = ev.getNewDescriptor();
+    updateErrorPaneIfAuthRequired(desc,
+        isLocal() ?
+            INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_INDEX_EDITING.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     SwingUtilities.invokeLater(new Runnable()
     {
       /**
@@ -261,7 +265,7 @@
       public void run()
       {
         checkSaveButton();
-        deleteIndex.setEnabled(!authenticationRequired(ev.getNewDescriptor()));
+        deleteIndex.setEnabled(!authenticationRequired(desc));
       }
     });
   }
@@ -581,7 +585,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java
index 5b3c28c..090ecff 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java
@@ -155,7 +155,9 @@
   private boolean readUseOpenDSJavaHome;
   private boolean readUseOpenDSJavaArgs;
 
-  private boolean firstDisplay = true;
+  private boolean initialized = false;
+
+  private boolean previousLocal = true;
 
   private Message READING_JAVA_SETTINGS =
     INFO_CTRL_PANEL_READING_JAVA_SETTINGS_SUMMARY.get();
@@ -240,7 +242,6 @@
     gbc.insets.left = 0;
     add(useOpenDSJavaHomeLabel, gbc);
 
-
     gbc.gridx = 1;
     gbc.gridy ++;
     gbc.fill = GridBagConstraints.HORIZONTAL;
@@ -416,7 +417,7 @@
 
     comps = new JComponent[] {
         javaHome, useOpenDSJavaHome, useSpecifiedJavaHome, browse,
-        useOpenDSJavaArgs, useSpecifiedJavaArgs
+        useOpenDSJavaArgs, useSpecifiedJavaArgs, showAll
     };
   }
 
@@ -425,6 +426,31 @@
    */
   public void configurationChanged(ConfigurationChangeEvent ev)
   {
+    final boolean isLocal = ev.getNewDescriptor().isLocal();
+    if (isLocal != previousLocal)
+    {
+      previousLocal = isLocal;
+      SwingUtilities.invokeLater(new Runnable()
+      {
+        /**
+         * {@inheritDoc}
+         */
+        public void run()
+        {
+          if (!isLocal)
+          {
+            displayErrorMessage(INFO_CTRL_PANEL_SERVER_REMOTE_SUMMARY.get(),
+            INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_JAVA_PROPERTIES_SUMMARY.get());
+            setEnabledOK(false);
+          }
+          else
+          {
+            displayMainPanel();
+            setEnabledOK(true);
+          }
+        }
+      });
+    }
   }
 
   /**
@@ -433,9 +459,14 @@
   @Override
   public void toBeDisplayed(boolean visible)
   {
-    if (visible && (firstDisplay || !updatedByUser()))
+    boolean isLocal = true;
+    if (getInfo() != null)
     {
-      firstDisplay = false;
+      isLocal = getInfo().getServerDescriptor().isLocal();
+    }
+    if (visible && isLocal && (!initialized || !updatedByUser()))
+    {
+      initialized = true;
       initContents();
     }
   }
@@ -1376,7 +1407,7 @@
       boolean canLaunch = true;
       if (!isServerRunning())
       {
-        if (state == State.RUNNING)
+        if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
         {
           // All the operations are incompatible if they apply to this
           // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
new file mode 100644
index 0000000..b75f70c
--- /dev/null
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
@@ -0,0 +1,881 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2009 Sun Microsystems, Inc.
+ */
+
+package org.opends.guitools.controlpanel.ui;
+
+import static org.opends.messages.AdminToolMessages.*;
+import static org.opends.messages.QuickSetupMessages.*;
+
+import java.awt.Component;
+import java.awt.GridBagConstraints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.InitialLdapContext;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPasswordField;
+import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
+
+import org.opends.admin.ads.util.ApplicationTrustManager;
+import org.opends.admin.ads.util.ConnectionUtils;
+import org.opends.guitools.controlpanel.datamodel.ConfigReadException;
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
+import org.opends.guitools.controlpanel.task.OnlineUpdateException;
+import org.opends.guitools.controlpanel.util.BackgroundTask;
+import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.messages.Message;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.UserDataCertificateException;
+import org.opends.quicksetup.ui.CertificateDialog;
+import org.opends.quicksetup.util.UIKeyStore;
+import org.opends.quicksetup.util.Utils;
+import org.opends.server.monitors.VersionMonitorProvider;
+import org.opends.server.types.DN;
+import org.opends.server.types.OpenDsException;
+import org.opends.server.util.DynamicConstants;
+
+/**
+ * The panel that appears when the user is asked to provide authentication.
+ *
+ */
+public class LocalOrRemotePanel extends StatusGenericPanel
+{
+  private static final long serialVersionUID = 5051556513294844797L;
+
+  private JComboBox combo;
+  private JLabel portLabel;
+  private JTextField hostName;
+  private JTextField port;
+  private JPasswordField pwd;
+  private JTextField dn;
+  private JLabel pwdLabel;
+  private JLabel dnLabel;
+  private String usedUrl;
+  private JLabel localInstallLabel;
+  private JLabel localInstall;
+
+  private JLabel localNotRunning;
+
+  private boolean isLocalServerRunning;
+
+  private static final Logger LOG =
+    Logger.getLogger(LocalOrRemotePanel.class.getName());
+
+  /**
+   * Default constructor.
+   *
+   */
+  public LocalOrRemotePanel()
+  {
+    super();
+    createLayout();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public Message getTitle()
+  {
+    return INFO_CTRL_PANEL_LOCAL_OR_REMOTE_PANEL_TITLE.get();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public GenericDialog.ButtonType getButtonType()
+  {
+    return GenericDialog.ButtonType.OK_CANCEL;
+  }
+
+  /**
+   * Creates the layout of the panel (but the contents are not populated here).
+   */
+  private void createLayout()
+  {
+    GridBagConstraints gbc = new GridBagConstraints();
+
+    gbc.anchor = GridBagConstraints.WEST;
+    gbc.gridx = 0;
+    gbc.gridy = 0;
+
+    gbc.weightx = 0.0;
+    gbc.weighty = 0.0;
+    String localServerInstallPath;
+    File instancePath = Installation.getLocal().getInstanceDirectory();
+    try
+    {
+      localServerInstallPath = instancePath.getCanonicalPath();
+    }
+    catch (IOException ioe)
+    {
+      localServerInstallPath = instancePath.getAbsolutePath();
+    }
+    combo = Utilities.createComboBox();
+    combo.setModel(new DefaultComboBoxModel(
+        new Object[] {INFO_CTRL_PANEL_LOCAL_SERVER.get(),
+            INFO_CTRL_PANEL_REMOTE_SERVER.get()}));
+    combo.setSelectedIndex(0);
+    gbc.gridwidth = 2;
+    add(Utilities.createDefaultLabel(INFO_CTRL_PANEL_LOCAL_OR_REMOTE.get()),
+        gbc);
+    gbc.gridwidth = 1;
+    gbc.insets.top = 10;
+    gbc.gridy ++;
+    add(combo, gbc);
+    gbc.gridx = 1;
+
+    localNotRunning = Utilities.createDefaultLabel();
+    Utilities.setWarningLabel(localNotRunning,
+        INFO_CTRL_PANEL_LOCAL_SERVER_NOT_RUNNING.get());
+    gbc.insets.left = 10;
+    add(localNotRunning, gbc);
+    hostName = Utilities.createMediumTextField();
+    add(hostName, gbc);
+    gbc.insets.top = 10;
+    gbc.gridy ++;
+    gbc.insets.left = 0;
+    gbc.weightx = 0.0;
+    gbc.insets.right = 0;
+    gbc.gridx = 0;
+
+    ActionListener actionListener = new ActionListener()
+    {
+      public void actionPerformed(ActionEvent ev)
+      {
+        updateComponentState();
+      }
+    };
+    combo.addActionListener(actionListener);
+
+    gbc.gridx = 0;
+    gbc.gridwidth = 1;
+
+
+    localInstallLabel = Utilities.createPrimaryLabel(
+        INFO_CTRL_PANEL_INSTANCE_PATH_LABEL.get());
+    gbc.insets.left = 0;
+    add(localInstallLabel, gbc);
+    gbc.gridx = 1;
+    gbc.insets.left = 10;
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    localInstall = Utilities.createDefaultLabel();
+    localInstall.setText(localServerInstallPath);
+    add(localInstall, gbc);
+
+    gbc.gridy ++;
+    gbc.insets.top = 10;
+    gbc.insets.left = 0;
+    gbc.gridx = 0;
+    gbc.weightx = 0.0;
+    portLabel = Utilities.createPrimaryLabel(
+        INFO_CTRL_PANEL_ADMINISTRATION_PORT.get());
+    add(portLabel, gbc);
+    gbc.gridx = 1;
+    gbc.insets.left = 10;
+    port = Utilities.createMediumTextField();
+    port.setText("4444");
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    add(port, gbc);
+
+    gbc.gridy ++;
+    gbc.gridx = 0;
+    gbc.weightx = 0.0;
+    gbc.fill = GridBagConstraints.NONE;
+    gbc.insets.left = 0;
+    dnLabel = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_BIND_DN_LABEL.get());
+    add(dnLabel, gbc);
+    gbc.insets.left = 10;
+    gbc.gridx = 1;
+    dn = Utilities.createTextField("cn=Directory Manager", 20);
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.insets.left = 10;
+    add(dn, gbc);
+    gbc.insets.top = 10;
+    gbc.insets.left = 0;
+
+    gbc.gridx = 0;
+    gbc.gridy ++;
+    gbc.weightx = 0.0;
+    gbc.fill = GridBagConstraints.NONE;
+    pwdLabel = Utilities.createPrimaryLabel(
+        INFO_CTRL_PANEL_BIND_PASSWORD_LABEL.get());
+    gbc.insets.left = 0;
+    add(pwdLabel, gbc);
+    gbc.insets.left = 10;
+    gbc.gridx = 1;
+    pwd = Utilities.createPasswordField();
+    gbc.weightx = 1.0;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    add(pwd, gbc);
+
+    addBottomGlue(gbc);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public Component getPreferredFocusComponent()
+  {
+    return pwd;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void configurationChanged(ConfigurationChangeEvent ev)
+  {
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void toBeDisplayed(boolean visible)
+  {
+    super.toBeDisplayed(visible);
+    if (visible)
+    {
+      // Do it outside the event thread if the panel requires it.
+      BackgroundTask<Void> worker = new BackgroundTask<Void>()
+      {
+        public Void processBackgroundTask() throws Throwable
+        {
+          try
+          {
+            Thread.sleep(200);
+          }
+          catch (Throwable t)
+          {
+          }
+          File instancePath = Installation.getLocal().getInstanceDirectory();
+          isLocalServerRunning = Utilities.isServerRunning(instancePath);
+          return null;
+        }
+
+
+        public void backgroundTaskCompleted(Void returnValue,
+            Throwable t)
+        {
+          updateComponentState();
+          displayMainPanel();
+        }
+      };
+      displayMessage(INFO_CTRL_PANEL_LOADING_PANEL_SUMMARY.get());
+      worker.startBackgroundTask();
+      pwd.setText("");
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void okClicked()
+  {
+    setPrimaryValid(portLabel);
+    setPrimaryValid(dnLabel);
+    setPrimaryValid(pwdLabel);
+    final LinkedHashSet<Message> errors = new LinkedHashSet<Message>();
+
+    boolean dnInvalid = false;
+    boolean pwdInvalid = false;
+
+    final boolean isLocal = combo.getSelectedIndex() == 0;
+
+    boolean doChecks = !isLocal || isLocalServerRunning;
+    if (doChecks)
+    {
+      if ("".equals(dn.getText().trim()))
+      {
+        dnInvalid = true;
+        errors.add(INFO_EMPTY_DIRECTORY_MANAGER_DN.get());
+      }
+      else if (!Utils.isDn(dn.getText()))
+      {
+        dnInvalid = true;
+        errors.add(INFO_NOT_A_DIRECTORY_MANAGER_DN.get());
+      }
+
+      if ("".equals(pwd.getPassword().length == 0))
+      {
+        pwdInvalid = true;
+        errors.add(INFO_EMPTY_PWD.get());
+      }
+      if (dnInvalid)
+      {
+        setPrimaryInvalid(dnLabel);
+      }
+
+      if (pwdInvalid)
+      {
+        setPrimaryInvalid(pwdLabel);
+      }
+
+      if (!isLocal)
+      {
+        if ("".equals(hostName.getText().trim()))
+        {
+          errors.add(INFO_EMPTY_REMOTE_HOST_NAME.get());
+        }
+
+        try
+        {
+          int p = Integer.parseInt(port.getText());
+          if ((p <= 0) || (p > 65535))
+          {
+            errors.add(INFO_INVALID_REMOTE_SERVER_PORT.get(0, 65535));
+          }
+        }
+        catch (Throwable t)
+        {
+          errors.add(INFO_INVALID_REMOTE_SERVER_PORT.get(0, 65535));
+        }
+      }
+    }
+
+    if (errors.isEmpty())
+    {
+      setEnabledOK(false);
+      displayMessage(INFO_CTRL_PANEL_VERIFYING_AUTHENTICATION_SUMMARY.get());
+
+      BackgroundTask<InitialLdapContext> worker =
+        new BackgroundTask<InitialLdapContext>()
+      {
+        /**
+         * {@inheritDoc}
+         */
+        public InitialLdapContext processBackgroundTask() throws Throwable
+        {
+          getInfo().stopPooling();
+          if (isLocal)
+          {
+            // At least load the local information.
+            SwingUtilities.invokeLater(new Runnable()
+            {
+              public void run()
+              {
+                displayMessage(
+                    INFO_CTRL_PANEL_READING_CONFIGURATION_SUMMARY.get());
+              }
+            });
+            if (getInfo().isLocal() != isLocal)
+            {
+              closeInfoConnections();
+            }
+            getInfo().setIsLocal(isLocal);
+            getInfo().regenerateDescriptor();
+            if (!isLocalServerRunning)
+            {
+              return null;
+            }
+          }
+          InitialLdapContext ctx = null;
+          try
+          {
+            if (isLocal)
+            {
+              usedUrl = getInfo().getAdminConnectorURL();
+              ctx = Utilities.getAdminDirContext(getInfo(), dn.getText(),
+                  String.valueOf(pwd.getPassword()));
+            }
+            else
+            {
+              usedUrl =
+                "ldaps://"+hostName.getText().trim()+":"+port.getText().trim();
+              ctx = Utils.createLdapsContext(usedUrl, dn.getText(),
+                  String.valueOf(pwd.getPassword()),
+                  Utils.getDefaultLDAPTimeout(), null,
+                  getInfo().getTrustManager());
+              checkVersion(ctx);
+            }
+
+            try
+            {
+              Thread.sleep(500);
+            }
+            catch (Throwable t)
+            {
+            }
+            SwingUtilities.invokeLater(new Runnable()
+            {
+              public void run()
+              {
+                displayMessage(
+                    INFO_CTRL_PANEL_READING_CONFIGURATION_SUMMARY.get());
+              }
+            });
+            closeInfoConnections();
+            getInfo().setIsLocal(isLocal);
+            getInfo().setDirContext(ctx);
+            getInfo().setUserDataDirContext(null);
+            getInfo().regenerateDescriptor();
+            return ctx;
+          } catch (Throwable t)
+          {
+            if (ctx != null)
+            {
+              try
+              {
+                ctx.close();
+              }
+              catch (Throwable t1)
+              {
+              }
+            }
+            throw t;
+          }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void backgroundTaskCompleted(InitialLdapContext ctx,
+            Throwable throwable)
+        {
+          boolean handleCertificateException = false;
+
+          boolean localServerErrorConnecting = false;
+
+          if (throwable != null)
+          {
+            LOG.log(Level.INFO, "Error connecting: " + throwable, throwable);
+
+            if (isVersionException(throwable))
+            {
+              errors.add(((OpenDsException)throwable).getMessageObject());
+            }
+            else if (Utils.isCertificateException(throwable))
+            {
+              ApplicationTrustManager.Cause cause =
+                getInfo().getTrustManager().getLastRefusedCause();
+
+              LOG.log(Level.INFO, "Certificate exception cause: "+cause);
+              UserDataCertificateException.Type excType = null;
+              if (cause == ApplicationTrustManager.Cause.NOT_TRUSTED)
+              {
+                excType = UserDataCertificateException.Type.NOT_TRUSTED;
+              }
+              else if (cause ==
+                ApplicationTrustManager.Cause.HOST_NAME_MISMATCH)
+              {
+                excType = UserDataCertificateException.Type.HOST_NAME_MISMATCH;
+              }
+              else
+              {
+                Message msg = Utils.getThrowableMsg(
+                    INFO_ERROR_CONNECTING_TO_LOCAL.get(), throwable);
+                errors.add(msg);
+              }
+
+              if (excType != null)
+              {
+                String h;
+                int p;
+                try
+                {
+                  URI uri = new URI(usedUrl);
+                  h = uri.getHost();
+                  p = uri.getPort();
+                }
+                catch (Throwable t)
+                {
+                  LOG.log(Level.WARNING,
+                      "Error parsing ldap url of ldap url.", t);
+                  h = INFO_NOT_AVAILABLE_LABEL.get().toString();
+                  p = -1;
+                }
+                UserDataCertificateException udce =
+                  new UserDataCertificateException(null,
+                      INFO_CERTIFICATE_EXCEPTION.get(h, String.valueOf(p)),
+                      throwable, h, p,
+                      getInfo().getTrustManager().getLastRefusedChain(),
+                      getInfo().getTrustManager().getLastRefusedAuthType(),
+                      excType);
+
+                handleCertificateException(udce);
+                handleCertificateException = true;
+              }
+            }
+            else if (throwable instanceof NamingException)
+            {
+              boolean found = false;
+              String providedDn = dn.getText();
+              if (isLocal)
+              {
+                Iterator<DN> it = getInfo().getServerDescriptor().
+                getAdministrativeUsers().iterator();
+                while (it.hasNext() && !found)
+                {
+                  found = Utils.areDnsEqual(providedDn, it.next().toString());
+                }
+                if (!found)
+                {
+                  errors.add(INFO_NOT_A_DIRECTORY_MANAGER_IN_CONFIG.get());
+                }
+                else
+                {
+                  errors.add(ERR_CANNOT_CONNECT_TO_LOGIN_WITHOUT_CAUSE.get());
+                }
+                localServerErrorConnecting = true;
+              }
+              else
+              {
+                String msg = throwable.toString();
+                errors.add(ERR_CANNOT_CONNECT_TO_REMOTE.get(
+                    hostName.getText().trim(),
+                    port.getText().trim(),
+                    msg));
+                setPrimaryInvalid(portLabel);
+              }
+              setPrimaryInvalid(dnLabel);
+              setPrimaryInvalid(pwdLabel);
+            }
+            else if (throwable instanceof ConfigReadException)
+            {
+              LOG.log(Level.WARNING,
+                  "Error reading configuration: "+throwable, throwable);
+              errors.add(((ConfigReadException)throwable).getMessageObject());
+            }
+            else
+            {
+              // This is a bug
+              LOG.log(Level.SEVERE,
+                  "Unexpected error: "+throwable, throwable);
+              errors.add(Utils.getThrowableMsg(INFO_BUG_MSG.get(), throwable));
+            }
+          }
+          displayMainPanel();
+          setEnabledOK(true);
+          if (!errors.isEmpty())
+          {
+            if (!localServerErrorConnecting)
+            {
+              displayErrorDialog(errors);
+            }
+            else
+            {
+              ArrayList<String> stringErrors = new ArrayList<String>();
+              for (Message err : errors)
+              {
+                stringErrors.add(err.toString());
+              }
+              String msg = Utilities.getStringFromCollection(stringErrors,
+                  "<br>");
+              if (displayConfirmationDialog(
+                  INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(),
+                  INFO_CTRL_PANEL_ERROR_CONNECTING_TO_LOCAL.get(msg)))
+              {
+                Utilities.getParentDialog(
+                    LocalOrRemotePanel.this).setVisible(false);
+              }
+            }
+            pwd.setSelectionStart(0);
+            pwd.setSelectionEnd(pwd.getPassword().length);
+            pwd.requestFocusInWindow();
+          }
+          else if (!handleCertificateException)
+          {
+            Utilities.getParentDialog(
+                LocalOrRemotePanel.this).setVisible(false);
+          }
+
+          if (!handleCertificateException)
+          {
+            startPooling();
+          }
+        }
+      };
+      worker.startBackgroundTask();
+    }
+    else
+    {
+      displayErrorDialog(errors);
+      if (dnInvalid)
+      {
+        dn.setSelectionStart(0);
+        dn.setSelectionEnd(dn.getText().length());
+        dn.requestFocusInWindow();
+      }
+      if (pwdInvalid)
+      {
+        pwd.setSelectionStart(0);
+        pwd.setSelectionEnd(pwd.getPassword().length);
+        pwd.requestFocusInWindow();
+      }
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void cancelClicked()
+  {
+    setPrimaryValid(dnLabel);
+    setPrimaryValid(pwdLabel);
+    setPrimaryValid(portLabel);
+    pwd.setText(null);
+    super.cancelClicked();
+  }
+
+  /**
+   * Displays a dialog asking the user to accept a certificate if the user
+   * accepts it, we update the trust manager and simulate a click on "OK" to
+   * re-check the authentication.
+   * This method assumes that we are being called from the event thread.
+   */
+  private void handleCertificateException(UserDataCertificateException ce)
+  {
+    CertificateDialog dlg = new CertificateDialog(null, ce);
+    dlg.pack();
+    Utilities.centerGoldenMean(dlg, Utilities.getParentDialog(this));
+    dlg.setVisible(true);
+    if (dlg.getUserAnswer() !=
+      CertificateDialog.ReturnType.NOT_ACCEPTED)
+    {
+      X509Certificate[] chain = ce.getChain();
+      String authType = ce.getAuthType();
+      String host = ce.getHost();
+
+      if ((chain != null) && (authType != null) && (host != null))
+      {
+        LOG.log(Level.INFO, "Accepting certificate presented by host "+host);
+        getInfo().getTrustManager().acceptCertificate(chain, authType, host);
+        /* Simulate a click on the OK by calling in the okClicked method. */
+        SwingUtilities.invokeLater(new Runnable()
+        {
+          public void run()
+          {
+            okClicked();
+          }
+        });
+      }
+      else
+      {
+        if (chain == null)
+        {
+          LOG.log(Level.WARNING,
+              "The chain is null for the UserDataCertificateException");
+        }
+        if (authType == null)
+        {
+          LOG.log(Level.WARNING,
+              "The auth type is null for the UserDataCertificateException");
+        }
+        if (host == null)
+        {
+          LOG.log(Level.WARNING,
+              "The host is null for the UserDataCertificateException");
+        }
+      }
+    }
+    if (dlg.getUserAnswer() ==
+      CertificateDialog.ReturnType.ACCEPTED_PERMANENTLY)
+    {
+      X509Certificate[] chain = ce.getChain();
+      if (chain != null)
+      {
+        try
+        {
+          UIKeyStore.acceptCertificate(chain);
+        }
+        catch (Throwable t)
+        {
+          LOG.log(Level.WARNING, "Error accepting certificate: "+t, t);
+        }
+      }
+    }
+  }
+
+  private void updateComponentState()
+  {
+    boolean isLocal = combo.getSelectedIndex() == 0;
+    hostName.setVisible(!isLocal);
+    port.setVisible(!isLocal);
+    portLabel.setVisible(!isLocal);
+    localInstall.setVisible(isLocal);
+    localInstallLabel.setVisible(isLocal);
+
+    boolean displayAuthentication = !isLocal || isLocalServerRunning;
+    dn.setVisible(displayAuthentication);
+    dnLabel.setVisible(displayAuthentication);
+    pwd.setVisible(displayAuthentication);
+    pwdLabel.setVisible(displayAuthentication);
+
+    localNotRunning.setVisible(isLocal && !isLocalServerRunning);
+  }
+
+  private void startPooling()
+  {
+    // The server descriptor has been already retrieved.
+    // startPooling tries to retrieve immediately the server descriptor, so
+    // sleep the pooling period before calling it.
+    Thread t = new Thread(new Runnable()
+    {
+      public void run()
+      {
+        try
+        {
+          Thread.sleep(getInfo().getPoolingPeriod());
+        }
+        catch (Throwable t)
+        {
+        }
+        getInfo().startPooling();
+      }
+    });
+    t.start();
+  }
+
+  private void checkVersion(InitialLdapContext ctx) throws OpenDsException
+  {
+    Message msg = null;
+    try
+    {
+      /*
+       * Search for the version on the remote server.
+       */
+      SearchControls searchControls = new SearchControls();
+      searchControls.setCountLimit(1);
+      searchControls.setSearchScope(
+      SearchControls.OBJECT_SCOPE);
+      searchControls.setReturningAttributes(
+      new String[] {
+          VersionMonitorProvider.ATTR_PRODUCT_NAME,
+          VersionMonitorProvider.ATTR_MAJOR_VERSION,
+          VersionMonitorProvider.ATTR_POINT_VERSION,
+          VersionMonitorProvider.ATTR_MINOR_VERSION
+          });
+      NamingEnumeration<SearchResult> en =
+        ctx.search("cn=Version,cn=monitor", "objectclass=*",
+          searchControls);
+      SearchResult sr = en.next();
+      CustomSearchResult csr =
+        new CustomSearchResult(sr, "cn=Version,cn=monitor");
+
+      String hostName = ConnectionUtils.getHostName(ctx);
+
+      String productName = String.valueOf(Utilities.getFirstMonitoringValue(csr,
+          VersionMonitorProvider.ATTR_PRODUCT_NAME));
+      String major = String.valueOf(Utilities.getFirstMonitoringValue(csr,
+          VersionMonitorProvider.ATTR_MAJOR_VERSION));
+      String point = String.valueOf(Utilities.getFirstMonitoringValue(csr,
+          VersionMonitorProvider.ATTR_POINT_VERSION));
+      String minor = String.valueOf(Utilities.getFirstMonitoringValue(csr,
+          VersionMonitorProvider.ATTR_MINOR_VERSION));
+      // Be strict, control panel is only compatible with exactly the same
+      // version.
+      if (!productName.equalsIgnoreCase(DynamicConstants.PRODUCT_NAME))
+      {
+        msg = ERR_NOT_SAME_PRODUCT_IN_REMOTE_SERVER_NOT_FOUND.get(hostName,
+            productName, DynamicConstants.PRODUCT_NAME);
+      }
+      else
+      {
+        if (!String.valueOf(DynamicConstants.MAJOR_VERSION).equals(major) ||
+            !String.valueOf(DynamicConstants.MINOR_VERSION).equals(minor) ||
+            !String.valueOf(DynamicConstants.POINT_VERSION).equals(point))
+        {
+          msg = ERR_INCOMPATIBLE_VERSION_IN_REMOTE_SERVER.get(hostName,
+              major, minor, point, DynamicConstants.MAJOR_VERSION,
+              DynamicConstants.MINOR_VERSION, DynamicConstants.POINT_VERSION);
+        }
+      }
+    }
+    catch (Throwable t)
+    {
+      msg = ERR_VERSION_IN_REMOTE_SERVER_NOT_FOUND.get();
+    }
+    if (msg != null)
+    {
+      throw new OnlineUpdateException(msg, null);
+    }
+  }
+
+  private boolean isVersionException(Throwable t)
+  {
+    boolean isVersionException = false;
+    if (t instanceof OpenDsException)
+    {
+      OpenDsException oe = (OpenDsException)t;
+      if (oe.getMessageObject() != null)
+      {
+        if (oe.getMessageObject().getDescriptor().equals
+            (ERR_INCOMPATIBLE_VERSION_IN_REMOTE_SERVER) ||
+            oe.getMessageObject().getDescriptor().equals
+            (ERR_VERSION_IN_REMOTE_SERVER_NOT_FOUND) ||
+            oe.getMessageObject().getDescriptor().equals
+            (ERR_NOT_SAME_PRODUCT_IN_REMOTE_SERVER_NOT_FOUND))
+        {
+          isVersionException = true;
+        }
+      }
+    }
+    return isVersionException;
+  }
+
+  private void closeInfoConnections()
+  {
+    if (getInfo().getDirContext() != null)
+    {
+      try
+      {
+        getInfo().getDirContext().close();
+      }
+      catch (Throwable t)
+      {
+      }
+    }
+    if (getInfo().getUserDataDirContext() != null)
+    {
+      try
+      {
+        getInfo().getUserDataDirContext().close();
+      }
+      catch (Throwable t)
+      {
+      }
+    }
+  }
+}
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainMenuBar.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainMenuBar.java
index 70ad84c..57757e0 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainMenuBar.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/MainMenuBar.java
@@ -79,29 +79,7 @@
    */
   protected void addMenus()
   {
-    JMenu menu;
-    JMenuItem menuItem;
-
-    if (!Utilities.isMacOS())
-    {
-      menu = Utilities.createMenu(INFO_CTRL_PANEL_FILE_MENU.get(),
-          INFO_CTRL_PANEL_FILE_MENU_DESCRIPTION.get());
-      menu.setMnemonic(KeyEvent.VK_F);
-      menuItem = Utilities.createMenuItem(INFO_CTRL_PANEL_EXIT_MENU.get());
-      menuItem.addActionListener(new ActionListener()
-      {
-        /**
-         * {@inheritDoc}
-         */
-        public void actionPerformed(ActionEvent ev)
-        {
-          quitClicked();
-        }
-      });
-      menu.add(menuItem);
-
-      add(menu);
-    }
+    add(createFileMenuBar());
     add(createViewMenuBar());
     add(createHelpMenuBar());
   }
@@ -138,7 +116,44 @@
     }
   }
 
-
+  /**
+   * Creates the File menu bar.
+   * @return the File menu bar.
+   */
+  protected JMenu createFileMenuBar()
+  {
+    JMenu menu = Utilities.createMenu(INFO_CTRL_PANEL_FILE_MENU.get(),
+        INFO_CTRL_PANEL_FILE_MENU_DESCRIPTION.get());
+    menu.setMnemonic(KeyEvent.VK_F);
+    if (!Utilities.isMacOS())
+    {
+      JMenuItem menuItem =
+        Utilities.createMenuItem(INFO_CTRL_PANEL_EXIT_MENU.get());
+      menuItem.addActionListener(new ActionListener()
+      {
+        /**
+         * {@inheritDoc}
+         */
+        public void actionPerformed(ActionEvent ev)
+        {
+          quitClicked();
+        }
+      });
+      menu.add(menuItem);
+    }
+    JMenuItem menuItem = Utilities.createMenuItem(
+        INFO_CTRL_PANEL_CONNECT_TO_SERVER_MENU.get());
+    menu.setMnemonic(KeyEvent.VK_R);
+    menuItem.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent ev)
+      {
+        connectToServerClicked();
+      }
+    });
+    menu.add(menuItem);
+    return menu;
+  }
 
   /**
    * Creates the View menu bar.
@@ -231,4 +246,38 @@
       getInfo().startPooling();
     }
   }
+
+  /**
+   * The method called when the user clicks on 'Connect to Server...'.
+   */
+  protected void connectToServerClicked()
+  {
+    Set<String> runningTasks = new HashSet<String>();
+    for (Task task : getInfo().getTasks())
+    {
+      if (task.getState() == Task.State.RUNNING)
+      {
+        runningTasks.add(task.getTaskDescription().toString());
+      }
+    }
+    boolean confirmed = true;
+    if (runningTasks.size() > 0)
+    {
+      String allTasks = Utilities.getStringFromCollection(runningTasks, "<br>");
+      Message title = INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get();
+      Message msg =
+        INFO_CTRL_PANEL_RUNNING_TASKS_CHANGE_SERVER_CONFIRMATION_DETAILS.get(
+            allTasks);
+      confirmed = Utilities.displayConfirmationDialog(
+          Utilities.getParentDialog(this), title, msg);
+    }
+    if (confirmed)
+    {
+      GenericDialog dlg =
+        ControlCenterMainPane.getLocalOrRemoteDialog(getInfo());
+      Utilities.centerGoldenMean(dlg,
+          Utilities.getFrame(MainMenuBar.this));
+      dlg.setVisible(true);
+    }
+  }
 }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java
index bdd4925..5a5b63b 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -361,7 +361,9 @@
     if (!error[0])
     {
       updateErrorPaneAndOKButtonIfAuthRequired(desc,
-     INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_TO_CREATE_ATTRIBUTE_SUMMARY.get());
+          isLocal() ?
+     INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_TO_CREATE_ATTRIBUTE_SUMMARY.get() :
+     INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     }
   }
 
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java
index ad6158d..115150d 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java
@@ -84,6 +84,7 @@
 import org.opends.guitools.controlpanel.util.ConfigReader;
 import org.opends.guitools.controlpanel.util.Utilities;
 import org.opends.messages.Message;
+import org.opends.quicksetup.Installation;
 import org.opends.quicksetup.installer.InstallerHelper;
 import org.opends.quicksetup.util.Utils;
 import org.opends.server.admin.client.ManagementContext;
@@ -98,6 +99,8 @@
 import org.opends.server.config.DNConfigAttribute;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.tools.ImportLDIF;
+import org.opends.server.tools.LDAPModify;
+import org.opends.server.tools.makeldif.MakeLDIF;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
@@ -123,6 +126,7 @@
   private JRadioButton importAutomaticallyGenerated;
   private JTextField path;
   private JTextField numberOfEntries;
+  private JLabel lRemoteFileHelp;
   private JButton browseImportPath;
 
   private JLabel lBackend;
@@ -342,6 +346,7 @@
       {
         browseImportPath.setEnabled(importDataFromLDIF.isSelected());
         lPath.setEnabled(importDataFromLDIF.isSelected());
+        lRemoteFileHelp.setEnabled(importDataFromLDIF.isSelected());
         numberOfEntries.setEnabled(importAutomaticallyGenerated.isSelected());
         lNumberOfEntries.setEnabled(importAutomaticallyGenerated.isSelected());
       }
@@ -380,8 +385,18 @@
     newElements.add(NEW_BACKEND);
     super.updateComboBoxModel(newElements,
         ((DefaultComboBoxModel)backends.getModel()));
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_CREATE_BASE_DN.get());
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+      isLocal() ?
+          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_CREATE_BASE_DN.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      public void run()
+      {
+        lRemoteFileHelp.setVisible(!isLocal());
+        browseImportPath.setVisible(isLocal());
+      }
+    });
   }
 
   private JPanel createPathPanel()
@@ -390,6 +405,8 @@
     panel.setOpaque(false);
     GridBagConstraints gbc = new GridBagConstraints();
     gbc.gridwidth = 1;
+    gbc.gridy = 0;
+    gbc.gridx = 0;
     lPath = Utilities.createDefaultLabel(
         INFO_CTRL_PANEL_IMPORT_LDIF_PATH_LABEL.get());
     panel.add(lPath, gbc);
@@ -409,6 +426,14 @@
     gbc.weightx = 0.0;
     panel.add(browseImportPath, gbc);
 
+    gbc.gridy ++;
+    gbc.gridx = 1;
+    lRemoteFileHelp = Utilities.createInlineHelpLabel(
+        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    gbc.insets.top = 3;
+    gbc.insets.left = 10;
+    panel.add(lRemoteFileHelp, gbc);
+
     return panel;
   }
 
@@ -573,7 +598,7 @@
       {
         errors.add(INFO_NO_LDIF_PATH.get());
         setSecondaryInvalid(lPath);
-      } else if (!Utils.fileExists(ldifPath))
+      } else if (isLocal() && !Utils.fileExists(ldifPath))
       {
         errors.add(INFO_LDIF_FILE_DOES_NOT_EXIST.get());
         setSecondaryInvalid(lPath);
@@ -584,7 +609,7 @@
     {
       String nEntries = numberOfEntries.getText();
       int minValue = 1;
-      int maxValue = 20000;
+      int maxValue = isLocal() ? 20000 : 1000;
       Message errMsg = ERR_NUMBER_OF_ENTRIES_INVALID.get(minValue, maxValue);
       checkIntValue(errors, nEntries, minValue, maxValue, errMsg);
     }
@@ -714,7 +739,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend.
@@ -758,7 +783,14 @@
       String cmdLineName;
       if (!leaveDatabaseEmpty.isSelected())
       {
-        cmdLineName = getCommandLinePath("import-ldif");
+        if (isLocal())
+        {
+          cmdLineName = getCommandLinePath("import-ldif");
+        }
+        else
+        {
+          cmdLineName = getCommandLinePath("ldapmodify");
+        }
       }
       else
       {
@@ -781,25 +813,33 @@
       ArrayList<String> args = new ArrayList<String>();
       if (!leaveDatabaseEmpty.isSelected())
       {
-        if (!useTemplate)
+        if (isLocal())
         {
-          args.add("--ldifFile");
-          args.add(ldifFile);
+          if (!useTemplate)
+          {
+            args.add("--ldifFile");
+            args.add(ldifFile);
+          }
+          else
+          {
+            args.add("--templateFile");
+            args.add(ldifFile);
+            args.add("--randomSeed");
+            args.add("0");
+          }
+          args.add("--backendID");
+          args.add(getBackendName());
+          args.add("--append");
         }
         else
         {
-          args.add("--templateFile");
+          args.add("-a");
+          args.add("-f");
           args.add(ldifFile);
-          args.add("--randomSeed");
-          args.add("0");
         }
-        args.add("--backendID");
-        args.add(getBackendName());
-        args.add("--append");
+        args.addAll(getConnectionCommandLineArguments(true, !isLocal()));
 
-        args.addAll(getConnectionCommandLineArguments());
-
-        if (isServerRunning())
+        if (isServerRunning() && isLocal())
         {
           args.addAll(getConfigCommandLineArguments());
         }
@@ -816,7 +856,6 @@
       {
         if (!isServerRunning())
         {
-          configHandlerUpdated = true;
           getInfo().stopPooling();
           if (getInfo().mustDeregisterConfig())
           {
@@ -826,6 +865,7 @@
                 org.opends.server.extensions.ConfigFileHandler.class.getName(),
                 ConfigReader.configFile);
           getInfo().setMustDeregisterConfig(true);
+          configHandlerUpdated = true;
         }
         else
         {
@@ -1009,14 +1049,60 @@
           {
             public void run()
             {
-               progressDialog.appendProgressHtml(Utilities.applyFont(
-                   INFO_PROGRESS_IMPORT_AUTOMATICALLY_GENERATED.get(nEntries).
-                   toString(), ColorAndFontConstants.progressFont)+"<br>");
+              if (isLocal())
+              {
+                progressDialog.appendProgressHtml(Utilities.applyFont(
+                    INFO_PROGRESS_IMPORT_AUTOMATICALLY_GENERATED.get(nEntries).
+                    toString(), ColorAndFontConstants.progressFont)+"<br>");
+              }
+              else
+              {
+                getProgressDialog().appendProgressHtml(
+                    Utilities.getProgressWithPoints(
+              INFO_PROGRESS_IMPORT_AUTOMATICALLY_GENERATED_REMOTE.get(nEntries),
+                      ColorAndFontConstants.progressFont));
+              }
             }
           });
           File f = SetupUtils.createTemplateFile(newBaseDN,
               Integer.parseInt(nEntries));
-          ldifFile = f.getAbsolutePath();
+          if (!isLocal())
+          {
+            File tempFile = File.createTempFile("opends-control-panel",
+                ".ldif");
+            tempFile.deleteOnExit();
+            ldifFile = tempFile.getAbsolutePath();
+            // Create the LDIF file locally using make-ldif
+            ArrayList<String> makeLDIFArgs = new ArrayList<String>();
+            makeLDIFArgs.add("--templateFile");
+            makeLDIFArgs.add(f.getAbsolutePath());
+            makeLDIFArgs.add("--ldifFile");
+            makeLDIFArgs.add(ldifFile);
+            makeLDIFArgs.add("--randomSeed");
+            makeLDIFArgs.add("0");
+            makeLDIFArgs.add("--resourcePath");
+            File makeLDIFPath =
+              new File(Installation.getLocal().getConfigurationDirectory(),
+                  "MakeLDIF");
+            makeLDIFArgs.add(makeLDIFPath.getAbsolutePath());
+            makeLDIFArgs.addAll(getConfigCommandLineArguments());
+            MakeLDIF makeLDIF = new MakeLDIF();
+            String[] array = new String[makeLDIFArgs.size()];
+            makeLDIFArgs.toArray(array);
+            returnCode = makeLDIF.makeLDIFMain(array, false, false,
+                outPrintStream, errorPrintStream);
+            f.delete();
+            if (returnCode != 0)
+            {
+              throw new OnlineUpdateException(
+                  ERR_CTRL_PANEL_ERROR_CREATING_NEW_DATA_LDIF.get(returnCode),
+                  null);
+            }
+          }
+          else
+          {
+            ldifFile = f.getAbsolutePath();
+          }
         }
         ArrayList<String> arguments = getDataCommandLineArguments(ldifFile,
             generateData);
@@ -1024,7 +1110,7 @@
         String[] args = new String[arguments.size()];
 
         arguments.toArray(args);
-        if (createBaseEntry)
+        if (createBaseEntry || !isLocal())
         {
           outPrintStream.setNotifyListeners(false);
           errorPrintStream.setNotifyListeners(false);
@@ -1033,8 +1119,18 @@
         {
           if (isServerRunning())
           {
-            returnCode = ImportLDIF.mainImportLDIF(args, false, outPrintStream,
+            if (isLocal() || importLDIF)
+            {
+              returnCode = ImportLDIF.mainImportLDIF(args, false,
+                  outPrintStream,
                 errorPrintStream);
+            }
+            else
+            {
+              returnCode = LDAPModify.mainModify(args,  false,
+                  outPrintStream,
+                  errorPrintStream);
+            }
           }
           else
           {
@@ -1043,7 +1139,6 @@
         }
         finally
         {
-          if (createBaseEntry)
           {
             outPrintStream.setNotifyListeners(true);
             errorPrintStream.setNotifyListeners(true);
@@ -1056,7 +1151,7 @@
         }
         else
         {
-          if (createBaseEntry)
+          if (createBaseEntry || (!isLocal() && generateData))
           {
             SwingUtilities.invokeLater(new Runnable()
             {
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewIndexPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewIndexPanel.java
index 5bc8f33..7a0749d 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewIndexPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewIndexPanel.java
@@ -269,7 +269,8 @@
     if (!error[0])
     {
       updateErrorPaneAndOKButtonIfAuthRequired(desc,
-          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_NEW_INDEX.get());
+       isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_NEW_INDEX.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     }
   }
 
@@ -448,7 +449,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java
index d62e30d..41cd46b 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -247,7 +247,9 @@
     if (!error[0])
     {
       updateErrorPaneAndOKButtonIfAuthRequired(desc,
-   INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_TO_CREATE_OBJECTCLASS_SUMMARY.get());
+          isLocal() ?
+   INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_TO_CREATE_OBJECTCLASS_SUMMARY.get() :
+     INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     }
   }
 
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewVLVIndexPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewVLVIndexPanel.java
index a44f57f..86ff4bf 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewVLVIndexPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewVLVIndexPanel.java
@@ -44,6 +44,7 @@
 
 import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.datamodel.VLVIndexDescriptor;
 import org.opends.guitools.controlpanel.datamodel.VLVSortOrder;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
@@ -91,7 +92,6 @@
   /**
    * {@inheritDoc}
    */
-  @Override
   public Message getTitle()
   {
     return INFO_CTRL_PANEL_NEW_VLV_INDEX_TITLE.get();
@@ -100,7 +100,6 @@
   /**
    * {@inheritDoc}
    */
-  @Override
   public Component getPreferredFocusComponent()
   {
     return name;
@@ -111,10 +110,12 @@
    */
   public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    if (updateLayout(ev.getNewDescriptor()))
+    ServerDescriptor desc = ev.getNewDescriptor();
+    if (updateLayout(desc))
     {
-      updateErrorPaneAndOKButtonIfAuthRequired(ev.getNewDescriptor(),
-          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_NEW_VLV.get());
+      updateErrorPaneAndOKButtonIfAuthRequired(desc,
+         isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_NEW_VLV.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     }
   }
 
@@ -131,7 +132,6 @@
   /**
    * {@inheritDoc}
    */
-  @Override
   public void okClicked()
   {
     List<Message> errors = checkErrors(true);
@@ -214,7 +214,6 @@
     /**
      * {@inheritDoc}
      */
-    @Override
     public Type getType()
     {
       return Type.NEW_INDEX;
@@ -223,7 +222,6 @@
     /**
      * {@inheritDoc}
      */
-    @Override
     public Set<String> getBackends()
     {
       return backendSet;
@@ -232,7 +230,6 @@
     /**
      * {@inheritDoc}
      */
-    @Override
     public Message getTaskDescription()
     {
       return INFO_CTRL_PANEL_NEW_VLV_INDEX_TASK_DESCRIPTION.get(
@@ -242,12 +239,11 @@
     /**
      * {@inheritDoc}
      */
-    @Override
     public boolean canLaunch(Task taskToBeLaunched,
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/RebuildIndexPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/RebuildIndexPanel.java
index 5771488..302a566 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/RebuildIndexPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/RebuildIndexPanel.java
@@ -228,7 +228,7 @@
    * Refresh the contents of the panel with the provided server descriptor.
    * @param desc the server descriptor.
    */
-  private void refreshContents(ServerDescriptor desc)
+  private void refreshContents(final ServerDescriptor desc)
   {
     updateIndexMap(desc, hmIndexes);
     updateBaseDNComboBoxModel((DefaultComboBoxModel)baseDNs.getModel(), desc);
@@ -249,7 +249,9 @@
     if (!allDisabled)
     {
       updateErrorPaneAndOKButtonIfAuthRequired(desc,
-          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_DISABLE_BACKEND.get());
+        isLocal() ?
+            INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_DISABLE_BACKEND.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
     }
     SwingUtilities.invokeLater(new Runnable()
     {
@@ -277,6 +279,17 @@
         addRemove.getSelectedList().repaint();
 
         Utilities.updateViewPositions(pos);
+        if (!desc.isLocal() && false)
+        {
+          displayErrorMessage(INFO_CTRL_PANEL_SERVER_REMOTE_SUMMARY.get(),
+          INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_REBUILD_INDEX_SUMMARY.get());
+          setEnabledOK(false);
+        }
+        else
+        {
+          displayMainPanel();
+          setEnabledOK(true);
+        }
       }
     });
   }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/RestorePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/RestorePanel.java
index 7b712ae..ff55574 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/RestorePanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/RestorePanel.java
@@ -38,6 +38,8 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import javax.swing.JLabel;
+import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -45,6 +47,7 @@
 import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
 import org.opends.guitools.controlpanel.datamodel.BackupDescriptor;
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.event.BackupCreatedEvent;
 import org.opends.guitools.controlpanel.event.BackupCreatedListener;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
@@ -62,6 +65,8 @@
 {
   private static final long serialVersionUID = -205585323128518051L;
   private ListSelectionListener listener;
+  private JLabel lBackupID;
+  private JTextField backupID;
 
   /**
    * Constructor of the panel.
@@ -140,9 +145,22 @@
    */
   public void configurationChanged(ConfigurationChangeEvent ev)
   {
+    final ServerDescriptor desc = ev.getNewDescriptor();
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      /**
+       * {@inheritDoc}
+       */
+      public void run()
+      {
+        lBackupID.setVisible(!desc.isLocal());
+        backupID.setVisible(!desc.isLocal());
+      }
+    });
     super.configurationChanged(ev);
-    updateErrorPaneAndOKButtonIfAuthRequired(getInfo().getServerDescriptor(),
-        INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_RESTORE.get());
+    updateErrorPaneAndOKButtonIfAuthRequired(desc,
+        isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_RESTORE.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
   }
 
   /**
@@ -194,6 +212,24 @@
 
     super.createLayout(gbc);
 
+    gbc.insets.top = 10;
+    gbc.gridx = 0;
+    gbc.gridy ++;
+    gbc.insets.left = 0;
+    gbc.gridwidth = 1;
+    lBackupID = Utilities.createPrimaryLabel(
+        INFO_CTRL_PANEL_BACKUP_ID_LABEL.get());
+    add(lBackupID, gbc);
+    backupID = Utilities.createMediumTextField();
+    gbc.weightx = 0.0;
+    gbc.gridx = 1;
+    gbc.insets.left = 10;
+    gbc.insets.right = 40;
+    gbc.fill = GridBagConstraints.HORIZONTAL;
+    gbc.anchor = GridBagConstraints.WEST;
+    gbc.gridwidth = 2;
+    add(backupID, gbc);
+
     listener = new ListSelectionListener()
     {
       public void valueChanged(ListSelectionEvent ev)
@@ -203,6 +239,8 @@
       }
     };
     backupList.getSelectionModel().addListSelectionListener(listener);
+
+    addBottomGlue(gbc);
   }
 
   /**
@@ -220,24 +258,44 @@
   {
     setPrimaryValid(lPath);
     setPrimaryValid(lAvailableBackups);
+    setPrimaryValid(lBackupID);
 
     final LinkedHashSet<Message> errors = new LinkedHashSet<Message>();
 
     BackupDescriptor backup = getSelectedBackup();
 
-    boolean selected = backupList.isVisible() && (backup != null);
-    if (!selected)
+    if (isLocal())
     {
-      if (backupList.getRowCount() == 0)
+      boolean selected = backupList.isVisible() && (backup != null);
+      if (!selected)
       {
+        if (backupList.getRowCount() == 0)
+        {
+          setPrimaryInvalid(lPath);
+          errors.add(ERR_CTRL_PANEL_NO_PARENT_BACKUP_TO_VERIFY.get());
+        }
+        else
+        {
+          errors.add(ERR_CTRL_PANEL_REQUIRED_BACKUP_TO_VERIFY.get());
+        }
+        setPrimaryInvalid(lAvailableBackups);
+      }
+    }
+    else
+    {
+      String parentPath = parentDirectory.getText();
+      if ((parentPath == null) || (parentPath.trim().equals("")))
+      {
+        errors.add(ERR_CTRL_PANEL_NO_BACKUP_PATH_PROVIDED.get());
         setPrimaryInvalid(lPath);
-        errors.add(ERR_CTRL_PANEL_NO_PARENT_BACKUP_TO_VERIFY.get());
       }
-      else
+
+      String id = backupID.getText();
+      if ((id == null) || (id.trim().equals("")))
       {
-        errors.add(ERR_CTRL_PANEL_REQUIRED_BACKUP_TO_VERIFY.get());
+        errors.add(ERR_CTRL_PANEL_NO_BACKUP_ID_PROVIDED.get());
+        setPrimaryInvalid(lBackupID);
       }
-      setPrimaryInvalid(lAvailableBackups);
     }
 
     if (errors.isEmpty())
@@ -312,9 +370,17 @@
     {
       super(info, dlg);
       this.verify = verify;
-      BackupDescriptor backup = getSelectedBackup();
-      dir = backup.getPath().getAbsolutePath();
-      backupID = backup.getID();
+      if (isLocal())
+      {
+        BackupDescriptor backup = getSelectedBackup();
+        dir = backup.getPath().getAbsolutePath();
+        backupID = backup.getID();
+      }
+      else
+      {
+        dir = parentDirectory.getText();
+        backupID = RestorePanel.this.backupID.getText();
+      }
       backendSet = new HashSet<String>();
       for (BackendDescriptor backend : info.getServerDescriptor().getBackends())
       {
@@ -355,7 +421,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend.
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
index dac07c2..e27537c 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
@@ -2024,7 +2024,7 @@
         }
         values.addAll(ocDesc.getAuxiliary());
         Schema schema = getInfo().getServerDescriptor().getSchema();
-        if (schema != null)
+        if ((schema != null) && (structural != null))
         {
           ObjectClass oc = schema.getObjectClass(structural.toLowerCase());
           if (oc != null)
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java
index 2e64477..25b7ca4 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardAttributePanel.java
@@ -149,13 +149,14 @@
         INFO_CTRL_PANEL_ATTRIBUTE_DESCRIPTION_LABEL.get(),
         INFO_CTRL_PANEL_ATTRIBUTE_USAGE_LABEL.get(),
         INFO_CTRL_PANEL_ATTRIBUTE_SYNTAX_LABEL.get(),
+        INFO_CTRL_PANEL_ATTRIBUTE_TYPE_LABEL.get(),
         INFO_CTRL_PANEL_ATTRIBUTE_APPROXIMATE_MATCHING_RULE_LABEL.get(),
         INFO_CTRL_PANEL_ATTRIBUTE_EQUALITY_MATCHING_RULE_LABEL.get(),
         INFO_CTRL_PANEL_ATTRIBUTE_ORDERING_MATCHING_RULE_LABEL.get(),
         INFO_CTRL_PANEL_ATTRIBUTE_SUBSTRING_MATCHING_RULE_LABEL.get()
     };
     JLabel[] values = {name, parent, oid, aliases, origin, description, usage,
-        syntax, approximate, equality, ordering, substring, type};
+        syntax, type, approximate, equality, ordering, substring};
     gbc.gridy = 0;
     gbc.gridwidth = 2;
     addErrorPane(c, gbc);
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardObjectClassPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardObjectClassPanel.java
index 7bb6650..4836d0a 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardObjectClassPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StandardObjectClassPanel.java
@@ -40,7 +40,6 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
@@ -60,7 +59,6 @@
 import org.opends.server.types.CommonSchemaElements;
 import org.opends.server.types.ObjectClass;
 import org.opends.server.types.Schema;
-import org.opends.server.util.ServerConstants;
 
 /**
  * The panel that displays a standard object class definition.
@@ -269,17 +267,7 @@
   {
     MessageBuilder returnValue = new MessageBuilder();
     String fileName = element.getSchemaFile();
-    String xOrigin = null;
-    Iterable<String> it =
-      element.getExtraProperty(ServerConstants.SCHEMA_PROPERTY_ORIGIN);
-    if (it != null)
-    {
-      Iterator<String> iterator = it.iterator();
-      if (iterator.hasNext())
-      {
-        xOrigin = iterator.next();
-      }
-    }
+    String xOrigin = Utilities.getOrigin(element);
     if (xOrigin != null)
     {
       returnValue.append(xOrigin);
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
index 06aec31..e763fb3 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
@@ -91,6 +91,7 @@
 import org.opends.messages.MessageBuilder;
 import org.opends.messages.MessageDescriptor;
 import org.opends.quicksetup.ui.CustomHTMLEditorKit;
+import org.opends.server.types.OpenDsException;
 import org.opends.server.util.ServerConstants;
 
 /**
@@ -128,9 +129,7 @@
   private boolean disposeOnClose = false;
 
   private JPanel mainPanel;
-  private JLabel message;
-
-  private GenericDialog loginDialog;
+  private JEditorPane message;
 
   /**
    * The error pane.
@@ -238,7 +237,7 @@
     mainPanel = new JPanel(new GridBagLayout());
     mainPanel.setOpaque(false);
 
-    message = Utilities.createDefaultLabel();
+    message = Utilities.makeHtmlPane("", ColorAndFontConstants.progressFont);
 
     GridBagConstraints gbc = new GridBagConstraints();
     gbc.gridx = 0;
@@ -627,10 +626,21 @@
     }
     else
     {
-      rebuildIndexes = Utilities.displayConfirmationDialog(progressDialog,
-          INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get(),
-          INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_ONLINE_DETAILS.get(
-              index.getName(), backendName, backendName));
+      if (isLocal() || true)
+      {
+        rebuildIndexes = Utilities.displayConfirmationDialog(progressDialog,
+            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get(),
+            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_ONLINE_DETAILS.get(
+                index.getName(), backendName, backendName));
+      }
+      else
+      {
+        Utilities.displayWarningDialog(progressDialog,
+            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get(),
+            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_REMOTE_DETAILS.get(
+                index.getName(), backendName));
+        rebuildIndexes = false;
+      }
     }
     if (rebuildIndexes)
     {
@@ -824,8 +834,9 @@
   {
     boolean returnValue;
     ServerDescriptor.ServerStatus status = desc.getStatus();
-    if ((status == ServerDescriptor.ServerStatus.STARTED) &&
-        !desc.isAuthenticated())
+    if (((status == ServerDescriptor.ServerStatus.STARTED) &&
+        !desc.isAuthenticated()) ||
+        (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE))
     {
       returnValue = true;
     }
@@ -896,7 +907,8 @@
       Message authRequired)
   {
     ServerDescriptor.ServerStatus status = desc.getStatus();
-    if (status != ServerDescriptor.ServerStatus.STARTED)
+    if ((status != ServerDescriptor.ServerStatus.STARTED) &&
+        (status != ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE))
     {
       Message title = INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get();
       MessageBuilder mb = new MessageBuilder();
@@ -1051,7 +1063,7 @@
         displayMessage(INFO_CTRL_PANEL_LOADING_PANEL_SUMMARY.get());
         worker.startBackgroundTask();
       }
-      else
+      else if (info.getServerDescriptor() != null)
       {
         configurationChanged(new ConfigurationChangeEvent(
           this.info, this.info.getServerDescriptor()));
@@ -1070,17 +1082,49 @@
   }
 
   /**
+   * Returns whether the main panel is visible or not.
+   * @return whether the main panel is visible or not.
+   */
+  protected boolean isMainPanelVisible()
+  {
+    return mainPanel.isVisible();
+  }
+
+  /**
    * Displays a message and hides the main panel.
    * @param msg the message to be displayed.
    */
   protected void displayMessage(Message msg)
   {
-    message.setText(msg.toString());
+    message.setText(Utilities.applyFont(msg.toString(),
+        ColorAndFontConstants.progressFont));
     mainPanel.setVisible(false);
     message.setVisible(true);
   }
 
   /**
+   * Displays an error message and hides the main panel.
+   * @param title the title of the message to be displayed.
+   * @param msg the message to be displayed.
+   */
+  protected void displayErrorMessage(Message title, Message msg)
+  {
+    updateErrorPane(message, title, ColorAndFontConstants.errorTitleFont,
+        msg, ColorAndFontConstants.defaultFont);
+    mainPanel.setVisible(false);
+    message.setVisible(true);
+  }
+
+  /**
+   * Returns whether the message is visible or not.
+   * @return whether the message is visible or not.
+   */
+  protected boolean isMessageVisible()
+  {
+    return message.isVisible();
+  }
+
+  /**
    * Updates the contents of an editor pane using the error format.
    * @param pane the editor pane to be updated.
    * @param title the title.
@@ -1156,7 +1200,7 @@
    * @param detailsFont the font to be used for the details.
    * @param type the type of panel.
    */
-  private void updatePane(JEditorPane pane, Message title,
+  private void updatePane(final JEditorPane pane, Message title,
       Font titleFont, Message details, Font detailsFont, PanelType type)
   {
     String text;
@@ -1202,11 +1246,11 @@
           ServerConstants.EOL);
       Utilities.updatePreferredSize(pane2, 100, plainText, detailsFont, true);
       Dimension d2 = pane2.getPreferredSize();
+      pane.setText(text);
       pane.setPreferredSize(new Dimension(Math.max(d1.width, d2.width),
           d1.height + d2.height));
 
       lastDisplayedError = text;
-      pane.setText(text);
     }
     final Window window =
       Utilities.getParentDialog(StatusGenericPanel.this);
@@ -1219,6 +1263,7 @@
          */
         public void run()
         {
+          pane.invalidate();
           window.validate();
         }
       });
@@ -1563,6 +1608,17 @@
   }
 
   /**
+   * Returns <CODE>true</CODE> if the managed server is the local installation
+   * (where the control panel is installed) <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if the managed server is the local installation
+   * (where the control panel is installed) <CODE>false</CODE> otherwise.
+   */
+  protected boolean isLocal()
+  {
+    return getInfo().getServerDescriptor().isLocal();
+  }
+
+  /**
    * Launch an task.
    * @param task the task to be launched.
    * @param initialSummary the initial summary to be displayed in the progress
@@ -1715,10 +1771,26 @@
             if ((task.getReturnCode() != null) &&
                 (errorDetailCode != null))
             {
+              String sThrowable;
+              if (t instanceof OpenDsException)
+              {
+                sThrowable = ((OpenDsException)t).getMessageObject().toString();
+              }
+              else
+              {
+                if (t.getMessage() != null)
+                {
+                  sThrowable = t.getMessage();
+                }
+                else
+                {
+                  sThrowable = t.toString();
+                }
+              }
               MessageBuilder mb = new MessageBuilder();
               mb.append(errorDetailCode.get(task.getReturnCode()));
               mb.append(
-                  "  "+INFO_CTRL_PANEL_DETAILS_THROWABLE.get(t.toString()));
+                  "  "+INFO_CTRL_PANEL_DETAILS_THROWABLE.get(sThrowable));
               summaryMsg = Utilities.getFormattedError(errorSummary,
                   ColorAndFontConstants.errorTitleFont,
                   mb.toMessage(), ColorAndFontConstants.defaultFont);
@@ -1943,15 +2015,22 @@
    */
   protected GenericDialog getLoginDialog()
   {
-    if (loginDialog == null)
+    if (isLocal())
     {
-      LoginPanel loginPanel = new LoginPanel();
-      loginDialog = new GenericDialog(Utilities.getFrame(this), loginPanel);
-      loginPanel.setInfo(getInfo());
+      GenericDialog loginDialog =
+        ControlCenterMainPane.getLocalServerLoginDialog(getInfo());
       Utilities.centerGoldenMean(loginDialog, Utilities.getFrame(this));
       loginDialog.setModal(true);
+      return loginDialog;
     }
-    return loginDialog;
+    else
+    {
+      GenericDialog localOrRemoteDialog =
+        ControlCenterMainPane.getLocalOrRemoteDialog(getInfo());
+      Utilities.centerGoldenMean(localOrRemoteDialog, Utilities.getFrame(this));
+      localOrRemoteDialog.setModal(true);
+      return localOrRemoteDialog;
+    }
   }
 
   /**
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java
index cc8f23c..09e1ea8 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java
@@ -266,6 +266,20 @@
               mb.toMessage(), ColorAndFontConstants.defaultFont);
         }
       }
+      else if (desc.getStatus() ==
+        ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
+      {
+        errorPaneVisible = true;
+        MessageBuilder mb = new MessageBuilder();
+        mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
+            desc.getHostname()));
+        mb.append("<br><br>"+getAuthenticateHTML());
+        Message title =
+          INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_SUMMARY.get();
+        updateErrorPane(errorPane, title,
+            ColorAndFontConstants.errorTitleFont,
+            mb.toMessage(), ColorAndFontConstants.defaultFont);
+      }
       if (errorPane.isVisible() != errorPaneVisible)
       {
         errorPane.setVisible(errorPaneVisible);
@@ -292,12 +306,20 @@
       {
         if (!desc.isAuthenticated())
         {
+          mb.append("<br>");
           mb.append(
      INFO_CTRL_PANEL_AUTH_REQUIRED_TO_BROWSE_MONITORING_SUMMARY.
      get());
           mb.append("<br><br>"+getAuthenticateHTML());
         }
       }
+      else if (desc.getStatus() == ServerDescriptor.ServerStatus.STARTED)
+      {
+        mb.append("<br>");
+        mb.append(INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(
+          desc.getHostname()));
+        mb.append("<br><br>"+getAuthenticateHTML());
+      }
       updateErrorPane(errorPane, title, ColorAndFontConstants.errorTitleFont,
           mb.toMessage(), ColorAndFontConstants.defaultFont);
 
@@ -307,20 +329,29 @@
       }
     }
 
-    serverStatus.setText(desc.getStatus().toString().toLowerCase());
+    serverStatus.setText(getStatusLabel(desc));
 
     boolean isRunning = desc.getStatus() ==
       ServerDescriptor.ServerStatus.STARTED;
     boolean isAuthenticated = desc.isAuthenticated();
+    boolean isLocal = desc.isLocal();
 
     startButton.setVisible(desc.getStatus() ==
-      ServerDescriptor.ServerStatus.STOPPED);
-    restartButton.setVisible(isRunning);
-    stopButton.setVisible(isRunning);
+      ServerDescriptor.ServerStatus.STOPPED  && isLocal);
+    restartButton.setVisible(isRunning  && isLocal);
+    stopButton.setVisible(isRunning && isLocal);
 
     if (!isRunning)
     {
-      Utilities.setNotAvailableBecauseServerIsDown(currentConnections);
+      if (isLocal)
+      {
+        Utilities.setNotAvailableBecauseServerIsDown(currentConnections);
+      }
+      else
+      {
+        Utilities.setTextValue(currentConnections,
+            INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString());
+      }
     }
     else if (!isAuthenticated)
     {
@@ -358,22 +389,50 @@
       }
     }
 
-    String htmlString = "<html>"+Utilities.applyFont(
-        Utilities.getStringFromCollection(sortedRootUsers, "<br>"),
-        administrativeUsers.getFont());
-    administrativeUsers.setText(htmlString);
-
+    if (rootUsers.size() > 0)
+    {
+      String htmlString = "<html>"+Utilities.applyFont(
+          Utilities.getStringFromCollection(sortedRootUsers, "<br>"),
+          administrativeUsers.getFont());
+      administrativeUsers.setText(htmlString);
+    }
+    else
+    {
+      administrativeUsers.setText(
+          INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString());
+    }
     File install = desc.getInstallPath();
-    installPath.setText(install.getAbsolutePath());
+    if (install != null)
+    {
+      installPath.setText(install.getAbsolutePath());
+    }
+    else
+    {
+      installPath.setText(INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString());
+    }
 
     File instance = desc.getInstancePath();
 
-    instancePath.setText(instance.getAbsolutePath());
+    if (instance != null)
+    {
+      instancePath.setText(instance.getAbsolutePath());
+    }
+    else
+    {
+      instancePath.setText(INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString());
+    }
 
     boolean sameInstallAndInstance;
     try
     {
-      sameInstallAndInstance = instance.getCanonicalFile().equals(install);
+      if (instance != null)
+      {
+        sameInstallAndInstance = instance.getCanonicalFile().equals(install);
+      }
+      else
+      {
+        sameInstallAndInstance = install == null;
+      }
     }
     catch (IOException ioe)
     {
@@ -383,11 +442,26 @@
     instancePath.setVisible(!sameInstallAndInstance);
     lInstancePath.setVisible(!sameInstallAndInstance);
 
-    opendsVersion.setText(desc.getOpenDSVersion());
+    if (desc.getOpenDSVersion() != null)
+    {
+      opendsVersion.setText(desc.getOpenDSVersion());
+    }
+    else
+    {
+      opendsVersion.setText(INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString());
+    }
 
     if (!isRunning)
     {
-      Utilities.setNotAvailableBecauseServerIsDown(javaVersion);
+      if (isLocal)
+      {
+        Utilities.setNotAvailableBecauseServerIsDown(javaVersion);
+      }
+      else
+      {
+        Utilities.setTextValue(javaVersion,
+            INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString());
+      }
     }
     else if (!isAuthenticated)
     {
@@ -642,7 +716,7 @@
       gbc.insets.left = 0;
       if (i != 0)
       {
-        gbc.insets.top = 5;
+        gbc.insets.top = 10;
       }
       gbc.gridwidth = GridBagConstraints.RELATIVE;
       auxPanel.add(leftLabels[i], gbc);
@@ -772,5 +846,40 @@
       return INFO_NOT_AVAILABLE_SHORT_LABEL.get().toString();
     }
   }
+
+  private String getStatusLabel(ServerDescriptor desc)
+  {
+    Message status;
+    switch (desc.getStatus())
+    {
+    case STARTED:
+      status = INFO_SERVER_STARTED_LABEL.get();
+      break;
+
+    case STOPPED:
+      status = INFO_SERVER_STOPPED_LABEL.get();
+      break;
+
+    case STARTING:
+      status = INFO_SERVER_STARTING_LABEL.get();
+      break;
+
+    case STOPPING:
+      status = INFO_SERVER_STOPPING_LABEL.get();
+      break;
+
+    case NOT_CONNECTED_TO_REMOTE:
+      status = INFO_SERVER_NOT_CONNECTED_TO_REMOTE_STATUS_LABEL.get();
+      break;
+
+    case UNKNOWN:
+      status = INFO_SERVER_UNKNOWN_STATUS_LABEL.get();
+      break;
+
+    default:
+      throw new IllegalStateException("Unknown status: "+desc.getStatus());
+    }
+    return status.toString();
+  }
 }
 
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/VLVIndexPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/VLVIndexPanel.java
index 87bccfc..c6f1776 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/VLVIndexPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/VLVIndexPanel.java
@@ -62,6 +62,7 @@
 import org.opends.guitools.controlpanel.datamodel.AbstractIndexDescriptor;
 import org.opends.guitools.controlpanel.datamodel.CategorizedComboBoxElement;
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
+import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.datamodel.VLVIndexDescriptor;
 import org.opends.guitools.controlpanel.datamodel.VLVSortOrder;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
@@ -142,12 +143,15 @@
   /**
    * {@inheritDoc}
    */
-  public void configurationChanged(final ConfigurationChangeEvent ev)
+  public void configurationChanged(ConfigurationChangeEvent ev)
   {
-    if (updateLayout(ev.getNewDescriptor()))
+    final ServerDescriptor desc = ev.getNewDescriptor();
+    if (updateLayout(desc))
     {
-      updateErrorPaneIfAuthRequired(ev.getNewDescriptor(),
-          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_VLV_INDEX_EDITING.get());
+      updateErrorPaneIfAuthRequired(desc,
+          isLocal() ?
+          INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_VLV_INDEX_EDITING.get() :
+      INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
       SwingUtilities.invokeLater(new Runnable()
       {
         /**
@@ -157,7 +161,7 @@
         {
           checkSaveButton();
           deleteIndex.setEnabled(
-              !authenticationRequired(ev.getNewDescriptor()));
+              !authenticationRequired(desc));
         }
       });
     }
@@ -668,7 +672,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend for safety.  This is a short operation so the limitation
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/VerifyIndexPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/VerifyIndexPanel.java
index 8b4fcb1..7e29d64 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/VerifyIndexPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/VerifyIndexPanel.java
@@ -295,7 +295,7 @@
     refreshContents(ev.getNewDescriptor());
   }
 
-  private void refreshContents(ServerDescriptor desc)
+  private void refreshContents(final ServerDescriptor desc)
   {
     updateIndexMap(desc, hmIndexes);
     updateBaseDNComboBoxModel((DefaultComboBoxModel)baseDNs.getModel(), desc);
@@ -327,6 +327,19 @@
         baseDNs.setVisible(comboVisible);
         lNoBaseDNsFound.setVisible(!comboVisible);
         Utilities.updateViewPositions(pos);
+
+
+        if (!desc.isLocal())
+        {
+          displayErrorMessage(INFO_CTRL_PANEL_SERVER_REMOTE_SUMMARY.get(),
+          INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_VERIFY_INDEX_SUMMARY.get());
+          setEnabledOK(false);
+        }
+        else
+        {
+          displayMainPanel();
+          setEnabledOK(true);
+        }
       }
     });
   }
@@ -572,7 +585,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         // All the operations are incompatible if they apply to this
         // backend.
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
index 60ba960..4478668 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -647,10 +647,13 @@
   {
     boolean isOperational = false;
     attrName = Utilities.getAttributeNameWithoutOptions(attrName);
-    AttributeType attrType = schema.getAttributeType(attrName.toLowerCase());
-    if (attrType != null)
+    if (schema != null)
     {
-      isOperational = attrType.isOperational();
+      AttributeType attrType = schema.getAttributeType(attrName.toLowerCase());
+      if (attrType != null)
+      {
+        isOperational = attrType.isOperational();
+      }
     }
     return !isOperational || isEditableOperationalAttribute(attrName);
   }
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/WindowsServicePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/WindowsServicePanel.java
index 9bd1032..57c655e 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/WindowsServicePanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/WindowsServicePanel.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui;
@@ -44,6 +44,7 @@
 import javax.swing.JButton;
 import javax.swing.JEditorPane;
 import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
 
 import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
 import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
@@ -64,6 +65,8 @@
   private JButton bEnable;
   private JButton bDisable;
 
+  private boolean previousLocal = true;
+
   private boolean isWindowsServiceEnabled;
 
   /**
@@ -193,13 +196,37 @@
   {
     boolean previousValue = isWindowsServiceEnabled;
     isWindowsServiceEnabled = ev.getNewDescriptor().isWindowsServiceEnabled();
-    if (isWindowsServiceEnabled != previousValue)
+
+    final boolean isLocal = ev.getNewDescriptor().isLocal();
+    if ((isLocal != previousLocal) ||
+        (isWindowsServiceEnabled != previousValue))
     {
-      lState.setText(isWindowsServiceEnabled ?
-          INFO_ENABLED_LABEL.get().toString() :
-            INFO_DISABLED_LABEL.get().toString());
-      bEnable.setVisible(!isWindowsServiceEnabled);
-      bDisable.setVisible(isWindowsServiceEnabled);
+      previousLocal = isLocal;
+      SwingUtilities.invokeLater(new Runnable()
+      {
+        /**
+         * {@inheritDoc}
+         */
+        public void run()
+        {
+          lState.setText(isWindowsServiceEnabled ?
+              INFO_ENABLED_LABEL.get().toString() :
+                INFO_DISABLED_LABEL.get().toString());
+          bEnable.setVisible(!isWindowsServiceEnabled);
+          bDisable.setVisible(isWindowsServiceEnabled);
+
+          if (!isLocal)
+          {
+            displayErrorMessage(INFO_CTRL_PANEL_SERVER_REMOTE_SUMMARY.get(),
+            INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_WINDOWS_SERVICE_SUMMARY.get());
+            packParentDialog();
+          }
+          else
+          {
+            displayMainPanel();
+          }
+        }
+      });
     }
   }
 
@@ -314,7 +341,7 @@
         Collection<Message> incompatibilityReasons)
     {
       boolean canLaunch = true;
-      if (state == State.RUNNING)
+      if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
       {
         if ((taskToBeLaunched.getType() == Type.ENABLE_WINDOWS_SERVICE) ||
             (taskToBeLaunched.getType() == Type.DISABLE_WINDOWS_SERVICE))
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java b/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
index 86f1513..7f6e720 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
@@ -67,6 +67,7 @@
 import org.opends.server.admin.client.ldap.LDAPManagementContext;
 import org.opends.server.admin.std.client.*;
 import org.opends.server.admin.std.meta.LocalDBIndexCfgDefn.IndexType;
+import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.DN;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.util.ServerConstants;
@@ -88,6 +89,9 @@
   private CustomSearchResult systemInformation;
   private CustomSearchResult entryCaches;
   private CustomSearchResult workQueue;
+  private CustomSearchResult versionMonitor;
+
+  private boolean isLocal = true;
 
   private Map<String, CustomSearchResult> hmConnectionHandlersMonitor =
     new HashMap<String, CustomSearchResult>();
@@ -112,6 +116,10 @@
    * The work queue monitoring entry DN.
    */
   protected DN workQueueDN = DN.nullDN();
+  /**
+   * The version monitoring entry DN.
+   */
+  protected DN versionDN = DN.nullDN();
 
   {
     try
@@ -121,6 +129,7 @@
       systemInformationDN = DN.decode("cn=System Information,cn=monitor");
       entryCachesDN = DN.decode("cn=Entry Caches,cn=monitor");
       workQueueDN = DN.decode("cn=Work Queue,cn=monitor");
+      versionDN = DN.decode("cn=Version,cn=monitor");
     }
     catch (Throwable t)
     {
@@ -169,6 +178,15 @@
   }
 
   /**
+   * Returns the version entry of the monitoring tree.
+   * @return the version entry of the monitoring tree.
+   */
+  public CustomSearchResult getVersionMonitor()
+  {
+    return versionMonitor;
+  }
+
+  /**
    * Returns the monitoring entry for the system information.
    * @return the monitoring entry for the system information.
    */
@@ -187,6 +205,28 @@
   }
 
   /**
+   * Sets whether this server represents the local instance or a remote server.
+   * @param isLocal whether this server represents the local instance or a
+   * remote server (in another machine or in another installation on the same
+   * machine).
+   */
+  public void setIsLocal(boolean isLocal)
+  {
+    this.isLocal = isLocal;
+  }
+
+  /**
+   * Returns <CODE>true</CODE> if we are trying to manage the local host and
+   * <CODE>false</CODE> otherwise.
+   * @return <CODE>true</CODE> if we are trying to manage the local host and
+   * <CODE>false</CODE> otherwise.
+   */
+  public boolean isLocal()
+  {
+    return isLocal;
+  }
+
+  /**
    * Reads configuration and monitoring information using the provided
    * connection.
    * @param ctx the connection to be used to read the information.
@@ -204,9 +244,28 @@
     systemInformation = null;
     entryCaches = null;
     workQueue = null;
+    versionMonitor = null;
 
     hmConnectionHandlersMonitor.clear();
 
+    if (mustReadSchema())
+    {
+      try
+      {
+        readSchema(ctx);
+        if (getSchema() != null)
+        {
+          // Update the schema: so that when we call the server code the
+          // latest schema read on the server we are managing is used.
+          DirectoryServer.setSchema(getSchema());
+        }
+      }
+      catch (OpenDsException oe)
+      {
+        ex.add(oe);
+      }
+    }
+
     try
     {
       // Get the Directory Server configuration handler and use it.
@@ -449,15 +508,6 @@
       {
         ex.add(oe);
       }
-
-      try
-      {
-        readSchema();
-      }
-      catch (OpenDsException oe)
-      {
-        ex.add(oe);
-      }
     }
     catch (final Throwable t)
     {
@@ -506,6 +556,33 @@
   }
 
   /**
+   * Reads the schema from the files.
+   * @param ctx the connection to be used to load the schema.
+   * @throws OpenDsException if an error occurs reading the schema.
+   */
+  private void readSchema(InitialLdapContext ctx) throws OpenDsException
+  {
+    if (isLocal)
+    {
+      super.readSchema();
+    }
+    else
+    {
+      RemoteSchemaLoader loader = new RemoteSchemaLoader();
+      try
+      {
+        loader.readSchema(ctx);
+      }
+      catch (NamingException ne)
+      {
+        throw new OnlineUpdateException(
+            ERR_READING_SCHEMA_LDAP.get(ne.toString()), ne);
+      }
+      schema = loader.getSchema();
+    }
+  }
+
+  /**
    * Takes the provided search result and updates the monitoring information
    * accordingly.
    * @param sr the search result.
@@ -662,6 +739,10 @@
         {
           systemInformation = csr;
         }
+        else if ((versionMonitor == null) && isVersionMonitor(csr))
+        {
+          versionMonitor = csr;
+        }
         else if (isConnectionHandler(csr))
         {
           String statistics = " Statistics";
@@ -829,6 +910,12 @@
     return monitorDN.equals(DN.decode(csr.getDN()));
   }
 
+  private boolean isVersionMonitor(CustomSearchResult csr)
+  throws OpenDsException
+  {
+    return versionDN.equals(DN.decode(csr.getDN()));
+  }
+
   private boolean isSystemInformation(CustomSearchResult csr)
   throws OpenDsException
   {
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java b/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
index a26bbaf..c4aefb3 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromFile.java
@@ -110,6 +110,25 @@
     try
     {
       DirectoryServer.getInstance().initializeConfiguration();
+
+      if (mustReadSchema())
+      {
+        try
+        {
+          readSchema();
+          if (getSchema() != null)
+          {
+            // Update the schema: so that when we call the server code the
+            // latest schema read on the server we are managing is used.
+            DirectoryServer.setSchema(getSchema());
+          }
+        }
+        catch (OpenDsException oe)
+        {
+          ex.add(oe);
+        }
+      }
+
       // Get the Directory Server configuration handler and use it.
       RootCfg root =
         ServerManagementContext.getInstance().getRootConfiguration();
@@ -343,18 +362,6 @@
       {
         ex.add(oe);
       }
-
-      if (mustReadSchema())
-      {
-        try
-        {
-          readSchema();
-        }
-        catch (OpenDsException oe)
-        {
-          ex.add(oe);
-        }
-      }
     }
     catch (OpenDsException oe)
     {
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java b/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java
index b961f62..cd7c495 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java
@@ -36,6 +36,8 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
 import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor;
@@ -58,14 +60,18 @@
  */
 public abstract class ConfigReader
 {
+  private static final Logger LOG =
+    Logger.getLogger(ConfigReader.class.getName());
   /**
    * The class used to read the configuration from a file.
    */
   public static String configClassName;
   /**
    * The configuration file full path (-INSTANCE_ROOT-/config/config.ldif).
+   * of the installation of the control panel.
    */
   public static String configFile;
+
   /**
    * The error that occurred when setting the environment (null if no error
    * occurred).
@@ -89,9 +95,9 @@
     {
       DirectoryEnvironmentConfig env = DirectoryServer.getEnvironmentConfig();
       env.setServerRoot(new File(installRoot));
+      DirectoryServer instance = DirectoryServer.getInstance();
       DirectoryServer.bootstrapClient();
       DirectoryServer.initializeJMX();
-      DirectoryServer instance = DirectoryServer.getInstance();
       instance.initializeConfiguration(configClassName, configFile);
       instance.initializeSchema();
     }
@@ -100,6 +106,7 @@
       environmentSettingException = new OfflineUpdateException(
           ERR_CTRL_PANEL_SETTING_ENVIRONMENT.get(t.getMessage().toString()), t);
     }
+    LOG.log(Level.INFO, "Environment initialized.");
   }
 
   /**
@@ -275,8 +282,8 @@
   /**
    * Reads the schema from the files.
    * @throws ConfigException if an error occurs reading the schema.
-   * @throws InitializationException if an error occurs trying to find out
-   * the schema files.
+   * @throws InitializationException if an error occurs initializing
+   * configuration to read schema.
    * @throws DirectoryException if there is an error registering the minimal
    * objectclasses.
    */
@@ -285,7 +292,7 @@
   {
     SchemaLoader loader = new SchemaLoader();
     loader.readSchema();
-    schema = loader.getSchema().duplicate();
+    schema = loader.getSchema();
   }
 
   /**
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java b/opends/src/guitools/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
new file mode 100644
index 0000000..b607643
--- /dev/null
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
@@ -0,0 +1,185 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2009 Sun Microsystems, Inc.
+ */
+
+package org.opends.guitools.controlpanel.util;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.InitialLdapContext;
+
+import org.opends.guitools.controlpanel.browser.BrowserController;
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
+import org.opends.server.config.ConfigConstants;
+import org.opends.server.config.ConfigException;
+import org.opends.server.schema.AttributeTypeSyntax;
+import org.opends.server.schema.ObjectClassSyntax;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.ByteStringBuilder;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.ObjectClass;
+import org.opends.server.types.Schema;
+
+/**
+ * Class used to retrieve the schema from the schema files.
+ *
+ */
+public class RemoteSchemaLoader extends SchemaLoader
+{
+  private Schema schema;
+
+  /**
+   * Constructor.
+   *
+   */
+  public RemoteSchemaLoader()
+  {
+    super();
+  }
+
+  /**
+   * Reads the schema.
+   * @param ctx the connection to be used to load the schema.
+   * @throws NamingException if an error occurs reading the schema.
+   * @throws DirectoryException if an error occurs parsing the schema.
+   * @throws InitializationException if an error occurs finding the base
+   * schema.
+   * @throws ConfigException if an error occurs loading the configuration
+   * required to use the schema classes.
+   */
+  public void readSchema(InitialLdapContext ctx) throws NamingException,
+  DirectoryException, InitializationException, ConfigException
+  {
+    SearchControls searchControls = new SearchControls();
+    searchControls.setSearchScope(SearchControls.OBJECT_SCOPE);
+    String[] schemaAttrs =
+    {
+        ConfigConstants.ATTR_OBJECTCLASSES_LC,
+        ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC
+    };
+    searchControls.setReturningAttributes(schemaAttrs);
+    String filter = BrowserController.ALL_OBJECTS_FILTER;
+    NamingEnumeration<SearchResult> srs =
+      ctx.search(ConfigConstants.DN_DEFAULT_SCHEMA_ROOT,
+          filter,
+          searchControls);
+    SearchResult sr = srs.next();
+    CustomSearchResult csr = new CustomSearchResult(sr,
+        ConfigConstants.DN_DEFAULT_SCHEMA_ROOT);
+
+    schema = getBaseSchema();
+
+    Set<Object> attrs =
+      csr.getAttributeValues(ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC);
+    Set<String> remainingAttrs = new HashSet<String>();
+    for (Object o : attrs)
+    {
+      remainingAttrs.add((String)o);
+    }
+
+    while (!remainingAttrs.isEmpty())
+    {
+      DirectoryException lastException = null;
+      boolean oneRegistered = false;
+      Set<String> registeredAttrs = new HashSet<String>();
+      for (String attrDefinition : remainingAttrs)
+      {
+        ByteStringBuilder sb = new ByteStringBuilder();
+        sb.append(attrDefinition);
+        try
+        {
+          AttributeType attrType =
+            AttributeTypeSyntax.decodeAttributeType(sb, schema, false);
+          schema.registerAttributeType(attrType, true);
+          oneRegistered = true;
+          registeredAttrs.add(attrDefinition);
+        }
+        catch (DirectoryException de)
+        {
+          lastException = de;
+        }
+      }
+      if (!oneRegistered)
+      {
+        throw lastException;
+      }
+      remainingAttrs.removeAll(registeredAttrs);
+    }
+
+    Set<Object> objectClasses =
+      csr.getAttributeValues(ConfigConstants.ATTR_OBJECTCLASSES_LC);
+
+    Set<String> remainingOcs = new HashSet<String>();
+    for (Object o : objectClasses)
+    {
+      remainingOcs.add((String)o);
+    }
+
+    while (!remainingOcs.isEmpty())
+    {
+      DirectoryException lastException = null;
+      boolean oneRegistered = false;
+      Set<String> registeredOcs = new HashSet<String>();
+      for (String ocDefinition : remainingOcs)
+      {
+        ByteStringBuilder sb = new ByteStringBuilder();
+        sb.append(ocDefinition);
+        try
+        {
+          ObjectClass oc =
+            ObjectClassSyntax.decodeObjectClass(sb, schema, false);
+          schema.registerObjectClass(oc, true);
+          oneRegistered = true;
+          registeredOcs.add(ocDefinition);
+        }
+        catch (DirectoryException de)
+        {
+          lastException = de;
+        }
+      }
+      if (!oneRegistered)
+      {
+        throw lastException;
+      }
+      remainingOcs.removeAll(registeredOcs);
+    }
+  }
+
+  /**
+   * Returns the schema that was read.
+   * @return the schema that was read.
+   */
+  public Schema getSchema()
+  {
+    return schema;
+  }
+}
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java b/opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java
index f176f60..675ed6d 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java
@@ -128,23 +128,7 @@
   public void readSchema() throws DirectoryException,
   ConfigException, InitializationException
   {
-    schema = new Schema();
-    for (MatchingRule mr : matchingRulesToKeep)
-    {
-      schema.registerMatchingRule(mr, true);
-    }
-    for (AttributeSyntax syntax : syntaxesToKeep)
-    {
-      schema.registerSyntax(syntax, true);
-    }
-    for (AttributeType attr : attributesToKeep)
-    {
-      schema.registerAttributeType(attr, true);
-    }
-    for (ObjectClass oc : objectclassesToKeep)
-    {
-      schema.registerObjectClass(oc, true);
-    }
+    schema = getBaseSchema();
 
     String[] fileNames = null;
     try
@@ -263,6 +247,35 @@
   }
 
   /**
+   * Returns a basic version of the schema.  The schema is created and contains
+   * enough definitions for the schema to be loaded.
+   * @return a basic version of the schema.
+   * @throws DirectoryException if there is an error registering the minimal
+   * objectclasses.
+   */
+  protected Schema getBaseSchema() throws DirectoryException
+  {
+    Schema schema = new Schema();
+    for (MatchingRule mr : matchingRulesToKeep)
+    {
+      schema.registerMatchingRule(mr, true);
+    }
+    for (AttributeSyntax syntax : syntaxesToKeep)
+    {
+      schema.registerSyntax(syntax, true);
+    }
+    for (AttributeType attr : attributesToKeep)
+    {
+      schema.registerAttributeType(attr, true);
+    }
+    for (ObjectClass oc : objectclassesToKeep)
+    {
+      schema.registerObjectClass(oc, true);
+    }
+    return schema;
+  }
+
+  /**
    * Returns the schema that was read.
    * @return the schema that was read.
    */
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java b/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
index 929e555..4ad5131 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
@@ -48,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.Set;
 
 import javax.naming.CompositeName;
@@ -292,6 +293,25 @@
         null); // default button title
   }
 
+  /**
+   * Displays a warning dialog.
+   * @param parentComponent the parent component relative to which the dialog
+   * will be displayed.
+   * @param title the title of the dialog.
+   * @param msg the message to be displayed.
+   */
+  public static void displayWarningDialog(Component parentComponent,
+      Message title, Message msg)
+  {
+    String plainText = msg.toString().replaceAll("<br>", ServerConstants.EOL);
+    String wrappedText = StaticUtils.wrapText(plainText, 70);
+    wrappedText = wrappedText.replaceAll(ServerConstants.EOL, "<br>");
+    JOptionPane.showMessageDialog(
+        parentComponent, "<html>"+wrappedText,
+        title.toString(),
+        JOptionPane.WARNING_MESSAGE);
+  }
+
 
   /**
    * Creates a JEditorPane that displays a message.
@@ -1734,6 +1754,16 @@
       "03-uddiv3.ldif", "05-solaris.ldif"
   };
 
+  private final static String[] configurationSchemaOrigins =
+  {
+      "OpenDS Directory Server", "Sun Directory Server"
+  };
+
+  private final static String[] standardSchemaOrigins =
+  {
+      "Sun Java System Directory Server", "Solaris Specific", "X.501"
+  };
+
   private final static String[] configurationSchemaFileNames =
   {
       "02-config.ldif", "06-compat.ldif"
@@ -1765,6 +1795,27 @@
         isStandard = fileName.toLowerCase().indexOf("-rfc") != -1;
       }
     }
+    else if (fileElement instanceof CommonSchemaElements)
+    {
+      CommonSchemaElements element = (CommonSchemaElements)fileElement;
+      String xOrigin = getOrigin(element);
+      if (xOrigin != null)
+      {
+        for (String name : standardSchemaOrigins)
+        {
+          isStandard = xOrigin.equals(name);
+          if (isStandard)
+          {
+            break;
+          }
+        }
+        if (!isStandard)
+        {
+          isStandard = xOrigin.startsWith("RFC ") ||
+          xOrigin.startsWith("draft-");
+        }
+      }
+    }
     return isStandard;
   }
 
@@ -1790,10 +1841,47 @@
         }
       }
     }
+    else if (fileElement instanceof CommonSchemaElements)
+    {
+      CommonSchemaElements element = (CommonSchemaElements)fileElement;
+      String xOrigin = getOrigin(element);
+      if (xOrigin != null)
+      {
+        for (String name : configurationSchemaOrigins)
+        {
+          isConfiguration = xOrigin.equals(name);
+          if (isConfiguration)
+          {
+            break;
+          }
+        }
+      }
+    }
     return isConfiguration;
   }
 
   /**
+   * Returns the origin of the provided schema element.
+   * @param element the schema element.
+   * @return the origin of the provided schema element.
+   */
+  public static String getOrigin(CommonSchemaElements element)
+  {
+    String xOrigin = null;
+    Iterable<String> it =
+      element.getExtraProperty(ServerConstants.SCHEMA_PROPERTY_ORIGIN);
+    if (it != null)
+    {
+      Iterator<String> iterator = it.iterator();
+      if (iterator.hasNext())
+      {
+        xOrigin = iterator.next();
+      }
+    }
+    return xOrigin;
+  }
+
+  /**
    * Returns the string representation of an attribute syntax.
    * @param syntax the attribute syntax.
    * @return the string representation of an attribute syntax.
@@ -1976,13 +2064,7 @@
     /*
      * Search for the config to check that it is the directory manager.
      */
-    SearchControls searchControls = new SearchControls();
-    searchControls.setCountLimit(1);
-    searchControls.setSearchScope(
-    SearchControls. OBJECT_SCOPE);
-    searchControls.setReturningAttributes(
-    new String[] {"dn"});
-    ctx.search("cn=config", "objectclass=*", searchControls);
+    checkCanReadConfig(ctx);
     return ctx;
   }
 
@@ -2042,6 +2124,18 @@
           bindDN, pwd, Utils.getDefaultLDAPTimeout(), null);
     }
 
+    checkCanReadConfig(ctx);
+    return ctx;
+  }
+
+  /**
+   * Checks that the provided connection can read cn=config.
+   * @param ctx the connection to be tested.
+   * @throws NamingException if an error occurs while reading cn=config.
+   */
+  public static void checkCanReadConfig(InitialLdapContext ctx)
+  throws NamingException
+  {
     /*
      * Search for the config to check that it is the directory manager.
      */
@@ -2052,7 +2146,6 @@
     searchControls.setReturningAttributes(
     new String[] {"dn"});
     ctx.search("cn=config", "objectclass=*", searchControls);
-    return ctx;
   }
 
   /**
diff --git a/opends/src/messages/messages/admin_tool.properties b/opends/src/messages/messages/admin_tool.properties
index 59feb12..85abcc2 100644
--- a/opends/src/messages/messages/admin_tool.properties
+++ b/opends/src/messages/messages/admin_tool.properties
@@ -199,6 +199,8 @@
 MILD_ERR_READING_CONFIG_FILE=Error reading the configuration file.
 MILD_ERR_READING_CONFIG_LDAP=Error reading data from server.  Verify the \
  authentication information provided.%nDetails: %s
+MILD_ERR_READING_SCHEMA_LDAP=Error reading schema from the remote server.\
+ %nDetails: %s
 SEVERE_ERR_STARTING_SERVER_GENERIC=Could not Start server.
 INFO_FINISH_BUTTON_UNINSTALL_LABEL=Uninstall
 INFO_FINISH_BUTTON_UNINSTALL_TOOLTIP=Finish Uninstall
@@ -279,6 +281,7 @@
 INFO_SERVER_STOPPED_LABEL=Stopped
 INFO_SERVER_STOPPING_LABEL=Stopping
 INFO_SERVER_UNKNOWN_STATUS_LABEL=Unknown
+INFO_SERVER_NOT_CONNECTED_TO_REMOTE_STATUS_LABEL=Not Connected to Remote
 INFO_START_BUTTON_LABEL=Start
 INFO_START_BUTTON_TOOLTIP=Starts the Directory Server
 INFO_STATE_COLUMN=State
@@ -1814,6 +1817,27 @@
 INFO_CTRL_OBJECTCLASS_DESCRIPTOR=Objectclass: %s
 INFO_CTRL_AUXILIARY_OBJECTCLASS_DESCRIPTOR=Auxiliary objectclasses: %s
 
+INFO_CTRL_PANEL_LOCAL_OR_REMOTE_LABEL=Choose the server to be administered:
+INFO_CTRL_PANEL_REMOTE_SERVER=Remote Server:
+INFO_CTRL_PANEL_LOCAL_SERVER=Local Server
+INFO_CTRL_PANEL_ADMINISTRATION_PORT=Administration Port:
+INFO_CTRL_PANEL_LOCAL_SERVER_NOT_RUNNING=Not Running
+INFO_EMPTY_REMOTE_HOST_NAME=You must provide the name of the remote host name.
+INFO_INVALID_REMOTE_SERVER_PORT=The value of the remote server administrative \
+ port must be an integer value between %d and %d.
+INFO_CTRL_PANEL_LOCAL_OR_REMOTE_PANEL_TITLE=Server to Administer
+#
+# Note that the following two properties contain line breaks in HTML format
+# (<br>)
+#
+INFO_CTRL_PANEL_ERROR_CONNECTING_TO_LOCAL=The following errors occurred \
+ connecting to the local server:<br>%s<br>If you continue without providing \
+ authentication no monitoring information will be displayed.<br><br>Do you \
+ want to continue?
+MILD_ERR_CANNOT_CONNECT_TO_REMOTE=Could not connect to server '%s' on port \
+ '%s'.  Verify that the provided information is valid and that the server is \
+ running.  Details: %s
+
 INFO_CTRL_PANEL_LOGIN_PANEL_TITLE=Authentication Required
 INFO_CTRL_PANEL_BIND_DN_LABEL=Bind DN:
 INFO_CTRL_PANEL_BIND_PASSWORD_LABEL=Password:
@@ -1824,8 +1848,12 @@
 #
 INFO_CTRL_PANEL_RUNNING_TASKS_CONFIRMATION_DETAILS=The following tasks are \
  running:<br>%s<br><br>If you exit the tasks will continue but you will have \
- to check the error logs to see if they complete successfully.<br><br>Do you \
+ to check the log files to see if they complete successfully.<br><br>Do you \
  want to continue?
+INFO_CTRL_PANEL_RUNNING_TASKS_CHANGE_SERVER_CONFIRMATION_DETAILS=The following \
+ tasks are running:<br>%s<br><br>If you connect to another server the tasks \
+ will continue but you will have to check the log files to see if they \
+ complete successfully.<br><br>Do you want to continue?
 
 INFO_CTRL_PANEL_MATCHING_RULE_PANEL_TITLE=Matching Rule
 INFO_CTRL_PANEL_MATCHING_RULE_DETAILS=Matching Rule Details
@@ -1895,6 +1923,7 @@
 INFO_CTRL_PANEL_ATTRIBUTE_DESCRIPTION_LABEL=Description:
 INFO_CTRL_PANEL_ATTRIBUTE_USAGE_LABEL=Usage:
 INFO_CTRL_PANEL_ATTRIBUTE_SYNTAX_LABEL=Syntax:
+INFO_CTRL_PANEL_ATTRIBUTE_TYPE_LABEL=Type:
 INFO_CTRL_PANEL_ATTRIBUTE_APPROXIMATE_MATCHING_RULE_LABEL=Approximate \
  Matching Rule:
 INFO_CTRL_PANEL_ATTRIBUTE_EQUALITY_MATCHING_RULE_LABEL=Equality \
@@ -2476,6 +2505,49 @@
 INFO_CTRL_PANEL_AVERAGE_HEADER=%s Avg per second
 INFO_CTRL_PANEL_AUTHENTICATED_AS=Authenticated as '%s'
 INFO_CTRL_PANEL_NOT_AUTHENTICATED=User Not Authenticated
-INFO_CTRL_PANEL_NOT_AUTHENTICATED_SERVER_NOT_RUNNING=User Not Authenticated \
- (Server not Running)
-
+INFO_CTRL_PANEL_NOT_AUTHENTICATED_SERVER_NOT_RUNNING=User not authenticated \
+ (server not running)
+INFO_CTRL_PANEL_NOT_AUTHENTICATED_SERVER_REMOTE=User not authenticated \
+ (could not connect to server '%s')
+INFO_CTRL_PANEL_LOCAL_OR_REMOTE=Select the server that you want to administer:
+INFO_CTRL_PANEL_SERVER_REMOTE_SUMMARY=Server is Remote
+INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_JAVA_PROPERTIES_SUMMARY=The Java Settings \
+ can only be updated when the managed server is the local server.
+INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_VERIFY_INDEX_SUMMARY=The indexes can only \
+ be verified when the managed server is the local server.
+INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_REBUILD_INDEX_SUMMARY=The indexes can \
+ only be rebuilt when the managed server is the local server.
+INFO_CTRL_PANEL_REMOTE_SERVER_PATH=The path must be accessible by the remote \
+ server.
+INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_WINDOWS_SERVICE_SUMMARY=The Windows \
+ Service configuration can only be viewed and updated when the managed server \
+ is the local server.
+SEVERE_ERR_CTRL_PANEL_ERROR_CREATING_NEW_DATA_LDIF=Could not created local \
+ LDIF to populate new base DN with automatically generated data.  Error code: \
+ %d.
+INFO_CTRL_PANEL_PARENT_BACKUP_ID_LABEL=Parent Backup ID:
+INFO_CTRL_PANEL_PARENT_BACKUP_PATH_LABEL=Parent Backup Path:
+MILD_ERR_CTRL_PANEL_NO_PARENT_BACKUP_ID_PROVIDED=No parent backup ID provided.
+INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_SUMMARY=Could not connect to remote \
+ server
+INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS=The remote server '%s' might \
+ be down or the provided authentication is no longer valid.  To be able to \
+ manage a server remotely it must be running and you must provide \
+ authentication.
+INFO_CTRL_PANEL_CONNECT_TO_SERVER_MENU=Server to Administer...
+INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_REMOTE_DETAILS=The index configuration \
+ for '%s' was successfully modified.  For the configuration to be taken into \
+ account the database index files must be regenerated.  This can be done by \
+ using the 'rebuild-index' command-line on the remote server or re-importing \
+ the contents of the backend '%s'.
+INFO_PROGRESS_IMPORT_AUTOMATICALLY_GENERATED_REMOTE=Importing \
+ Automatically-Generated Data (%s Entries)
+SEVERE_ERR_NOT_SAME_PRODUCT_IN_REMOTE_SERVER_NOT_FOUND=The remote server in \
+ '%s' is cannot be managed by this control panel.  The remote server product \
+ name is '%s' and the control panel product name is '%s'.
+SEVERE_ERR_INCOMPATIBLE_VERSION_IN_REMOTE_SERVER=The remote server in '%s' has \
+ not the same version as the control panel.  The remote server version is \
+ '%s.%s.%s' and the control panel version is '%d.%d.%d'.
+SEVERE_ERR_VERSION_IN_REMOTE_SERVER_NOT_FOUND=Could not find version \
+ information in the remote server.  The remote LDAP server does not seem to be \
+ manageable remotely by the control panel.
diff --git a/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java b/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java
index daec30c..c1b2568 100644
--- a/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java
+++ b/opends/src/server/org/opends/server/monitors/SystemInfoMonitorProvider.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.monitors;
 
@@ -196,7 +196,16 @@
                               String.valueOf(runtime.totalMemory())));
     attrs.add(createAttribute("freeUsedMemory",
                               String.valueOf(runtime.freeMemory())));
-
+    String installPath = DirectoryServer.getServerRoot();
+    if (installPath != null)
+    {
+      attrs.add(createAttribute("installPath", installPath));
+    }
+    String instancePath = DirectoryServer.getInstanceRoot();
+    if (instancePath != null)
+    {
+      attrs.add(createAttribute("instancePath", instancePath));
+    }
 
     // Get the JVM input arguments.
     RuntimeMXBean rtBean = ManagementFactory.getRuntimeMXBean();
diff --git a/opends/src/server/org/opends/server/tasks/RebuildTask.java b/opends/src/server/org/opends/server/tasks/RebuildTask.java
index 6fa8eb4..a8fa88a 100644
--- a/opends/src/server/org/opends/server/tasks/RebuildTask.java
+++ b/opends/src/server/org/opends/server/tasks/RebuildTask.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.tasks;
 import org.opends.messages.Message;
@@ -65,8 +65,6 @@
 import static org.opends.messages.ToolMessages.
     ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND;
 import static org.opends.messages.ToolMessages.
-    ERR_REBUILDINDEX_CANNOT_SHARED_LOCK_BACKEND;
-import static org.opends.messages.ToolMessages.
     WARN_REBUILDINDEX_CANNOT_UNLOCK_BACKEND;
 import static org.opends.server.config.ConfigConstants.
     ATTR_REBUILD_BASE_DN;
@@ -195,65 +193,43 @@
     // to aquire exclusive lock.
     String lockFile = LockFileManager.getBackendLockFileName(backend);
     StringBuilder failureReason = new StringBuilder();
-    if(rebuildConfig.includesSystemIndex())
+
+    // Disable the backend.
+    try
     {
-      // Disable the backend.
-      try
+      TaskUtils.disableBackend(backend.getBackendID());
+    }
+    catch (DirectoryException e)
+    {
+      if (debugEnabled())
       {
-        TaskUtils.disableBackend(backend.getBackendID());
-      }
-      catch (DirectoryException e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
-        logError(e.getMessageObject());
-        return TaskState.STOPPED_BY_ERROR;
+        TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
 
-      try
-      {
-        if(! LockFileManager.acquireExclusiveLock(lockFile, failureReason))
-        {
-          Message message = ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND.get(
-              backend.getBackendID(), String.valueOf(failureReason));
-          logError(message);
-          return TaskState.STOPPED_BY_ERROR;
-        }
-      }
-      catch (Exception e)
+      logError(e.getMessageObject());
+      return TaskState.STOPPED_BY_ERROR;
+    }
+
+    try
+    {
+      if(! LockFileManager.acquireExclusiveLock(lockFile, failureReason))
       {
         Message message = ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND.get(
-            backend.getBackendID(), getExceptionMessage(e));
+            backend.getBackendID(), String.valueOf(failureReason));
         logError(message);
         return TaskState.STOPPED_BY_ERROR;
       }
     }
-    else
+    catch (Exception e)
     {
-      try
-      {
-        if(! LockFileManager.acquireSharedLock(lockFile, failureReason))
-        {
-          Message message = ERR_REBUILDINDEX_CANNOT_SHARED_LOCK_BACKEND.get(
-              backend.getBackendID(), String.valueOf(failureReason));
-          logError(message);
-          return TaskState.STOPPED_BY_ERROR;
-        }
-      }
-      catch (Exception e)
-      {
-        Message message = ERR_REBUILDINDEX_CANNOT_SHARED_LOCK_BACKEND.get(
-            backend.getBackendID(), getExceptionMessage(e));
-        logError(message);
-        return TaskState.STOPPED_BY_ERROR;
-      }
-
+      Message message = ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND.get(
+          backend.getBackendID(), getExceptionMessage(e));
+      logError(message);
+      return TaskState.STOPPED_BY_ERROR;
     }
 
 
+    TaskState returnCode = TaskState.COMPLETED_SUCCESSFULLY;
     // Launch the rebuild process.
     try
     {
@@ -270,31 +246,33 @@
       Message message =
           ERR_REBUILDINDEX_ERROR_DURING_REBUILD.get(e.getMessage());
       logError(message);
-      return TaskState.STOPPED_BY_ERROR;
+      returnCode = TaskState.STOPPED_BY_ERROR;
     }
-
     // Release the lock on the backend.
-    try
+    finally
     {
-      lockFile = LockFileManager.getBackendLockFileName(backend);
-      failureReason = new StringBuilder();
-      if (! LockFileManager.releaseLock(lockFile, failureReason))
+      try
+      {
+        lockFile = LockFileManager.getBackendLockFileName(backend);
+        failureReason = new StringBuilder();
+        if (! LockFileManager.releaseLock(lockFile, failureReason))
+        {
+          Message message = WARN_REBUILDINDEX_CANNOT_UNLOCK_BACKEND.get(
+              backend.getBackendID(), String.valueOf(failureReason));
+          logError(message);
+          returnCode = TaskState.COMPLETED_WITH_ERRORS;
+        }
+      }
+      catch (Throwable t)
       {
         Message message = WARN_REBUILDINDEX_CANNOT_UNLOCK_BACKEND.get(
-            backend.getBackendID(), String.valueOf(failureReason));
+            backend.getBackendID(), getExceptionMessage(t));
         logError(message);
-        return TaskState.COMPLETED_WITH_ERRORS;
+        returnCode = TaskState.COMPLETED_WITH_ERRORS;
       }
     }
-    catch (Exception e)
-    {
-      Message message = WARN_REBUILDINDEX_CANNOT_UNLOCK_BACKEND.get(
-          backend.getBackendID(), getExceptionMessage(e));
-      logError(message);
-      return TaskState.COMPLETED_WITH_ERRORS;
-    }
 
-    if(rebuildConfig.includesSystemIndex())
+    if(returnCode == TaskState.COMPLETED_SUCCESSFULLY)
     {
       // Enable the backend.
       try
@@ -309,10 +287,10 @@
         }
 
         logError(e.getMessageObject());
-        return TaskState.STOPPED_BY_ERROR;
+        returnCode = TaskState.STOPPED_BY_ERROR;
       }
     }
 
-    return TaskState.COMPLETED_SUCCESSFULLY;
+    return returnCode;
   }
 }
diff --git a/opends/src/server/org/opends/server/tools/RebuildIndex.java b/opends/src/server/org/opends/server/tools/RebuildIndex.java
index 7390896..a408db0 100644
--- a/opends/src/server/org/opends/server/tools/RebuildIndex.java
+++ b/opends/src/server/org/opends/server/tools/RebuildIndex.java
@@ -22,31 +22,38 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.tools;
 import org.opends.messages.Message;
 
 import static org.opends.server.util.StaticUtils.wrapText;
 import org.opends.server.util.args.ArgumentException;
-import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.args.LDAPConnectionArgumentParser;
 import org.opends.server.util.args.StringArgument;
 import org.opends.server.extensions.ConfigFileHandler;
 
+
 import static org.opends.messages.ToolMessages.*;
 import org.opends.server.config.ConfigException;
+
+import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.loggers.ErrorLogger.logError;
 import org.opends.server.loggers.TextWriter;
 import org.opends.server.loggers.ErrorLogger;
 import org.opends.server.loggers.TextErrorLogPublisher;
 import org.opends.server.loggers.debug.TextDebugLogPublisher;
 import org.opends.server.loggers.debug.DebugLogger;
+import org.opends.server.protocols.ldap.LDAPAttribute;
+
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.CoreConfigManager;
 import org.opends.server.core.LockFileManager;
+import org.opends.server.tasks.RebuildTask;
+import org.opends.server.tools.tasks.TaskTool;
 import org.opends.server.types.*;
 import org.opends.server.api.Backend;
 import org.opends.server.api.ErrorLogPublisher;
@@ -67,8 +74,12 @@
  * intended to run separate from Directory Server and not internally within the
  * server process (e.g., via the tasks interface).
  */
-public class RebuildIndex
+public class RebuildIndex extends TaskTool
 {
+  private StringArgument  configClass             = null;
+  private StringArgument  configFile              = null;
+  private StringArgument  baseDNString            = null;
+  private StringArgument  indexList               = null;
 
   /**
    * Processes the command-line arguments and invokes the rebuild process.
@@ -102,6 +113,12 @@
                                      OutputStream outStream,
                                      OutputStream errStream)
   {
+    RebuildIndex tool = new RebuildIndex();
+    return tool.process(args, initializeServer, outStream, errStream);
+  }
+
+  private int process(String[] args, boolean initializeServer,
+      OutputStream outStream, OutputStream errStream) {
     PrintStream out;
     if (outStream == null)
     {
@@ -123,18 +140,14 @@
     }
 
     // Define the command-line arguments that may be used with this program.
-    StringArgument  configClass             = null;
-    StringArgument  configFile              = null;
-    StringArgument  baseDNString            = null;
-    StringArgument  indexList               = null;
     BooleanArgument displayUsage            = null;
 
 
     // Create the command-line argument parser for use with this program.
     Message toolDescription = INFO_REBUILDINDEX_TOOL_DESCRIPTION.get();
-    ArgumentParser argParser =
-         new ArgumentParser("org.opends.server.tools.RebuildIndex",
-                            toolDescription, false);
+    LDAPConnectionArgumentParser argParser =
+      createArgParser("org.opends.server.tools.RebuildIndex",
+                            toolDescription);
 
 
     // Initialize all the command-line argument types and register them with the
@@ -232,6 +245,17 @@
       return 1;
     }
 
+    return process(argParser, initializeServer, out, err);
+  }
+
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected int processLocal(boolean initializeServer,
+                           PrintStream out,
+                           PrintStream err) {
     // Perform the initial bootstrap of the Directory Server and process the
     // configuration.
     DirectoryServer directoryServer = DirectoryServer.getInstance();
@@ -512,4 +536,50 @@
 
     return returnCode;
   }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String getTaskId() {
+    // NYI.
+    return null;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void addTaskAttributes(List<RawAttribute> attributes)
+  {
+    //
+    // Required attributes
+    //
+    ArrayList<ByteString> values;
+
+    String baseDN = baseDNString.getValue();
+    values = new ArrayList<ByteString>(1);
+    values.add(ByteString.valueOf(baseDN));
+    attributes.add(new LDAPAttribute(ATTR_REBUILD_BASE_DN, values));
+
+    List<String> indexes = indexList.getValues();
+    values = new ArrayList<ByteString>(indexes.size());
+    for (String s : indexes)
+    {
+      values.add(ByteString.valueOf(s));
+    }
+    attributes.add(new LDAPAttribute(ATTR_REBUILD_INDEX, values));
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String getTaskObjectclass() {
+    return "ds-task-rebuild";
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public Class getTaskClass() {
+    return RebuildTask.class;
+  }
 }
diff --git a/opends/src/server/org/opends/server/tools/status/StatusCli.java b/opends/src/server/org/opends/server/tools/status/StatusCli.java
index bf44d85..68ae613 100644
--- a/opends/src/server/org/opends/server/tools/status/StatusCli.java
+++ b/opends/src/server/org/opends/server/tools/status/StatusCli.java
@@ -575,6 +575,10 @@
       status = INFO_SERVER_STOPPING_LABEL.get();
       break;
 
+    case NOT_CONNECTED_TO_REMOTE:
+      status = INFO_SERVER_NOT_CONNECTED_TO_REMOTE_STATUS_LABEL.get();
+      break;
+
     case UNKNOWN:
       status = INFO_SERVER_UNKNOWN_STATUS_LABEL.get();
       break;

--
Gitblit v1.10.0