From 43ba6d721185f9a810761720fcb05103b31d17b7 Mon Sep 17 00:00:00 2001
From: chebrard <chebrard@localhost>
Date: Wed, 29 Oct 2008 10:39:44 +0000
Subject: [PATCH] Fix 3534: Provide native Solaris packages (fix also 3533: upgrade fails starting server adding entry ds-cfg-key-id)

---
 opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgraderSvr4.java                              |  138 ++
 opends/src/server/org/opends/server/admin/ClassLoaderProvider.java                                  |   18 
 opends/resource/bin/_mixed-script.sh                                                                |   10 
 opends/resource/upgrade_svr4                                                                        |   92 +
 opends/build-svr4.xml                                                                               |  166 +++
 opends/src/svr4/OpenDS/copyright                                                                    |   17 
 opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java                          |    3 
 opends/src/server/org/opends/server/core/SchemaConfigManager.java                                   |  101 +
 opends/src/svr4/OpenDS/layout.xml                                                                   |  167 +++
 opends/src/svr4/OpenDS/pkg.properties                                                               |    7 
 opends/resource/bin/stop-ds                                                                         |    9 
 opends/src/messages/messages/backend.properties                                                     |    2 
 opends/resource/bin/_script-util.sh                                                                 |  105 +
 opends/src/quicksetup/org/opends/quicksetup/Installation.java                                       |  164 ++
 opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java     |   14 
 opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java                      |    9 
 opends/resource/configure                                                                           |   66 +
 opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java                           |   76 -
 opends/src/server/org/opends/server/tasks/AddSchemaFileTask.java                                    |   19 
 opends/resource/upgrade                                                                             |    9 
 opends/src/quicksetup/org/opends/quicksetup/configurator/package-info.java                          |   31 
 opends/resource/bin/start-ds                                                                        |   25 
 opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java                         |   48 
 opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java |    2 
 opends/resource/bin/_client-script.sh                                                               |    9 
 opends/resource/uninstall                                                                           |    9 
 opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java             |    8 
 opends/src/messages/messages/config.properties                                                      |    2 
 opends/src/quicksetup/org/opends/quicksetup/configurator/CheckInstance.java                         |  238 ++++
 opends/resource/bin/make-ldif                                                                       |   18 
 opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java                    |   10 
 opends/src/server/org/opends/server/backends/SchemaBackend.java                                     |  353 ++++--
 opends/src/svr4/OpenDS/README                                                                       |   11 
 opends/resource/bin/_server-script.sh                                                               |    9 
 opends/src/messages/messages/tools.properties                                                       |   34 
 opends/src/svr4/OpenDS/install.html                                                                 |   68 +
 opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/AddSchemaFileTaskTestCase.java    |    8 
 opends/src/guitools/org/opends/guitools/controlpanel/task/SchemaTask.java                           |    4 
 opends/src/server/org/opends/server/types/Schema.java                                               |   25 
 opends/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java            |    2 
 opends/src/quicksetup/org/opends/quicksetup/configurator/Configurator.java                          |  429 ++++++++
 opends/build.xml                                                                                    |    2 
 opends/src/svr4/OpenDS/install.txt                                                                  |   25 
 opends/src/quicksetup/org/opends/quicksetup/util/Utils.java                                         |   17 
 opends/src/messages/messages/task.properties                                                        |    4 
 opends/resource/setup                                                                               |    9 
 opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeSvr4Launcher.java                       |  196 +++
 opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java                            |   57 -
 opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java                                  |  233 ++-
 49 files changed, 2,597 insertions(+), 481 deletions(-)

diff --git a/opends/build-svr4.xml b/opends/build-svr4.xml
new file mode 100644
index 0000000..5514d3e
--- /dev/null
+++ b/opends/build-svr4.xml
@@ -0,0 +1,166 @@
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !
+ !      Copyright 2006-2008 Sun Microsystems, Inc.
+ ! -->
+
+<project name="SVR4 Packaging" basedir="." default="package-svr4">
+  <description>
+    This is a build script that extends the OpenDS build script by adding
+    SVR4 packaging functions.
+  </description>
+  
+
+  <!-- By default will build OpenDS package -->
+  <property name="product"           value="${SHORT_NAME}" />
+
+
+  <!-- General properties -->
+  <property name="svr4.src.dir"      location="src/svr4/${product}" />
+  <property name="build.dir"         location="build"                />
+  <property name="pkg.dir"           location="${build.dir}/package" />
+  <property name="svr4.dir"          location="${build.dir}/package/svr4" />
+
+  <!-- Product specific properties: pkg.name / pkg.fullname / pkg.arch / pkg.desc / pkg.vendor / pkg.basedir -->
+  <property file="${svr4.src.dir}/pkg.properties" />
+
+  <!-- Default values for product specific properties -->
+  <property name="pkg.name"       value="${product}" />
+  <property name="pkg.fullname"   value="${pkg.name}" />
+  <property name="pkg.arch"       value="all" />
+  <property name="pkg.desc"       value="${product}" />
+  <property name="pkg.vendor"     value="Sun Microsystems, Inc." />
+  <property name="pkg.basedir"    value="/opt" />
+
+  <!-- Some others general properties -->
+  <property name="svr4.build.dir"        location="${build.dir}/package/svr4/build/${pkg.name}" />
+  <property name="svr4.meta.dir"         location="${svr4.build.dir}/meta" />
+  <property name="svr4.layout.dir"       location="${svr4.build.dir}/layout" />
+  <property name="svr4.layout.pkg.dir"   location="${svr4.build.dir}/layout/${pkg.name}" />
+
+  <!-- Must define layout/pkgversion target -->
+  <import file="${svr4.src.dir}/layout.xml" />
+
+  <!-- Check if OS is Solaris -->
+  <target name="checkos">
+    <condition property="isSunOS">
+      <os name="SunOS"/>
+    </condition>
+   </target>
+
+  <target name="wrongos" unless="isSunOS">
+    <echo message="OS is ${os.name}. SVR4 package can only be built on a SunOS machine" />
+  </target>
+
+
+  <!-- Construct SVR4 package -->
+  <target name="svr4" depends="checkos,wrongos,cleansvr4,pkgversion,layout,metadata,pkgmk" if="isSunOS" 
+	  	description="Construct ${pkg.name} package for product ${product}.">
+    <echo message="Package ${pkg.name} for product ${product} built in ${svr4.dir}" />
+  </target>
+  
+  <!-- Cleanup target -->
+  <target name="cleansvr4" if="isSunOS" 
+	  	description="Cleanup SVR4 files.">
+	<delete dir="${svr4.build.dir}" />
+	<delete dir="${svr4.dir}/${pkg.name}" />
+  </target>
+  
+  <!-- Construct metadata data -->
+  <target name="metadata" depends="pkginfo,prototype,copyright" if="isSunOS" 
+	  	description="Construct metadata for ${pkg.name}.">
+  </target>
+  
+  <!-- Construct pkginfo file -->
+  <target name="pkginfo"  if="isSunOS" depends="pkgversion"
+		description="Create pkginfo file based on ${svr4.src.dir}/info.properties" >
+	<echo message="Building pkginfo for ${pkg.name}" />
+	<tstamp>
+	  <format property="rev" pattern="yyyy.MM.dd"/>
+	</tstamp>
+	<mkdir dir="${svr4.meta.dir}"/>
+        <echo file="${svr4.meta.dir}/pkginfo">
+PKG=${pkg.name}
+NAME=${pkg.fullname}
+ARCH=${pkg.arch}
+VERSION=${pkg.version},REV=${rev}
+SUNW_PRODNAME=${pkg.desc}
+SUNW_PRODVERS=${pkg.version}
+SUNW_PKGVERS=1.0
+MAXINST=1000
+CATEGORY=application
+DESC=${pkg.desc}
+VENDOR=${pkg.vendor}
+BASEDIR=${pkg.basedir}
+CLASSES=none
+HOTLINE=Please contact your local service provider
+EMAIL=
+        </echo>
+  </target>
+
+  <!-- Construct prototype file -->
+  <target name="prototype" depends="layout" if="isSunOS" 
+		description="Create prototype file based on ${svr4.layout.dir}" >
+	<echo message="Building prototype for ${pkg.name} pkg" />
+	<exec executable="pkgproto" dir="${svr4.layout.dir}" output="${svr4.meta.dir}/prototype">
+	    <arg value="."/>
+	</exec>
+	<exec executable="groups" dir="${svr4.layout.dir}" outputproperty="user.group" />
+        <echo file="${svr4.meta.dir}/prototype" append="true">i pkginfo
+i copyright</echo>
+	<replaceregexp file="${svr4.meta.dir}/prototype"
+                         match="${user.name}"
+                         replace="root"
+                         byline="true"/>
+	<replaceregexp file="${svr4.meta.dir}/prototype"
+                         match="${user.group}"
+                         replace="sys"
+                         byline="true"/>
+
+  </target>
+
+  <!-- Construct copyright file -->
+  <target name="copyright"  if="isSunOS" 
+		description="Create copyright file based on ${svr4.src.dir}/copyright" >
+	<echo message="Building copyright for ${pkg.name} pkg" />
+	<copy file="${svr4.src.dir}/copyright" todir="${svr4.meta.dir}"/>
+  </target>
+
+  <!-- Make package -->
+  <target name="pkgmk" if="isSunOS" 
+		description="Build ${pkg.name} package" >
+	<echo message="Building ${pkg.name} pkg" />
+	<echo message="Executing pkgmk -o -d ${svr4.dir} -r ${svr4.layout.dir} -f ${svr4.meta.dir}/prototype in ${svr4.layout.dir}" />
+	<exec executable="pkgmk" dir="${svr4.layout.dir}">
+	    <arg value="-o"/>
+	    <arg value="-d"/>
+	    <arg value="${svr4.dir}"/>
+	    <arg value="-r"/>
+	    <arg value="${svr4.layout.dir}"/>
+	    <arg value="-f"/>
+	    <arg value="${svr4.meta.dir}/prototype"/>
+	</exec>
+  </target>
+
+</project>
diff --git a/opends/build.xml b/opends/build.xml
index e95966c..d975784 100644
--- a/opends/build.xml
+++ b/opends/build.xml
@@ -2421,4 +2421,6 @@
     </javac>
   </target>
 
+  <import file="build-svr4.xml"/>
+
 </project>
diff --git a/opends/resource/bin/_client-script.sh b/opends/resource/bin/_client-script.sh
index 6c519d2..b1e4374 100755
--- a/opends/resource/bin/_client-script.sh
+++ b/opends/resource/bin/_client-script.sh
@@ -47,15 +47,6 @@
 INSTALL_ROOT=`pwd`
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 cd "${WORKING_DIR}"
 
 
diff --git a/opends/resource/bin/_mixed-script.sh b/opends/resource/bin/_mixed-script.sh
index 302ee0f..6f92453 100644
--- a/opends/resource/bin/_mixed-script.sh
+++ b/opends/resource/bin/_mixed-script.sh
@@ -48,16 +48,6 @@
 INSTALL_ROOT=`pwd`
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
-
 cd "${WORKING_DIR}"
 
 OLD_SCRIPT_NAME=${SCRIPT_NAME}
diff --git a/opends/resource/bin/_script-util.sh b/opends/resource/bin/_script-util.sh
index 9830484..c77e45c 100644
--- a/opends/resource/bin/_script-util.sh
+++ b/opends/resource/bin/_script-util.sh
@@ -170,17 +170,61 @@
   cd "`dirname "${0}"`"
   cd ..
   INSTALL_ROOT=`pwd`
-  if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-  then
-    INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-    export INSTANCE_ROOT
-  else
-    INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-    export INSTANCE_ROOT
-  fi
   cd "${WORKING_DIR}"
 fi
 
+if test "${INSTANCE_ROOT}" = ""
+then
+  for opt in `echo $*`
+  do
+	if [ $opt = "-V" ] || [ $opt = "--version" ] || 
+		[ $opt = "-H" ] || [ $opt = "--help" ] 
+	then
+		INSTANCE_ROOT="not_needed"
+	fi
+  done
+fi
+
+if test "${INSTANCE_ROOT}" = ""
+then
+  if [ -f ${INSTALL_ROOT}/configure ]
+  then
+    if [ -f /etc/opt/opends/instance.loc ]
+    then 
+      if [ "${SCRIPT_NAME}" = "configure" ]
+      then
+        echo "${INSTALL_ROOT}/configure has already be run. Exiting."
+        exit 0
+      fi	
+      INSTANCE_ROOT=`cat /etc/opt/opends/instance.loc`
+    else
+      if [ "${SCRIPT_NAME}" != "configure" ]
+      then
+        echo "No instance found. Run ${INSTALL_ROOT}/configure to create it."
+        exit 1
+      fi
+    fi
+  else
+    if [ -f ${INSTALL_ROOT}/instance.loc ]
+    then
+      if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
+      then
+         INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
+      else
+         INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
+      fi
+    else
+         INSTANCE_ROOT=${INSTALL_ROOT}
+    fi
+  fi
+  if [ -d "${INSTANCE_ROOT}" ]
+  then
+      cd ${INSTANCE_ROOT}
+      INSTANCE_ROOT=`pwd`
+      export INSTANCE_ROOT
+  fi
+fi
+
 if test "${SCRIPT_UTIL_CMD}" = "set-full-environment-and-test-java"
 then
   set_java_home_and_args
@@ -205,3 +249,48 @@
 then
   test_java
 fi
+
+current_user()
+{
+USER=`id`
+CURRENT_IFS=${IFS}
+IFS="()"
+set -- ${USER}
+echo $2
+IFS=${CURRENT_IFS}
+}
+
+if [ "${SCRIPT_NAME}" != "configure" ]
+then 
+  NO_CHECK=0
+  for opt in `echo $*`
+  do
+    # No check for --version or --help option
+	if [ $opt = "-V" ] || [ $opt = "--version" ] || 
+		[ $opt = "-H" ] || [ $opt = "--help" ]  ||
+		[ $opt = "-F" ] || [ $opt = "--fullversion" ] 
+	then
+		NO_CHECK=1
+	fi
+  done
+  if [ ${NO_CHECK} -eq 0 ]
+  then
+    set_classpath
+  # Check instance
+      CURRENT_USER="`current_user`"
+      if [ "${CHECK_VERSION}" = "yes" ]
+      then
+	  OPT_CHECK_VERSION="--checkVersion"
+      else
+	  OPT_CHECK_VERSION=""
+      fi
+  # Launch the CheckInstance process.
+      "${OPENDS_JAVA_BIN}" ${OPENDS_JAVA_ARGS} ${SCRIPT_NAME_ARG} -DINSTALL_ROOT=${INSTALL_ROOT} -DINSTANCE_ROOT=${INSTANCE_ROOT} org.opends.quicksetup.configurator.CheckInstance --currentUser ${CURRENT_USER} ${OPT_CHECK_VERSION}
+  # return part
+      RETURN_CODE=$?
+      if [ ${RETURN_CODE} -ne 0 ]
+      then
+	  exit ${RETURN_CODE}
+      fi
+  fi
+fi
diff --git a/opends/resource/bin/_server-script.sh b/opends/resource/bin/_server-script.sh
index 6adb9fa..d5ae72c 100755
--- a/opends/resource/bin/_server-script.sh
+++ b/opends/resource/bin/_server-script.sh
@@ -47,15 +47,6 @@
 INSTALL_ROOT=`pwd`
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
- INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 cd "${WORKING_DIR}"
 
 # Set environment variables
diff --git a/opends/resource/bin/make-ldif b/opends/resource/bin/make-ldif
index cca6e47..38a2c0e 100755
--- a/opends/resource/bin/make-ldif
+++ b/opends/resource/bin/make-ldif
@@ -42,17 +42,15 @@
 INSTALL_ROOT=`pwd`
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
- INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 cd "${WORKING_DIR}"
 
-SCRIPT_DIR=`dirname "${0}"`
+# Set environment variables
+.  "${INSTALL_ROOT}/lib/_script-util.sh"
+RETURN_CODE=$?
+if test ${RETURN_CODE} -ne 0
+then
+        exit ${RETURN_CODE}
+fi
+
 "${SCRIPT_DIR}/../lib/_server-script.sh" \
      --resourcePath "${INSTANCE_ROOT}/config/MakeLDIF" "${@}"
diff --git a/opends/resource/bin/start-ds b/opends/resource/bin/start-ds
index 075dcca..ffbfe97 100755
--- a/opends/resource/bin/start-ds
+++ b/opends/resource/bin/start-ds
@@ -38,24 +38,8 @@
 INSTALL_ROOT=`pwd`
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 cd "${WORKING_DIR}"
 
-# Specify the locations of important files that may be used when the server
-# is starting.
-CONFIG_FILE=${INSTANCE_ROOT}/config/config.ldif
-PID_FILE=${INSTANCE_ROOT}/logs/server.pid
-LOG_FILE=${INSTANCE_ROOT}/logs/server.out
-STARTING_FILE=${INSTANCE_ROOT}/logs/server.starting
-
 
 # Specify the script name so that it may be provided in command-line usage.
 SCRIPT_NAME="start-ds"
@@ -64,6 +48,8 @@
 # Set environment variables
 SCRIPT_UTIL_CMD=set-full-environment-and-test-java
 export SCRIPT_UTIL_CMD
