diff --git a/src/freedombone-selector b/src/freedombone-selector
index 5345bda23c49c2629ca2f00d36c6d004b02187f5..8755bac8d8c1b130daa91c3f623ce2c0e9963e4a 100755
--- a/src/freedombone-selector
+++ b/src/freedombone-selector
@@ -42,56 +42,7 @@ source $PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars
 
 COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
 
-# Array containing names of available apps
-APPS_AVAILABLE=()
-
-# Array containing 1 or 0 indicating installed apps
-APPS_INSTALLED=()
-
-# Apps selected with checklist
-APPS_CHOSEN=()
-
-function item_in_array {
-	local e
-	for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
-	return 1
-}
-
-function app_is_installed {
-	app_name="$1"
-	if [ ! -f $COMPLETION_FILE ]; then
-		echo "0"
-		return
-	fi
-
-	if ! grep -Fxq "install_${app_name}" $COMPLETION_FILE; then
-		echo "0"
-	else
-		echo "1"
-	fi
-}
-
-function get_apps_installed {
-	for a in "${APPS_AVAILABLE[@]}"
-	do
-		APPS_INSTALLED+=("$(app_is_installed $a)")
-	done
-}
-
-function detect_apps {
-	FILES=$PROJECT_INSTALL_DIR/${PROJECT_NAME}-app-*
-
-	# for all the app scripts
-	for filename in $FILES
-	do
-		app_name=$(echo "${filename}" | awk -F '-app-' '{print $2}')
-		if [[ $(item_in_array ${app_name} ${APPS_AVAILABLE[@]}) != 0 ]]; then
-			APPS_AVAILABLE+=("${app_name}")
-			APPS_CHOSEN+=("0")
-		fi
-	done
-	get_apps_installed
-}
+source $PROJECT_INSTALL_DIR/${PROJECT_NAME}-utils-selector
 
 function show_apps {
 	applist=""
@@ -124,7 +75,7 @@ function show_apps {
 	fi
 }
 
-function remove_apps {
+function remove_apps_interactive {
 	# which apps need to be removed?
 	removals=""
 	app_index=0
@@ -162,20 +113,10 @@ function remove_apps {
 
 	# remove the apps
 	read_configuration
-	for a in "${APPS_AVAILABLE[@]}"
-	do
-		if [[ ${APPS_INSTALLED[$app_index]} == "1" ]]; then
-			if [[ ${APPS_CHOSEN[$app_index]} == "0" ]]; then
-				echo $"Removing application: ${a}"
-				remove_${a}
-				echo $"${a} was removed"
-			fi
-		fi
-		app_index=$[app_index+1]
-	done
+	remove_apps
 }
 
-function install_apps {
+function install_apps_interactive {
 	# which apps need to be installed?
 	installs=""
 	app_index=0
@@ -213,17 +154,7 @@ function install_apps {
 
 	# install the apps
 	read_configuration
-	for a in "${APPS_AVAILABLE[@]}"
-	do
-		if [[ ${APPS_INSTALLED[$app_index]} == "0" ]]; then
-			if [[ ${APPS_CHOSEN[$app_index]} == "1" ]]; then
-				echo $"Installing application: ${a}"
-				install_${a}
-				echo $"${a} was installed"
-			fi
-		fi
-		app_index=$[app_index+1]
-	done
+	install_apps
 }
 
 ${PROJECT_NAME}-tests
@@ -242,7 +173,7 @@ show_apps
 
 clear
 
-remove_apps
-install_apps
+remove_apps_interactive
+install_apps_interactive
 
 exit 0
diff --git a/src/freedombone-utils-selector b/src/freedombone-utils-selector
new file mode 100644
index 0000000000000000000000000000000000000000..daaec9aa7e1775311f25995f91fef9bfe81bce94
--- /dev/null
+++ b/src/freedombone-utils-selector
@@ -0,0 +1,113 @@
+#!/bin/bash
+#
+# .---.                  .              .
+# |                      |              |
+# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
+# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
+# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
+#
+#                    Freedom in the Cloud
+#
+# Functions for selecting which apps to install or remove
+#
+# 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/>.
+
+# Array containing names of available apps
+APPS_AVAILABLE=()
+
+# Array containing 1 or 0 indicating installed apps
+APPS_INSTALLED=()
+
+# Apps selected with checklist
+APPS_CHOSEN=()
+
+function item_in_array {
+	local e
+	for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
+	return 1
+}
+
+function app_is_installed {
+	app_name="$1"
+	if [ ! -f $COMPLETION_FILE ]; then
+		echo "0"
+		return
+	fi
+
+	if ! grep -Fxq "install_${app_name}" $COMPLETION_FILE; then
+		echo "0"
+	else
+		echo "1"
+	fi
+}
+
+function get_apps_installed {
+	for a in "${APPS_AVAILABLE[@]}"
+	do
+		APPS_INSTALLED+=("$(app_is_installed $a)")
+	done
+}
+
+function detect_apps {
+	FILES=$PROJECT_INSTALL_DIR/${PROJECT_NAME}-app-*
+
+	APPS_AVAILABLE=()
+	APPS_CHOSEN=()
+
+	# for all the app scripts
+	for filename in $FILES
+	do
+		app_name=$(echo "${filename}" | awk -F '-app-' '{print $2}')
+		if [[ $(item_in_array ${app_name} ${APPS_AVAILABLE[@]}) != 0 ]]; then
+			APPS_AVAILABLE+=("${app_name}")
+			APPS_CHOSEN+=("0")
+		fi
+	done
+	get_apps_installed
+}
+
+function remove_apps {
+	app_index=0
+	for a in "${APPS_AVAILABLE[@]}"
+	do
+		if [[ ${APPS_INSTALLED[$app_index]} == "1" ]]; then
+			if [[ ${APPS_CHOSEN[$app_index]} == "0" ]]; then
+				echo $"Removing application: ${a}"
+				remove_${a}
+				echo $"${a} was removed"
+			fi
+		fi
+		app_index=$[app_index+1]
+	done
+}
+
+function install_apps {
+	app_index=0
+	for a in "${APPS_AVAILABLE[@]}"
+	do
+		if [[ ${APPS_INSTALLED[$app_index]} == "0" ]]; then
+			if [[ ${APPS_CHOSEN[$app_index]} == "1" ]]; then
+				echo $"Installing application: ${a}"
+				install_${a}
+				echo $"${a} was installed"
+			fi
+		fi
+		app_index=$[app_index+1]
+	done
+}
diff --git a/src/freedombone-utils-setup b/src/freedombone-utils-setup
index 209de479c7ce713bf1d0d80cab6e1848c0e48f22..651aca0279d8c49142065e6e4d79233202e910bd 100755
--- a/src/freedombone-utils-setup
+++ b/src/freedombone-utils-setup
@@ -326,24 +326,13 @@ function setup_web {
 }
 
 function setup_apps {
-	install_zeronet
-	install_syncthing
-	install_gogs
-	install_xmpp
-	install_tox
-	install_irc
-	install_mumble
-	install_sip
-	install_wiki
-	install_blog
-	install_gnusocial
-	install_rss
-	install_hubzilla
-	#install_webmail
-	#install_search_engine
-	install_dlna
-	#install_mediagoblin
-	#install_ipfs
+	function_check detect_apps
+	detect_apps
+
+	# TODO choose apps based upon variants
+
+	function_check install_apps
+	install_apps
 }
 
 # NOTE: deliberately no exit 0