diff --git a/screening/build/build.xml b/screening/build/build.xml
index c3510ad732c857482ea4a059645b5dd94e834305..7826973eb4cee48a336e84fd0db38dcb170196ae 100644
--- a/screening/build/build.xml
+++ b/screening/build/build.xml
@@ -46,12 +46,12 @@
         // Task for creating distributions
   -->
 	
-  <target name="dist" depends="create-installation-tarball, screening-api"/>
+  <target name="dist" depends="openbis.make-dist, make-full-dss-dist, dss-plugin-jar, datastore_server.make-plugin-dist, screening-api, create-installation-tarball"/>
 
 	<target name="create-installation-tarball" depends="create-installer">
 	  <property name="tarball.file" value="${basedir}/${dist}/${tarball.basename}.tar.gz" />
 		
-		<tar destfile="${tarball.file}">
+		<tar destfile="${tarball.file}" compression="gzip">
 		  <tarfileset dir="${basedir}/dist/tarball"
 		              prefix="${tarball.basename}/">
 		    <include name="*.*"/>
@@ -69,11 +69,16 @@
 		</tar>		
 	</target>
 	
-  <target name="create-installer" depends="openbis.make-dist, make-full-dss-dist, dss-plugin-jar, datastore_server.make-plugin-dist, prepare-installer">
+  <target name="create-installer" depends="prepare-installer">
 
 		<mkdir dir="${installer.dist.dir}" />
-		<unzip src="${dss.dist.file}" dest="${installer.dist.dir}"/>
-		<unzip src="${server.dist.file}" dest="${installer.dist.dir}"/>
+		
+  	<unzip dest="${installer.dist.dir}">
+		    <fileset dir=".">
+		        <include name="${dist}/openBIS-server${variant}-S*.zip"/>
+	          <include name="${dist}/datastore_server${variant}-S*.zip"/>
+		    </fileset>
+		</unzip>
 		
 		<!-- make the "admin" directory available to the installer as "bin" -->
 		<copy todir="${installer.dist.dir}/bin">
@@ -124,12 +129,8 @@
 	</target>
 	
 	<target name="prepare-installer">
-		<!-- KE: there is no easy way to get the ${dss.dist.file} property as we 
-		     refer to the DSS build via "antcall"-s and they do not have return values -->  
-		<build-info revision="revision.number" version="version.number" clean="clean.flag" />
-    <property name="dss.dist.file"
-              value="${dist.file.prefix}${variant}-${version.number}-r${revision.number}.zip" />
 		
+		<build-info revision="revision.number" version="version.number" clean="clean.flag" />
 	  <property name="tarball.basename" value="openBIS-installation${variant}-${version.number}-r${revision.number}" />
 		
   	<zip update="true" destfile="${server.dist.file}">
diff --git a/screening/dist/admin/restore-config-from-backup.sh b/screening/dist/admin/restore-config-from-backup.sh
index 9ef1fbef12a27be9c287fc2065cb1ca13d567b05..cf456fb5c4f6206cb63f856ba5c6cc7c9bc38625 100755
--- a/screening/dist/admin/restore-config-from-backup.sh
+++ b/screening/dist/admin/restore-config-from-backup.sh
@@ -16,7 +16,7 @@ fi
 source $BASE/common-functions.sh
 ROOT=$BASE/../servers
 
-echo "Restorting configuration backup from $CONF to $ROOT ..."
+echo "Restoring configuration backup from $CONF to $ROOT ..."
 
 # -- GLOBAL
 if [ -e "$CONF/env" ]; then
diff --git a/screening/dist/tarball/installer/eng.xml b/screening/dist/tarball/installer/eng.xml
index fc81b2937f57b50ecb23209d8c192f55608d3942..45a09e7a4d5f5735331b87e03817e4935ae17b5c 100644
--- a/screening/dist/tarball/installer/eng.xml
+++ b/screening/dist/tarball/installer/eng.xml
@@ -2,4 +2,6 @@
 <langpack>
     <str id="data.validation.error.title"  txt="Error" />
     <str id="installer.reversetitle"  txt="$APP_NAME installation" />
+    <str id="TargetPanel.info" txt="Select openBIS installation directory: " />
+    <str id="TargetPanel.warn" txt="Installation folder already exists. The process will run openBIS upgrade. Continue ?" />    
 </langpack>
