diff --git a/lib/private/ocsclient.php b/lib/private/ocsclient.php
index 351027d80189e0b335105262ace97fa124b99725..7ce6723128bb7b01fd447d1f8705b0b5936a7a23 100644
--- a/lib/private/ocsclient.php
+++ b/lib/private/ocsclient.php
@@ -147,7 +147,7 @@ class OC_OCSClient{
 			$app['changed']=strtotime($tmp[$i]->changed);
 			$app['description']=(string)$tmp[$i]->description;
 			$app['score']=(string)$tmp[$i]->score;
-			$app['downloads'] = $tmp[$i]->downloads;
+			$app['downloads'] = (int)$tmp[$i]->downloads;
 
 			$apps[]=$app;
 		}
diff --git a/settings/ajax/disableapp.php b/settings/ajax/disableapp.php
index c1e5bc8eac76680cce533ab50d40207fd8964d54..1a133ea9af7bd325f69d38198c53f75971b9402e 100644
--- a/settings/ajax/disableapp.php
+++ b/settings/ajax/disableapp.php
@@ -10,5 +10,9 @@ if (!array_key_exists('appid', $_POST)) {
 $appId = $_POST['appid'];
 $appId = OC_App::cleanAppId($appId);
 
+// FIXME: Clear the cache - move that into some sane helper method
+\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-0');
+\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-1');
+
 OC_App::disable($appId);
 OC_JSON::success();
diff --git a/settings/ajax/enableapp.php b/settings/ajax/enableapp.php
index 81ca1e0338d40d69288cb3d557be32f9e7bfd229..88abff487db450dfcf774b7423a244cf3bb7e604 100644
--- a/settings/ajax/enableapp.php
+++ b/settings/ajax/enableapp.php
@@ -7,6 +7,9 @@ $groups = isset($_POST['groups']) ? $_POST['groups'] : null;
 
 try {
 	OC_App::enable(OC_App::cleanAppId($_POST['appid']), $groups);
+	// FIXME: Clear the cache - move that into some sane helper method
+	\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-0');
+	\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-1');
 	OC_JSON::success();
 } catch (Exception $e) {
 	OC_Log::write('core', $e->getMessage(), OC_Log::ERROR);
diff --git a/settings/ajax/installapp.php b/settings/ajax/installapp.php
index 80bc1819724b0290dd9a6cc33b493c951f91018e..f25e68214a7f5f4b1f8b5a4da0930059b6fe94ce 100644
--- a/settings/ajax/installapp.php
+++ b/settings/ajax/installapp.php
@@ -12,6 +12,9 @@ $appId = OC_App::cleanAppId($appId);
 
 $result = OC_App::installApp($appId);
 if($result !== false) {
+	// FIXME: Clear the cache - move that into some sane helper method
+	\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-0');
+	\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-1');
 	OC_JSON::success(array('data' => array('appid' => $appId)));
 } else {
 	$l = \OC::$server->getL10N('settings');
diff --git a/settings/ajax/uninstallapp.php b/settings/ajax/uninstallapp.php
index cae7c33f292f7d7926ceda9c270862f2036610d6..e50fc31a449faf8987e0ae674c6d7bdfb1ce2103 100644
--- a/settings/ajax/uninstallapp.php
+++ b/settings/ajax/uninstallapp.php
@@ -12,6 +12,9 @@ $appId = OC_App::cleanAppId($appId);
 
 $result = OC_App::removeApp($appId);
 if($result !== false) {
+	// FIXME: Clear the cache - move that into some sane helper method
+	\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-0');
+	\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-1');
 	OC_JSON::success(array('data' => array('appid' => $appId)));
 } else {
 	$l = \OC::$server->getL10N('settings');
diff --git a/settings/application.php b/settings/application.php
index 070da8024b22fe84216079b275d10ef94370b10f..f7ba72f3bfc6181a4f42fdbb652314f695522c9b 100644
--- a/settings/application.php
+++ b/settings/application.php
@@ -55,7 +55,8 @@ class Application extends App {
 				$c->query('AppName'),
 				$c->query('Request'),
 				$c->query('L10N'),
-				$c->query('Config')
+				$c->query('Config'),
+				$c->query('ICacheFactory')
 			);
 		});
 		$container->registerService('SecuritySettingsController', function(IContainer $c) {
@@ -120,6 +121,9 @@ class Application extends App {
 		$container->registerService('Config', function(IContainer $c) {
 			return $c->query('ServerContainer')->getConfig();
 		});
+		$container->registerService('ICacheFactory', function(IContainer $c) {
+			return $c->query('ServerContainer')->getMemCacheFactory();
+		});
 		$container->registerService('L10N', function(IContainer $c) {
 			return $c->query('ServerContainer')->getL10N('settings');
 		});
diff --git a/settings/controller/appsettingscontroller.php b/settings/controller/appsettingscontroller.php
index 3688859ef5602b637f954fe60532838b677ceaa4..55677d64870b5f2110979bf510da20bd53cfdd6c 100644
--- a/settings/controller/appsettingscontroller.php
+++ b/settings/controller/appsettingscontroller.php
@@ -14,6 +14,7 @@ namespace OC\Settings\Controller;
 use OC\App\DependencyAnalyzer;
 use OC\App\Platform;
 use \OCP\AppFramework\Controller;
+use OCP\ICacheFactory;
 use OCP\IRequest;
 use OCP\IL10N;
 use OCP\IConfig;
@@ -27,20 +28,25 @@ class AppSettingsController extends Controller {
 	private $l10n;
 	/** @var IConfig */
 	private $config;
+	/** @var \OCP\ICache */
+	private $cache;
 
 	/**
 	 * @param string $appName
 	 * @param IRequest $request
 	 * @param IL10N $l10n
 	 * @param IConfig $config
+	 * @param ICacheFactory $cache
 	 */
 	public function __construct($appName,
 								IRequest $request,
 								IL10N $l10n,
-								IConfig $config) {
+								IConfig $config,
+								ICacheFactory $cache) {
 		parent::__construct($appName, $request);
 		$this->l10n = $l10n;
 		$this->config = $config;
+		$this->cache = $cache->create($appName);
 	}
 
 	/**
@@ -49,13 +55,16 @@ class AppSettingsController extends Controller {
 	 */
 	public function listCategories() {
 
-		$categories = array(
-			array('id' => 0, 'displayName' => (string)$this->l10n->t('Enabled') ),
-			array('id' => 1, 'displayName' => (string)$this->l10n->t('Not enabled') ),
-		);
+		if(!is_null($this->cache->get('listCategories'))) {
+			return $this->cache->get('listCategories');
+		}
+		$categories = [
+			['id' => 0, 'displayName' => (string)$this->l10n->t('Enabled')],
+			['id' => 1, 'displayName' => (string)$this->l10n->t('Not enabled')],
+		];
 
 		if($this->config->getSystemValue('appstoreenabled', true)) {
-			$categories[] = array('id' => 2, 'displayName' => (string)$this->l10n->t('Recommended') );
+			$categories[] = ['id' => 2, 'displayName' => (string)$this->l10n->t('Recommended')];
 			// apps from external repo via OCS
 			$ocs = \OC_OCSClient::getCategories();
 			foreach($ocs as $k => $v) {
@@ -67,6 +76,7 @@ class AppSettingsController extends Controller {
 		}
 
 		$categories['status'] = 'success';
+		$this->cache->set('listCategories', $categories, 3600);
 
 		return $categories;
 	}
@@ -77,44 +87,46 @@ class AppSettingsController extends Controller {
 	 * @return array
 	 */
 	public function listApps($category = 0) {
-		$apps = array();
-
-		switch($category) {
-			// installed apps
-			case 0:
-				$apps = \OC_App::listAllApps(true);
-				$apps = array_filter($apps, function($app) {
-					return $app['active'];
-				});
-				break;
-			// not-installed apps
-			case 1:
-				$apps = \OC_App::listAllApps(true);
-				$apps = array_filter($apps, function($app) {
-					return !$app['active'];
-				});
-				break;
-			default:
-				if ($category === 2) {
-					$apps = \OC_App::getAppstoreApps('approved');
-					$apps = array_filter($apps, function($app) {
-						return isset($app['internalclass']) && $app['internalclass'] === 'recommendedapp';
+		if(!is_null($this->cache->get('listApps-'.$category))) {
+			$apps = $this->cache->get('listApps-'.$category);
+		} else {
+			switch ($category) {
+				// installed apps
+				case 0:
+					$apps = \OC_App::listAllApps(true);
+					$apps = array_filter($apps, function ($app) {
+						return $app['active'];
+					});
+					break;
+				// not-installed apps
+				case 1:
+					$apps = \OC_App::listAllApps(true);
+					$apps = array_filter($apps, function ($app) {
+						return !$app['active'];
 					});
-				} else {
-					$apps = \OC_App::getAppstoreApps('approved', $category);
-				}
-				if (!$apps) {
-					$apps = array();
-				}
-				usort($apps, function ($a, $b) {
-					$a = (int)$a['score'];
-					$b = (int)$b['score'];
-					if ($a === $b) {
-						return 0;
+					break;
+				default:
+					if ($category === 2) {
+						$apps = \OC_App::getAppstoreApps('approved');
+						$apps = array_filter($apps, function ($app) {
+							return isset($app['internalclass']) && $app['internalclass'] === 'recommendedapp';
+						});
+					} else {
+						$apps = \OC_App::getAppstoreApps('approved', $category);
+					}
+					if (!$apps) {
+						$apps = array();
 					}
-					return ($a > $b) ? -1 : 1;
-				});
-				break;
+					usort($apps, function ($a, $b) {
+						$a = (int)$a['score'];
+						$b = (int)$b['score'];
+						if ($a === $b) {
+							return 0;
+						}
+						return ($a > $b) ? -1 : 1;
+					});
+					break;
+			}
 		}
 
 		// fix groups to be an array
@@ -142,6 +154,8 @@ class AppSettingsController extends Controller {
 			return $app;
 		}, $apps);
 
-		return array('apps' => $apps, 'status' => 'success');
+		$this->cache->set('listApps-'.$category, $apps, 300);
+
+		return ['apps' => $apps, 'status' => 'success'];
 	}
 }