fix issues when launching from scratch
diff --git a/hudson-scripts/clean-nightly.sh b/hudson-scripts/clean-nightly.sh
index b283af7..0684855 100755
--- a/hudson-scripts/clean-nightly.sh
+++ b/hudson-scripts/clean-nightly.sh
@@ -24,7 +24,6 @@
 unqualifiedVersion="${1}"
 nbBuildToKeep="${2:-5}"
 
-LS_LEVEL=20
 source "$(dirname "${0}")/init.sh"
 
 LSINFO "Cleaning up '${PROJECT_NAME} ${unqualifiedVersion}' nightly builds (will keep the ${nbBuildToKeep} most recent)"
diff --git a/hudson-scripts/init.sh b/hudson-scripts/init.sh
index 9062d60..fd0bf73 100644
--- a/hudson-scripts/init.sh
+++ b/hudson-scripts/init.sh
@@ -21,6 +21,7 @@
 
 SCRIPT_PATH="$(dirname "${0}")"
 INIT_PATH="${INIT_PATH:-${SCRIPT_PATH}/init}"
+LS_LEVEL=20 # log level == info
 
 # load bootstrap scripts (starting with _) in order
 for S in $( echo "${INIT_PATH}/_"* | tr ' ' '\n' | sort -t '.' -k1n );
diff --git a/hudson-scripts/init/1_p2.sh b/hudson-scripts/init/1_p2.sh
index 1c87de8..fc84e06 100644
--- a/hudson-scripts/init/1_p2.sh
+++ b/hudson-scripts/init/1_p2.sh
@@ -67,7 +67,7 @@
 	"${WORKING_DIRECTORY}/p2-admin/p2-admin" \
 		-vm "${JAVA_HOME}/bin/java" \
 		-application "org.eclipselabs.equinox.p2.composite.repository" \
-		$@
+		$@ || true
 }
 
 # Create a p2 index file for composite repositories
diff --git a/hudson-scripts/init/_0_log.sh b/hudson-scripts/init/_0_log.sh
index 1cbcdf1..0563c67 100644
--- a/hudson-scripts/init/_0_log.sh
+++ b/hudson-scripts/init/_0_log.sh
@@ -22,8 +22,6 @@
 
 # Modified from https://github.com/livibetter/log.sh/releases/tag/v0.3
 
-LS_VERSION=0.3
-
 LS_OUTPUT=${LS_OUTPUT:-/dev/stdout}
 # XXX need more flexible templating, currently manual padding for level names
 #LS_DEFAULT_FMT=${LS_DEFAULT_FMT:-'[${_LS_LEVEL_STR}][${FUNCNAME[1]}:${BASH_LINENO[0]}]'}