+CHECK_VERSION=yes
+export CHECK_VERSION
 .  "${INSTALL_ROOT}/lib/_script-util.sh"
 RETURN_CODE=$?
 if test ${RETURN_CODE} -ne 0
@@ -71,6 +57,13 @@
 	exit ${RETURN_CODE}
 fi
 
+# Specify the locations of important files that may be used when the server
+# is starting.
+CONFIG_FILE=${INSTANCE_ROOT}/config/config.ldif
+PID_FILE=${INSTANCE_ROOT}/logs/server.pid
+LOG_FILE=${INSTANCE_ROOT}/logs/server.out
+STARTING_FILE=${INSTANCE_ROOT}/logs/server.starting
+
 
 # See if the provided set of arguments were sufficient for us to be able to
 # start the server or perform the requested operation.  An exit code of 99
diff --git a/opends/resource/bin/stop-ds b/opends/resource/bin/stop-ds
index 71e46a2..a316e5a 100755
--- a/opends/resource/bin/stop-ds
+++ b/opends/resource/bin/stop-ds
@@ -47,15 +47,6 @@
 INSTALL_ROOT=`pwd`
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 cd "${WORKING_DIR}"
 
 # We keep this values to reset the environment before calling start-ds.
diff --git a/opends/resource/configure b/opends/resource/configure
new file mode 100755
index 0000000..c70b134
--- /dev/null
+++ b/opends/resource/configure
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# by brackets "[]" replaced with your own identifying information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2006-2008 Sun Microsystems, Inc.
+
+
+# Capture the current working directory so that we can change to it later.
+# Then capture the location of this script and the Directory Server instance
+# root so that we can use them to create appropriate paths.
+WORKING_DIR=`pwd`
+
+cd "`dirname "${0}"`"
+SCRIPT_DIR=`pwd`
+
+INSTALL_ROOT=${SCRIPT_DIR}
+export INSTALL_ROOT
+
+SCRIPT_NAME=configure
+export SCRIPT_NAME
+
+cd "${WORKING_DIR}"
+
+# Set environment variables
+SCRIPT_UTIL_CMD=set-full-environment-and-test-java
+export SCRIPT_UTIL_CMD
+.  "${INSTALL_ROOT}/lib/_script-util.sh"
+RETURN_CODE=$?
+if test ${RETURN_CODE} -ne 0
+then
+  exit ${RETURN_CODE}
+fi
+
+# Launch the configure process.
+"${OPENDS_JAVA_BIN}" ${OPENDS_JAVA_ARGS} ${SCRIPT_NAME_ARG} -DINSTALL_ROOT=${INSTALL_ROOT} org.opends.quicksetup.configurator.Configurator "${@}"
+
+# return part
+RETURN_CODE=$?
+if test ${RETURN_CODE} -eq 50
+then
+  # Version info was on requested
+  exit 0
+else
+  exit ${RETURN_CODE}
+fi
diff --git a/opends/resource/setup b/opends/resource/setup
index f9ceae1..731baf4 100755
--- a/opends/resource/setup
+++ b/opends/resource/setup
@@ -37,15 +37,6 @@
 INSTALL_ROOT=${SCRIPT_DIR}
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 SCRIPT_NAME=setup
 export SCRIPT_NAME
 
diff --git a/opends/resource/uninstall b/opends/resource/uninstall
index f1e6ad5..ccab3d3 100644
--- a/opends/resource/uninstall
+++ b/opends/resource/uninstall
@@ -42,15 +42,6 @@
 INSTALL_ROOT=${SCRIPT_DIR}
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 cd "${WORKING_DIR}"
 
 # Set environment variables
diff --git a/opends/resource/upgrade b/opends/resource/upgrade
index 291439a..8bd3d9b 100644
--- a/opends/resource/upgrade
+++ b/opends/resource/upgrade
@@ -36,15 +36,6 @@
 INSTALL_ROOT=${SCRIPT_DIR}
 export INSTALL_ROOT
 
