diff --git a/src/main/scripts/unix/download-shell-script-url-create b/src/main/scripts/unix/download-shell-script-url-create
new file mode 100755
index 0000000000000000000000000000000000000000..7626123d104d0a8f43a673bc0d31ec3db4a1f399
--- /dev/null
+++ b/src/main/scripts/unix/download-shell-script-url-create
@@ -0,0 +1,157 @@
+#!/bin/bash
+
+# This script generates a URL which when consumed, will download a zip file
+# The zip file holds Unix and Windows scripts for downloading the specified assets.
+#
+# Default values for the script arguments
+EXPIRE_DAYS=14
+OVERWRITE=false
+VERBOSE=true
+PROJECT=""
+
+
+# aterm.jar download url
+ATERM_URL=https://mediaflux.researchsoftware.unimelb.edu.au/mflux/aterm.jar
+
+# function to print usage
+usage() {
+    echo ""
+	echo "Usage:"
+	echo "    $(basename $0) [-h|--help] [[--project <project ID>] --expire-days <number-of-days>] [--ncsr <ncsr>] [--overwrite] [--quiet] <namespace>"
+	echo ""
+	echo "Options:"
+	echo "    -h | --help                       prints usage."
+	echo "    --email <addresses>               specify the email recipient of the generated url. Can be comma-separated if there are more than one."
+	echo "    --expire-days <number-of-days>    expiry of the auth token. Defaults to ${EXPIRE_DAYS} days."
+	echo "    --overwrite                       overwrite if output file exists."
+	echo "    --project                         the project ID that the assets must be drawn from."
+	echo "    --quiet                           do not print output message."
+	echo ""
+	echo "Positional arguments:"
+	echo "    <id>                              Mediaflux asset IDs to be downloaded by the scripts. Can be multiple, but must be from the same project."
+	echo ""
+	echo "Examples:"
+	echo "    $(basename $0) --email user1@unimelb.edu.au --expire-days 10 proj-abc-1128.4.999/RAW_DATA proj-abc-1128.4.999/PROCESSED_DATA"
+	echo ""
+}
+
+# check java
+[[ -z $(which java) ]] && echo "Error: cannot find java." 1>&2 && exit 1
+
+# check mflux.cfg
+[[ -z $MFLUX_CFG || ! -f $MFLUX_CFG ]] && MFLUX_CFG="./mflux.cfg"
+[[ -z $MFLUX_CFG || ! -f $MFLUX_CFG ]] && MFLUX_CFG="${HOME}/.Arcitecta/mflux.cfg"
+[[ -z $MFLUX_CFG || ! -f $MFLUX_CFG ]] && MFLUX_CFG="$(dirname ${BASH_SOURCE[0]})/../../config/mflux.cfg"
+[[ -z $MFLUX_CFG || ! -f $MFLUX_CFG ]] && MFLUX_CFG="$(dirname ${BASH_SOURCE[0]})/../../mflux.cfg"
+[[ -z $MFLUX_CFG || ! -f $MFLUX_CFG ]] && MFLUX_CFG="$(dirname ${BASH_SOURCE[0]})/mflux.cfg"
+[[ -z $MFLUX_CFG || ! -f $MFLUX_CFG ]] && echo "Error: cannot find ${HOME}/.Arcitecta/mflux.cfg." 1>&2 && exit 1
+
+# check aterm.jar
+[[ -z $MFLUX_ATERM || ! -f $MFLUX_ATERM ]] && MFLUX_ATERM="$(dirname ${BASH_SOURCE[0]})/../../lib/aterm.jar"
+[[ -z $MFLUX_ATERM || ! -f $MFLUX_ATERM ]] && MFLUX_ATERM="${HOME}/.Arcitecta/aterm.jar"
+[[ -z $MFLUX_ATERM || ! -f $MFLUX_ATERM ]] && MFLUX_ATERM=/opt/mediaflux/bin/aterm.jar
+[[ -z $MFLUX_ATERM || ! -f $MFLUX_ATERM ]] && MFLUX_ATERM=./aterm.jar
+
+
+# download aterm.jar
+if [[ -z $MFLUX_ATERM || ! -f $MFLUX_ATERM ]]; then
+    MFLUX_ATERM=${HOME}/.Arcitecta/aterm.jar
+    mkdir -p ${HOME}/.Arcitecta
+    CURL=$(which curl)
+    WGET=$(which wget)
+    [[ -z "${CURL}" && -z "${WGET}" ]] && echo "Error: cannot download aterm.jar. Found no curl or wget." 1>&2 && exit 1
+    if [[ ! -z "${CURL}" ]]; then
+        curl -f --create-dirs -k -o "$(dirname $0)/aterm.jar" "${ATERM_URL}"
+    else
+        wget --no-check-certificate -O "$(dirname $0)/aterm.jar" "${ATERM_URL}"
+    fi
+    if [[ $? -ne 0 ]]; then
+        echo "Error: failed to download aterm.jar"
+        exit 1
+    fi
+fi
+
+ATERM="java -jar -Dmf.cfg=$MFLUX_CFG $MFLUX_ATERM nogui"
+SERVICE=unimelb.asset.download.shell.script.url.create 
+COMMAND="${ATERM} ${SERVICE}"
+
+##
+## parse arguments
+##
+declare -a NAMESPACES=()
+declare -a EMAILS=()
+while [[ $# -gt 0 ]]
+do
+key="$1"
+case $key in
+    --expire-days)
+    EXPIRE_DAYS="$2"
+    shift
+    shift
+    ;;
+    --email)
+    IFS=',' read -r -a EMAILS <<< "$2"; unset IFS
+    shift
+    shift
+    ;;
+    --overwrite)
+    OVERWRITE=true
+    shift
+    ;;
+    --project)
+    PROJECT="$2"
+    shift
+    shift
+    ;;
+    --quiet)
+    VERBOSE=false
+    shift
+    ;;
+    -h|--help)
+    shift
+    usage && exit 0
+    ;;
+    *)
+    IDS+=("$1")
+    shift
+    ;;
+esac
+done
+
+if [[ -z $PROJECT ]]; then
+    echo "Error: no project ID was specified." 1>&2
+    usage
+    exit 1
+fi
+
+if [[ ${#IDS[@]} -eq 0 ]]; then
+    echo "Error: no Mediaflux assets were specified." 1>&2
+    usage
+    exit 1
+fi
+
+COMMAND="${COMMAND} :download <"
+for id in "${IDS[@]}"
+do
+    COMMAND="${COMMAND} :id ${id}"
+done
+ROLE="${PROJECT}:participant-a"
+ROLE_NAMESPACE="${PROJECT}"
+COMMAND="${COMMAND} :id 2383171 :id 2383172"
+
+COMMAND="${COMMAND} :token < :role -type role ${ROLE} :to now+${EXPIRE_DAYS}day > :verbose ${VERBOSE} :overwrite ${OVERWRITE}"
+COMMAND="${COMMAND} >"
+
+COMMAND="${COMMAND} :token < :perm < :resource -type role:namespace ${ROLE_NAMESPACE} :access ADMINISTER > >"
+
+if [[ ${#EMAILS[@]} -gt 0 ]]; then
+    COMMAND="${COMMAND} :email < "
+    for email in "${EMAILS[@]}"
+    do
+        COMMAND="${COMMAND} :to ${email}"
+    done
+    COMMAND="${COMMAND} >"
+fi
+
+# execute the command to generate the url
+${COMMAND}