@@ -46,20 +44,20 @@
 )
 
 _LS_FIND_LEVEL_STR () {
-  local LEVEL=${1}
-  local i
-  _LS_LEVEL_STR="${LEVEL}"
-  for ((i=0; i<${#LS_LEVELS[@]}; i+=4)); do
-    if [[ "${LEVEL}" == "${LS_LEVELS[i]}" ]]; then
-      _LS_LEVEL_STR="${LS_LEVELS[i+1]}"
-      #_LS_LEVEL_BEGIN="${LS_LEVELS[i+2]}"
-      #_LS_LEVEL_END="${LS_LEVELS[i+3]}"
-      return 0
-    fi
-  done
-  _LS_LEVEL_BEGIN=""
-  _LS_LEVEL_END=""
-  return 1
+local LEVEL=${1}
+local i
+_LS_LEVEL_STR="${LEVEL}"
+for ((i=0; i<${#LS_LEVELS[@]}; i+=4)); do
+  if [[ "${LEVEL}" == "${LS_LEVELS[i]}" ]]; then
+    _LS_LEVEL_STR="${LS_LEVELS[i+1]}"
+    #_LS_LEVEL_BEGIN="${LS_LEVELS[i+2]}"
+    #_LS_LEVEL_END="${LS_LEVELS[i+3]}"
+    return 0
+  fi
+done
+_LS_LEVEL_BEGIN=""
+_LS_LEVEL_END=""
+return 1
 }
 
 # General logging function
@@ -75,34 +73,28 @@
   printf "${LS_DEFAULT_FMT}" "${_LS_LEVEL_STR}" "${_MSG}" "$(basename ${BASH_SOURCE[1]})" "${BASH_LINENO[0]}" >> "${LS_OUTPUT}"
 }
 
-shopt -s expand_aliases
+# Log Call Stack
+LSCALLSTACK () {
+  local i=0
+  local FRAMES=${#BASH_LINENO[@]}
+  if [ "${FRAMES}" -gt "4" ]; then
+    local start=3
+  else 
+    local start=0
+  fi
+  # starts at 3 to skips LSCALLSTACK and __onErr, the last one in arrays
+  for ((i=$start; i<FRAMES-1; i++)); do
+    echo '  File' \"${BASH_SOURCE[i+1]}\", line ${BASH_LINENO[i]}, in ${FUNCNAME[i+1]} >> "${LS_OUTPUT}"
+    # Grab the source code of the line
+    sed -E -n ${BASH_LINENO[i]}'s/^[:space:]*/    /p' "${BASH_SOURCE[i+1]}" >> "${LS_OUTPUT}"
+    # TODO extract arugments from "${BASH_ARGC[@]}" and "${BASH_ARGV[@]}"
+    # It requires `shopt -s extdebug'
+  done
+}
+
 alias LSDEBUG='LSLOG 10'
 alias LSINFO='LSLOG 20'
 alias LSWARNING='LSLOG 30'
 alias LSERROR='LSLOG 40'
 alias LSCRITICAL='LSLOG 50'
-alias LSLOGSTACK='LSDEBUG Stack trace ; LSCALLSTACK'
-
-# TODO Log Bash information
-LSLOGBASH () {
-  :
-}
-
-# TODO Log current user information
-LSLOGUSER () {
-  :
-}
-
-# Log Call Stack
-LSCALLSTACK () {
-  local i=0
-  local FRAMES=${#BASH_LINENO[@]}
-  # FRAMES-2 skips main, the last one in arrays
-  for ((i=FRAMES-2; i>0; i--)); do
-    echo '  File' \"${BASH_SOURCE[i+1]}\", line ${BASH_LINENO[i]}, in ${FUNCNAME[i+1]}
-    # Grab the source code of the line
-    sed -n "${BASH_LINENO[i]} s/^[:space:]*/    /p" "${BASH_SOURCE[i+1]}"
-    # TODO extract arugments from "${BASH_ARGC[@]}" and "${BASH_ARGV[@]}"
-    # It requires `shopt -s extdebug'
-  done
-}
+alias LSLOGSTACK='LSDEBUG Stack trace ; LSCALLSTACK'
\ No newline at end of file
diff --git a/hudson-scripts/init/_1_trap.sh b/hudson-scripts/init/_1_trap.sh
index 5948df8..f5429ff 100644
--- a/hudson-scripts/init/_1_trap.sh
+++ b/hudson-scripts/init/_1_trap.sh
@@ -36,5 +36,5 @@
 }
 
 trap __onErr ERR
-trap __onInterruption INT TERM #DEBUG #RETURN
+trap __onInterruption INT QUIT TERM
 trap __onExit EXIT
diff --git a/hudson-scripts/init/_2_workdir.sh b/hudson-scripts/init/_2_workdir.sh
index 6eecfb5..aec30a2 100644
--- a/hudson-scripts/init/_2_workdir.sh
+++ b/hudson-scripts/init/_2_workdir.sh
@@ -11,8 +11,19 @@
 # ====================================================================
 
 export WORKING_DIRECTORY="${WORKING_DIRECTORY:-$(pwd)/target}"
+LS_OUTPUT="${WORKING_DIRECTORY}/log.txt"
 
 if [ ! -d "${WORKING_DIRECTORY}" ]; then
 	LSDEBUG "Creating '${WORKING_DIRECTORY}'"
 	mkdir -p "${WORKING_DIRECTORY}"
-fi
\ No newline at end of file
+fi
+
+[ -z "${_WORKDIR_MODULE_INITED:-}" ] && {
+	export _WORKDIR_MODULE_INITED="resolved"
+
+	rm -f "${LS_OUTPUT}"
+	touch "${LS_OUTPUT}"
+	tail -f "${LS_OUTPUT}" &
+	_TAIL_PID=$!
+	trap "kill ${_TAIL_PID}" EXIT
+} || true
\ No newline at end of file
diff --git a/hudson-scripts/publish-nightly.sh b/hudson-scripts/publish-nightly.sh
index fd08661..e1afdaf 100755
--- a/hudson-scripts/publish-nightly.sh
+++ b/hudson-scripts/publish-nightly.sh
@@ -24,7 +24,6 @@
 artifactURL="${1}"
 qualifiedVersion="${2}"
 
-LS_LEVEL=20
 source "$(dirname "${0}")/init.sh"
 
 LSINFO "Publishing nightly build '${PROJECT_NAME} ${qualifiedVersion}'"