diff --git a/src/freedombone-app-babel b/src/freedombone-app-babel
index 0573b3e001c321b3ff2fc38e06ddb899e4ccc4c5..55b1e31ea584bb4631a3ddc9ce042e111195a751 100755
--- a/src/freedombone-app-babel
+++ b/src/freedombone-app-babel
@@ -32,6 +32,10 @@
 ENABLE_BABEL="no"
 BABEL_PORT=6696
 
+function upgrade_babel {
+    echo ''
+}
+
 function backup_local_babel {
     echo ''
 }
diff --git a/src/freedombone-app-batman b/src/freedombone-app-batman
index b6ee17269ff09010ef744b0c24004cf140429328..01525f5e125dc3654f51b819fdc48f5ebe560ec8 100755
--- a/src/freedombone-app-batman
+++ b/src/freedombone-app-batman
@@ -45,6 +45,10 @@ function configure_firewall_for_batma {
 	echo 'configure_firewall_for_batman' >> $COMPLETION_FILE
 }
 
+function upgrade_batman {
+    echo ''
+}
+
 function backup_local_batman {
     echo ''
 }
diff --git a/src/freedombone-app-blog b/src/freedombone-app-blog
index 156c176709e1f95f173cfb21cee44ba01086a571..a2dd80b2b36851763f0debd4f3fb4519d7eca670 100755
--- a/src/freedombone-app-blog
+++ b/src/freedombone-app-blog
@@ -36,6 +36,10 @@ FULLBLOG_COMMIT='bf5fe9486160be4da86d8987d3e5c977e1dc6d32'
 MY_BLOG_TITLE="My Blog"
 MY_BLOG_SUBTITLE="Another ${PROJECT_NAME} Blog"
 
+function upgrade_blog {
+    echo ''
+}
+
 function backup_local_blog {
     echo ''
 }
diff --git a/src/freedombone-app-cjdns b/src/freedombone-app-cjdns
index b1aa3802ebcbce2aa851e89f95dbdd0d2b9d9421..5f6a1ab0bf3595794c6bf9a16e9624d2500b3ba4 100755
--- a/src/freedombone-app-cjdns
+++ b/src/freedombone-app-cjdns
@@ -40,6 +40,10 @@ CJDNS_COMMIT='13189fde111d0500427a7a0ce06a970753527bca'
 CJDCMD_REPO="https://github.com/inhies/cjdcmd"
 CJDCMD_COMMIT='973cca6ed0eecf9041c3403a40193c0b1291b808'
 