\ No newline at end of file
diff --git a/screening/dist/tarball/installer/install.xml b/screening/dist/tarball/installer/install.xml
index 115d9e95704b1fc2b69c78b0a1f3bc8906b0b99a..83a0c56209b59b3e8e4c0ba16cc325d40ff9dc4c 100644
--- a/screening/dist/tarball/installer/install.xml
+++ b/screening/dist/tarball/installer/install.xml
@@ -4,8 +4,7 @@
     <appname>openBIS</appname>
     <appversion>@{version.number}</appversion>
     <url>http://www.cisd.ethz.ch/software/openBIS</url>
-    <!--  TODO KE: cannot disable uninstaller -->
-    <!--  uninstaller write="no"/-->
+    <uninstaller write="no"/>
     <javaversion>1.6</javaversion>
     <requiresjdk>yes</requiresjdk>
     <os>
@@ -99,11 +98,7 @@
     
     
     <!--  create backup if needed -->
-    <panel classname="com.izforge.izpack.panels.process.ProcessPanel" condition="isUpdateInstallation" >
-      <actions>
-        <action stage="preactivate" classname="ch.systemsx.cisd.openbis.installer.izpack.PrepareInstallationBackupAction" />
-      </actions>
-    </panel>
+    <panel classname="com.izforge.izpack.panels.process.ProcessPanel" condition="isUpdateInstallation" />
     
     <panel classname="com.izforge.izpack.panels.packs.PacksPanel"/>
     <panel classname="com.izforge.izpack.panels.install.InstallPanel">
@@ -142,12 +137,12 @@
     <pack name="Datastore Server" required="yes" loose="yes">
       <description>The data store server managing raw data</description>
       <file src="@{installer.dist.dir}/datastore_server" targetdir="$INSTALL_PATH/servers"/>
-      <file src="@{installer.dist.dir}/data/dropboxes" targetdir="$DSS.ROOT-DIR" />
-      <file src="@{installer.dist.dir}/data/incoming-simple" targetdir="$DSS.ROOT-DIR" />
-      <file src="@{installer.dist.dir}/data/incoming-hcs" targetdir="$DSS.ROOT-DIR" />
-      <file src="@{installer.dist.dir}/data/samples" targetdir="$DSS.ROOT-DIR" />
-      <file src="@{installer.dist.dir}/data/store" targetdir="$DSS.ROOT-DIR" />
-      <file src="@{installer.dist.dir}/data/log" targetdir="$INSTALL_DSS_PATH" />
+      <file src="@{installer.dist.dir}/data/dropboxes" targetdir="$DSS.ROOT-DIR" condition="isFirstTimeInstallation"/>
+      <file src="@{installer.dist.dir}/data/incoming-simple" targetdir="$DSS.ROOT-DIR" condition="isFirstTimeInstallation"/>
+      <file src="@{installer.dist.dir}/data/incoming-hcs" targetdir="$DSS.ROOT-DIR" condition="isFirstTimeInstallation"/>
+      <file src="@{installer.dist.dir}/data/samples" targetdir="$DSS.ROOT-DIR" condition="isFirstTimeInstallation"/>
+      <file src="@{installer.dist.dir}/data/store" targetdir="$DSS.ROOT-DIR" condition="isFirstTimeInstallation"/>
+      <file src="@{installer.dist.dir}/data/log" targetdir="$INSTALL_DSS_PATH" condition="isFirstTimeInstallation"/>
       
       <parsable targetfile="$INSTALL_DSS_PATH/etc/service.properties" />
     </pack>
@@ -155,21 +150,13 @@
     <pack name="Administration Scripts" required="yes" loose="yes">
       <description>Scripts to facilitate openBIS administration</description>
       <file src="@{installer.dist.dir}/bin" targetdir="$INSTALL_PATH" />
-      <file src="@{installer.dist.dir}/data/doc" targetdir="$DSS.ROOT-DIR" />
+      <file src="@{installer.dist.dir}/data/doc" targetdir="$DSS.ROOT-DIR" condition="isFirstTimeInstallation"/>
       
       <parsable targetfile="$INSTALL_BIN_PATH/env" />
