diff --git a/lib/private/app.php b/lib/private/app.php
index a4dd513a5d830275d333bb40339a0fa9b4a62699..4814561baec0682b231e85f6cc0ff776e61677a8 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -797,9 +797,11 @@ class OC_App {
 	 * List all apps, this is used in apps.php
 	 *
 	 * @param bool $onlyLocal
+	 * @param bool $includeUpdateInfo Should we check whether there is an update
+	 *                                in the app store?
 	 * @return array
 	 */
-	public static function listAllApps($onlyLocal = false) {
+	public static function listAllApps($onlyLocal = false, $includeUpdateInfo = true) {
 		$installedApps = OC_App::getAllApps();
 
 		//TODO which apps do we want to blacklist and how do we integrate
@@ -841,7 +843,7 @@ class OC_App {
 					$info['removable'] = true;
 				}
 
-				$info['update'] = OC_Installer::isUpdateAvailable($app);
+				$info['update'] = ($includeUpdateInfo) ? OC_Installer::isUpdateAvailable($app) : null;
 
 				$appIcon = self::getAppPath($app) . '/img/' . $app . '.svg';
 				if (file_exists($appIcon)) {
diff --git a/settings/controller/appsettingscontroller.php b/settings/controller/appsettingscontroller.php
index f1b62bb1d3839e01c3a3e9af4283e105adaf71f8..a98d297a12284459ff8ab26209fa19ee64588b96 100644
--- a/settings/controller/appsettingscontroller.php
+++ b/settings/controller/appsettingscontroller.php
@@ -147,16 +147,18 @@ class AppSettingsController extends Controller {
 	 * Get all available apps in a category
 	 *
 	 * @param int $category
+	 * @param bool $includeUpdateInfo Should we check whether there is an update
+	 *                                in the app store?
 	 * @return array
 	 */
-	public function listApps($category = 0) {
+	public function listApps($category = 0, $includeUpdateInfo = true) {
 		if(!is_null($this->cache->get('listApps-'.$category))) {
 			$apps = $this->cache->get('listApps-'.$category);
 		} else {
 			switch ($category) {
 				// installed apps
 				case 0:
-					$apps = $this->getInstalledApps();
+					$apps = $this->getInstalledApps($includeUpdateInfo);
 					usort($apps, function ($a, $b) {
 						$a = (string)$a['name'];
 						$b = (string)$b['name'];
@@ -168,7 +170,7 @@ class AppSettingsController extends Controller {
 					break;
 				// not-installed apps
 				case 1:
-					$apps = \OC_App::listAllApps(true);
+					$apps = \OC_App::listAllApps(true, $includeUpdateInfo);
 					$apps = array_filter($apps, function ($app) {
 						return !$app['active'];
 					});
@@ -189,7 +191,7 @@ class AppSettingsController extends Controller {
 						$apps = array();
 					} else {
 						// don't list installed apps
-						$installedApps = $this->getInstalledApps();
+						$installedApps = $this->getInstalledApps(false);
 						$installedApps = array_map(function ($app) {
 							if (isset($app['ocsid'])) {
 								return $app['ocsid'];
@@ -245,10 +247,12 @@ class AppSettingsController extends Controller {
 	}
 
 	/**
+	 * @param bool $includeUpdateInfo Should we check whether there is an update
+	 *                                in the app store?
 	 * @return array
 	 */
-	private function getInstalledApps() {
-		$apps = \OC_App::listAllApps(true);
+	private function getInstalledApps($includeUpdateInfo = true) {
+		$apps = \OC_App::listAllApps(true, $includeUpdateInfo);
 		$apps = array_filter($apps, function ($app) {
 			return $app['active'];
 		});
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 1d115eb8182062c155ccdc9ec3ae68e24fa49c99..2863e86dba8766a5e1ae3ffcde7aa3000363d043 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -81,7 +81,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
 		$('#app-category-' + categoryId).addClass('active');
 		OC.Settings.Apps.State.currentCategory = categoryId;
 
-		this._loadCategoryCall = $.ajax(OC.generateUrl('settings/apps/list?category={categoryId}', {
+		this._loadCategoryCall = $.ajax(OC.generateUrl('settings/apps/list?category={categoryId}&includeUpdateInfo=0', {
 			categoryId: categoryId
 		}), {
 			type:'GET',
@@ -123,6 +123,20 @@ OC.Settings.Apps = OC.Settings.Apps || {
 			},
 			complete: function() {
 				$('#apps-list').removeClass('icon-loading');
+				$.ajax(OC.generateUrl('settings/apps/list?category={categoryId}&includeUpdateInfo=1', {
+					categoryId: categoryId
+				}), {
+					type: 'GET',
+					success: function (apps) {
+						_.each(apps.apps, function(app) {
+							if (app.update) {
+								var $update = $('#app-' + app.id + ' .update');
+								$update.removeClass('hidden');
+								$update.val(t('settings', 'Update to %s').replace(/%s/g, app.update));
+							}
+						})
+					}
+				});
 			}
 		});
 	},
diff --git a/settings/templates/apps.php b/settings/templates/apps.php
index 0904f31df4db8352d3d824f6b48c660b21b5886c..c88efb8746a8dec13b16c69b3d3b33b8d7287da2 100644
--- a/settings/templates/apps.php
+++ b/settings/templates/apps.php
@@ -108,9 +108,7 @@ script(
 	</div>
 	{{/unless}}
 
-	{{#if update}}
-	<input class="update" type="submit" value="<?php p($l->t('Update to %s', array('{{update}}'))); ?>" data-appid="{{id}}" />
-	{{/if}}
+	<input class="update hidden" type="submit" value="<?php p($l->t('Update to %s', array('{{update}}'))); ?>" data-appid="{{id}}" />
 	{{#if active}}
 	<input class="enable" type="submit" data-appid="{{id}}" data-active="true" value="<?php p($l->t("Disable"));?>"/>
 	<input type="checkbox" class="groups-enable" id="groups_enable-{{id}}"/>