diff --git a/src/freedombone-addremove b/src/freedombone-addremove
new file mode 100755
index 0000000000000000000000000000000000000000..7da064b8fa2b74f4fdad3333ad3a06154c87890c
--- /dev/null
+++ b/src/freedombone-addremove
@@ -0,0 +1,189 @@
+#!/bin/bash
+#
+# .---.                  .              .
+# |                      |              |
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
+#
+#                    Freedom in the Cloud
+#
+# Add or remove apps
+#
+# License
+# =======
+#
+# Copyright (C) 2015-2016 Bob Mottram <bob@robotics.uk.to>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+PROJECT_NAME='freedombone'
+
+export TEXTDOMAIN=${PROJECT_NAME}-addremove
+export TEXTDOMAINDIR="/usr/share/locale"
+
+PROJECT_INSTALL_DIR=/usr/local/bin
+if [ -f /usr/bin/${PROJECT_NAME} ]; then
+    PROJECT_INSTALL_DIR=/usr/bin
+fi
+
+source $PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars
+
+COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
+
+UTILS_FILES=/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-*
+for f in $UTILS_FILES
+do
+  source $f
+done
+
+APP_FILES=/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-*
+for f in $APP_FILES
+do
+  source $f
+done
+
+function show_apps {
+    applist=""
+    n=1
+    app_index=0
+    for a in "${APPS_AVAILABLE[@]}"
+    do
+        if [[ ${APPS_INSTALLED[$app_index]} == "0" ]]; then
+            applist="$applist $n $a off"
+        else
+            applist="$applist $n $a on"
+        fi
+        n=$[n+1]
+        app_index=$[app_index+1]
+    done
+
+    choices=$(dialog --stdout --backtitle $"Freedombone" \
+                     --title $"Add/Remove Applications" \
+                     --checklist $'Choose:' \
+                     27 40 20 $applist)
+
+    if [ $? -eq 0 ]; then
+        for choice in $choices
+        do
+            app_index = $[choice-1]
+            APPS_CHOSEN[$app_index]="1"
+        done
+    else
+        exit 0
+    fi
+}
+
+function remove_apps_interactive {
+    # which apps need to be removed?
+    removals=""
+    app_index=0
+    n=0
+    for a in "${APPS_INSTALLED[@]}"
+    do
+        if [[ ${APPS_INSTALLED[$app_index]} == "1" ]]; then
+            if [[ ${APPS_CHOSEN[$app_index]} == "0" ]]; then
+                if [ ${n} -gt 0 ]; then
+                    removals="$removals $APPS_AVAILABLE[$app_index]"
+                else
+                    removals="$APPS_AVAILABLE[$app_index]"
+                fi
+                n=$[n+1]
+            fi
+        fi
+        app_index=$[app_index+1]
+    done
+
+    # if no apps to be removed then don't do anything
+    if [ ${n} -eq 0 ]; then
+        return
+    fi
+
+    # ask for confirmation
+    dialog --title $"Remove applications" \
+           --backtitle $"Freedombone" \
+           --defaultno \
+           --yesno $"\nYou have chosen to remove $n apps.\n\n    $removals\n\nIf you choose 'yes' then this will remove both the applications and their data/messages. If you don't have a backup then you will not be able to recover the data for these applications.\n\nAre you sure that you wish to continue?" 15 60
+    sel=$?
+    case $sel in
+        1) return;;
+        255) return;;
+    esac
+
+    # remove the apps
+    read_configuration
+    remove_apps
+}
+
+function install_apps_interactive {
+    # which apps need to be installed?
+    installs=""
+    app_index=0
+    n=0
+    for a in "${APPS_INSTALLED[@]}"
+    do
+        if [[ ${APPS_INSTALLED[$app_index]} == "0" ]]; then
+            if [[ ${APPS_CHOSEN[$app_index]} == "1" ]]; then
+                if [ ${n} -gt 0 ]; then
+                    installs="$installs $APPS_AVAILABLE[$app_index]"
+                else
+                    installs="$APPS_AVAILABLE[$app_index]"
+                fi
+                n=$[n+1]
+            fi
+        fi
+        app_index=$[app_index+1]
+    done
+
+    # if no apps to be installed then don't do anything
+    if [ ${n} -eq 0 ]; then
+        return
+    fi
+
+    # ask for confirmation
+    dialog --title $"Remove applications" \
+           --backtitle $"Freedombone" \
+           --defaultno \
+           --yesno $"\nYou have chosen to install $n apps.\n\n    $installs\n\nIf you choose 'yes' then these will now be installed.\n\nAre you sure that you wish to continue?" 15 60
+    sel=$?
+    case $sel in
+        1) return;;
+        255) return;;
+    esac
+
+    # install the apps
+    read_configuration
+    install_apps
+}
+
+${PROJECT_NAME}-tests
+if [ ! "$?" = "0" ]; then
+    exit 2
+fi
+
+detect_apps
+
+# if no applications were found
+if [[ ${#APPS_AVAILABLE[@]} == 0 ]]; then
+    exit 1
+fi
+
+show_apps
+
+clear
+
+remove_apps_interactive
+install_apps_interactive
+
+exit 0
diff --git a/src/freedombone-selector b/src/freedombone-selector
deleted file mode 100755
index 2bff62e5c966bf2f8ba6cfe8f0a6bcf6b99bda73..0000000000000000000000000000000000000000
--- a/src/freedombone-selector
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/bin/bash
-#
-# .---.                  .              .
-# |                      |              |
-# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
-# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
-# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
-#
-#                    Freedom in the Cloud
-#
-# Add or remove apps
-#
-# License
-# =======
-#
-# Copyright (C) 2015-2016 Bob Mottram <bob@robotics.uk.to>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-PROJECT_NAME='freedombone'
-
-export TEXTDOMAIN=${PROJECT_NAME}-selector
-export TEXTDOMAINDIR="/usr/share/locale"
-
-PROJECT_INSTALL_DIR=/usr/local/bin
-if [ -f /usr/bin/${PROJECT_NAME} ]; then
-	PROJECT_INSTALL_DIR=/usr/bin
-fi
-
-source $PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars
-
-COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
-
-source /usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-selector
-
-function show_apps {
-	applist=""
-	n=1
-	app_index=0
-	for a in "${APPS_AVAILABLE[@]}"
-	do
-		if [[ ${APPS_INSTALLED[$app_index]} == "0" ]]; then
-			applist="$applist $n $a off"
-		else
-			applist="$applist $n $a on"
-		fi
-		n=$[n+1]
-		app_index=$[app_index+1]
-	done
-
-	choices=$(dialog --stdout --backtitle $"Freedombone" \
-					 --title $"Installed applications" \
-					 --checklist $'Choose:' \
-					 80 40 20 $applist)
-
-	if [ $? -eq 0 ]; then
-		for choice in $choices
-		do
-			app_index = $[choice-1]
-			APPS_CHOSEN[$app_index]="1"
-		done
-	else
-		exit 0
-	fi
-}
-
-function remove_apps_interactive {
-	# which apps need to be removed?
-	removals=""
-	app_index=0
-	n=0
-	for a in "${APPS_INSTALLED[@]}"
-	do
-		if [[ ${APPS_INSTALLED[$app_index]} == "1" ]]; then
-			if [[ ${APPS_CHOSEN[$app_index]} == "0" ]]; then
-				if [ ${n} -gt 0 ]; then
-					removals="$removals $APPS_AVAILABLE[$app_index]"
-				else
-					removals="$APPS_AVAILABLE[$app_index]"
-				fi
-				n=$[n+1]
-			fi
-		fi
-		app_index=$[app_index+1]
-	done
-
-	# if no apps to be removed then don't do anything
-	if [ ${n} -eq 0 ]; then
-		return
-	fi
-
-	# ask for confirmation
-	dialog --title $"Remove applications" \
-		   --backtitle $"Freedombone" \
-		   --defaultno \
-		   --yesno $"\nYou have chosen to remove $n apps.\n\n    $removals\n\nIf you choose 'yes' then this will remove both the applications and their data/messages. If you don't have a backup then you will not be able to recover the data for these applications.\n\nAre you sure that you wish to continue?" 15 60
-	sel=$?
-	case $sel in
-		1) return;;
-		255) return;;
-	esac
-
-	# remove the apps
-	read_configuration
-	remove_apps
-}
-
-function install_apps_interactive {
-	# which apps need to be installed?
-	installs=""
-	app_index=0
-	n=0
-	for a in "${APPS_INSTALLED[@]}"
-	do
-		if [[ ${APPS_INSTALLED[$app_index]} == "0" ]]; then
-			if [[ ${APPS_CHOSEN[$app_index]} == "1" ]]; then
-				if [ ${n} -gt 0 ]; then
-					installs="$installs $APPS_AVAILABLE[$app_index]"
-				else
-					installs="$APPS_AVAILABLE[$app_index]"
-				fi
-				n=$[n+1]
-			fi
-		fi
-		app_index=$[app_index+1]
-	done
-
-	# if no apps to be installed then don't do anything
-	if [ ${n} -eq 0 ]; then
-		return
-	fi
-
-	# ask for confirmation
-	dialog --title $"Remove applications" \
-		   --backtitle $"Freedombone" \
-		   --defaultno \
-		   --yesno $"\nYou have chosen to install $n apps.\n\n    $installs\n\nIf you choose 'yes' then these will now be installed.\n\nAre you sure that you wish to continue?" 15 60
-	sel=$?
-	case $sel in
-		1) return;;
-		255) return;;
-	esac
-
-	# install the apps
-	read_configuration
-	install_apps
-}
-
-${PROJECT_NAME}-tests
-if [ ! "$?" = "0" ]; then
-	exit 2
-fi
-
-detect_apps
-
-# if no applications were found
-if [[ ${#APPS_AVAILABLE[@]} == 0 ]]; then
-	exit 1
-fi
-
-show_apps
-
-clear
-
-remove_apps_interactive
-install_apps_interactive
-
-exit 0