diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise
index 42c9a2be963405eb38376c920f6f590d0042b994..3bfc5ce6f283e573f4fd3fa11e62607858130acb 100755
--- a/src/freedombone-image-customise
+++ b/src/freedombone-image-customise
@@ -626,11 +626,7 @@ function mesh_firewall {
 
 function mesh_tox_node {
 	# obtain commits from the main file
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXCORE_COMMIT_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXCORE_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		TOXCORE_COMMIT_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXCORE_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	TOXCORE_COMMIT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXCORE_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 	if [ ${#TOXCORE_COMMIT_MAIN} -gt 10 ]; then
 		TOXCORE_COMMIT=$TOXCORE_COMMIT_MAIN
 	fi
@@ -639,11 +635,7 @@ function mesh_tox_node {
 		exit 76325
 	fi
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOX_PORT_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOX_PORT=" | head -n 1 | awk -F '=' '{print $2}')
-	else
-		TOX_PORT_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOX_PORT=" | head -n 1 | awk -F '=' '{print $2}')
-	fi
+	TOX_PORT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOX_PORT=" | head -n 1 | awk -F '=' '{print $2}')
 	if [ ${#TOX_PORT_MAIN} -gt 2 ]; then
 		TOX_PORT=$TOX_PORT_MAIN
 	fi
@@ -652,11 +644,7 @@ function mesh_tox_node {
 		exit 32856
 	fi
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXCORE_REPO_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXCORE_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	else
-		TOXCORE_REPO_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXCORE_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	fi
+	TOXCORE_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXCORE_REPO=" | head -n 1 | awk -F '"' '{print $2}')
 	if [ ${#TOXCORE_REPO_MAIN} -gt 10 ]; then
 		TOXCORE_REPO=$TOXCORE_REPO_MAIN
 	fi
@@ -767,11 +755,7 @@ function mesh_tox_avahi {
 		exit 87359
 	fi
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXID_REPO_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	else
-		TOXID_REPO_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	fi
+	TOXID_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
 	if [ ${#TOXID_REPO_MAIN} -gt 5 ]; then
 		TOXID_REPO=$TOXID_REPO_MAIN
 	fi
@@ -814,27 +798,15 @@ function mesh_tox_avahi {
 }
 
 function mesh_tox_client {
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXIC_FILE=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	else
-		TOXIC_FILE=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	fi
+	TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
 
 	# obtain commits from the main file
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXIC_COMMIT_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		TOXIC_COMMIT_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	TOXIC_COMMIT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 	if [ ${#TOXIC_COMMIT_MAIN} -gt 10 ]; then
 		TOXIC_COMMIT=$TOXIC_COMMIT_MAIN
 	fi
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXIC_REPO_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	else
-		TOXIC_REPO_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	fi
+	TOXIC_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_REPO=" | head -n 1 | awk -F '"' '{print $2}')
 	if [ ${#TOXIC_REPO_MAIN} -gt 5 ]; then
 		TOXIC_REPO=$TOXIC_REPO_MAIN
 	fi
@@ -858,11 +830,7 @@ function mesh_tox_client {
 	chmod +x $TEMP_SCRIPT
 	cp $TEMP_SCRIPT $rootdir/root/
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXIC_FILE=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	else
-		TOXIC_FILE=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	fi
+	TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
 
 	SECONDS=0
 	chroot "$rootdir" /root/$TEMP_SCRIPT_NAME
@@ -884,11 +852,7 @@ function mesh_tox_client {
 
 function mesh_zeronet {
 	# obtain commits from the main file
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_COMMIT_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		ZERONET_COMMIT_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	ZERONET_COMMIT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 	if [ ${#ZERONET_COMMIT_MAIN} -gt 10 ]; then
 		ZERONET_COMMIT=$ZERONET_COMMIT_MAIN
 	fi
@@ -896,12 +860,8 @@ function mesh_zeronet {
 		echo $'No Tox commit was specified'
 		exit 37046
 	fi
-
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_REPO_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	else
-		ZERONET_REPO_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-	fi
+	
+	ZERONET_REPO_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_REPO=" | head -n 1 | awk -F '"' '{print $2}')
 	if [ ${#ZERONET_REPO_MAIN} -gt 5 ]; then
 		ZERONET_REPO=$ZERONET_REPO_MAIN
 	fi
@@ -910,11 +870,7 @@ function mesh_zeronet {
 		exit 37046
 	fi
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_PORT_MAIN=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_PORT=" | head -n 1 | awk -F '=' '{print $2}')
-	else
-		ZERONET_PORT_MAIN=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_PORT=" | head -n 1 | awk -F '=' '{print $2}')
-	fi
+	ZERONET_PORT_MAIN=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_PORT=" | head -n 1 | awk -F '=' '{print $2}')
 	if [ ${#ZERONET_PORT_MAIN} -gt 1 ]; then
 		ZERONET_PORT=$ZERONET_PORT_MAIN
 	fi
@@ -995,13 +951,8 @@ function mesh_zeronet {
 }
 
 function mesh_zeronet_blog {
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_BLOG_REPO=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_BLOG_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_BLOG_COMMIT=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_BLOG_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		ZERONET_BLOG_REPO=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_BLOG_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_BLOG_COMMIT=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_BLOG_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	ZERONET_BLOG_REPO=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_BLOG_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+	ZERONET_BLOG_COMMIT=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_BLOG_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 
 	git clone $ZERONET_BLOG_REPO $rootdir$MESH_INSTALL_DIR/zeronet/ZeroBlog
 	if [ ! -d $rootdir$MESH_INSTALL_DIR/zeronet/ZeroBlog ]; then
@@ -1014,13 +965,8 @@ function mesh_zeronet_blog {
 }
 
 function mesh_zeronet_mail {
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_MAIL_REPO=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_MAIL_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_MAIL_COMMIT=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_MAIL_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		ZERONET_MAIL_REPO=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_MAIL_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_MAIL_COMMIT=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_MAIL_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	ZERONET_MAIL_REPO=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_MAIL_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+	ZERONET_MAIL_COMMIT=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_MAIL_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 
 	git clone $ZERONET_MAIL_REPO $rootdir$MESH_INSTALL_DIR/zeronet/ZeroMail
 	if [ ! -d $rootdir$MESH_INSTALL_DIR/zeronet/ZeroMail ]; then
@@ -1033,13 +979,8 @@ function mesh_zeronet_mail {
 }
 
 function mesh_zeronet_forum {
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_FORUM_REPO=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_FORUM_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_FORUM_COMMIT=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_FORUM_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		ZERONET_FORUM_REPO=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_FORUM_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_FORUM_COMMIT=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_FORUM_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	ZERONET_FORUM_REPO=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_FORUM_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+	ZERONET_FORUM_COMMIT=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_FORUM_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 
 	git clone $ZERONET_FORUM_REPO $rootdir$MESH_INSTALL_DIR/zeronet/ZeroTalk
 	if [ ! -d $rootdir$MESH_INSTALL_DIR/zeronet/ZeroTalk ]; then
@@ -1052,13 +993,8 @@ function mesh_zeronet_forum {
 }
 
 function mesh_zeronet_id {
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		ZERONET_ID_REPO=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_ID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_ID_COMMIT=$(cat /usr/local/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_ID_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	else
-		ZERONET_ID_REPO=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_ID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
-		ZERONET_ID_COMMIT=$(cat /usr/bin/${PROJECT_NAME}-app-zeronet | grep "ZERONET_ID_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
-	fi
+	ZERONET_ID_REPO=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_ID_REPO=" | head -n 1 | awk -F '"' '{print $2}')
+	ZERONET_ID_COMMIT=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-zeronet | grep "ZERONET_ID_COMMIT=" | head -n 1 | awk -F "'" '{print $2}')
 
 	git clone $ZERONET_ID_REPO $rootdir$MESH_INSTALL_DIR/zeronet/ZeroID
 	if [ ! -d $rootdir$MESH_INSTALL_DIR/zeronet/ZeroID ]; then
diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh
index be27e9410f0670b9cb4259a44bf61ab63adb3186..8fbf1ec8c639dedbce856f46f49e946cfee5ab7a 100755
--- a/src/freedombone-image-mesh
+++ b/src/freedombone-image-mesh
@@ -372,11 +372,7 @@ function configure_zeronet_id {
 function configure_toxcore {
 	echo $'Configuring toxcore' >> $INSTALL_LOG
 
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXIC_FILE=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	else
-		TOXIC_FILE=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	fi
+	TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
 
 	echo $'Enabling toxcore daemon' >> $INSTALL_LOG
 	systemctl enable tox-bootstrapd.service
diff --git a/src/freedombone-mesh b/src/freedombone-mesh
index d477d96ffcb1f011a5b6d9f969e369192c290e6b..c7454160d5511717c498407dc19bbf47d4cd6553 100755
--- a/src/freedombone-mesh
+++ b/src/freedombone-mesh
@@ -36,11 +36,7 @@ export TEXTDOMAINDIR="/usr/share/locale"
 CONFIG_FILE=$HOME/${PROJECT_NAME}.cfg
 
 MUMBLE_PATH=/usr/bin/mumble
-if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-    TOXIC_FILE=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-else
-    TOXIC_FILE=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-fi
+TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
 DHTNODES=/usr/share/toxic/DHTnodes
 
 PEERS_FILE=/tmp/meshpeers.txt
diff --git a/src/freedombone-mesh-install b/src/freedombone-mesh-install
index 57db2938e88a9bb51582e9c1f9df0192368c26e7..50ca7e84cd6810b755bb18ddfc9d15f647dfb05e 100755
--- a/src/freedombone-mesh-install
+++ b/src/freedombone-mesh-install
@@ -229,11 +229,7 @@ function mesh_avahi {
 
 function install_babel_client {
 	# TODO to be fixed
-	if [ -f /usr/local/bin/${PROJECT_NAME} ]; then
-		TOXIC_FILE=$(cat /usr/local/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	else
-		TOXIC_FILE=$(cat /usr/bin/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
-	fi
+	TOXIC_FILE=$(cat /usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-tox | grep "TOXIC_FILE=" | head -n 1 | awk -F '=' '{print $2}')
 
 	if [ ! -f ${rootdir}/tmp/meshtype ]; then
 		$CHROOT_PREFIX sudo apt-get -y install babeld
diff --git a/src/freedombone-utils-selector b/src/freedombone-utils-selector
index 6ff9b2c56120d32199a7799ae06b0a494a50a5da..089e9d72d69396a05ffcd924ac72a99a6358e5aa 100755
--- a/src/freedombone-utils-selector
+++ b/src/freedombone-utils-selector
@@ -79,6 +79,8 @@ function detect_apps {
 			APPS_CHOSEN+=("0")
 		fi
 	done
+
+	function_check get_apps_installed
 	get_apps_installed
 }
 
@@ -112,6 +114,8 @@ function choose_apps_for_variant {
 
 		fi
 	done
+
+	function_check get_apps_installed
 	get_apps_installed
 }
 
diff --git a/src/freedombone-utils-setup b/src/freedombone-utils-setup
index 2293b8177732fd3521b8c07e965a9692cd15c72a..2ef5c45653b650ac057344f60fd83a60c4a6642a 100755
--- a/src/freedombone-utils-setup
+++ b/src/freedombone-utils-setup
@@ -87,250 +87,258 @@ CHECK_MESSAGE="Check your internet connection, /etc/network/interfaces and /etc/
 DH_KEYLENGTH=2048
 
 function initial_setup {
-	if grep -Fxq "initial_setup" $COMPLETION_FILE; then
-		return
-	fi
-
-	apt-get -y remove --purge apache*
-	apt-get -y dist-upgrade
-	apt-get -y install ca-certificates emacs24 cpulimit
-	apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
-	apt-get -y install avahi-daemon avahi-utils avahi-discover
-	apt-get -y install connect-proxy
-
-	if [ ! -d $INSTALL_DIR ]; then
-		mkdir -p $INSTALL_DIR
-	fi
-
-	echo 'initial_setup' >> $COMPLETION_FILE
+    if grep -Fxq "initial_setup" $COMPLETION_FILE; then
+        return
+    fi
+
+    apt-get -y remove --purge apache*
+    apt-get -y dist-upgrade
+    apt-get -y install ca-certificates emacs24 cpulimit
+    apt-get -y install cryptsetup libgfshare-bin obnam sshpass wget
+    apt-get -y install avahi-daemon avahi-utils avahi-discover
+    apt-get -y install connect-proxy
+
+    if [ ! -d $INSTALL_DIR ]; then
+        mkdir -p $INSTALL_DIR
+    fi
+
+    echo 'initial_setup' >> $COMPLETION_FILE
 }
 
 function search_for_attached_usb_drive {
-	# If a USB drive is attached then search for email,
-	# gpg, ssh keys and emacs configuration
-	if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
-		return
-	fi
-	if [ -b $USB_DRIVE ]; then
-		if [ ! -d $USB_MOUNT ]; then
-			echo $'Mounting USB drive'
-			mkdir $USB_MOUNT
-			mount $USB_DRIVE $USB_MOUNT
-		fi
-		if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
-			if [ -d $USB_MOUNT/Maildir ]; then
-				echo $'Maildir found on USB drive'
-				IMPORT_MAILDIR=$USB_MOUNT/Maildir
-			fi
-			if [ -d $USB_MOUNT/.gnupg ]; then
-				echo $'Importing GPG keyring'
-				cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
-				chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
-				GPG_KEYS_IMPORTED="yes"
-				if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
-					echo $'GPG files did not copy'
-					exit 73529
-				fi
-			fi
-
-			if [ -f $USB_MOUNT/.procmailrc ]; then
-				echo $'Importing procmail settings'
-				cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
-				chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
-			fi
-
-			if [ -f $USB_MOUNT/private_key.gpg ]; then
-				echo $'GPG private key found on USB drive'
-				MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
-			fi
-			if [ -f $USB_MOUNT/public_key.gpg ]; then
-				echo $'GPG public key found on USB drive'
-				MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
-			fi
-		fi
-		if [ -d $USB_MOUNT/prosody ]; then
-			if [ ! -d $XMPP_DIRECTORY ]; then
-				mkdir $XMPP_DIRECTORY
-			fi
-			cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
-			chown -R prosody:prosody $XMPP_DIRECTORY
-		fi
-		if [ -d $USB_MOUNT/.ssh ]; then
-			echo $'Importing ssh keys'
-			cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
-			chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
-			# for security delete the ssh keys from the usb drive
-			if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
-				echo $'ssh files did not copy'
-				exit 8
-			fi
-		fi
-		if [ -f $USB_MOUNT/.emacs ]; then
-			echo $'Importing .emacs file'
-			cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
-			chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
-		fi
-		if [ -d $USB_MOUNT/.emacs.d ]; then
-			echo $'Importing .emacs.d directory'
-			cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
-			chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
-		fi
-		if [ -d $USB_MOUNT/ssl ]; then
-			echo $'Importing SSL certificates'
-			cp -r $USB_MOUNT/ssl/* /etc/ssl
-			chmod 640 /etc/ssl/certs/*
-			chmod 400 /etc/ssl/private/*
-			# change ownership of some certificates
-			if [ -d /etc/prosody ]; then
-				chown prosody:prosody /etc/ssl/private/xmpp.*
-				chown prosody:prosody /etc/ssl/certs/xmpp.*
-			fi
-			if [ -d /etc/dovecot ]; then
-				chown root:dovecot /etc/ssl/certs/dovecot.*
-				chown root:dovecot /etc/ssl/private/dovecot.*
-			fi
-			if [ -f /etc/ssl/private/exim.key ]; then
-				cp /etc/ssl/private/exim.key /etc/exim4
-				cp /etc/ssl/certs/exim.crt /etc/exim4
-				cp /etc/ssl/certs/exim.dhparam /etc/exim4
-				chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
-				chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
-			fi
-		fi
-		if [ -d $USB_MOUNT/personal ]; then
-			echo $'Importing personal directory'
-			cp -r $USB_MOUNT/personal /home/$MY_USERNAME
-			chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
-		fi
-	else
-		if [ -d $USB_MOUNT ]; then
-			umount $USB_MOUNT
-			rm -rf $USB_MOUNT
-		fi
-		echo $'No USB drive attached'
-	fi
-	echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
+    # If a USB drive is attached then search for email,
+    # gpg, ssh keys and emacs configuration
+    if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
+        return
+    fi
+    if [ -b $USB_DRIVE ]; then
+        if [ ! -d $USB_MOUNT ]; then
+            echo $'Mounting USB drive'
+            mkdir $USB_MOUNT
+            mount $USB_DRIVE $USB_MOUNT
+        fi
+        if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_DEVELOPER" || $SYSTEM_TYPE == "$VARIANT_MESH" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
+            if [ -d $USB_MOUNT/Maildir ]; then
+                echo $'Maildir found on USB drive'
+                IMPORT_MAILDIR=$USB_MOUNT/Maildir
+            fi
+            if [ -d $USB_MOUNT/.gnupg ]; then
+                echo $'Importing GPG keyring'
+                cp -r $USB_MOUNT/.gnupg /home/$MY_USERNAME
+                chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
+                GPG_KEYS_IMPORTED="yes"
+                if [ ! -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
+                    echo $'GPG files did not copy'
+                    exit 73529
+                fi
+            fi
+
+            if [ -f $USB_MOUNT/.procmailrc ]; then
+                echo $'Importing procmail settings'
+                cp $USB_MOUNT/.procmailrc /home/$MY_USERNAME
+                chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
+            fi
+
+            if [ -f $USB_MOUNT/private_key.gpg ]; then
+                echo $'GPG private key found on USB drive'
+                MY_GPG_PRIVATE_KEY=$USB_MOUNT/private_key.gpg
+            fi
+            if [ -f $USB_MOUNT/public_key.gpg ]; then
+                echo $'GPG public key found on USB drive'
+                MY_GPG_PUBLIC_KEY=$USB_MOUNT/public_key.gpg
+            fi
+        fi
+        if [ -d $USB_MOUNT/prosody ]; then
+            if [ ! -d $XMPP_DIRECTORY ]; then
+                mkdir $XMPP_DIRECTORY
+            fi
+            cp -r $USB_MOUNT/prosody/* $XMPP_DIRECTORY
+            chown -R prosody:prosody $XMPP_DIRECTORY
+        fi
+        if [ -d $USB_MOUNT/.ssh ]; then
+            echo $'Importing ssh keys'
+            cp -r $USB_MOUNT/.ssh /home/$MY_USERNAME
+            chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
+            # for security delete the ssh keys from the usb drive
+            if [ ! -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
+                echo $'ssh files did not copy'
+                exit 8
+            fi
+        fi
+        if [ -f $USB_MOUNT/.emacs ]; then
+            echo $'Importing .emacs file'
+            cp -f $USB_MOUNT/.emacs /home/$MY_USERNAME/.emacs
+            chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
+        fi
+        if [ -d $USB_MOUNT/.emacs.d ]; then
+            echo $'Importing .emacs.d directory'
+            cp -r $USB_MOUNT/.emacs.d /home/$MY_USERNAME
+            chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
+        fi
+        if [ -d $USB_MOUNT/ssl ]; then
+            echo $'Importing SSL certificates'
+            cp -r $USB_MOUNT/ssl/* /etc/ssl
+            chmod 640 /etc/ssl/certs/*
+            chmod 400 /etc/ssl/private/*
+            # change ownership of some certificates
+            if [ -d /etc/prosody ]; then
+                chown prosody:prosody /etc/ssl/private/xmpp.*
+                chown prosody:prosody /etc/ssl/certs/xmpp.*
+            fi
+            if [ -d /etc/dovecot ]; then
+                chown root:dovecot /etc/ssl/certs/dovecot.*
+                chown root:dovecot /etc/ssl/private/dovecot.*
+            fi
+            if [ -f /etc/ssl/private/exim.key ]; then
+                cp /etc/ssl/private/exim.key /etc/exim4
+                cp /etc/ssl/certs/exim.crt /etc/exim4
+                cp /etc/ssl/certs/exim.dhparam /etc/exim4
+                chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
+                chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
+            fi
+        fi
+        if [ -d $USB_MOUNT/personal ]; then
+            echo $'Importing personal directory'
+            cp -r $USB_MOUNT/personal /home/$MY_USERNAME
+            chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
+        fi
+    else
+        if [ -d $USB_MOUNT ]; then
+            umount $USB_MOUNT
+            rm -rf $USB_MOUNT
+        fi
+        echo $'No USB drive attached'
+    fi
+    echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
 }
 
 function mark_admin_user_account {
-	if ! grep -q "Admin user:" $COMPLETION_FILE; then
-		echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
-	fi
+    if ! grep -q "Admin user:" $COMPLETION_FILE; then
+        echo "Admin user:$MY_USERNAME" >> $COMPLETION_FILE
+    fi
 }
 
 function remove_instructions_from_motd {
-	sed -i '/## /d' /etc/motd
+    sed -i '/## /d' /etc/motd
 }
 
 function remove_default_user {
-	# make sure you don't use the default user account
-	if [[ $MY_USERNAME == "debian" ]]; then
-		echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
-		exit 68
-	fi
-	# remove the default debian user to prevent it from becoming an attack vector
-	if [ -d /home/debian ]; then
-		userdel -r debian
-		echo 'Default debian user account removed'
-	fi
+    # make sure you don't use the default user account
+    if [[ $MY_USERNAME == "debian" ]]; then
+        echo 'Do not use the default debian user account. Create a different user with: adduser [username]'
+        exit 68
+    fi
+    # remove the default debian user to prevent it from becoming an attack vector
+    if [ -d /home/debian ]; then
+        userdel -r debian
+        echo 'Default debian user account removed'
+    fi
+}
+
+function upgrade_installation {
+    if [ ! -d /usr/share/${PROJECT_NAME}/apps ]; then
+        mkdir -p /usr/share/${PROJECT_NAME}/apps
+    fi
+    mv /usr/local/bin/${PROJECT_NAME}-app-* /usr/share/${PROJECT_NAME}/apps
 }
 
 function setup_firewall {
-	configure_firewall
-	configure_firewall_ping
-	configure_firewall_for_dns
-	configure_firewall_for_avahi
+    configure_firewall
+    configure_firewall_ping
+    configure_firewall_for_dns
+    configure_firewall_for_avahi
 }
 
-function setup_utils {
-	read_configuration
-	set_default_onion_domains
-	locale_setup
-	parse_args
-	check_domains
-	install_static_network
-	remove_default_user
-	setup_firewall
-	create_repo_sources
-	configure_dns
-	initial_setup
-	install_tor
-	#resolve_dns_via_tor
-	install_command_line_browser
-	enable_ssh_via_onion
-	check_date
-	install_dynamicdns
-	randomize_cron
-	create_freedns_updater
-	mark_admin_user_account
-	enforce_good_passwords
-	install_editor
-	change_login_message
-	enable_zram
-	random_number_generator
-	set_your_domain_name
-	time_synchronisation_tlsdate
-	configure_internet_protocol
-	create_git_project
-	setup_wifi
-	configure_ssh
-	configure_ssh_onion
-	allow_ssh_to_onion_address
-	remove_instructions_from_motd
-	check_hwrng
-	search_for_attached_usb_drive
-	regenerate_ssh_keys
-	create_mirrors
-	create_upgrade_script
-	letsencrypt_renewals
-	install_watchdog_script
-	configure_avahi
-	create_avahi_onion_domains
-	#install_atheros_wifi
-	route_outgoing_traffic_through_tor
-	upgrade_golang
+function setup_utils {  
+    read_configuration
+    upgrade_installation
+    set_default_onion_domains
+    locale_setup
+    parse_args
+    check_domains
+    install_static_network
+    remove_default_user
+    setup_firewall
+    create_repo_sources
+    configure_dns
+    initial_setup
+    install_tor
+    #resolve_dns_via_tor
+    install_command_line_browser
+    enable_ssh_via_onion
+    check_date
+    install_dynamicdns
+    randomize_cron
+    create_freedns_updater
+    mark_admin_user_account
+    enforce_good_passwords
+    install_editor
+    change_login_message
+    enable_zram
+    random_number_generator
+    set_your_domain_name
+    time_synchronisation_tlsdate
+    configure_internet_protocol
+    create_git_project
+    setup_wifi
+    configure_ssh
+    configure_ssh_onion
+    allow_ssh_to_onion_address
+    remove_instructions_from_motd
+    check_hwrng
+    search_for_attached_usb_drive
+    regenerate_ssh_keys
+    create_mirrors
+    create_upgrade_script
+    letsencrypt_renewals
+    install_watchdog_script
+    configure_avahi
+    create_avahi_onion_domains
+    #install_atheros_wifi
+    route_outgoing_traffic_through_tor
+    upgrade_golang
 }
 
 function setup_email {
-	install_email
-	create_procmail
-	handle_admin_emails
-	spam_filtering
-	configure_imap
-	#configure_imap_client_certs
-	configure_gpg
-	refresh_gpg_keys
-	configure_backup_key
-	install_monkeysphere
-	encrypt_incoming_email
-	encrypt_outgoing_email
-	email_client
-	email_archiving
-	email_from_address
-	create_public_mailing_list
-	#create_private_mailing_list
-	encrypt_all_email
-	import_email
+    install_email
+    create_procmail
+    handle_admin_emails
+    spam_filtering
+    configure_imap
+    #configure_imap_client_certs
+    configure_gpg
+    refresh_gpg_keys
+    configure_backup_key
+    install_monkeysphere
+    encrypt_incoming_email
+    encrypt_outgoing_email
+    email_client
+    email_archiving
+    email_from_address
+    create_public_mailing_list
+    #create_private_mailing_list
+    encrypt_all_email
+    import_email
 }
 
 function setup_web {
-	install_web_server
-	install_web_server_access_control
+    install_web_server
+    install_web_server_access_control
 }
 
 function setup_apps {
-	function_check choose_apps_for_variant
-	choose_apps_for_variant "$SYSTEM_TYPE"
-
-	echo $"System variant: $SYSTEM_TYPE"
-	echo $'The following apps have been selected'
-	echo ''
-	function_check list_chosen_apps
-	list_chosen_apps
-	echo ''
-
-	function_check install_apps
-	install_apps
+    function_check choose_apps_for_variant
+    choose_apps_for_variant "$SYSTEM_TYPE"
+
+    echo $"System variant: $SYSTEM_TYPE"
+    echo $'The following apps have been selected'
+    echo ''
+    function_check list_chosen_apps
+    list_chosen_apps
+    echo ''
+
+    function_check install_apps
+    install_apps
 }
 
 # NOTE: deliberately no exit 0