-      <parsable targetfile="$DSS.ROOT-DIR/doc/getting-started-with-openBIS.html" />
+      <parsable targetfile="$DSS.ROOT-DIR/doc/getting-started-with-openBIS.html" condition="isFirstTimeInstallation"/>
 
       <!--  set all *.sh files executable -->      
-      <executable targetfile="$INSTALL_BIN_PATH/chmodx-all-scripts.sh" stage="postinstall" keep="false"/>
-      
-      <!-- restore the config from the pre-existing installation -->
-      <executable targetfile="$INSTALL_BIN_PATH/restore-config-from-backup.sh" 
-        stage="postinstall" condition="isUpdateInstallation" keep="true">
-        <args>
-          <arg value="$BACKUP_FOLDER/config-backup" />
-        </args>
-      </executable>
+      <executable targetfile="${INSTALL_BIN_PATH}/chmodx-all-scripts.sh" stage="postinstall" keep="false"/>
     </pack>
     
   </packs>
diff --git a/screening/dist/tarball/run-console.sh b/screening/dist/tarball/run-console.sh
index 6a56e502a14cf54f65c620dcf6ff5b1da7fe2001..3d213ad9b0334177396e971601c51e72945b97e5 100755
--- a/screening/dist/tarball/run-console.sh
+++ b/screening/dist/tarball/run-console.sh
@@ -1,33 +1,62 @@
 #!/bin/bash
 