+function upgrade_cjdns {
+    echo ''
+}
+
 function configure_firewall_for_cjdns {
 	if grep -Fxq "configure_firewall_for_cjdns" $COMPLETION_FILE; then
 		return
diff --git a/src/freedombone-app-dlna b/src/freedombone-app-dlna
index 5f073bfff569921e9ccd33835336cb75f393d383..6744dd1b0d7f3d2abd9a1e42c0fa642dba15d9aa 100755
--- a/src/freedombone-app-dlna
+++ b/src/freedombone-app-dlna
@@ -28,6 +28,10 @@
 # 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/>.
 
+function upgrade_dlna {
+    echo ''
+}
+
 function configure_firewall_for_dlna {
 	if grep -Fxq "configure_firewall_for_dlna" $COMPLETION_FILE; then
 		return
diff --git a/src/freedombone-app-emacs b/src/freedombone-app-emacs
index fd32bb567fd8255c291778da348da156df026218..f5861578d3d878325eb5721a307390a9907f2736 100755
--- a/src/freedombone-app-emacs
+++ b/src/freedombone-app-emacs
@@ -28,6 +28,10 @@
 # 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/>.
 
+function upgrade_emacs {
+    echo ''
+}
+
 function backup_local_emacs {
 	echo ''
 }
diff --git a/src/freedombone-app-gnusocial b/src/freedombone-app-gnusocial
index fc6fc7c2e9a7de8876b0c0a7935b626c6ffe07d2..d99d391d99467cdbcb082e9742b4c76df7cc2a7b 100755
--- a/src/freedombone-app-gnusocial
+++ b/src/freedombone-app-gnusocial
@@ -47,6 +47,10 @@ SHARINGS_COMMIT='d5c6c7f855d9afff9086c09ea706f38c859bc0d4'
 SHARINGS_THEME_REPO="http://git.lasindias.club/manuel/SharingsTheme"
 SHARINGS_THEME_COMMIT='7106c7ef03'
 
+function upgrade_gnusocial {
+    echo ''
+}
+
 function backup_local_gnusocial {
 	echo ''
 }
diff --git a/src/freedombone-app-gogs b/src/freedombone-app-gogs
index cde157056137cf8742f8932b487def77ec27b06d..f045dd0834460b3a06880824a122dc75a428632a 100755
--- a/src/freedombone-app-gogs
+++ b/src/freedombone-app-gogs
@@ -35,6 +35,10 @@ GIT_DOMAIN_REPO="https://github.com/gogits/gogs"
 GIT_ADMIN_PASSWORD=
 GOGS_COMMIT='3fb4f7f4980b4339fd9ef6a3ba5b0acab83d264d'
 
+function upgrade_gogs {
+    echo ''
+}
+
 function backup_local_gogs {
     echo ''
 }
diff --git a/src/freedombone-app-hubzilla b/src/freedombone-app-hubzilla
index 12514518177f8a85aa631f6b38997fa47e1354dd..1bc47944f3fd6c7e281347186ee26790bbdd53d5 100755
--- a/src/freedombone-app-hubzilla
+++ b/src/freedombone-app-hubzilla
@@ -38,6 +38,10 @@ HUBZILLA_ADMIN_PASSWORD=
 HUBZILLA_COMMIT='2d79e75788aa71664a379c4cea0b6bfe3ab87ad0'
 HUBZILLA_ADDONS_COMMIT='67b40c7a40f328a93ee030eb15e9e1261f3cba64'
 
+function upgrade_hubzilla {
+    echo ''
+}
+
 function backup_local_hubzilla {
     echo ''
 }
diff --git a/src/freedombone-app-ipfs b/src/freedombone-app-ipfs
index 2e112035742bacd75855db945abd45dcb1f68278..b84828e84d7b35f3bb25f819f13d76204de6c0bb 100755
--- a/src/freedombone-app-ipfs
+++ b/src/freedombone-app-ipfs
@@ -32,6 +32,10 @@ IPFS_GO_REPO="https://github.com/ipfs/go-ipfs"
 IPFS_COMMIT='20b06a4cbce8884f5b194da6e98cb11f2c77f166'
 IPFS_PORT=4001
 
+function upgrade_ipfs {
+    echo ''
+}
+
 function backup_local_ipfs {
     echo ''
 }
diff --git a/src/freedombone-app-irc b/src/freedombone-app-irc
index c0e938cb06758f0016d9f4af802d98382ea84cfb..526c26c0f74a62d5fd29a75827c01af892a4cc63 100755
--- a/src/freedombone-app-irc
+++ b/src/freedombone-app-irc
@@ -34,6 +34,10 @@ IRC_ONION_PORT=6697
 # An optional password to log into IRC. This applies to all users
 IRC_PASSWORD=
 
+function upgrade_irc {
+    echo ''
+}
+
 function backup_local_irc {
 	echo ''
 }
diff --git a/src/freedombone-app-mediagoblin b/src/freedombone-app-mediagoblin
index 318c9ace4763a571b0cda0d0a5f931c24d95a253..b5a8c89970ede8e6e819261c78415fc6faa000ff 100755
--- a/src/freedombone-app-mediagoblin
+++ b/src/freedombone-app-mediagoblin
@@ -35,6 +35,10 @@ MEDIAGOBLIN_COMMIT='d1ac2d52fd8859c3f32fa38e4836ffe9615e5bba'
 MEDIAGOBLIN_ADMIN_PASSWORD=
 MEDIAGOBLIN_ONION_PORT=8096
 
+function upgrade_mediagoblin {
+    echo ''
+}
+
 function backup_local_mediagoblin {
     echo ''
 }
diff --git a/src/freedombone-app-mumble b/src/freedombone-app-mumble
index 963c7378f51543fd3eabba6fb76b03100050ca55..6d80eda709469453f7ff9056760cda349a8fcbbe 100755
--- a/src/freedombone-app-mumble
+++ b/src/freedombone-app-mumble
@@ -37,6 +37,10 @@ VOIP_PORT=64738
 VOIP_DATABASE="mumble-server.sqlite"
 VOIP_CONFIG_FILE="mumble-server.ini"
 
+function upgrade_mumble {
+    echo ''
+}
+
 function backup_local_mumble {
     echo ''
 }
diff --git a/src/freedombone-app-rss b/src/freedombone-app-rss
index 3d88f91345e8b772c2632aad5089fe5cfc26f14b..5cadb9ca88f5596db3f1acf0841d4cc80cb66856 100755
--- a/src/freedombone-app-rss
+++ b/src/freedombone-app-rss
@@ -40,6 +40,10 @@ RSS_READER_PATH=/etc/share/tt-rss
 RSS_READER_GNUSOCIAL_REPO="https://github.com/bashrc/ttrss-gnusocial"
 RSS_READER_GNUSOCIAL_COMMIT='8b92b8f5db7b0d12459c7bd86a50f48815efe642'
 
+function upgrade_rss {
+    echo ''
+}
+
 function backup_local_rss {
 	echo ''
 }
diff --git a/src/freedombone-app-searx b/src/freedombone-app-searx
index d152983e8b6deff385d81f9126235af8979998f2..49ad3a9b467dd141f0e89ac6cdb5a89efc159749 100755
--- a/src/freedombone-app-searx
+++ b/src/freedombone-app-searx
@@ -36,6 +36,10 @@ SEARX_ONION_HOSTNAME=
 SEARX_LOGIN_TEXT=$"Search engine login"
 SEARX_PASSWORD=
 
+function upgrade_searx {
+    echo ''
+}
+
 function backup_local_searx {
 	echo ''
 }
diff --git a/src/freedombone-app-sip b/src/freedombone-app-sip
index 220e3009cf76563f550eeded37543004bef5d8cb..c46984cd5f3a36a34c4951b9f3843ce76b43c245 100755
--- a/src/freedombone-app-sip
+++ b/src/freedombone-app-sip
@@ -35,6 +35,10 @@ VOIP_TURN_PORT=3478
 VOIP_TURN_TLS_PORT=5349
 VOIP_TURN_NONCE=
 
+function upgrade_sip {
+    echo ''
+}
+
 function backup_local_sip {
 	echo ''
 }
diff --git a/src/freedombone-app-syncthing b/src/freedombone-app-syncthing
index 480c129229e0c0837fa18db2cf0e8369dc093066..5e46cc2c4c1ec8b352ded1f3aaa5289f64a7154f 100755
--- a/src/freedombone-app-syncthing
+++ b/src/freedombone-app-syncthing
@@ -37,6 +37,10 @@ SYNCTHING_PORT=22000
 SYNCTHING_SHARED_DATA=/var/lib/syncthing/SyncShared
 SYNCTHING_USER_IDS_FILE='.syncthingids'
 
+function upgrade_syncthing {
+    echo ''
+}
+
 function backup_local_syncthing {
     echo ''
 }
diff --git a/src/freedombone-app-tox b/src/freedombone-app-tox
index 0953419c9fe28f848d552dd1cd4c29343e7700e5..2bf647fc021c9031fb0a7aca9db4832e4f3b6a93 100755
--- a/src/freedombone-app-tox
+++ b/src/freedombone-app-tox
@@ -44,6 +44,10 @@ TOXIC_REPO="https://github.com/Tox/toxic"
 TOXIC_COMMIT='cf16849b374e484a33a4dffa3dfb937b59d537f2'
 TOXIC_FILE=/usr/local/bin/toxic
 
+function upgrade_tox {
+    echo ''
+}
+
 function backup_local_tox {
 	echo ''
 }
diff --git a/src/freedombone-app-vpn b/src/freedombone-app-vpn
index 51761e08bb2adc8e73f0f17fbafefe0125401aec..85bc234d0c96122c91e117aaba7cc6ebd4b573ae 100755
--- a/src/freedombone-app-vpn
+++ b/src/freedombone-app-vpn
@@ -28,6 +28,10 @@
 # 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/>.
 
+function upgrade_vpn {
+    echo ''
+}
+
 function backup_local_vpn {
 	echo ''
 }
diff --git a/src/freedombone-app-webmail b/src/freedombone-app-webmail
index a3d3f21b793441e45585acbc86f10d9196f71a3e..e3bcdee6adefba03b34c5e7bc569c0dad53d9987 100755
--- a/src/freedombone-app-webmail
+++ b/src/freedombone-app-webmail
@@ -36,6 +36,10 @@ WEBMAIL_ADMIN_PASSWORD=
 WEB_PATH=/var/www
 WEBMAIL_PATH=$WEB_PATH/webmail
 
+function upgrade_webmail {
+    echo ''
+}
+
 function backup_local_webmail {
     echo ''
 }
diff --git a/src/freedombone-app-wiki b/src/freedombone-app-wiki
index aaf7021aaccfa3e51fefcb31319bd4f4b2e9bb2e..db2a119f57dbe03892e26a2b7f3a1f36828c71a3 100755
--- a/src/freedombone-app-wiki
+++ b/src/freedombone-app-wiki
@@ -34,6 +34,10 @@ WIKI_TITLE="${PROJECT_NAME} Wiki"
 WIKI_CODE=
 WIKI_ONION_PORT=8089
 
+function upgrade_wiki {
+    echo ''
+}
+
 function backup_local_wiki {
     echo ''
 }
diff --git a/src/freedombone-app-xmpp b/src/freedombone-app-xmpp
index 8fb6d7e0a4e556b915ac62a0f3d85c280ed58daa..1a6da69ce0e094dc6c6d4f54e5857fe75c84105f 100755
--- a/src/freedombone-app-xmpp
+++ b/src/freedombone-app-xmpp
@@ -35,6 +35,10 @@ XMPP_PASSWORD=
 XMPP_CIPHERS='"EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA"'
 XMPP_ECC_CURVE='"secp384r1"'
 
+function upgrade_xmpp {
+    echo ''
+}
+
 function backup_local_xmpp {
 	echo ''
 }
diff --git a/src/freedombone-app-zeronet b/src/freedombone-app-zeronet
index 237404eab64cf8eb1f9ddf43ea63f9880c48505a..29bf2a4cbc9dc9160049a096e6c729950d045991 100755
--- a/src/freedombone-app-zeronet
+++ b/src/freedombone-app-zeronet
@@ -45,6 +45,10 @@ ZERONET_DEFAULT_MAIL_TAGLINE="Mail for the Mesh"
 ZERONET_ID_REPO="https://github.com/HelloZeroNet/ZeroID"
 ZERONET_ID_COMMIT='ccf14fdc96fa9cdb2ddd8a7ab283a8e17a4f234b'
 
+function upgrade_zeronet {
+    echo ''
+}
+
 function backup_local_zeronet {
 	echo ''
 }
diff --git a/src/freedombone-tests b/src/freedombone-tests
index 2ff3a5624e5d2abf5483f8f80fd84d1b69566825..0b6b5538d6e22d44cb9b347647ef394566276f75 100755
--- a/src/freedombone-tests
+++ b/src/freedombone-tests
@@ -65,7 +65,7 @@ function test_app_functions {
 	fi
 
 	# check that these functions exist
-	interface_functions=( install remove backup_local backup_remote )
+	interface_functions=( install remove backup_local backup_remote upgrade )
 
 	# for all the app scripts
 	for filename in $FILES