diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index e35ca85a779ab7647f89415fd53ceafaf8122ca8..a9b443ce52e77b402ec2b54066f960384a226013 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -27,6 +27,7 @@
 namespace OC\Files\Node;
 
 use OC\DB\QueryBuilder\Literal;
+use OCA\Files_Sharing\SharedStorage;
 use OCP\DB\QueryBuilder\IQueryBuilder;
 use OCP\Files\Config\ICachedMountInfo;
 use OCP\Files\FileInfo;
@@ -376,8 +377,30 @@ class Folder extends Node implements \OCP\Files\Folder {
 		$mountMap = array_combine($storageIds, $mounts);
 		$folderMimetype = $mimetypeLoader->getId(FileInfo::MIMETYPE_FOLDER);
 
-		//todo look into options of filtering path based on storage id (only search in files/ for home storage, filter by share root for shared, etc)
+		// Search in batches of 500 entries
+		$searchLimit = 500;
+		$results = [];
+		do {
+			$searchResult = $this->recentSearch($searchLimit, $offset, $storageIds, $folderMimetype);
 
+			// Exit condition if there are no more results
+			if (count($searchResult) === 0) {
+				break;
+			}
+
+			$parseResult = $this->recentParse($searchResult, $mountMap, $mimetypeLoader);
+
+			foreach ($parseResult as $result) {
+				$results[] = $result;
+			}
+
+			$offset += $searchLimit;
+		} while (count($results) < $limit);
+
+		return array_slice($results, 0, $limit);
+	}
+
+	private function recentSearch($limit, $offset, $storageIds, $folderMimetype) {
 		$builder = \OC::$server->getDatabaseConnection()->getQueryBuilder();
 		$query = $builder
 			->select('f.*')
@@ -388,12 +411,15 @@ class Folder extends Node implements \OCP\Files\Folder {
 				$builder->expr()->neq('f.mimetype', $builder->createNamedParameter($folderMimetype, IQueryBuilder::PARAM_INT)),
 				$builder->expr()->eq('f.size', new Literal(0))
 			))
+			->andWhere($builder->expr()->notLike('f.path', $builder->createNamedParameter('files_versions/%')))
+			->andWhere($builder->expr()->notLike('f.path', $builder->createNamedParameter('files_trashbin/%')))
 			->orderBy('f.mtime', 'DESC')
 			->setMaxResults($limit)
 			->setFirstResult($offset);
+		return $query->execute()->fetchAll();
+	}
 
-		$result = $query->execute()->fetchAll();
-
+	private function recentParse($result, $mountMap, $mimetypeLoader) {
 		$files = array_filter(array_map(function (array $entry) use ($mountMap, $mimetypeLoader) {
 			$mount = $mountMap[$entry['storage']];
 			$entry['internalPath'] = $entry['path'];
@@ -416,6 +442,9 @@ class Folder extends Node implements \OCP\Files\Folder {
 	private function getAbsolutePath(IMountPoint $mount, $path) {
 		$storage = $mount->getStorage();
 		if ($storage->instanceOfStorage('\OC\Files\Storage\Wrapper\Jail')) {
+			if ($storage->instanceOfStorage(SharedStorage::class)) {
+				$storage->getSourceStorage();
+			}
 			/** @var \OC\Files\Storage\Wrapper\Jail $storage */
 			$jailRoot = $storage->getUnjailedPath('');
 			$rootLength = strlen($jailRoot) + 1;