-if cat ${INSTALL_ROOT}/instance.loc | grep '^/' > /dev/null
-then
-  INSTANCE_ROOT=`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-else
-  INSTANCE_ROOT=${INSTALL_ROOT}/`cat ${INSTALL_ROOT}/instance.loc`
-  export INSTANCE_ROOT
-fi
-
 SCRIPT_NAME=upgrade
 export SCRIPT_NAME
 
diff --git a/opends/resource/upgrade_svr4 b/opends/resource/upgrade_svr4
new file mode 100755
index 0000000..eba37ea
--- /dev/null
+++ b/opends/resource/upgrade_svr4
@@ -0,0 +1,92 @@
+#!/bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License").  You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE
+# or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at
+# trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+# add the following below this CDDL HEADER, with the fields enclosed
+# by brackets "[]" replaced with your own identifying information:
+#      Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#      Copyright 2006-2008 Sun Microsystems, Inc.
+
+# Capture the current working directory so that we can change to it later.
+# Then capture the location of this script and the Directory Server instance
+# root so that we can use them to create appropriate paths.
+WORKING_DIR=`pwd`
+
+cd "`dirname "${0}"`"
+SCRIPT_DIR=`pwd`
+
+INSTALL_ROOT=${SCRIPT_DIR}
+export INSTALL_ROOT
+
+SCRIPT_NAME=upgrade
+export SCRIPT_NAME
+
+cd "${WORKING_DIR}"
+
+# Set java home
+SCRIPT_UTIL_CMD=set-java-home-and-args
+export SCRIPT_UTIL_CMD
+.  "${INSTALL_ROOT}/lib/_script-util.sh"
+RETURN_CODE=$?
+if test ${RETURN_CODE} -ne 0
+then
+  exit ${RETURN_CODE}
+fi
+
+# Set environment variables
+SCRIPT_UTIL_CMD=set-environment-vars
+export SCRIPT_UTIL_CMD
+.  "${INSTALL_ROOT}/lib/_script-util.sh"
+RETURN_CODE=$?
+if test ${RETURN_CODE} -ne 0
+then
+  exit ${RETURN_CODE}
+fi
+
+# Configure the appropriate CLASSPATH to test.
+#for JAR in ${INSTANCE_ROOT}/tmp/upgrade/lib/*.jar
+#do
+#  CLASSPATH=${CLASSPATH}:${JAR}
+#done
+CLASSPATH=${CLASSPATH}:${INSTANCE_ROOT}/classes
+for JAR in ${INSTALL_ROOT}/lib/*.jar
+do
+  CLASSPATH=${CLASSPATH}:${JAR}
+done
+export CLASSPATH
+
+# Test the java installation
+SCRIPT_UTIL_CMD=test-java
+export SCRIPT_UTIL_CMD
+.  "${INSTALL_ROOT}/lib/_script-util.sh"
+RETURN_CODE=$?
+if test ${RETURN_CODE} -ne 0
+then
+  exit ${RETURN_CODE}
+fi
+
+if [ -r "${INSTANCE_ROOT}/tmp/upgrade" ]
+then
+  rm -fr "${INSTANCE_ROOT}/tmp/upgrade"
+fi
+
+# Launch the upgrade process.
+"${OPENDS_JAVA_BIN}" ${OPENDS_JAVA_ARGS} -DINSTALL_ROOT=${INSTALL_ROOT} org.opends.quicksetup.upgrader.UpgradeSvr4Launcher "${@}"
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
index 9cbeabe..90d147a 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
@@ -371,8 +371,14 @@
     if (!f.isAbsolute())
     {
       f = new File(
-        DirectoryServer.getEnvironmentConfig().getSchemaDirectory(),
+        DirectoryServer.getEnvironmentConfig().getSchemaDirectory(false),
         schemaFile);
+      if (f == null || ! f.exists() || f.isDirectory())
+      {
+        f = new File(
+            DirectoryServer.getEnvironmentConfig().getSchemaDirectory(true),
+            schemaFile);
+      }
     }
     schemaFile = f.getAbsolutePath();
     return schemaFile;
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/SchemaTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/SchemaTask.java
index f7be01a..db299c8 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/SchemaTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/SchemaTask.java
@@ -77,15 +77,17 @@
     backendSet = new HashSet<String>();
     CommonSchemaElements element = getSchemaElement();
     schemaFile = element.getSchemaFile();
+    boolean userSchema = false ;
     if (schemaFile == null)
     {
       schemaFile = ConfigConstants.FILE_USER_SCHEMA_ELEMENTS;
+      userSchema = true;
     }
     File f = new File(schemaFile);
     if (!f.isAbsolute())
     {
       f = new File(
-        DirectoryServer.getEnvironmentConfig().getSchemaDirectory(),
+        DirectoryServer.getEnvironmentConfig().getSchemaDirectory(userSchema),
         schemaFile);
     }
     schemaFile = f.getAbsolutePath();
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 dc1f376..e84b802 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/JavaPropertiesPanel.java
@@ -761,11 +761,11 @@
    */
   private String getPropertiesFile()
   {
-    String configDir = Utils.getPath(
-        getInfo().getServerDescriptor().getInstallPath().getAbsolutePath(),
-        Installation.CONFIG_PATH_RELATIVE);
-    String propertiesFile = Utils.getPath(
-        configDir, Installation.DEFAULT_JAVA_PROPERTIES_FILE);
+    String installPath = getInfo().getServerDescriptor().
+      getInstallPath().getAbsolutePath();
+    String propertiesFile =  Utils.getPath(
+      Utilities.getInstanceRootDirectory(installPath).getAbsolutePath(),
+      Installation.RELATIVE_JAVA_PROPERTIES_FILE);
     return propertiesFile;
   }
 
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 7f9dd88..5d64d5e 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/SchemaLoader.java
@@ -60,10 +60,10 @@
     schema = DirectoryServer.getSchema().duplicate();
   }
 
-  private static String getSchemaDirectoryPath()
+  private static String getSchemaDirectoryPath(boolean userSchema)
   {
     File schemaDir =
-      DirectoryServer.getEnvironmentConfig().getSchemaDirectory();
+      DirectoryServer.getEnvironmentConfig().getSchemaDirectory(userSchema);
     if (schemaDir != null) {
       return schemaDir.getAbsolutePath();
     } else {
@@ -79,8 +79,6 @@
    */
   public void readSchema() throws ConfigException, InitializationException
   {
-    String schemaDirPath= getSchemaDirectoryPath();
-    File schemaDir = new File(schemaDirPath);
     String[] attrsToKeep = {
         ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC,
         ConfigConstants.ATTR_OBJECTCLASSES_LC,
@@ -126,6 +124,14 @@
     String[] fileNames = null;
     try
     {
+      String installPath  =
+        new File(DirectoryServer.getServerRoot()).getCanonicalPath();
+      String instancePath =
+        new File(DirectoryServer.getInstanceRoot()).getCanonicalPath();
+
+      // Load install directory schema
+      String schemaDirPath= getSchemaDirectoryPath(false);
+      File schemaDir = new File(schemaDirPath);
       if (schemaDirPath == null || ! schemaDir.exists())
       {
         Message message = ERR_CONFIG_SCHEMA_NO_SCHEMA_DIR.get(schemaDirPath);
@@ -137,10 +143,27 @@
           ERR_CONFIG_SCHEMA_DIR_NOT_DIRECTORY.get(schemaDirPath);
         throw new InitializationException(message);
       }
+      File[] schemaInstallDirFiles = schemaDir.listFiles();
+      File[] schemaInstanceDirFiles = null ;
+      int size = schemaInstallDirFiles.length;
 
-      File[] schemaDirFiles = schemaDir.listFiles();
-      ArrayList<String> fileList = new ArrayList<String>(schemaDirFiles.length);
-      for (File f : schemaDirFiles)
+      if (! installPath.equals(instancePath))
+      {
+        schemaDirPath= getSchemaDirectoryPath(true);
+        schemaDir = new File(schemaDirPath);
+        if (schemaDirPath != null
+            &&
+            schemaDir.exists()
+            &&
+            schemaDir.isDirectory())
+        {
+          schemaInstanceDirFiles = schemaDir.listFiles();
+          size += schemaInstanceDirFiles.length;
+        }
+      }
+
+      ArrayList<String> fileList = new ArrayList<String>(size);
+      for (File f : schemaInstallDirFiles)
       {
         if (f.isFile())
         {
@@ -148,6 +171,17 @@
         }
       }
 
+      if (schemaInstanceDirFiles != null)
+      {
+        for (File f : schemaInstanceDirFiles)
+        {
+          if (f.isFile())
+          {
+            fileList.add(f.getName());
+          }
+        }
+      }
+
       fileNames = new String[fileList.size()];
       fileList.toArray(fileNames);
       Arrays.sort(fileNames);
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 fd58eb5..320b5e3 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
@@ -38,9 +38,7 @@
 import java.awt.Window;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.text.CharacterIterator;
@@ -1536,59 +1534,8 @@
   {
     if (instanceRootDirectory == null)
     {
-      String instancePathFileName = installPath + File.separator +
-        "instance.loc";
-
-      File f = new File(instancePathFileName);
-      // look for <installPath>/instance.loc
-      if (! f.exists())
-      {
-        instanceRootDirectory = new File(installPath);
-        return instanceRootDirectory;
-      }
-
-      BufferedReader reader;
-      try
-      {
-        reader = new BufferedReader(new FileReader(instancePathFileName));
-      }
-      catch (Exception e)
-      {
-        instanceRootDirectory = new File(installPath);
-        return instanceRootDirectory;
-      }
-
-
-      // Read the first line and close the file.
-      String line;
-      try
-      {
-        line = reader.readLine();
-        File instanceLoc =  new File (line);
-        if (instanceLoc.isAbsolute())
-        {
-          instanceRootDirectory = instanceLoc ;
-          return instanceRootDirectory;
-        }
-        else
-        {
-          instanceRootDirectory =
-            new File(installPath + File.separator + instanceLoc.getPath());
-          return instanceRootDirectory;
-        }
-      }
-      catch (Exception e)
-      {
-        instanceRootDirectory = new File(installPath);
-        return instanceRootDirectory;
-      }
-      finally
-      {
-        try
-        {
-          reader.close();
-        } catch (Exception e) {}
-      }
+      instanceRootDirectory = new File(
+        Utils.getInstancePathFromClasspath(installPath));
     }
     return instanceRootDirectory;
   }
diff --git a/opends/src/messages/messages/backend.properties b/opends/src/messages/messages/backend.properties
index 826d89e..81335de 100644
--- a/opends/src/messages/messages/backend.properties
+++ b/opends/src/messages/messages/backend.properties
@@ -257,7 +257,7 @@
  schema files that were in place before the start of the restore process have \
  been preserved and are contained in the %s directory
 SEVERE_ERR_SCHEMA_RESTORE_CANNOT_CREATE_SCHEMA_DIRECTORY_79=Unable to restore \
- schema backup %s because an error occurred while attempting to create a new \
+ schema backup %s or % s because an error occurred while attempting to create a new \
  empty directory %s into which the files should be restored:  %s
 SEVERE_ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED_80=An error occurred that \
  prevented the schema backup from being properly restored.  The original \
diff --git a/opends/src/messages/messages/config.properties b/opends/src/messages/messages/config.properties
index 38acbca..55631a4 100644
--- a/opends/src/messages/messages/config.properties
+++ b/opends/src/messages/messages/config.properties
@@ -655,7 +655,7 @@
  Server schema definitions because the schema directory %s exists but is not a \
  directory
 SEVERE_ERR_CONFIG_SCHEMA_CANNOT_LIST_FILES_190=Unable to read the Directory \
- Server schema definitions from directory %s because an unexpected error \
+ Server schema definitions from directory %s or %s because an unexpected error \
  occurred while trying to list the files in that directory:  %s
 SEVERE_WARN_CONFIG_SCHEMA_CANNOT_OPEN_FILE_191=Schema configuration file %s \
  in directory %s cannot be parsed because an unexpected error occurred while \
diff --git a/opends/src/messages/messages/task.properties b/opends/src/messages/messages/task.properties
index ce3b4d6..41e73e7 100644
--- a/opends/src/messages/messages/task.properties
+++ b/opends/src/messages/messages/task.properties
@@ -60,10 +60,10 @@
  %s of task entry %s
 SEVERE_ERR_TASK_ADDSCHEMAFILE_NO_SUCH_FILE_6=Unable to add one or more files \
  to the server schema because the specified schema file %s does not exist in \
- schema directory %s
+ schema directories %s or %s
 SEVERE_ERR_TASK_ADDSCHEMAFILE_ERROR_CHECKING_FOR_FILE_7=Unable to add one or \
  more files to the server schema because an error occurred while attempting to \
- determine whether file %s exists in schema directory %s:  %s
+ determine whether file %s exists in schema directory %s or %s:  %s
 SEVERE_ERR_TASK_ADDSCHEMAFILE_ERROR_LOADING_SCHEMA_FILE_8=An error occurred \
  while attempting to load the contents of schema file %s into the server \
  schema:  %s
diff --git a/opends/src/messages/messages/tools.properties b/opends/src/messages/messages/tools.properties
index fa1950a..f86317e 100644
--- a/opends/src/messages/messages/tools.properties
+++ b/opends/src/messages/messages/tools.properties
@@ -2393,3 +2393,37 @@
  the Directory Server at %s on port %s. Check this port is an administration port
 SEVERE_ERR_PWPSTATE_CANNOT_CONNECT_SSL_1629=ERROR:  Cannot establish a connection to \
  the Directory Server at %s on port %s. Check this port is an administration port
+
+INFO_IPATH_PLACEHOLDER_1630={instancePath}
+INFO_CURRENT_USER_PLACEHOLDER_1631={currentUser}
+
+INFO_CONFIGURE_DESCRIPTION_IPATH_1632=Path where the instance will be located
+INFO_CONFIGURE_DESCRIPTION_USERNAME_1633=User name of the owner of the instance
+INFO_CONFIGURE_DESCRIPTION_GROUPNAME_1634=Group name of the owner of the instance
+INFO_CONFIGURE_USAGE_DESCRIPTION_1635=This utility sets the instance location
+SEVERE_ERR_CONFIGURE_NOT_DIRECTORY_1636=[%s] is not a directory. Only directories can \
+be used as {instancePath}
+SEVERE_ERR_CONFIGURE_DIRECTORY_NOT_EMPTY_1637=[%s] is not empty. Only empty directories can \
+be used as {instancePath}
+SEVERE_ERR_CONFIGURE_DIRECTORY_NOT_WRITABLE_1638=[%s] is not writable. Cannot create \
+Directory Server instance
+SEVERE_ERR_CONFIGURE_BAD_USER_NAME_1639=[%s] does not start with a letter. \
+Cannot be specified as {userName}
+SEVERE_ERR_CONFIGURE_GET_GROUP_ERROR_1640=Unable to retrieve group for [%s]. \
+Check that [%s] exists
+SEVERE_ERR_CONFIGURE_CHMOD_ERROR_1641=Unable to use [%s]/[%s] as {userName}/{groupName}. \
+Check that %s exists and belongs to %s
+SEVERE_ERR_CONFIGURE_CURRENT_USER_ERROR_1642=Unauthorized user. \
+Only user that can write [%s] can use this command
+
+INFO_CHECK_DESCRIPTION_1643=This utility checks version and owner of the instance
+INFO_CHECK_DESCRIPTION_CURRENT_USER_1644=Current user
+INFO_CHECK_DESCRIPTION_CHECK_VERSION_1645=Specifies that check on version should be done
+SEVERE_ERR_CHECK_USER_ERROR_1646=Current user is not owner of the instance. Only [%s] can run this command
+SEVERE_ERR_CHECK_VERSION_NOT_MATCH_1647=Data version does not match binaries. Run upgrade script to solve this
+
+
+SEVERE_ERR_CONFIGURE_USER_NOT_EXIST_1648=User [%s] does not exist
+SEVERE_ERR_CONFIGURE_OPENDSD_NOT_EXIST_1649=User/role [opendsd] does not exist. \
+Create it or use --userName option to specify another user
+
diff --git a/opends/src/quicksetup/org/opends/quicksetup/Installation.java b/opends/src/quicksetup/org/opends/quicksetup/Installation.java
index e032348..0deca50 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/Installation.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/Installation.java
@@ -77,6 +77,11 @@
     SetupUtils.LIBRARIES_PATH_RELATIVE;
 
   /**
+   * The relative path where customer classes are.
+   */
+  public static final String CLASSES_PATH_RELATIVE = "classes";
+
+  /**
    * The relative path where the database files are.
    */
   public static final String DATABASES_PATH_RELATIVE = "db";
@@ -143,10 +148,32 @@
     CONFIG_PATH_RELATIVE+File.separator+"tools.properties";
 
   /**
+   * The path to the default instance.
+   */
+  public static final String DEFAULT_INSTANCE_PATH = "/var/opt/opends";
+
+  /**
    * The relative path to the instance.loc file.
    */
   public static final String INSTANCE_LOCATION_PATH_RELATIVE =
     "instance.loc";
+
+  /**
+   * The path to the instance.loc file.
+   */
+  public static final String INSTANCE_LOCATION_PATH = "/etc/opt/opends/" +
+    INSTANCE_LOCATION_PATH_RELATIVE;
+
+  /**
+   * The relative path to tmpl_instance.
+   */
+  public static final String TMPL_INSTANCE_RELATIVE_PATH = "tmpl_instance";
+
+  /**
+   * The relative path to buildinfo file.
+   */
+  public static final String BUILDINFO_RELATIVE_PATH = "buildinfo";
+
   /**
    * The UNIX setup script file name.
    */
@@ -178,6 +205,11 @@
   public static final String WINDOWS_UPGRADE_FILE_NAME = "upgrade.bat";
 
   /**
+   * The UNIX configure script file name.
+   */
+  public static final String UNIX_CONFIGURE_FILE_NAME = "configure";
+
+  /**
    * Newly upgraded Windows upgrade batch file name.  When the upgrade
    * batch file requires upgrade it is not done during execution of the
    * upgrade utility itself since replacing a running script on Windows
@@ -402,6 +434,8 @@
 
   private BuildInformation buildInformation;
 
+  private BuildInformation instanceInformation;
+
   /**
    * Indicates if the install and instance are in the same directory.
    * @return true if the install and instance are in the same directory.
@@ -469,6 +503,21 @@
   }
 
   /**
+   * Gets the directory of the OpenDS template instance.
+   *
+   * @return File object representing the top level directory of
+   *         and OpenDS installation
+   */
+  public File getTmplInstanceDirectory() {
+    File f = new File(getRootDirectory().getAbsolutePath() +
+             File.separator + TMPL_INSTANCE_RELATIVE_PATH );
+    if (f.exists())
+        return f;
+    else
+        return getInstanceDirectory();
+  }
+
+  /**
    * Sets the root directory of this installation.
    *
    * @param rootDirectory File of this installation
@@ -605,7 +654,7 @@
    * @return the path to the tools properties file.
    */
   public File getToolsPropertiesFile() {
-    return new File(getRootDirectory(), TOOLS_PROPERTIES);
+    return new File(getTmplInstanceDirectory(), TOOLS_PROPERTIES);
   }
 
   /**
@@ -614,7 +663,8 @@
    * @return the path to the set-java-home file.
    */
   public File getSetJavaHomeFile() {
-    return new File(getLibrariesDirectory(),
+    return new File(getInstanceDirectory().getAbsolutePath() + File.separator +
+            LIBRARIES_PATH_RELATIVE,
         Utils.isWindows()?SET_JAVA_PROPERTIES_FILE_WINDOWS :
           SET_JAVA_PROPERTIES_FILE_UNIX);
   }
@@ -642,10 +692,42 @@
    */
   public File getBaseSchemaFile() throws ApplicationException {
     return new File(getConfigurationUpgradeDirectory(),
+                  "schema.ldif." + getInstanceSvnRev().toString());
+  }
+
+  /**
+   * Creates a File object representing
+   * tmpl_instance/config/upgrade/schema.ldif.current.
+   *
+   * @return File object representing
+   *  tmpl_instance/config/upgrade/schema.ldif.current
+   * @throws ApplicationException if there was a problem determining the
+   *                             svn revision number
+   */
+  public File getTemplSchemaFile() throws ApplicationException {
+    return new File(getTmplInstanceDirectory().getAbsolutePath() +
+                  File.separator + CONFIG_PATH_RELATIVE +
+                  File.separator + UPGRADE_PATH,
                   "schema.ldif." + getSvnRev().toString());
   }
 
   /**
+   * Creates a File object representing
+   * tmpl_instance/config/upgrade/config.ldif.current.
+   *
+   * @return File object representing
+   *  tmpl_instance/config/upgrade/config.ldif.current
+   * @throws ApplicationException if there was a problem determining the
+   *                             svn revision number
+   */
+  public File getTemplConfigFile() throws ApplicationException {
+    return new File(getTmplInstanceDirectory().getAbsolutePath() +
+                  File.separator + CONFIG_PATH_RELATIVE +
+                  File.separator + UPGRADE_PATH,
+                  BASE_CONFIG_FILE_PREFIX + getSvnRev().toString());
+  }
+
+  /**
    * Creates a File object representing config/upgrade/schema.ldif.current
    * which the server creates the first time it starts if there are schema
    * customizations.
@@ -656,7 +738,7 @@
    */
   public File getBaseConfigurationFile() throws ApplicationException {
     return new File(getConfigurationUpgradeDirectory(),
-            BASE_CONFIG_FILE_PREFIX + getSvnRev().toString());
+            BASE_CONFIG_FILE_PREFIX + getInstanceSvnRev().toString());
   }
 
   /**
@@ -672,6 +754,18 @@
   }
 
   /**
+   * Gets the SVN revision number of the instance.
+   *
+   * @return Integer representing the svn number
+   * @throws ApplicationException if for some reason the number could not
+   *                             be determined
+   */
+  public Integer getInstanceSvnRev() throws ApplicationException {
+    BuildInformation bi = getInstanceBuildInformation();
+    return bi.getRevisionNumber();
+  }
+
+  /**
    * Returns the path to the configuration file of the directory server.  Note
    * that this method assumes that this code is being run locally.
    *
@@ -688,7 +782,7 @@
    * @return the path of the ADS file of the directory server.
    */
   public File getADSBackendFile() {
-    return new File(getRootDirectory(), ADSContext.getAdminLDIFFile());
+    return new File(getTmplInstanceDirectory(), ADSContext.getAdminLDIFFile());
   }
 
   /**
@@ -737,6 +831,15 @@
   }
 
   /**
+   * Returns the path to the config files under the instance path.
+   *
+   * @return the path to the config files under the instance path.
+   */
+  public File getInstallConfigurationDirectory() {
+    return new File(getRootDirectory(), CONFIG_PATH_RELATIVE);
+  }
+
+  /**
    * Returns the path to the log files under the install path.
    *
    * @return the path to the log files under the install path.
@@ -986,11 +1089,54 @@
   }
 
   /**
-   * {@inheritDoc}
+   * Gets information about the build that was used to produce the
+   * instance.
+   * @return BuildInformation object describing this instance
    */
-  @Override
-  public String toString() {
-    return Utils.getPath(rootDirectory);
+  public BuildInformation getInstanceBuildInformation() {
+    return getInstanceBuildInformation(true);
   }
 
-}
+  /**
+   * Gets information about the build that was used to produce the
+   * instance.
+   * @param useCachedVersion where true indicates that a potentially cached
+   * version of the build information is acceptable for use; false indicates
+   * the build information will be created from scratch which is potentially
+   * time consuming
+   * @return BuildInformation object describing this instance
+   */
+  public BuildInformation
+          getInstanceBuildInformation(boolean useCachedVersion) {
+    if (instanceInformation == null || !useCachedVersion) {
+      try {
+        File bif = new File(getConfigurationDirectory(),
+          BUILDINFO_RELATIVE_PATH);
+
+        if (bif.exists()) {
+          BufferedReader reader = new BufferedReader(new FileReader(bif));
+
+          // Read the first line and close the file.
+          String line;
+          try {
+            line = reader.readLine();
+            instanceInformation = BuildInformation.fromBuildString(line);
+          } finally {
+            try {
+              reader.close();
+            } catch (Exception e) {
+            }
+          }
+        } else {
+          return getBuildInformation();
+        }
+      } catch (Exception e) {
+        LOG.log(Level.SEVERE, "error getting build information for " +
+                "current instance", e);
+      }
+    }
+    return instanceInformation;
+
+  }
+
+  }
diff --git a/opends/src/quicksetup/org/opends/quicksetup/configurator/CheckInstance.java b/opends/src/quicksetup/org/opends/quicksetup/configurator/CheckInstance.java
new file mode 100644
index 0000000..250ccd7
--- /dev/null
+++ b/opends/src/quicksetup/org/opends/quicksetup/configurator/CheckInstance.java
@@ -0,0 +1,238 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2006-2008 Sun Microsystems, Inc.
+ */
+package org.opends.quicksetup.configurator;
+
+import java.io.File;
+import java.io.IOException;
+import org.opends.quicksetup.ReturnCode;
+import org.opends.server.util.args.ArgumentException;
+import org.opends.server.util.args.ArgumentParser;
+import org.opends.server.util.args.StringArgument;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.opends.messages.Message;
+import org.opends.quicksetup.ApplicationException;
+import org.opends.quicksetup.Installation;
+import org.opends.server.util.args.BooleanArgument;
+import java.util.StringTokenizer;
+import org.opends.quicksetup.BuildInformation;
+import org.opends.quicksetup.QuickSetupLog;
+
+import static org.opends.messages.ToolMessages.*;
+import static org.opends.server.tools.ToolConstants.*;
+import static org.opends.messages.QuickSetupMessages.*;
+
+/**
+ * This class is called by the configure command line to move the default
+ * Directory Server instance.
+ */
+public class CheckInstance {
+
+  static private final Logger LOG = Logger.getLogger(
+          CheckInstance.class.getName());
+
+  /** Prefix for log files. */
+  static public final String LOG_FILE_PREFIX = "opends-checkinstance-";
+
+  private static String installRootFromSystem;
+  private static String instanceRootFromSystem;
+  /**
+   * The user that launches this application.
+   */
+  public static final String CURRENT_USER_OPTION_LONG = "currentUser";
+  /**
+   * The value for the short option 'currentUser'.
+   */
+  public static final Character CURRENT_USER_OPTION_SHORT = null;
+  /**
+   * Should version be verified.
+   */
+  public static final String CHECK_VERSION_OPTION_LONG = "checkVersion";
+  /**
+   * The value for the short option 'checkVersion'.
+   */
+  public static final Character CHECK_VERSION_OPTION_SHORT = null;
+  private static StringArgument currentUserArg;
+  private static BooleanArgument checkVersionArg;
+  private static String currentUser;
+  private static String instanceOwner;
+  private static int SUCCESS = 0;
+  private static int ARGS_ERROR = 1;
+  private static int USER_ERROR = 2;
+  private static int VERSION_ERROR = 3;
+
+  /**
+   * The main method which is called by the configure command lines.
+   *
+   * @param args the arguments passed by the command line.
+   */
+  public static void main(String[] args) {
+
+    try {
+      QuickSetupLog.initLogFileHandler(
+              File.createTempFile(LOG_FILE_PREFIX,
+                      QuickSetupLog.LOG_FILE_SUFFIX));
+    } catch (Throwable t) {
+      System.err.println(INFO_ERROR_INITIALIZING_LOG.get());
+      t.printStackTrace();
+    }
+
+    // Create the command-line argument parser for use with this program.
+    Message toolDescription = INFO_CHECK_DESCRIPTION.get();
+    ArgumentParser argParser =
+            new ArgumentParser(CheckInstance.class.getName(),
+            toolDescription, false);
+
+
+    installRootFromSystem = System.getProperty("INSTALL_ROOT");
+    if (installRootFromSystem == null) {
+      System.err.println("INSTALL_ROOT property not specified");
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+    instanceRootFromSystem = System.getProperty("INSTANCE_ROOT");
+    if (instanceRootFromSystem == null) {
+      System.err.println("INSTANCE_ROOT property not specified");
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+    // Initialize all the command-line argument types and register them with the
+    // parser.
+    try {
+      currentUserArg = new StringArgument(CURRENT_USER_OPTION_LONG,
+              CURRENT_USER_OPTION_SHORT,
+              CURRENT_USER_OPTION_LONG,
+              true, true,
+              INFO_CURRENT_USER_PLACEHOLDER.get(),
+              INFO_CHECK_DESCRIPTION_CURRENT_USER.get());
+      argParser.addArgument(currentUserArg);
+      checkVersionArg = new BooleanArgument(CHECK_VERSION_OPTION_LONG,
+              CHECK_VERSION_OPTION_SHORT,
+              CHECK_VERSION_OPTION_LONG,
+              INFO_CHECK_DESCRIPTION_CHECK_VERSION.get());
+      argParser.addArgument(checkVersionArg);
+    } catch (ArgumentException ae) {
+      System.err.println(ae.getMessageObject());
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+
+    // Parse the command-line arguments provided to this program.
+    try {
+      argParser.parseArguments(args);
+    } catch (ArgumentException ae) {
+      System.err.println(ae.getMessageObject());
+      System.exit(ARGS_ERROR);
+    }
+
+    // Check user
+    Installation installation = new Installation(installRootFromSystem,
+            instanceRootFromSystem);
+    File conf = installation.getCurrentConfigurationFile();
+    String cmd = null;
+    Process proc = null;
+    int exit = 0;
+
+    InputStreamReader reader = null;
+    int c;
+    StringBuffer sb = new StringBuffer();
+    cmd = "ls -l " + conf.getAbsolutePath();
+    try {
+      proc = Runtime.getRuntime().exec(cmd);
+      proc.waitFor();
+      reader = new InputStreamReader(proc.getInputStream());
+      while (((c = reader.read()) != -1)) {
+        sb.append((char) c);
+      }
+      exit = proc.exitValue();
+      if (exit != 0) {
+        LOG.log(Level.FINEST, cmd + " error= " + exit);
+        System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+      }
+    } catch (InterruptedException ex) {
+      LOG.log(Level.SEVERE, "InterruptedException" + ex.getMessage());
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    } catch (IOException ex) {
+      LOG.log(Level.SEVERE, "IOException" + ex.getMessage() );
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+    LOG.log(Level.FINEST, cmd + " returns [" + sb.toString() + "]");
+    StringTokenizer tok = new StringTokenizer(sb.toString());
+    if (tok.hasMoreTokens()) {
+      // access rights
+      tok.nextToken();
+      if (tok.hasMoreTokens()) {
+        // inode
+        tok.nextToken();
+        if (tok.hasMoreTokens()) {
+          instanceOwner = tok.nextToken();
+          LOG.log(Level.FINEST, "instanceOwner=[" + instanceOwner + "]");
+        } else {
+          LOG.log(Level.SEVERE, "no instanceOwner");
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+      } else {
+        LOG.log(Level.SEVERE, "no inode");
+        System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+      }
+    } else {
+      LOG.log(Level.SEVERE, "no access rights");
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+
+    currentUser = currentUserArg.getValue();
+    LOG.log(Level.FINEST, "currentUser=[" + currentUser + "]");
+
+    if ((currentUser != null) && !(currentUser.equals(instanceOwner))) {
+      System.err.println(ERR_CHECK_USER_ERROR.get(instanceOwner));
+      System.exit(USER_ERROR);
+    }
+
+
+    // Check version
+    if (checkVersionArg.isPresent()) {
+      try {
+        BuildInformation installBi = installation.getBuildInformation();
+        BuildInformation instanceBi = installation.
+                getInstanceBuildInformation();
+        if (!installBi.equals(instanceBi)) {
+          System.err.println(ERR_CHECK_VERSION_NOT_MATCH.get());
+          System.exit(VERSION_ERROR);
+        }
+      } catch (ApplicationException ae) {
+        System.err.println(ae.getMessageObject());
+        System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+      }
+    } else {
+      LOG.log(Level.FINEST, "checkVersion not specified");
+    }
+    System.exit(SUCCESS);
+
+  }
+}
diff --git a/opends/src/quicksetup/org/opends/quicksetup/configurator/Configurator.java b/opends/src/quicksetup/org/opends/quicksetup/configurator/Configurator.java
new file mode 100644
index 0000000..a20ebcc
--- /dev/null
+++ b/opends/src/quicksetup/org/opends/quicksetup/configurator/Configurator.java
@@ -0,0 +1,429 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2006-2008 Sun Microsystems, Inc.
+ */
+package org.opends.quicksetup.configurator;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import org.opends.quicksetup.ReturnCode;
+import org.opends.server.util.args.ArgumentException;
+import org.opends.server.util.args.ArgumentParser;
+import org.opends.server.util.args.StringArgument;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.opends.messages.Message;
+import org.opends.quicksetup.ApplicationException;
+import org.opends.quicksetup.CliApplication;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.Launcher;
+import org.opends.quicksetup.util.Utils;
+import org.opends.server.util.ServerConstants;
+import org.opends.server.util.args.BooleanArgument;
+import org.opends.quicksetup.QuickSetupLog;
+
+import static org.opends.messages.ToolMessages.*;
+import static org.opends.server.tools.ToolConstants.*;
+import static org.opends.messages.QuickSetupMessages.*;
+
+/**
+ * This class is called by the configure command line to move the default
+ * Directory Server instance.
+ */
+public class Configurator extends Launcher {
+
+  static private final Logger LOG = Logger.getLogger(
+    Configurator.class.getName());
+
+  /** Prefix for log files. */
+  static public final String LOG_FILE_PREFIX = "opends-configure-";
+
+  private String installRootFromSystem;
+
+  /**
+   * The path where to create the instance.
+   */
+  public static final String IPATH_OPTION_LONG = "instancePath";
+  /**
+   * The value for the short option 'instancePath'.
+   */
+  public static final Character IPATH_OPTION_SHORT = null;
+  /**
+   * The name of the owner of the instance.
+   */
+  public static final String USERNAME_OPTION_LONG = "userName";
+  /**
+   * The value for the short option 'userName'.
+   */
+  public static final Character USERNAME_OPTION_SHORT = null;
+  /**
+   * The group of the owner of the instance.
+   */
+  public static final String GROUPNAME_OPTION_LONG = "groupName";
+  /**
+   * The value for the short option 'groupName'.
+   */
+  public static final Character GROUPNAME_OPTION_SHORT = null;
+  private ArgumentParser argParser;
+  private StringArgument iPath;
+  private StringArgument username;
+  private StringArgument groupname;
+  private BooleanArgument showUsage;
+  private String user;
+  private String group;
+  private String ipath;
+
+  /**
+   * The main method which is called by the configure command lines.
+   *
+   * @param args the arguments passed by the command line.
+   */
+  public static void main(String[] args) {
+
+    try {
+      QuickSetupLog.initLogFileHandler(
+              File.createTempFile(LOG_FILE_PREFIX,
+                      QuickSetupLog.LOG_FILE_SUFFIX));
+    } catch (Throwable t) {
+      System.err.println(INFO_ERROR_INITIALIZING_LOG.get());
+      t.printStackTrace();
+    }
+
+    try {
+      Configurator configurator;
+
+      configurator = new Configurator(args);
+      configurator.parseArgs(args);
+      configurator.configure();
+
+    } catch (ApplicationException ae) {
+      LOG.log(Level.SEVERE, "Error during config: " + ae.getMessageObject());
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+  }
+
+  private void parseArgs(String[] args) {
+
+    String cmd = null;
+    Process proc = null;
+    int exit = 0;
+
+    try {
+      argParser.parseArguments(args);
+
+      if (argParser.usageOrVersionDisplayed()) {
+        System.exit(ReturnCode.PRINT_USAGE.getReturnCode());
+      }
+
+      /* Check instancePath */
+      if (iPath.hasValue()) {
+        ipath  = iPath.getValue();
+      } else {
+        ipath = Installation.DEFAULT_INSTANCE_PATH;
+      }
+      File f = new File(ipath);
+      if (f.exists()) {
+        if (!f.isDirectory()) {
+          System.err.println(
+            ERR_CONFIGURE_NOT_DIRECTORY.get(ipath));
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+        File[] l = f.listFiles();
+        if (l.length != 0) {
+          System.err.println(
+            ERR_CONFIGURE_DIRECTORY_NOT_EMPTY.get(ipath));
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+        if (!f.canWrite()) {
+          System.err.println(
+            ERR_CONFIGURE_DIRECTORY_NOT_WRITABLE.get(ipath));
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+
+      } else {
+        File parent = f;
+
+        while ((parent != null) && !parent.exists()) {
+          parent = parent.getParentFile();
+        }
+        if (parent != null) {
+          /* Checks f is writable */
+          if (!parent.canWrite()) {
+            System.err.println(
+              ERR_CONFIGURE_DIRECTORY_NOT_WRITABLE.get(parent.getName()));
+            System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+          }
+        }
+        /* Create subdirs */
+        f.mkdirs();
+      }
+
+      /* Check userName/groupName by creating a temporary file and try to
+       * set the owner
+       */
+      File temp = File.createTempFile(Configurator.class.getName(), null);
+      if (username.hasValue()) {
+        user = username.getValue();
+        if (! Character.isLetter(user.charAt(0))) {
+          System.err.println(ERR_CONFIGURE_BAD_USER_NAME.get(user));
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+        cmd = "id " + user;
+        proc = Runtime.getRuntime().exec(cmd);
+        proc.waitFor();
+        exit = proc.exitValue();
+        if (exit != 0) {
+          LOG.log(Level.SEVERE, "[" + cmd + "] returns " + exit);
+          System.err.println(ERR_CONFIGURE_USER_NOT_EXIST.get(user));
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+      } else {
+        user = "opendsd";
+        cmd = "id " + user;
+        proc = Runtime.getRuntime().exec(cmd);
+        proc.waitFor();
+        exit = proc.exitValue();
+        if (exit != 0) {
+          LOG.log(Level.SEVERE, "[" + cmd + "] returns " + exit);
+          System.err.println(ERR_CONFIGURE_OPENDSD_NOT_EXIST.get());
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+      }
+
+      if (!groupname.hasValue()) {
+        InputStreamReader reader = null;
+        int c;
+        StringBuffer sb = new StringBuffer();
+        cmd = "groups " + user;
+        proc = Runtime.getRuntime().exec(cmd);
+        proc.waitFor();
+        reader = new InputStreamReader(proc.getInputStream());
+        while (((c = reader.read()) != -1) && (c != ' ')) {
+          sb.append((char) c);
+        }
+        exit = proc.exitValue();
+        if (exit != 0) {
+          LOG.log(Level.SEVERE, "[" + cmd + "] returns " + exit);
+          System.err.println(ERR_CONFIGURE_GET_GROUP_ERROR.get(user, user));
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+        group = sb.toString();
+      } else {
+        group = groupname.getValue();
+      }
+
+      cmd = "chown " + user + ":" + group + " " + temp.getPath();
+      proc = Runtime.getRuntime().exec(cmd);
+      proc.waitFor();
+      exit = proc.exitValue();
+      if (exit != 0) {
+        LOG.log(Level.SEVERE, "[" + cmd + "] returns " + exit);
+        System.err.println(ERR_CONFIGURE_CHMOD_ERROR.get(user, group,
+          user, group));
+        System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+      }
+      temp.delete();
+
+    } catch (InterruptedException ex) {
+      System.err.println(ex.getLocalizedMessage());
+      printUsage(false);
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    } catch (IOException ex) {
+      System.err.println(ex.getLocalizedMessage());
+      printUsage(false);
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    } catch (ArgumentException ae) {
+      System.err.println(ae.getMessageObject());
+      printUsage(false);
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+  }
+
+  private void configure() throws ApplicationException {
+    File templ_dir = new File(installRootFromSystem + "/" +
+            Installation.TMPL_INSTANCE_RELATIVE_PATH);
+
+    String cmd = null;
+    Process proc = null;
+    int exit = 0;
+    try {
+      /* Copy template instance */
+      File[] l = templ_dir.listFiles();
+      for (int i = 0; i < l.length; i++) {
+        File subf = l[i];
+
+        if (subf.isDirectory()) {
+          cmd = "cp -R " + l[i].getAbsolutePath() + " " + ipath;
+        } else {
+          cmd = "cp " + l[i].getAbsolutePath() + " " + ipath;
+        }
+        proc = Runtime.getRuntime().exec(cmd);
+        proc.waitFor();
+        exit = proc.exitValue();
+        if (exit != 0) {
+          LOG.log(Level.SEVERE, "[" + cmd + "] returns " + exit);
+          System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+        }
+      }
+
+      /* Change owner */
+      cmd = "chown -R " + user + ":" + group + " " + ipath;
+      proc = Runtime.getRuntime().exec(cmd);
+      proc.waitFor();
+      exit = proc.exitValue();
+      if (exit != 0) {
+        LOG.log(Level.SEVERE, "[" + cmd + "] returns " + exit);
+        System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+      }
+
+      /* Create instance.loc */
+      File iloc = new File(Installation.INSTANCE_LOCATION_PATH);
+      iloc.getParentFile().mkdirs();
+      iloc.createNewFile();
+      FileWriter instanceLoc = new FileWriter(iloc);
+      instanceLoc.write(ipath);
+      instanceLoc.close();
+
+    } catch (IOException ex) {
+      System.err.println(ex.getLocalizedMessage());
+      printUsage(false);
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    } catch (InterruptedException ex) {
+      System.err.println(ex.getLocalizedMessage());
+      printUsage(false);
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+  }
+
+  private Configurator(String[] args) {
+    super(args);
+
+    String scriptName = "configure";
+
+    if (Utils.isWindows()) {
+      System.err.println("Not supported platform: Windows");
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    } else {
+      scriptName = Installation.UNIX_CONFIGURE_FILE_NAME;
+    }
+    if (System.getProperty(ServerConstants.PROPERTY_SCRIPT_NAME) == null) {
+      System.setProperty(ServerConstants.PROPERTY_SCRIPT_NAME, scriptName);
+    }
+
+    installRootFromSystem = System.getProperty("INSTALL_ROOT");
+
+    if (installRootFromSystem == null) {
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+
+    argParser = new ArgumentParser(getClass().getName(),
+                 INFO_CONFIGURE_USAGE_DESCRIPTION.get(), false);
+
+
+    try {
+      iPath = new StringArgument(
+        IPATH_OPTION_LONG,
+        IPATH_OPTION_SHORT,
+        IPATH_OPTION_LONG,
+        false, true,
+        INFO_IPATH_PLACEHOLDER.get(),
+        INFO_CONFIGURE_DESCRIPTION_IPATH.get());
+      argParser.addArgument(iPath);
+
+      username =
+        new StringArgument(
+          USERNAME_OPTION_LONG,
+          USERNAME_OPTION_SHORT,
+          USERNAME_OPTION_LONG,
+          false, true,
+          INFO_USER_NAME_PLACEHOLDER.get(),
+          INFO_CONFIGURE_DESCRIPTION_USERNAME.get());
+      argParser.addArgument(username);
+
+      groupname =
+        new StringArgument(
+          GROUPNAME_OPTION_LONG,
+          GROUPNAME_OPTION_SHORT,
+          GROUPNAME_OPTION_LONG,
+          false, true,
+          INFO_GROUPNAME_PLACEHOLDER.get(),
+          INFO_CONFIGURE_DESCRIPTION_GROUPNAME.get());
+      argParser.addArgument(groupname);
+
+      showUsage = new BooleanArgument(
+        "showusage",
+        OPTION_SHORT_HELP,
+        OPTION_LONG_HELP,
+        INFO_DESCRIPTION_USAGE.get());
+      argParser.addArgument(showUsage);
+      argParser.setUsageArgument(showUsage);
+
+    } catch (ArgumentException ae) {
+      System.err.println(ae.getMessageObject());
+      printUsage(false);
+      System.exit(ReturnCode.APPLICATION_ERROR.getReturnCode());
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected void willLaunchGui() {
+    return;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected void guiLaunchFailed(String logFilePath) {
+    return;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected CliApplication createCliApplication() {
+    return null;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  protected Message getFrameTitle() {
+    return null;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public ArgumentParser getArgumentParser() {
+    return argParser;
+  }
+}
+
diff --git a/opends/src/quicksetup/org/opends/quicksetup/configurator/package-info.java b/opends/src/quicksetup/org/opends/quicksetup/configurator/package-info.java
new file mode 100644
index 0000000..9483889
--- /dev/null
+++ b/opends/src/quicksetup/org/opends/quicksetup/configurator/package-info.java
@@ -0,0 +1,31 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2008 Sun Microsystems, Inc.
+ */
+
+/**
+ * Defines the specific classes that are used by the configurator.
+ */
+package org.opends.quicksetup.configurator;
diff --git a/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java b/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
index a055d8a..ec3a9a6 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
@@ -806,7 +806,8 @@
       writer.close();
     }
     String destinationFile;
-    String libDir = Utils.getPath(installPath,
+    String libDir = Utils.getPath(Utils.
+            getInstancePathFromClasspath(installPath),
         Installation.LIBRARIES_PATH_RELATIVE);
     if (Utils.isWindows())
     {
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeSvr4Launcher.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeSvr4Launcher.java
new file mode 100644
index 0000000..2eb2c5b
--- /dev/null
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgradeSvr4Launcher.java
@@ -0,0 +1,196 @@
+/*
+ * 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 2007-2008 Sun Microsystems, Inc.
+ */
+
+package org.opends.quicksetup.upgrader;
+
+import static org.opends.messages.QuickSetupMessages.*;
+
+import static org.opends.messages.ToolMessages.*;
+import static org.opends.server.tools.ToolConstants.*;
+
+import org.opends.quicksetup.CliApplication;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.QuickSetupLog;
+import org.opends.quicksetup.ReturnCode;
+
+import org.opends.quicksetup.util.Utils;
+import org.opends.server.util.ServerConstants;
+import org.opends.server.util.args.ArgumentParser;
+import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.args.ArgumentException;
+import org.opends.server.util.args.StringArgument;
+
+import java.util.logging.Logger;
+import java.io.File;
+
+/**
+ * This class is called by the upgrade and upgrade.bat
+ * command line utilities to launch an upgrade process.
+ */
+public class UpgradeSvr4Launcher extends UpgradeLauncher {
+
+  static private final Logger LOG =
+          Logger.getLogger(UpgradeSvr4Launcher.class.getName());
+
+  /**
+   * The main method which is called by the setup command lines.
+   *
+   * @param args the arguments passed by the command lines.
+   */
+  public static void main(String[] args) {
+    try {
+      QuickSetupLog.initLogFileHandler(
+              File.createTempFile(LOG_FILE_PREFIX,
+                      QuickSetupLog.LOG_FILE_SUFFIX));
+    } catch (Throwable t) {
+      System.err.println(INFO_ERROR_INITIALIZING_LOG.get());
+      t.printStackTrace();
+    }
+    new UpgradeSvr4Launcher(args).launch();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected CliApplication createCliApplication() {
+   return new UpgraderSvr4();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void willLaunchGui() {
+    System.out.println(INFO_UPGRADE_LAUNCHER_LAUNCHING_GUI.get());
+    System.setProperty("org.opends.quicksetup.Application.class",
+            "org.opends.quicksetup.upgrader.UpgraderSvr4");
+  }
+
+  private ArgumentParser argParser;
+
+  private BooleanArgument showUsage;
+  private BooleanArgument quiet;
+  private BooleanArgument noPrompt;
+  private BooleanArgument verbose;
+  private BooleanArgument revertMostRecent;
+  private StringArgument reversionArchive;
+
+
+  /**
+   * Creates an instance.
+   *
+   * @param args specified on command line
+   */
+  protected UpgradeSvr4Launcher(String[] args) {
+    super(args);
+
+    String scriptName;
+    if (Utils.isWindows()) {
+      scriptName = Installation.WINDOWS_UPGRADE_FILE_NAME;
+    } else {
+      scriptName = Installation.UNIX_UPGRADE_FILE_NAME;
+    }
+    if (System.getProperty(ServerConstants.PROPERTY_SCRIPT_NAME) == null)
+    {
+      System.setProperty(ServerConstants.PROPERTY_SCRIPT_NAME, scriptName);
+    }
+
+    argParser = new ArgumentParser(getClass().getName(),
+        INFO_UPGRADE_LAUNCHER_USAGE_DESCRIPTION.get(), false);
+    try
+    {
+      revertMostRecent = new BooleanArgument(
+              REVERT_MOST_RECENT_OPTION_LONG,
+              REVERT_MOST_RECENT_OPTION_SHORT,
+              REVERT_MOST_RECENT_OPTION_LONG,
+              INFO_REVERT_DESCRIPTION_RECENT.get());
+      argParser.addArgument(revertMostRecent);
+
+      reversionArchive = new StringArgument(
+              REVERT_ARCHIVE_OPTION_LONG,
+              REVERT_ARCHIVE_OPTION_SHORT,
+              REVERT_ARCHIVE_OPTION_LONG,
+              false, false, true,
+              INFO_DIRECTORY_PLACEHOLDER.get(),
+              null, null, INFO_REVERT_DESCRIPTION_DIRECTORY.get());
+      argParser.addArgument(reversionArchive);
+
+      noPrompt = new BooleanArgument(
+              OPTION_LONG_NO_PROMPT,
+              OPTION_SHORT_NO_PROMPT,
+              OPTION_LONG_NO_PROMPT,
+              INFO_UPGRADE_DESCRIPTION_NO_PROMPT.get());
+      argParser.addArgument(noPrompt);
+
+      quiet = new BooleanArgument(
+              OPTION_LONG_QUIET,
+              OPTION_SHORT_QUIET,
+              OPTION_LONG_QUIET,
+              INFO_UPGRADE_DESCRIPTION_SILENT.get());
+      argParser.addArgument(quiet);
+
+      verbose = new BooleanArgument(OPTION_LONG_VERBOSE, OPTION_SHORT_VERBOSE,
+          OPTION_LONG_VERBOSE, INFO_DESCRIPTION_VERBOSE.get());
+      argParser.addArgument(verbose);
+
+      showUsage = new BooleanArgument(
+              "showusage",
+              OPTION_SHORT_HELP,
+              OPTION_LONG_HELP,
+              INFO_DESCRIPTION_USAGE.get());
+      argParser.addArgument(showUsage);
+      argParser.setUsageArgument(showUsage);
+
+      try {
+        argParser.parseArguments(args);
+
+        // Set fields indicating reversion or upgrade.  This may change
+        // later if interaction is required to make the determination.
+        isReversion =
+                reversionArchive.isPresent() || revertMostRecent.isPresent();
+        isUpgrade = !isReversion;
+
+        if (argParser.usageOrVersionDisplayed()) {
+          System.exit(ReturnCode.PRINT_USAGE.getReturnCode());
+        }
+      } catch (ArgumentException ae) {
+        System.err.println(ae.getMessageObject());
+        printUsage(false);
+        System.exit(ReturnCode.
+                APPLICATION_ERROR.getReturnCode());
+      }
+    }
+    catch (Throwable t)
+    {
+      System.out.println("ERROR: "+t);
+      t.printStackTrace();
+    }
+
+  }
+
+}
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
index f3c4bbd..1a45d5b 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/Upgrader.java
@@ -72,11 +72,9 @@
 import org.opends.server.tools.JavaPropertiesTool;
 
 import java.awt.event.WindowEvent;
-import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileFilter;
-import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
@@ -154,6 +152,7 @@
     "bin",
     "lib",
     "bat",
+    "config" + File.separator + "schema",
     "setup",
     "setup.bat",
     "uninstall",
@@ -203,7 +202,12 @@
   /**
    * Information on the current build.
    */
-  private BuildInformation currentVersion = null;
+  protected BuildInformation currentVersion = null;
+
+  /**
+   * Information on the current instance.
+   */
+  protected BuildInformation currentInstanceVersion = null;
 
   /**
    * Information on the staged build.
@@ -211,6 +215,11 @@
   private BuildInformation stagedVersion = null;
 
   /**
+   * Information on the staged instance.
+   */
+  private BuildInformation stagedInstanceVersion = null;
+
+  /**
    * New OpenDS bits.
    */
   private Installation stagedInstallation = null;
@@ -390,50 +399,7 @@
       return null;
     }
 
-    String instancePathFileName = installPath + File.separator + "instance.loc";
-
-    // look for <installPath>/instance.loc
-    File f = new File(instancePathFileName);
-    if (!f.exists())
-    {
-      return installPath;
-    }
-
-    BufferedReader reader;
-    try
-    {
-      reader = new BufferedReader(new FileReader(instancePathFileName));
-    } catch (Exception e)
-    {
-      return installPath;
-    }
-
-    // Read the first line and close the file.
-    String line;
-    try
-    {
-      line = reader.readLine();
-      File instanceLoc = new File(line);
-      if (instanceLoc.isAbsolute())
-      {
-        return instanceLoc.getAbsolutePath();
-      } else
-      {
-        return new File(installPath + File.separator
-            + line).getAbsolutePath();
-      }
-    } catch (Exception e)
-    {
-      return installPath;
-    } finally
-    {
-      try
-      {
-        reader.close();
-      } catch (Exception e)
-      {
-      }
-    }
+    return Utils.getInstancePathFromClasspath(installPath);
   }
 
   /**
@@ -898,6 +864,7 @@
                 UpgradeProgressStep.UPGRADING_COMPONENTS);
         upgradeComponents();
         updateConfigDirectory();
+        updateExtensionsDirectory();
         notifyListeners(getFormattedDoneWithLineBreak());
         LOG.log(Level.INFO, "component upgrade finished");
       } catch (ApplicationException e) {
@@ -1515,14 +1482,25 @@
 
   }
 
-  private Stage getStage() throws IOException, ApplicationException {
+  /**
+   * Returns the directory used to stage files for upgrade or reversion.
+   * @return the directory used to stage files for upgrade or reversion
+   * @throws IOException if errors occurs while accessing stage files
+   * @throws org.opends.quicksetup.ApplicationException
+   *     if retrieval of stage files path fails
+   */
+  protected Stage getStage() throws IOException, ApplicationException {
     if (this.stage == null) {
       this.stage = new Stage(getStageDirectory());
     }
     return this.stage;
   }
 
-  private void upgradeComponents() throws ApplicationException {
+  /**
+   * Upgrade components.
+   * @throws ApplicationException if upgrade fails
+   */
+  protected void upgradeComponents() throws ApplicationException {
     try {
       Stage stage = getStage();
       Installation installation = getInstallation();
@@ -1530,19 +1508,19 @@
 
       if (instanceAndInstallInSameDir())
       {
-        stage.move(root, new UpgradeFileFilter(getStageDirectory()));
+       stage.move(root, new UpgradeFileFilter(getStageDirectory()));
       }
       else
       {
-        stage.move(root, new UpgradeFileFilter(getStageDirectory(),true));
-
+         stage.move(root, new UpgradeFileFilter(getStageDirectory(),true));
         root = installation.getInstanceDirectory();
         stage.move(root, new UpgradeFileFilter(getStageDirectory(),false));
       }
 
       // Check if instance.loc exits
       File instanceFile = new File
-         (installation.getRootDirectory(), "instance.loc");
+         (installation.getRootDirectory(),
+            Installation.INSTANCE_LOCATION_PATH_RELATIVE);
       if (! instanceFile.exists())
       {
         BufferedWriter instanceLoc =
@@ -1569,28 +1547,77 @@
   {
     // The config directory may contain files that are needed
     // by the new installation (e.g. SSL config files and tasks)
-    File oldConfigDir =
+    File oldInstallConfigDir =
+            new File(getFilesInstallBackupDirectory(),
+                     Installation.CONFIG_PATH_RELATIVE);
+    File oldInstanceConfigDir =
             new File(getFilesInstanceBackupDirectory(),
                      Installation.CONFIG_PATH_RELATIVE);
-    File newConfigDir =
-            getInstallation().getConfigurationDirectory();
+    File newInstallConfigDir =
+            getInstallation().getInstallConfigurationDirectory();
+    File newInstanceConfigDir =
+      getInstallation().getConfigurationDirectory();
     FileManager fm = new FileManager();
 
     // Define a filter for files that we don't want to copy over
     // from the old config directory.
-    final File oldConfigUpgradeDir = new File(oldConfigDir, "upgrade");
-    final File oldConfigSchemaDir = new File(oldConfigDir, "schema");
-    FileFilter filter = new FileFilter() {
-      public boolean accept(File f) {
-        return !Utils.isDescendant(f, oldConfigUpgradeDir) &&
-                !Utils.isDescendant(f, oldConfigSchemaDir);
-      }
-    };
+    {
+      final File oldConfigUpgradeDir = new File(oldInstallConfigDir, "upgrade");
+      final File oldConfigSchemaDir = new File(oldInstallConfigDir, "schema");
+      FileFilter filter = new FileFilter()
+      {
+        public boolean accept(File f)
+        {
+          return !Utils.isDescendant(f, oldConfigUpgradeDir)
+              && !Utils.isDescendant(f, oldConfigSchemaDir);
+        }
+      };
 
-    fm.synchronize(oldConfigDir, newConfigDir, filter);
+      fm.synchronize(oldInstallConfigDir, newInstallConfigDir, filter);
+    }
+
+    {
+      final File oldConfigUpgradeDir =
+        new File(oldInstanceConfigDir, "upgrade");
+      FileFilter filter = new FileFilter()
+      {
+        public boolean accept(File f)
+        {
+          return !Utils.isDescendant(f, oldConfigUpgradeDir);
+        }
+      };
+
+      fm.synchronize(oldInstanceConfigDir, newInstanceConfigDir, filter);
+    }
   }
 
-  private void backupFilesystem() throws ApplicationException {
+  private void updateExtensionsDirectory()
+          throws IOException,ApplicationException
+  {
+    // Get extensions back
+    File savedDir =
+            new File(getFilesInstanceBackupDirectory(),
+                     Installation.LIBRARIES_PATH_RELATIVE);
+    File destDir = getInstallation().getInstanceDirectory();
+
+    FileManager fm = new FileManager();
+    fm.copyRecursively(savedDir, destDir);
+
+    // Get classes back
+    savedDir =
+            new File(getFilesInstanceBackupDirectory(),
+                     Installation.CLASSES_PATH_RELATIVE);
+    destDir = getInstallation().getInstanceDirectory();
+
+    fm.copyRecursively(savedDir, destDir);
+
+  }
+
+  /**
+   * Backup files to be able to revert if upgrdae fails.
+   * @throws ApplicationException if backup fails
+   */
+  protected void backupFilesystem() throws ApplicationException {
     try {
       // Backup first install (potentially everything if install and instance
       //  are in the same dir
@@ -1693,7 +1720,12 @@
     }
   }
 
-  private void cleanup() throws ApplicationException {
+  /**
+   * Cleanup to done executed once upgrade is done.
+   * @throws org.opends.quicksetup.ApplicationException
+   *    if cleanup fails
+   */
+  protected void cleanup() throws ApplicationException {
     deleteStagingDirectory();
   }
 
@@ -1719,15 +1751,19 @@
     }
   }
 
-  private void initialize() throws ApplicationException {
+  /**
+   * Implements the initialization phase of the upgrade.
+   * @throws ApplicationException if upgrade is not possible
+   */
+  protected void initialize() throws ApplicationException {
     try {
-      BuildInformation fromVersion = getCurrentBuildInformation();
+      BuildInformation fromVersion = getCurrentInstanceBuildInformation();
       BuildInformation toVersion = getStagedBuildInformation();
       if (fromVersion.equals(toVersion))
       {
         throw new ApplicationException(ReturnCode.APPLICATION_ERROR,
             INFO_UPGRADE_ORACLE_SAME_VERSION.get(
-                fromVersion.toString()), null);
+                toVersion.toString()), null);
       }
       if (getInstallation().getStatus().isServerRunning()) {
         new ServerController(getInstallation()).stopServer(true);
@@ -1755,16 +1791,8 @@
    *         cannot be insured.
    */
   private void insureUpgradability() throws ApplicationException {
-    BuildInformation currentVersion;
     BuildInformation newVersion;
-    try {
-      currentVersion = getInstallation().getBuildInformation();
-    } catch (ApplicationException e) {
-      LOG.log(Level.INFO, "error getting build information for " +
-              "current installation", e);
-      throw ApplicationException.createFileSystemException(
-              INFO_ERROR_DETERMINING_CURRENT_BUILD.get(), e);
-    }
+    currentVersion = getCurrentInstanceBuildInformation();
 
     try {
       newVersion = getStagedInstallation().getBuildInformation();
@@ -1789,7 +1817,15 @@
     }
   }
 
-  private Installation getStagedInstallation()
+  /**
+   * Returns the path of the new OpenDS bits.
+   * @return the path of the new OpenDS bits.
+   * @throws java.io.IOException if an error occurs while accessing the
+   *         new bits
+   * @throws org.opends.quicksetup.ApplicationException if upgradability
+   *         cannot be insured.
+   */
+  protected Installation getStagedInstallation()
           throws IOException, ApplicationException {
     if (stagedInstallation == null) {
       File stageDir = getStageDirectory();
@@ -1913,7 +1949,14 @@
     return txt;
   }
 
-  private File getStageDirectory()
+  /**
+   * Returns the path of the new OpenDS bits.
+   * @return the path of the new OpenDS bits.
+   * @throws org.opends.quicksetup.ApplicationException
+   *         if retrieval of stage files path fails
+   * @throws java.io.IOException if errors occurs while accessing stage files
+   */
+  protected File getStageDirectory()
           throws ApplicationException, IOException {
     return getInstallation().getTemporaryUpgradeDirectory();
   }
@@ -1930,7 +1973,12 @@
     return installDir.getAbsolutePath().equals(instanceDir.getAbsolutePath());
   }
 
-  private File getFilesInstanceBackupDirectory() throws IOException
+  /**
+   * Returns the path where to backup instance files.
+   * @return the path where to backup instance files.
+   * @throws java.io.IOException if retrieval of backup files fails
+   */
+  protected File getFilesInstanceBackupDirectory() throws IOException
   {
     if (instanceAndInstallInSameDir())
     {
@@ -1995,6 +2043,10 @@
     return backupDirectory;
   }
 
+  /**
+   * Returns the BuildInformation of the current OpenDS bits.
+   * @return the BuildInformation of the current OpenDS bits.
+   */
   private BuildInformation getCurrentBuildInformation() {
     if (this.currentVersion == null) {
       try {
@@ -2006,10 +2058,23 @@
     return currentVersion;
   }
 
+ /**
+   * Returns the BuildInformation of the OpenDS instance.
+   * @return the BuildInformation of the OpenDS instance.
+   */
+  private BuildInformation getCurrentInstanceBuildInformation() {
+    if (this.currentInstanceVersion == null) {
+      currentInstanceVersion = getInstallation().getInstanceBuildInformation();
+    }
+
+    return currentInstanceVersion;
+  }
+
+
   private BuildInformation getStagedBuildInformation() {
     if (stagedVersion == null) {
       try {
-        stagedVersion = getStagedInstallation().getBuildInformation();
+          stagedVersion = getStagedInstallation().getBuildInformation();
       } catch (Exception e) {
         LOG.log(Level.INFO, "error getting build info for staged installation",
                 e);
@@ -2018,4 +2083,4 @@
     return stagedVersion;
   }
 
-}
+  }
diff --git a/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgraderSvr4.java b/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgraderSvr4.java
new file mode 100644
index 0000000..8679632
--- /dev/null
+++ b/opends/src/quicksetup/org/opends/quicksetup/upgrader/UpgraderSvr4.java
@@ -0,0 +1,138 @@
+/*
+ * 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 2007-2008 Sun Microsystems, Inc.
+ */
+package org.opends.quicksetup.upgrader;
+
+import static org.opends.messages.QuickSetupMessages.*;
+
+
+import org.opends.quicksetup.ApplicationException;
+
+
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.opends.quicksetup.Installation;
+import org.opends.quicksetup.Launcher;
+import org.opends.quicksetup.UserData;
+import org.opends.quicksetup.UserDataException;
+import org.opends.quicksetup.util.FileManager;
+import java.io.FileFilter;
+import org.opends.quicksetup.ReturnCode;
+
+/**
+ * QuickSetup application of upgrading the bits of an SVR4 based installation
+ * of OpenDS.
+ */
+public class UpgraderSvr4 extends Upgrader {
+
+  static private final Logger LOG = Logger.getLogger(
+          UpgraderSvr4.class.getName());
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public UserData createUserData(Launcher launcher)
+          throws UserDataException {
+    return new UpgraderCliHelper((UpgradeSvr4Launcher) launcher).
+            createUserData(launcher.getArguments());
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected File getStageDirectory()
+          throws ApplicationException, IOException {
+    return getInstallation().getTmplInstanceDirectory();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected Installation getStagedInstallation()
+          throws IOException, ApplicationException {
+    /* New bits have replaced old  */
+    return getInstallation();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void cleanup() throws ApplicationException {
+    return;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void backupFilesystem() throws ApplicationException {
+    try {
+      FileManager fm = new FileManager();
+      File filesBackupDirectory = getFilesInstanceBackupDirectory();
+      File root = getInstallation().getInstanceDirectory();
+      FileFilter filter = new UpgradeFileFilter(root, false);
+      for (String fileName : root.list()) {
+        File f = new File(root, fileName);
+        fm.move(f, filesBackupDirectory, filter);
+      }
+    } catch (ApplicationException ae) {
+      throw ae;
+    } catch (Exception e) {
+      throw new ApplicationException(
+              ReturnCode.FILE_SYSTEM_ACCESS_ERROR,
+              INFO_ERROR_BACKUP_FILESYSTEM.get(),
+              e);
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void upgradeComponents() throws ApplicationException {
+    try {
+      /* Only instance data have to be upgraded */
+      Stage stage = getStage();
+      Installation installation = getInstallation();
+      File root = installation.getInstanceDirectory();
+      stage.move(root, new UpgradeFileFilter(getStageDirectory(), false));
+
+      LOG.log(Level.INFO, "upgraded bits to " +
+              installation.getBuildInformation(false));
+
+    } catch (IOException e) {
+      throw ApplicationException.createFileSystemException(
+              INFO_ERROR_UPGRADING_COMPONENTS.get(), e);
+    }
+  }
+}
diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java b/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
index 8f007fc..dfea9b8 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -1174,13 +1174,20 @@
    */
   public static String getInstancePathFromClasspath(String installPath)
   {
-    String instancePathFileName = installPath + File.separator + "instance.loc";
+    String instancePathFileName = Installation.INSTANCE_LOCATION_PATH;
+    File configureScriptPath = new File(installPath + File.separator +
+      Installation.UNIX_CONFIGURE_FILE_NAME);
 
-    // look for <installPath>/instance.loc
+    // look for /etc/opt/opends/instance.loc
     File f = new File(instancePathFileName);
-    if (! f.exists())
-    {
-      return installPath;
+    if (!configureScriptPath.exists() || !f.exists()) {
+      // look for <installPath>/instance.loc
+      instancePathFileName = installPath + File.separator +
+              Installation.INSTANCE_LOCATION_PATH_RELATIVE;
+      f = new File(instancePathFileName);
+      if (!f.exists()) {
+        return installPath;
+      }
     }
 
     BufferedReader reader;
diff --git a/opends/src/server/org/opends/server/admin/ClassLoaderProvider.java b/opends/src/server/org/opends/server/admin/ClassLoaderProvider.java
index dd640cf..99cb790 100644
--- a/opends/src/server/org/opends/server/admin/ClassLoaderProvider.java
+++ b/opends/src/server/org/opends/server/admin/ClassLoaderProvider.java
@@ -315,7 +315,18 @@
 
     // Put extensions jars into the class loader and load all
     // configuration definition classes in that they contain.
-    initializeAllExtensions();
+    // First load the extension from the install directory, then
+    // from the instance directory.
+    File libDir ;
+    File extensionsPath ;
+
+    libDir = new File(DirectoryServer.getServerRoot(),LIB_DIR);
+    extensionsPath = new File(libDir, EXTENSIONS_DIR);
+    initializeAllExtensions(extensionsPath);
+
+    libDir = new File(DirectoryServer.getInstanceRoot(),LIB_DIR);
+    extensionsPath = new File(libDir, EXTENSIONS_DIR);
+    initializeAllExtensions(extensionsPath);
   }
 
 
@@ -508,6 +519,7 @@
   /**
    * Put extensions jars into the class loader and load all
    * configuration definition classes in that they contain.
+   * @param extensionsPath Indicates where extensions are located.
    *
    * @throws InitializationException
    *           If the extensions folder could not be accessed or if a
@@ -515,10 +527,8 @@
    *           the configuration definition classes could not be
    *           initialized.
    */
-  private void initializeAllExtensions()
+  private void initializeAllExtensions(File extensionsPath)
       throws InitializationException {
-    File libPath = new File(DirectoryServer.getInstanceRoot(), LIB_DIR);
-    File extensionsPath = new File(libPath, EXTENSIONS_DIR);
 
     try {
       if (!extensionsPath.exists()) {
diff --git a/opends/src/server/org/opends/server/backends/SchemaBackend.java b/opends/src/server/org/opends/server/backends/SchemaBackend.java
index c3613fd..f52d42f 100644
--- a/opends/src/server/org/opends/server/backends/SchemaBackend.java
+++ b/opends/src/server/org/opends/server/backends/SchemaBackend.java
@@ -3612,13 +3612,23 @@
     ArrayList<File> tempFileList      = new ArrayList<File>();
     ArrayList<File> origFileList      = new ArrayList<File>();
 
-    File schemaDir = new File(SchemaConfigManager.getSchemaDirectoryPath());
+    File schemaInstallDir  =
+      new File(SchemaConfigManager.getSchemaDirectoryPath(false));
+    File schemaInstanceDir =
+      new File(SchemaConfigManager.getSchemaDirectoryPath(true));
 
     for (String name : tempSchemaFiles.keySet())
     {
-      installedFileList.add(new File(schemaDir, name));
+      File installFile = new File(schemaInstallDir, name);
+      if (installFile.exists())
+      {
+        installedFileList.add(installFile);
+      } else
+      {
+        installedFileList.add(new File(schemaInstanceDir, name));
+      }
       tempFileList.add(tempSchemaFiles.get(name));
-      origFileList.add(new File(schemaDir, name + ".orig"));
+      origFileList.add(new File(schemaInstanceDir, name + ".orig"));
     }
 
 
@@ -4643,12 +4653,15 @@
 
     // Get the path to the directory in which the schema files reside and
     // then get a list of all the files in that directory.
-    String schemaDirPath = SchemaConfigManager.getSchemaDirectoryPath();
-    File[] schemaFiles;
+    String schemaInstallDirPath =
+      SchemaConfigManager.getSchemaDirectoryPath(false);
+    String schemaInstanceDirPath =
+      SchemaConfigManager.getSchemaDirectoryPath(true);
+    File[][] schemaFiles = new File[2][];
     try
     {
-      File schemaDir = new File(schemaDirPath);
-      schemaFiles = schemaDir.listFiles();
+      File schemaDir = new File(schemaInstallDirPath);
+      schemaFiles[0] = schemaDir.listFiles();
     }
     catch (Exception e)
     {
@@ -4658,100 +4671,114 @@
       }
 
       message = ERR_SCHEMA_BACKUP_CANNOT_LIST_SCHEMA_FILES.get(
-          schemaDirPath, getExceptionMessage(e));
+          schemaInstallDirPath, getExceptionMessage(e));
       throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                    message, e);
     }
 
+    try
+    {
+      File schemaDir = new File(schemaInstanceDirPath);
+      schemaFiles[1] = schemaDir.listFiles();
+    }
+    catch (Exception e)
+    {
+      schemaFiles[1] = new File[0] ;
+    }
 
     // Iterate through the schema files and write them to the zip stream.  If
     // we're using a hash or MAC, then calculate that as well.
     byte[] buffer = new byte[8192];
-    for (File schemaFile : schemaFiles)
+    String parent = ".install";
+    for (int i=0 ; i < 2 ; i++)
     {
-      if (backupConfig.isCancelled())
+      for (File schemaFile : schemaFiles[i])
       {
-        break;
-      }
-
-      if (! schemaFile.isFile())
-      {
-        // If there are any non-file items in the directory (e.g., one or more
-        // subdirectories), then we'll skip them.
-        continue;
-      }
-
-      String baseName = schemaFile.getName();
-
-
-      // We'll put the name in the hash, too.
-      if (hash)
-      {
-        if (signHash)
+        if (backupConfig.isCancelled())
         {
-          mac.update(getBytes(baseName));
+          break;
         }
-        else
+
+        if (!schemaFile.isFile())
         {
-          digest.update(getBytes(baseName));
+          // If there are any non-file items in the directory (e.g., one or more
+          // subdirectories), then we'll skip them.
+          continue;
         }
-      }
 
-      InputStream inputStream = null;
-      try
-      {
-        ZipEntry zipEntry = new ZipEntry(baseName);
-        zipStream.putNextEntry(zipEntry);
+        String baseName = schemaFile.getName();
 
-        inputStream = new FileInputStream(schemaFile);
-        while (true)
+        // We'll put the name in the hash, too.
+        if (hash)
         {
-          int bytesRead = inputStream.read(buffer);
-          if (bytesRead < 0 || backupConfig.isCancelled())
+          if (signHash)
           {
-            break;
-          }
-
-          if (hash)
+            mac.update(getBytes(baseName));
+          } else
           {
-            if (signHash)
-            {
-              mac.update(buffer, 0, bytesRead);
-            }
-            else
-            {
-              digest.update(buffer, 0, bytesRead);
-            }
+            digest.update(getBytes(baseName));
           }
-
-          zipStream.write(buffer, 0, bytesRead);
         }
 
-        zipStream.closeEntry();
-        inputStream.close();
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-
+        InputStream inputStream = null;
         try
         {
+          ZipEntry zipEntry = new ZipEntry(baseName + parent);
+          zipStream.putNextEntry(zipEntry);
+
+          inputStream = new FileInputStream(schemaFile);
+          while (true)
+          {
+            int bytesRead = inputStream.read(buffer);
+            if (bytesRead < 0 || backupConfig.isCancelled())
+            {
+              break;
+            }
+
+            if (hash)
+            {
+              if (signHash)
+              {
+                mac.update(buffer, 0, bytesRead);
+              } else
+              {
+                digest.update(buffer, 0, bytesRead);
+              }
+            }
+
+            zipStream.write(buffer, 0, bytesRead);
+          }
+
+          zipStream.closeEntry();
           inputStream.close();
-        } catch (Exception e2) {}
-
-        try
+        } catch (Exception e)
         {
-          zipStream.close();
-        } catch (Exception e2) {}
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.ERROR, e);
+          }
 
-        message = ERR_SCHEMA_BACKUP_CANNOT_BACKUP_SCHEMA_FILE.get(
-            baseName, stackTraceToSingleLineString(e));
-        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                     message, e);
+          try
+          {
+            inputStream.close();
+          } catch (Exception e2)
+          {
+          }
+
+          try
+          {
+            zipStream.close();
+          } catch (Exception e2)
+          {
+          }
+
+          message = ERR_SCHEMA_BACKUP_CANNOT_BACKUP_SCHEMA_FILE.get(baseName,
+              stackTraceToSingleLineString(e));
+          throw new DirectoryException(DirectoryServer
+              .getServerErrorResultCode(), message, e);
+        }
       }
+      parent = ".instance";
     }
 
 
@@ -5005,29 +5032,38 @@
     // try to verify the archive.  If we are not going to verify only, then
     // move the current schema directory out of the way so we can keep it around
     // to restore if a problem occurs.
-    String schemaDirPath   = SchemaConfigManager.getSchemaDirectoryPath();
-    File   schemaDir       = new File(schemaDirPath);
-    String backupDirPath   = null;
-    File   schemaBackupDir = null;
+    String schemaInstallDirPath    =
+      SchemaConfigManager.getSchemaDirectoryPath(false);
+    String schemaInstanceDirPath   =
+      SchemaConfigManager.getSchemaDirectoryPath(true);
+
+    File   schemaInstallDir        = new File(schemaInstallDirPath);
+    File   schemaInstanceDir       = new File(schemaInstanceDirPath);
+
+    String backupInstallDirPath   = null;
+    File   schemaBackupInstallDir = null;
+
+    String backupInstanceDirPath   = null;
+    File   schemaBackupInstanceDir = null;
     boolean verifyOnly = restoreConfig.verifyOnly();
     if (! verifyOnly)
     {
       // Rename the current schema directory if it exists.
       try
       {
-        if (schemaDir.exists())
+        if (schemaInstallDir.exists())
         {
-          String schemaBackupDirPath = schemaDirPath + ".save";
-          backupDirPath = schemaBackupDirPath;
-          schemaBackupDir = new File(backupDirPath);
-          if (schemaBackupDir.exists())
+          String schemaBackupInstallDirPath = schemaInstallDirPath + ".save";
+          backupInstallDirPath = schemaBackupInstallDirPath;
+          schemaBackupInstallDir = new File(backupInstallDirPath);
+          if (schemaBackupInstallDir.exists())
           {
             int i=2;
             while (true)
             {
-              backupDirPath = schemaBackupDirPath + i;
-              schemaBackupDir = new File(backupDirPath);
-              if (schemaBackupDir.exists())
+              backupInstallDirPath = schemaBackupInstallDirPath + i;
+              schemaBackupInstallDir = new File(backupInstallDirPath);
+              if (schemaBackupInstallDir.exists())
               {
                 i++;
               }
@@ -5038,13 +5074,51 @@
             }
           }
 
-          schemaDir.renameTo(schemaBackupDir);
+          schemaInstallDir.renameTo(schemaBackupInstallDir);
         }
       }
       catch (Exception e)
       {
         Message message = ERR_SCHEMA_RESTORE_CANNOT_RENAME_CURRENT_DIRECTORY.
-            get(backupID, schemaDirPath, String.valueOf(backupDirPath),
+            get(backupID, schemaInstallDirPath,
+                String.valueOf(backupInstallDirPath),
+                stackTraceToSingleLineString(e));
+        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
+                                     message, e);
+      }
+      try
+      {
+        if (schemaInstanceDir.exists())
+        {
+          String schemaBackupInstanceDirPath = schemaInstanceDirPath + ".save";
+          backupInstanceDirPath = schemaBackupInstanceDirPath;
+          schemaBackupInstanceDir = new File(backupInstanceDirPath);
+          if (schemaBackupInstanceDir.exists())
+          {
+            int i=2;
+            while (true)
+            {
+              backupInstanceDirPath = schemaBackupInstanceDirPath + i;
+              schemaBackupInstanceDir = new File(backupInstanceDirPath);
+              if (schemaBackupInstanceDir.exists())
+              {
+                i++;
+              }
+              else
+              {
+                break;
+              }
+            }
+          }
+
+          schemaInstanceDir.renameTo(schemaBackupInstanceDir);
+        }
+      }
+      catch (Exception e)
+      {
+        Message message = ERR_SCHEMA_RESTORE_CANNOT_RENAME_CURRENT_DIRECTORY.
+            get(backupID, schemaInstanceDirPath,
+                String.valueOf(backupInstanceDirPath),
                 stackTraceToSingleLineString(e));
         throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                      message, e);
@@ -5054,32 +5128,52 @@
       // Create a new directory to hold the restored schema files.
       try
       {
-        schemaDir.mkdirs();
+        schemaInstallDir.mkdirs();
+        schemaInstanceDir.mkdirs();
       }
       catch (Exception e)
       {
         // Try to restore the previous schema directory if possible.  This will
         // probably fail in this case, but try anyway.
-        if (schemaBackupDir != null)
+        if (schemaBackupInstallDir != null)
         {
           try
           {
-            schemaBackupDir.renameTo(schemaDir);
+            schemaBackupInstallDir.renameTo(schemaInstallDir);
             Message message =
-                NOTE_SCHEMA_RESTORE_RESTORED_OLD_SCHEMA.get(schemaDirPath);
+                NOTE_SCHEMA_RESTORE_RESTORED_OLD_SCHEMA.get(
+                    schemaInstallDirPath);
             logError(message);
           }
           catch (Exception e2)
           {
             Message message = ERR_SCHEMA_RESTORE_CANNOT_RESTORE_OLD_SCHEMA.get(
-                schemaBackupDir.getPath());
+                schemaBackupInstallDir.getPath());
+            logError(message);
+          }
+        }
+        if (schemaBackupInstanceDir != null)
+        {
+          try
+          {
+            schemaBackupInstanceDir.renameTo(schemaInstanceDir);
+            Message message =
+                NOTE_SCHEMA_RESTORE_RESTORED_OLD_SCHEMA.get(
+                    schemaInstanceDirPath);
+            logError(message);
+          }
+          catch (Exception e2)
+          {
+            Message message = ERR_SCHEMA_RESTORE_CANNOT_RESTORE_OLD_SCHEMA.get(
+                schemaBackupInstanceDir.getPath());
             logError(message);
           }
         }
 
 
         Message message = ERR_SCHEMA_RESTORE_CANNOT_CREATE_SCHEMA_DIRECTORY.get(
-            backupID, schemaDirPath, stackTraceToSingleLineString(e));
+            backupID, schemaInstallDirPath,schemaInstanceDirPath,
+            stackTraceToSingleLineString(e));
         throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                      message, e);
       }
@@ -5100,10 +5194,16 @@
       catch (Exception e)
       {
         // Tell the user where the previous schema was archived.
-        if (schemaBackupDir != null)
+        if (schemaBackupInstallDir != null)
         {
           Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
-              schemaBackupDir.getPath());
+              schemaBackupInstallDir.getPath());
+          logError(message);
+        }
+        if (schemaBackupInstanceDir != null)
+        {
+          Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
+              schemaBackupInstanceDir.getPath());
           logError(message);
         }
 
@@ -5131,13 +5231,25 @@
         mac.update(getBytes(fileName));
       }
 
+      String baseDirPath ;
+      if (fileName.endsWith(".install"))
+      {
+        fileName = fileName.substring(fileName.lastIndexOf(".install"));
+        baseDirPath = schemaInstallDirPath;
+      }
+      else
+      {
+        fileName = fileName.substring(fileName.lastIndexOf(".instance"));
+        baseDirPath = schemaInstanceDirPath;
+      }
+
 
       // If we're doing the restore, then create the output stream to write the
       // file.
       OutputStream outputStream = null;
       if (! verifyOnly)
       {
-        String filePath = schemaDirPath + File.separator + fileName;
+        String filePath = baseDirPath + File.separator + fileName;
         try
         {
           outputStream = new FileOutputStream(filePath);
@@ -5145,10 +5257,16 @@
         catch (Exception e)
         {
           // Tell the user where the previous schema was archived.
-          if (schemaBackupDir != null)
+          if (schemaBackupInstallDir != null)
           {
             Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
-                schemaBackupDir.getPath());
+                schemaBackupInstallDir.getPath());
+            logError(message);
+          }
+          if (schemaBackupInstanceDir != null)
+          {
+            Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
+                schemaBackupInstanceDir.getPath());
             logError(message);
           }
 
@@ -5206,10 +5324,16 @@
       catch (Exception e)
       {
         // Tell the user where the previous schema was archived.
-        if (schemaBackupDir != null)
+        if (schemaBackupInstallDir != null)
         {
           Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
-              schemaBackupDir.getPath());
+              schemaBackupInstallDir.getPath());
+          logError(message);
+        }
+        if (schemaBackupInstanceDir != null)
+        {
+          Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
+              schemaBackupInstanceDir.getPath());
           logError(message);
         }
 
@@ -5249,10 +5373,17 @@
       else
       {
         // Tell the user where the previous schema was archived.
-        if (schemaBackupDir != null)
+        if (schemaBackupInstallDir != null)
         {
           Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
-              schemaBackupDir.getPath());
+              schemaBackupInstallDir.getPath());
+          logError(message);
+        }
+        // Tell the user where the previous schema was archived.
+        if (schemaBackupInstanceDir != null)
+        {
+          Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
+              schemaBackupInstanceDir.getPath());
           logError(message);
         }
 
@@ -5274,10 +5405,16 @@
       else
       {
         // Tell the user where the previous schema was archived.
-        if (schemaBackupDir != null)
+        if (schemaBackupInstallDir != null)
         {
           Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
-              schemaBackupDir.getPath());
+              schemaBackupInstallDir.getPath());
+          logError(message);
+        }
+        if (schemaBackupInstanceDir != null)
+        {
+          Message message = ERR_SCHEMA_RESTORE_OLD_SCHEMA_SAVED.get(
+              schemaBackupInstanceDir.getPath());
           logError(message);
         }
 
@@ -5301,9 +5438,13 @@
     // If we've gotten here, then the archive was restored successfully.  Get
     // rid of the temporary copy we made of the previous schema directory and
     // exit.
-    if (schemaBackupDir != null)
+    if (schemaBackupInstallDir != null)
     {
-      recursiveDelete(schemaBackupDir);
+      recursiveDelete(schemaBackupInstallDir);
+    }
+    if (schemaBackupInstanceDir != null)
+    {
+      recursiveDelete(schemaBackupInstanceDir);
     }
 
     Message message = NOTE_SCHEMA_RESTORE_SUCCESSFUL.get(backupID, backupPath);
diff --git a/opends/src/server/org/opends/server/core/SchemaConfigManager.java b/opends/src/server/org/opends/server/core/SchemaConfigManager.java
index a8f71b3..ed00b5e 100644
--- a/opends/src/server/org/opends/server/core/SchemaConfigManager.java
+++ b/opends/src/server/org/opends/server/core/SchemaConfigManager.java
@@ -105,12 +105,16 @@
   /**
    * Retrieves the path to the directory containing the server schema files.
    *
+   * @param userSchema indicates if we need to retrieve user schema or
+   * "unmodified" schema.
+   *
    * @return  The path to the directory containing the server schema files.
    */
-  public static String getSchemaDirectoryPath()
+  public static String getSchemaDirectoryPath(boolean userSchema)
   {
     File schemaDir =
-              DirectoryServer.getEnvironmentConfig().getSchemaDirectory();
+              DirectoryServer.getEnvironmentConfig().
+                getSchemaDirectory(userSchema);
     if (schemaDir != null) {
       return schemaDir.getAbsolutePath();
     } else {
@@ -202,29 +206,62 @@
     // Construct the path to the directory that should contain the schema files
     // and make sure that it exists and is a directory.  Get a list of the files
     // in that directory sorted in alphabetic order.
-    String schemaDirPath          = getSchemaDirectoryPath();
-    File schemaDir                = new File(schemaDirPath);
+    String schemaInstallDirPath   = getSchemaDirectoryPath(false);
+    String schemaInstanceDirPath  = getSchemaDirectoryPath(true);
+    File schemaInstallDir         = new File(schemaInstallDirPath);
+    File schemaInstanceDir        = null;
+
+    try
+    {
+      if (schemaInstanceDirPath != null)
+      {
+        schemaInstanceDir = new File(schemaInstanceDirPath);
+        if (schemaInstallDir.getCanonicalPath().equals(
+            schemaInstanceDir.getCanonicalPath()))
+        {
+          schemaInstanceDir = null;
+        }
+      }
+    } catch (Exception e)
+    {
+      schemaInstanceDir = null;
+    }
     long oldestModificationTime   = -1L;
     long youngestModificationTime = -1L;
     String[] fileNames;
 
     try
     {
-      if (schemaDirPath == null || ! schemaDir.exists())
-      {
-        Message message = ERR_CONFIG_SCHEMA_NO_SCHEMA_DIR.get(schemaDirPath);
-        throw new InitializationException(message);
-      }
-      else if (! schemaDir.isDirectory())
+      if (schemaInstallDir == null || ! schemaInstallDir.exists())
       {
         Message message =
-            ERR_CONFIG_SCHEMA_DIR_NOT_DIRECTORY.get(schemaDirPath);
+          ERR_CONFIG_SCHEMA_NO_SCHEMA_DIR.get(schemaInstallDirPath);
+        throw new InitializationException(message);
+      }
+      if (! schemaInstallDir.isDirectory())
+      {
+        Message message =
+            ERR_CONFIG_SCHEMA_DIR_NOT_DIRECTORY.get(schemaInstallDirPath);
         throw new InitializationException(message);
       }
 
-      File[] schemaDirFiles = schemaDir.listFiles();
-      ArrayList<String> fileList = new ArrayList<String>(schemaDirFiles.length);
-      for (File f : schemaDirFiles)
+      if ((schemaInstanceDir == null) || (!schemaInstanceDir.exists())
+          || (! schemaInstanceDir.isDirectory()))
+      {
+        schemaInstanceDir = null;
+      }
+
+      File[] schemaInstallDirFiles  = schemaInstallDir.listFiles() ;
+      int fileNumber = schemaInstallDirFiles.length;
+      File[] schemaInstanceDirFiles = null ;
+      if (schemaInstanceDir != null)
+      {
+        schemaInstanceDirFiles = schemaInstanceDir.listFiles();
+        fileNumber =+ schemaInstanceDirFiles.length ;
+      }
+
+      ArrayList<String> fileList = new ArrayList<String>(fileNumber);
+      for (File f : schemaInstallDirFiles)
       {
         if (f.isFile())
         {
@@ -244,6 +281,29 @@
           youngestModificationTime = modificationTime;
         }
       }
+      if (schemaInstanceDirFiles != null)
+      {
+        for (File f : schemaInstanceDirFiles)
+        {
+          if (f.isFile())
+          {
+            fileList.add(f.getName());
+          }
+
+          long modificationTime = f.lastModified();
+          if ((oldestModificationTime <= 0L)
+              || (modificationTime < oldestModificationTime))
+          {
+            oldestModificationTime = modificationTime;
+          }
+
+          if ((youngestModificationTime <= 0)
+              || (modificationTime > youngestModificationTime))
+          {
+            youngestModificationTime = modificationTime;
+          }
+        }
+      }
 
       fileNames = new String[fileList.size()];
       fileList.toArray(fileNames);
@@ -266,7 +326,7 @@
       }
 
       Message message = ERR_CONFIG_SCHEMA_CANNOT_LIST_FILES.get(
-          schemaDirPath, getExceptionMessage(e));
+          schemaInstallDirPath, schemaInstanceDirPath, getExceptionMessage(e));
       throw new InitializationException(message, e);
     }
 
@@ -356,11 +416,18 @@
          throws ConfigException, InitializationException
   {
     // Create an LDIF reader to use when reading the files.
-    String schemaDirPath = getSchemaDirectoryPath();
+    String schemaDirPath = null;
+
+    schemaDirPath = getSchemaDirectoryPath(true);
+    File f = new File(schemaDirPath, schemaFile);
+    if (!f.exists())
+    {
+      schemaDirPath = getSchemaDirectoryPath(false);
+      f = new File(schemaDirPath, schemaFile);
+    }
     LDIFReader reader;
     try
     {
-      File f = new File(schemaDirPath, schemaFile);
       reader = new LDIFReader(new LDIFImportConfig(f.getAbsolutePath()));
     }
     catch (Exception e)
diff --git a/opends/src/server/org/opends/server/tasks/AddSchemaFileTask.java b/opends/src/server/org/opends/server/tasks/AddSchemaFileTask.java
index cd60148..6c82691 100644
--- a/opends/src/server/org/opends/server/tasks/AddSchemaFileTask.java
+++ b/opends/src/server/org/opends/server/tasks/AddSchemaFileTask.java
@@ -127,7 +127,10 @@
 
     // Get the name(s) of the schema files to add and make sure they exist in
     // the schema directory.
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaInstallDirectory  =
+      SchemaConfigManager.getSchemaDirectoryPath(false);
+    String schemaInstanceDirectory =
+      SchemaConfigManager.getSchemaDirectoryPath(true);
     filesToAdd = new TreeSet<String>();
     for (Attribute a : attrList)
     {
@@ -138,14 +141,19 @@
 
         try
         {
-          File schemaFile = new File(schemaDirectory, filename);
+          File schemaFile = new File(schemaInstallDirectory, filename);
           if ((! schemaFile.exists()) ||
-              (! schemaFile.getParent().equals(schemaDirectory)))
+              (! schemaFile.getParent().equals(schemaInstallDirectory)))
           {
+            // try in the instance
+            schemaFile = new File(schemaInstanceDirectory, filename);
+            if (! schemaFile.exists())
+            {
             Message message = ERR_TASK_ADDSCHEMAFILE_NO_SUCH_FILE.get(
-                filename, schemaDirectory);
+                filename, schemaInstallDirectory, schemaInstanceDirectory);
             throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
                                          message);
+            }
           }
         }
         catch (Exception e)
@@ -156,7 +164,8 @@
           }
 
           Message message = ERR_TASK_ADDSCHEMAFILE_ERROR_CHECKING_FOR_FILE.get(
-              filename, schemaDirectory, getExceptionMessage(e));
+              filename, schemaInstallDirectory, schemaInstanceDirectory,
+              getExceptionMessage(e));
           throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
                                        message, e);
         }
diff --git a/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java b/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java
index 8f00dcc..8cbe32a 100644
--- a/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java
+++ b/opends/src/server/org/opends/server/types/DirectoryEnvironmentConfig.java
@@ -28,9 +28,7 @@
 
 
 
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -39,6 +37,7 @@
 import org.opends.server.api.ConfigHandler;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.extensions.ConfigFileHandler;
+import org.opends.quicksetup.util.Utils;
 
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.messages.CoreMessages.*;
@@ -225,56 +224,8 @@
    */
   public static File getInstanceRootFromServerRoot(File serverRoot)
   {
-    String instancePathFileName = serverRoot.getAbsolutePath() +
-      File.separator + "instance.loc";
-
-    // look for <installPath>/instance.loc
-    File f = new File(instancePathFileName);
-
-    if (! f.exists())
-    {
-      return serverRoot;
-    }
-
-    BufferedReader reader;
-    try
-    {
-      reader = new BufferedReader(
-          new FileReader(instancePathFileName));
-    }
-    catch (Exception e)
-    {
-      return null;
-    }
-
-
-    // Read the first line and close the file.
-    String line;
-    try
-    {
-      line = reader.readLine();
-      File instanceLoc = new File(line);
-      if (instanceLoc.isAbsolute())
-      {
-        return instanceLoc;
-      }
-      else
-      {
-        return new File(serverRoot.getAbsolutePath()  + File.separator
-            + instanceLoc.getPath());
-      }
-    }
-    catch (Exception e)
-    {
-      return null;
-    }
-    finally
-    {
-      try
-      {
-        reader.close();
-      } catch (Exception e) {}
-    }
+    return new File(Utils.getInstancePathFromClasspath(
+                                serverRoot.getAbsolutePath()));
   }
 
 
@@ -806,10 +757,13 @@
    * directory of "config/schema" exists below the server root, then
    * that will be returned.
    *
+   * @param userSchema indicates if we need to retrieve user schema or
+   * "unmodified" schema.
+   *
    * @return  The directory that contains the server schema
    *          configuration files, or {@code null} if none is defined.
    */
-  public File getSchemaDirectory()
+  public File getSchemaDirectory(boolean userSchema)
   {
     String schemaDirectoryPath =
          getProperty(PROPERTY_SCHEMA_DIRECTORY);
@@ -818,9 +772,19 @@
       File serverRoot = getServerRoot();
       if (serverRoot != null)
       {
-        File instanceRoot = getInstanceRootFromServerRoot(serverRoot);
-        File schemaDir = new File(instanceRoot.getAbsolutePath() +
-                                  File.separator + PATH_SCHEMA_DIR);
+        String schemaPath = null ;
+        if (userSchema)
+        {
+          File instanceRoot =
+            getInstanceRootFromServerRoot(serverRoot);
+          schemaPath = instanceRoot.getAbsolutePath();
+        }
+        else
+        {
+          schemaPath = serverRoot.getAbsolutePath();
+        }
+        File schemaDir = new File(schemaPath
+            + File.separator + PATH_SCHEMA_DIR);
         if (schemaDir.exists() && schemaDir.isDirectory())
         {
           return schemaDir;
diff --git a/opends/src/server/org/opends/server/types/Schema.java b/opends/src/server/org/opends/server/types/Schema.java
index 3e8f61d..039a1ac 100644
--- a/opends/src/server/org/opends/server/types/Schema.java
+++ b/opends/src/server/org/opends/server/types/Schema.java
@@ -3125,28 +3125,37 @@
   {
     // Get a sorted list of the files in the schema directory.
     String schemaDirectory =
-                SchemaConfigManager.getSchemaDirectoryPath();
-    TreeSet<String> schemaFileNames = new TreeSet<String>();
+                SchemaConfigManager.getSchemaDirectoryPath(false);
+    TreeSet<File> schemaFiles = new TreeSet<File>();
     for (File f : new File(schemaDirectory).listFiles())
     {
       if (f.isFile())
       {
-        schemaFileNames.add(f.getName());
+        schemaFiles.add(f);
+      }
+    }
+
+    schemaDirectory =
+      SchemaConfigManager.getSchemaDirectoryPath(true);
+    for (File f : new File(schemaDirectory).listFiles())
+    {
+      if (f.isFile())
+      {
+        schemaFiles.add(f);
       }
     }
 
 
     // Open each of the files in order and read the elements that they
     // contain, appending them to the appropriate lists.
-    for (String name : schemaFileNames)
+    for (File f : schemaFiles)
     {
       // Read the contents of the file into a list with one schema
       // element per list element.
       LinkedList<StringBuilder> lines =
            new LinkedList<StringBuilder>();
       BufferedReader reader =
-           new BufferedReader(new FileReader(
-                    new File(schemaDirectory, name)));
+           new BufferedReader(new FileReader(f));
 
       while (true)
       {
@@ -3187,12 +3196,12 @@
         if (line.endsWith(" )"))
         {
          line = line.substring(0, line.length()-1) +
-                SCHEMA_PROPERTY_FILENAME + " '" + name + "' )";
+                SCHEMA_PROPERTY_FILENAME + " '" + f.getName() + "' )";
         }
         else if (line.endsWith(")"))
         {
          line = line.substring(0, line.length()-1) + " " +
-                SCHEMA_PROPERTY_FILENAME + " '" + name + "' )";
+                SCHEMA_PROPERTY_FILENAME + " '" + f.getName() + "' )";
         }
         else
         {
diff --git a/opends/src/svr4/OpenDS/README b/opends/src/svr4/OpenDS/README
new file mode 100644
index 0000000..7549dcd
--- /dev/null
+++ b/opends/src/svr4/OpenDS/README
@@ -0,0 +1,11 @@
+OpenDS Directory Server
+
+This archive contains the OpenDS Directory Server.  Complete documentation for
+this product may be found online at https://OpenDS.dev.java.net/.
+
+To configure the server, run the configure script.
+
+This product is made available under the Common Development and Distribution
+License (CDDL).  The complete text for this license, and for alternate licenses
+of included components, may be found in the legal-notices directory.
+
diff --git a/opends/src/svr4/OpenDS/copyright b/opends/src/svr4/OpenDS/copyright
new file mode 100644
index 0000000..639df45
--- /dev/null
+++ b/opends/src/svr4/OpenDS/copyright
@@ -0,0 +1,17 @@
+Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+Use is subject to license terms.
+
+The contents of this file are subject to the terms of the
+Common Development and Distribution License (the "License").
+You may not use this file except in compliance with the License.
+
+You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+or http://www.opensolaris.org/os/licensing.
+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 usr/src/OPENSOLARIS.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]
diff --git a/opends/src/svr4/OpenDS/install.html b/opends/src/svr4/OpenDS/install.html
new file mode 100644
index 0000000..7b68ef1
--- /dev/null
+++ b/opends/src/svr4/OpenDS/install.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<title>How To Install Open DS</title>
+<style type="text/css">
+<!--
+body                     { font-family: Arial, Helvetica, sans-serif;
+                           font-size: 12px;
+                           color: #333; background-color: #fff; }
+h1                       { font-size: 2.0em; font-weight: normal;
+                                 margin-top: 0em; margin-bottom: 0em; }
+h2                       { font-size: 1.7em; font-weight: normal;
+                           margin: 1.2em 0em .8em 0em;
+                                 border-bottom: 1px #D9D9D9 solid; }
+h3                       { font-size: 1.4em; font-weight: bold;
+                           margin: 1.2em 0em .8em 0em; }
+
+a:link                  {color:#069;text-decoration:none;}
+a:visited               {color:#069;text-decoration:none;}
+a:active, a:hover       {color:#069;text-decoration:underline;}
+
+-->
+</style>
+</head>
+
+<body>
+
+<img src="images/opends_logo.png" alt="OpenDS logo" border="0" align=right>
+
+<br>
+
+<h2>How To Configure OpenDS</h2>
+<p>If you are reading this page, you have already installed the OpenDS package.
+
+<h3>Before You Configure</h3>
+A Java SE 5.0 (version 1.5.0_08) or higher runtime environment must be installed.
+It is recommended that your system have at least 100MB of disk space and
+256MB of free memory to run OpenDS for evaluation purposes. Note that
+you can configure OpenDS in such a way that it requires substantially
+less, or more, disk space. For more information, see the 
+<a href="https://www.opends.org/wiki/page/OpenDSSystemRequirements">OpenDS System Requirements</a>.
+
+<h3>To Configure OpenDS</h3>
+<ol>
+  <li>As root, type the following command:
+  <br>
+  <span style="font-family: monospace; white-space: pre;">
+$BASEDIR/opends/configure --instancePath {instancePath} [ --userName {userName} [ --groupName {groupName} ] ]
+  </span>
+  </li>
+  <li>As {userName}, type the following command:
+  <br>
+  <span style="font-family: monospace; white-space: pre;">
+     $BASEDIR/opends/setup
+  </span>
+  </li>
+</ol>
+
+<h3>See Also</h3>
+<ul>
+  <li><a href="https://www.opends.org/wiki/page/InstallingTheOpenDSDirectoryServer">Installing the OpenDS Directory Server</a>
+  <br>
+  </li>
+  <li> <a href="https://www.opends.org/wiki/page/Setup">setup</a>
+  </li>
+</ul>
+</body>
+</html>
diff --git a/opends/src/svr4/OpenDS/install.txt b/opends/src/svr4/OpenDS/install.txt
new file mode 100644
index 0000000..98b5347
--- /dev/null
+++ b/opends/src/svr4/OpenDS/install.txt
@@ -0,0 +1,25 @@
+How To Install OpenDS
+=====================
+
+If you are reading this page, you have already installed the OpenDS package.
+
+Before You Configure
+------------------
+A Java SE 5.0 (version 1.5.0_08) or higher runtime environment must be installed. It is 
+recommended that your system have at least 100MB of disk space and 256MB of free memory to run 
+OpenDS for evaluation purposes. Note that you can configure OpenDS in such a way that it requires 
+substantially less, or more, disk space. For more information, see the OpenDS System Requirements 
+at https://www.opends.org/wiki/page/OpenDSSystemRequirements.
+
+To Configure OpenDS
+--------------------------------------
+  1. As root, type the following command:
+     $BASEDIR/opends/configure --instancePath {instancePath} [ --userName {userName} [ --groupName {groupName} ] ] 
+  2. As {userName}, type the following command:
+     $BASEDIR/opends/setup 
+
+See Also
+--------
+ * Installing the OpenDS Directory Server 
+   (https://www.opends.org/wiki/page/InstallingTheOpenDSDirectoryServer)
+ * setup (https://www.opends.org/wiki/page/Setup)
diff --git a/opends/src/svr4/OpenDS/layout.xml b/opends/src/svr4/OpenDS/layout.xml
new file mode 100644
index 0000000..038d448
--- /dev/null
+++ b/opends/src/svr4/OpenDS/layout.xml
@@ -0,0 +1,167 @@
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !
+ !      Copyright 2006-2008 Sun Microsystems, Inc.
+ ! -->
+
+<project name="OpenDS SVR4 layout" basedir=".">
+  <description>
+    This is a build script that extends the OpenDS build script by adding
+    SVR4 packaging functions.
+  </description>
+  
+
+  <target name="pkgversion"
+	     description="Set pkg.version property" >
+  <!-- Construct the version number string -->
+  <taskdef name="getversionnumber"
+             classname="org.opends.build.tools.CreateVersionString">
+  <classpath>
+    <fileset dir="${build.dir}/build-tools">
+       <include name="*.jar" />
+       </fileset>
+    </classpath>
+  </taskdef>
+
+  <getversionnumber property="pkg.version" />
+  </target>
+
+  <property name="resource.dir"      location="src/resource" />
+
+  <!-- Construct layout -->
+  <target name="layout" if="isSunOS" 
+		description="Create layout based on zip layout" >
+    <!-- Get the revision number of the current Subversion workspace -->
+    <taskdef name="getsvnrevision"
+             classname="org.opends.build.tools.GetSubversionRevision">
+      <classpath>
+        <fileset dir="${build.dir}/build-tools">
+          <include name="*.jar" />
+        </fileset>
+        <fileset dir="${svnkit.dir}">
+          <include name="*.jar" />
+        </fileset>
+      </classpath>
+    </taskdef>
+
+<!--    <getsvnrevision property="REVISION_NUMBER" /> 
+  <tstamp>
+    <format property="REVISION_NUMBER" pattern="MMddhhmm"/>
+  </tstamp>
+-->
+
+
+
+
+
+        <property name="zip.dir"           location="${pkg.dir}/${product}-${pkg.version}" />
+	<echo message="Building layout for ${pkg.name} pkg based on ${zip.dir}" />
+	<!-- copy ZIP layout. Use exec instead of copy task to preserve file permissions -->
+	<mkdir dir="${svr4.layout.dir}"/>
+	<exec executable="cp">
+	    <arg value="-R"/>
+	    <arg value="${zip.dir}"/>
+	    <arg value="${svr4.layout.pkg.dir}"/>
+	</exec>
+	<!-- Remove Windows specific files -->
+	<delete includeemptydirs="true">
+	   <fileset dir="${svr4.layout.pkg.dir}" includes="**/*.exe"/>
+	   <fileset dir="${svr4.layout.pkg.dir}" includes="**/*.bat"/>
+	   <fileset dir="${svr4.layout.pkg.dir}" includes="**/bat/"/>
+	   <fileset dir="${svr4.layout.pkg.dir}" includes="**/README_WINDOWS.txt"/>
+	</delete>
+	<!-- Remove MacOS specific files  -->
+	<delete includeemptydirs="true">
+	  <fileset dir="${svr4.layout.pkg.dir}" includes="**/*.app/" />
+	</delete>
+	<!-- Remove instance.loc file -->
+	<delete file="${svr4.layout.pkg.dir}/instance.loc" />
+	<!-- Remove uninstall file -->
+	<delete file="${svr4.layout.pkg.dir}/uninstall" />
+        <!-- Remove ldaptools -->
+        <delete file="${svr4.layout.pkg.dir}/bin/ldapcompare" />
+        <delete file="${svr4.layout.pkg.dir}/bin/ldapdelete" />
+        <delete file="${svr4.layout.pkg.dir}/bin/ldapmodify" />
+        <delete file="${svr4.layout.pkg.dir}/bin/ldapsearch" />
+	<!-- Remove ZIP README / install files -->
+	<delete file="${svr4.layout.pkg.dir}/README" />
+	<delete file="${svr4.layout.pkg.dir}/install.txt" />
+	<delete file="${svr4.layout.pkg.dir}/install.html" />
+	<!-- Add SVR4 README / install files -->
+	<copy file="${svr4.src.dir}/README" tofile="${svr4.layout.pkg.dir}/README" />
+	<copy file="${svr4.src.dir}/install.txt" tofile="${svr4.layout.pkg.dir}/install.txt" />
+	<copy file="${svr4.src.dir}/install.html" tofile="${svr4.layout.pkg.dir}/install.html" />
+	<!-- Add configure script -->
+	<copy file="${resource.dir}/configure" tofile="${svr4.layout.pkg.dir}/configure" />
+	<chmod file="${svr4.layout.pkg.dir}/configure" perm="744" />
+	<!-- Replace zip upgrade script by svr4 upgrade script -->
+	<delete file="${svr4.layout.pkg.dir}/upgrade" />
+	<copy file="${resource.dir}/upgrade_svr4" tofile="${svr4.layout.pkg.dir}/upgrade" />
+	<chmod file="${svr4.layout.pkg.dir}/upgrade" perm="755" />
+	<!-- Move instance files in ${svr4.layout.pkg.dir}/tmpl_instance  -->
+	<mkdir dir="${svr4.layout.pkg.dir}/tmpl_instance"/>
+	<chmod dir="${svr4.layout.pkg.dir}/tmpl_instance" perm="755"/>
+        <mkdir dir="${svr4.layout.pkg.dir}/tmpl_instance/lib"/>
+        <chmod dir="${svr4.layout.pkg.dir}/tmpl_instance/lib" perm="755"/>
+        <mkdir dir="${svr4.layout.pkg.dir}/tmpl_instance/lib/extensions"/>
+        <chmod dir="${svr4.layout.pkg.dir}/tmpl_instance/lib/extensions" perm="755"/>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/bak">
+	  <fileset dir="${svr4.layout.pkg.dir}/bak"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/changelogDb">
+	  <fileset dir="${svr4.layout.pkg.dir}/changelogDb"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/classes">
+	  <fileset dir="${svr4.layout.pkg.dir}/classes"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/config">
+	  <fileset dir="${svr4.layout.pkg.dir}/config"/>
+	</move>
+        <mkdir dir="${svr4.layout.pkg.dir}/config"/>
+        <chmod dir="${svr4.layout.pkg.dir}/config" perm="755"/>
+	<move todir="${svr4.layout.pkg.dir}/config/schema">
+	  <fileset dir="${svr4.layout.pkg.dir}/tmpl_instance/config/schema"/>
+	</move>
+        <mkdir dir="${svr4.layout.pkg.dir}/tmpl_instance/config/schema"/>
+        <chmod dir="${svr4.layout.pkg.dir}/tmpl_instance/config/schema" perm="755"/>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/db">
+	  <fileset dir="${svr4.layout.pkg.dir}/db"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/import-tmp">
+	  <fileset dir="${svr4.layout.pkg.dir}/import-tmp"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/ldif">
+	  <fileset dir="${svr4.layout.pkg.dir}/ldif"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/locks">
+	  <fileset dir="${svr4.layout.pkg.dir}/locks"/>
+	</move>
+	<move todir="${svr4.layout.pkg.dir}/tmpl_instance/logs">
+	  <fileset dir="${svr4.layout.pkg.dir}/logs"/>
+	</move>
+        <!-- Create buildinfo file -->
+	<echo message="${pkg.version}.${REVISION_NUMBER}" file="${svr4.layout.pkg.dir}/tmpl_instance/config/buildinfo" />
+  </target>
+
+</project>
diff --git a/opends/src/svr4/OpenDS/pkg.properties b/opends/src/svr4/OpenDS/pkg.properties
new file mode 100644
index 0000000..7358680
--- /dev/null
+++ b/opends/src/svr4/OpenDS/pkg.properties
@@ -0,0 +1,7 @@
+# Info for prototype
+pkg.name=opends
+pkg.fullname=OpenDS, an open source LDAP directory server 
+pkg.desc=OpenDS, an open source LDAP directory server 
+pkg.arch=all
+pkg.vendor=opends.org
+pkg.basedir=/opt
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
index a41dd49..6e4e313 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -304,12 +304,16 @@
         testInstallRoot.mkdirs();
         testInstanceRoot.mkdirs();
       }
+      
+      File testInstanceSchema =
+        new File (testInstanceRoot, "config" + File.separator + "schema");
+      testInstanceSchema.mkdirs();
 
       //db_verify is second jeb backend used by the jeb verify test cases
       //db_rebuild is the third jeb backend used by the jeb rebuild test cases
       //db_unindexed is the forth backend used by the unindexed search privilege
       //test cases
-      String[] installSubDirectories = { "bin", "lib", "bat"};
+      String[] installSubDirectories = { "bin", "lib", "bat", "config"};
       String[] instanceSubDirectories = { "bak", "changelogDb", "classes",
           "config", "db", "import-tmp", "db_verify",
           "ldif", "locks", "logs", "db_rebuild",
@@ -333,6 +337,7 @@
       File testResourceDir  = new File(testSrcRoot, "resource");
       // Set the class variable
       testConfigDir    = new File(testInstanceRoot, "config");
+      File testSchemaDir    = new File(testInstallRoot, "config");
       File testClassesDir   = new File(testInstanceRoot, "classes");
       File testLibDir       = new File(testInstallRoot, "lib");
       File testBinDir       = new File(testInstallRoot, "bin");
@@ -371,7 +376,7 @@
         copyDirectory(new File(resourceDir, "bin"), testBinDir);
         copyDirectory(new File(resourceDir, "config"), testConfigDir);
         copyDirectory(new File(resourceDir, "schema"),
-            new File(testConfigDir, "schema"));
+            new File(testSchemaDir, "schema"));
         copyDirectory(new File(resourceDir, "MakeLDIF"),
             new File(testConfigDir, "MakeLDIF"));
         copyDirectory(new File(snmpResourceDir, "security"),
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
index 7cab354..19249d4 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/SchemaBackendTestCase.java
@@ -706,7 +706,7 @@
     String attrName = "testaddattributetypetoaltschemafile";
     assertFalse(DirectoryServer.getSchema().hasAttributeType(attrName));
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-attrtype.ldif");
     assertFalse(schemaFile.exists());
 
@@ -802,7 +802,7 @@
     String attrName = "testreplaceattributetypeinaltschemafile";
     assertFalse(DirectoryServer.getSchema().hasAttributeType(attrName));
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-replaceattrtype.ldif");
     assertFalse(schemaFile.exists());
 
@@ -1676,7 +1676,7 @@
     String ocName = "testaddobjectclasstoaltschemafile";
     assertFalse(DirectoryServer.getSchema().hasObjectClass(ocName));
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-oc.ldif");
     assertFalse(schemaFile.exists());
 
@@ -2476,7 +2476,7 @@
     String nameFormName = "testaddnameformtoaltschemafile";
     assertFalse(DirectoryServer.getSchema().hasNameForm(nameFormName));
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-nameform.ldif");
     assertFalse(schemaFile.exists());
 
@@ -3229,7 +3229,7 @@
     String ocName = "testadddcrtoaltschemafileoc";
     assertFalse(DirectoryServer.getSchema().hasObjectClass(ocName));
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-dcr.ldif");
     assertFalse(schemaFile.exists());
 
@@ -4286,7 +4286,7 @@
     int ruleID = 999010;
     assertFalse(DirectoryServer.getSchema().hasDITStructureRule(ruleID));
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-dsr.ldif");
     assertFalse(schemaFile.exists());
 
@@ -4777,7 +4777,7 @@
       "-f", path
     };
 
-    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(),
+    File schemaFile = new File(SchemaConfigManager.getSchemaDirectoryPath(true),
                                "98-schema-test-mru.ldif");
     assertFalse(schemaFile.exists());
 
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java
index c06d885..953cfbb 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/protocols/jmx/JmxPrivilegeTestCase.java
@@ -785,7 +785,7 @@
                  hasPrivilege);
 
 
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath(true);
 
     String identifier;
     Entry authNEntry = conn.getAuthenticationInfo().getAuthenticationEntry();
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/AddSchemaFileTaskTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/AddSchemaFileTaskTestCase.java
index 40c765c..a761a0f 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/AddSchemaFileTaskTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/tasks/AddSchemaFileTaskTestCase.java
@@ -95,7 +95,7 @@
     DirectoryServer.registerMatchingRule(matchingRule, false);
 
 
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath(true);
 
     String[] fileLines =
     {
@@ -168,7 +168,7 @@
     Thread.sleep(2);
 
 
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath(true);
 
 
     SchemaTestMatchingRule matchingRule1 =
@@ -342,7 +342,7 @@
     Thread.sleep(2);
 
 
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath(true);
 
     File emptyFile = new File(schemaDirectory, "05-empty.ldif");
     emptyFile.createNewFile();
@@ -377,7 +377,7 @@
   public void testAddInvalidSchemaFile()
          throws Exception
   {
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath(true);
 
     File invalidFile = new File(schemaDirectory, "05-invalid.ldif");
     BufferedWriter writer = new BufferedWriter(new FileWriter(invalidFile));
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java
index 16f3b84..9a06dfc 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/types/PrivilegeTestCase.java
@@ -850,7 +850,7 @@
                  hasPrivilege);
 
 
-    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath();
+    String schemaDirectory = SchemaConfigManager.getSchemaDirectoryPath(true);
 
     String identifier;
     Entry authNEntry = conn.getAuthenticationInfo().getAuthenticationEntry();

--
Gitblit v1.10.0