diff --git a/datastore_server/dist/datastore_server.sh b/datastore_server/dist/datastore_server.sh
index 13881cddcbca242928709b789677b2239fd6487c..31ccfae88467eac993b183b65995143e907fbc83 100755
--- a/datastore_server/dist/datastore_server.sh
+++ b/datastore_server/dist/datastore_server.sh
@@ -107,6 +107,8 @@ LOGFILE=log/datastore_server_log.txt
 STARTUPLOG=log/startup_log.txt
 SUCCESS_MSG="Data Store Server ready and waiting for data"
 LIB_FOLDER=lib
+# contains custom libraries e.g. JDBC drivers for external databases
+EXT_LIB_FOLDER=ext-lib
 MAX_LOOPS=10
 
 #
@@ -133,8 +135,8 @@ fi
 command=$1
 ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore -Dpython.path=lib/jython-lib $JAVA_OPTS"
 
-# Build classpath from $LIB_FOLDER content. First JAR is datastore_server.jar because it has to appear before cifex.jar
-CP=`echo $LIB_FOLDER/datastore_server.jar $LIB_FOLDER/*.jar | sed 's/ /:/g'`
+# Build classpath from $LIB_FOLDER and $EXT_LIB_FOLDER content. First JAR is datastore_server.jar because it has to appear before cifex.jar
+CP=`echo $LIB_FOLDER/datastore_server.jar $LIB_FOLDER/*.jar $EXT_LIB_FOLDER/*.jar | sed 's/ /:/g'`
 
 CMD="${JAVA_BIN} ${ALL_JAVA_OPTS} -classpath $CP ch.systemsx.cisd.openbis.dss.generic.DataStoreServer"
 
diff --git a/datastore_server/dist/ext-lib/README.txt b/datastore_server/dist/ext-lib/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5de7263704d3115b0b9b14ed5cd8abb93a44c8e1
--- /dev/null
+++ b/datastore_server/dist/ext-lib/README.txt
@@ -0,0 +1,11 @@
+This folder contains libraries (JAR files) that are not part of the standard 
+openBIS installation, but are needed for the normal work of the system.
+
+One good example for such libraries are JDBC drivers required to connect to 
+an external database (e.g. Oracle). 
+
+Administrators are encouraged to copy the extension libraries here as they will 
+be kept by the openBIS upgrade scripts (as opposed to the contents of the 'lib'
+folder which are wiped out after a software upgrade).
+
+  
\ No newline at end of file
diff --git a/screening/dist/admin/backup-config.sh b/screening/dist/admin/backup-config.sh
index d63cca1ec87a36f5ec71ff089517152b463ab79a..2d65840f653c33df8cc830893bedda958950f4be 100755
--- a/screening/dist/admin/backup-config.sh
+++ b/screening/dist/admin/backup-config.sh
@@ -37,5 +37,7 @@ cp $ROOT/datastore_server/etc/log.xml $CONF/dss-log.xml
 cp $ROOT/datastore_server/etc/datastore_server.conf $CONF/datastore_server.conf
 # not always present
 copyIfExists $ROOT/datastore_server/etc/openBIS.keystore $CONF/.keystore 
+copyIfExists $ROOT/datastore_server/ext-lib $CONF
+
 # screening-specific
 cp $ROOT/datastore_server/etc/tabular-data-graph.properties $CONF/tabular-data-graph.properties
diff --git a/screening/dist/admin/common-functions.sh b/screening/dist/admin/common-functions.sh
index 2a00c32541f3467947bb8b624248fc0ba9860771..63283870d5c3ac02531765124462070f2c416700 100644
--- a/screening/dist/admin/common-functions.sh
+++ b/screening/dist/admin/common-functions.sh
@@ -37,6 +37,6 @@ executeScriptHooks()
 copyIfExists() 
 {
   if [ -f "$1" ]; then
-      cp "$1" "$2"
+      cp -R "$1" "$2"
   fi
 }
\ No newline at end of file
diff --git a/screening/dist/admin/restore-config-from-backup.sh b/screening/dist/admin/restore-config-from-backup.sh
index 23ea3ce139fa9602351121491f8d3f0289f5026a..9ef1fbef12a27be9c287fc2065cb1ca13d567b05 100755
--- a/screening/dist/admin/restore-config-from-backup.sh
+++ b/screening/dist/admin/restore-config-from-backup.sh
@@ -44,5 +44,7 @@ cp $CONF/dss-log.xml $ROOT/datastore_server/etc/log.xml
 cp $CONF/datastore_server.conf $ROOT/datastore_server/etc/
 # not always present
 copyIfExists $CONF/.keystore $ROOT/datastore_server/etc/openBIS.keystore
+copyIfExists $CONF/ext-lib $ROOT/datastore_server 
+
 # screening-specific
 cp $CONF/tabular-data-graph.properties $ROOT/datastore_server/etc/