+#	
+# reads the 'admin' user password from the console
+#
+function readAdminPassword()
+{
+	if [ -z "$ADMIN_PASSWORD" ]; then
+	    read -s -p "Enter password for openBIS 'admin' user : " ADMIN_PASSWORD
+	    echo ""
+	    
+	    read -s -p "Re-type password for openBIS 'admin' user : " ADMIN_PASSWORD2
+	    echo ""
+	    
+	    if [ "$ADMIN_PASSWORD" -ne "$ADMIN_PASSWORD2" ]; then
+	        echo "Administrator passwords do not match. Aborting installation."
+	        exit 2
+	    fi
+	fi
+}
+
+#
+# enforces the availability of a certain command on the system path
+#
+function ensureToolOnPath() 
+{
+  cmd=$1
+  cmdLocation=$(which $cmd)
+  
+  if [ -z "$cmdLocation" ]; then
+  
+     echo "The installation process requires '$cmd' to be on the system path."
+     echo "Please set the PATH variable accordingly and try again."
+     exit 3
+  
+  fi
+}
+
+
 BASE=`dirname "$0"`
 if [ ${BASE#/} == ${BASE} ]; then
     BASE="`pwd`/${BASE}"
 fi
 
-
-install_path_configured=$(grep -e "^INSTALL_PATH=.*\w.*$" $BASE/console.properties)
-if [ -z "$install_path_configured" ]; then
+install_path=$( grep -e "^INSTALL_PATH=.*$" $BASE/console.properties | sed "s/INSTALL_PATH=//" )
+if [ -z "$install_path" ]; then
     echo "The property INSTALL_PATH must be configured in $BASE/console.properties."
     echo "Please edit the file and run the installation script again."
     exit 1
 fi
 
-#
-# create 'admin' user
-#
-if [ -z "$ADMIN_PASSWORD" ]; then
-    read -s -p "Enter password for openBIS 'admin' user : " ADMIN_PASSWORD
-    echo ""
-    
-    read -s -p "Re-type password for openBIS 'admin' user : " ADMIN_PASSWORD2
-    echo ""
-    
-    if [ "$ADMIN_PASSWORD" -ne "$ADMIN_PASSWORD2" ]; then
-        echo "Administrator passwords do not match. Aborting installation."
-        exit 2
-    fi
+ensureToolOnPath "java" 
+ensureToolOnPath "psql"
+ensureToolOnPath "pg_dump"
+	
+if [ -d "$install_path" ]; then
+  echo "Previous openBIS installation detected. Upgrading..."
+else 
+  readAdminPassword
 fi
 
-
-java -Djava.util.logging.config.file=$BASE/jul.config -DADMIN_PASSWORD=$ADMIN_PASSWORD -Dmerge.props.to.installation.vars=true -jar $BASE/openBIS-installer.jar -options-auto $BASE/console.properties
\ No newline at end of file
+java -Djava.util.logging.config.file=$BASE/jul.config -DADMIN_PASSWORD=$ADMIN_PASSWORD -Dmerge.props.to.installation.vars=true -jar $BASE/openBIS-installer.jar -options-auto $BASE/console.properties
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java
index 0cdc2acaa86a4ad0b72d64c1ad47e1d3646566da..29e2b99ed4729a74cc727a4c43b3c5fab64b000e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java
@@ -64,7 +64,10 @@ public class ExecuteSetupScriptsAction implements PanelAction
     private void executRestoreConfigScript(AutomatedInstallData data)
     {
         String script = getAdminScript(data, RESTORE_CONFIG_FROM_BACKUP_SCRIPT);
-        executeAdminScript(null, script, data.getVariable("BACKUP_FOLDER"));
+        String backupConfigFolder =
+                data.getVariable(GlobalInstallationContext.BACKUP_FOLDER_VARNAME)
+                        + "/config-backup";
+        executeAdminScript(null, script, backupConfigFolder);
     }
 
     private void executePostInstallationScript(AutomatedInstallData data)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java
index 15c279bb6f62b52662a4c54eb99c4843ce436dc2..034b67fb6331b329bf94bbe611699abf8ee252da 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java
@@ -35,6 +35,8 @@ public class GlobalInstallationContext
 
     public static final String DATA_DIR_VARNAME = "DSS.ROOT-DIR";
 
+    public static final String BACKUP_FOLDER_VARNAME = "BACKUP_FOLDER";
+
     /**
      * set to true if the installation process is trying to update an existing openBIS installation.
      */
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/InitializeInstallationContextAction.java b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/InitializeInstallationContextAction.java
index f18747d48e767c52c7347770161babbee9099c23..d2b0b06ecd2a9eca58c6b4b6110a0b94ddb48176 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/InitializeInstallationContextAction.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/InitializeInstallationContextAction.java
@@ -32,6 +32,11 @@ public class InitializeInstallationContextAction implements PanelAction
     public void executeAction(AutomatedInstallData data, AbstractUIHandler arg1)
     {
         GlobalInstallationContext.initialize(data);
+
+        if (GlobalInstallationContext.isUpdateInstallation)
+        {
+            new PrepareInstallationBackupAction().executeAction(data, arg1);
+        }
     }
 
     public void initialize(PanelActionConfiguration arg0)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PostgresToolsPathValidator.java b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PostgresToolsPathValidator.java
index 436e839cde60202fa01c9910c708e5a2ca884ef0..bc7af9d225ccc2237bde760223a958a493ff0623 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PostgresToolsPathValidator.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PostgresToolsPathValidator.java
@@ -58,7 +58,16 @@ public class PostgresToolsPathValidator implements DataValidator
 
         data.setVariable(POSTGRES_BIN_VARNAME, selectedPath);
 
-        return (valid) ? Status.OK : Status.ERROR;
+        if (valid)
+        {
+            return Status.OK;
+        } else
+        {
+            // only useful for console installations
+            System.err.println(getErrorMessageId());
+            return Status.ERROR;
+        }
+
     }
 
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PrepareInstallationBackupAction.java b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PrepareInstallationBackupAction.java
index e9f33f9f59db82c57b3ffea56d9704e6782dd73b..9aa693c07c85ab8dbd4e700f14a857d3b9b811ac 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PrepareInstallationBackupAction.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/installer/izpack/PrepareInstallationBackupAction.java
@@ -32,9 +32,6 @@ import com.izforge.izpack.data.PanelAction;
  */
 public class PrepareInstallationBackupAction implements PanelAction
 {
-
-    private static final String BACKUP_FOLDER_VARNAME = "BACKUP_FOLDER";
-
     private static final String BACK_FOLDER_PATTERN = "yyyy-MM-dd-HHmm";
 
     private static final String BACKUP_ROOT = "backup";
@@ -64,7 +61,7 @@ public class PrepareInstallationBackupAction implements PanelAction
     private String setInstallationWideBackupDirVariable(AutomatedInstallData data)
     {
         String backupDirPath = backupDir.getAbsolutePath();
-        data.setVariable(BACKUP_FOLDER_VARNAME, backupDirPath);
+        data.setVariable(GlobalInstallationContext.BACKUP_FOLDER_VARNAME, backupDirPath);
         return backupDirPath;
     }